diff --git a/campcaster/CREDITS b/campcaster/CREDITS new file mode 100644 index 000000000..4d345a6fa --- /dev/null +++ b/campcaster/CREDITS @@ -0,0 +1,16 @@ +Version 1.1 +----------- +Ferenc Gerlits +Ákos Maróy +János Csikós +Mark Kretschmann +Ian Monroe +Mugur Rus +Tomáš Hlava + +Version 1.0 +----------- +Ákos Maróy +Ferenc Gerlits +Sebastian Göbel +Tomáš Hlava diff --git a/campcaster/INSTALL b/campcaster/INSTALL new file mode 100644 index 000000000..32f295e78 --- /dev/null +++ b/campcaster/INSTALL @@ -0,0 +1,38 @@ +-------------------------------------------------------------------------------- + + Copyright (c) 2004-2006 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +-------------------------------------------------------------------------------- + +Installing on Ubuntu Dapper and Debian +http://code.campware.org/projects/campcaster/wiki/DevelopmentEnvironment + +Installing on Other Platforms +doc/install.html + +Campcaster HomePage +http://campcaster.campware.org/ + diff --git a/campcaster/README b/campcaster/README new file mode 100644 index 000000000..c29396cd2 --- /dev/null +++ b/campcaster/README @@ -0,0 +1,44 @@ +-------------------------------------------------------------------------------- + + Copyright (c) 2004-2006 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +-------------------------------------------------------------------------------- + +Building on Ubuntu Dapper or Debian +http://code.campware.org/projects/campcaster/wiki/DevelopmentEnvironment + +Installing on Other Platforms +doc/install.html +doc/gettingStarted.html + +User Documentation +http://code.campware.org/manuals/campcaster/1.0/ + +Developer Documentation +doc/index.html + +Campcaster HomePage +http://campcaster.campware.org/ diff --git a/campcaster/bin/archiveServerSetup.sh b/campcaster/bin/archiveServerSetup.sh new file mode 100755 index 000000000..414aedcfb --- /dev/null +++ b/campcaster/bin/archiveServerSetup.sh @@ -0,0 +1,485 @@ +#!/bin/bash +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: fgerlits $ +# Version : $Revision: 2292 $ +# Location : $URL: svn+ssh://tomash@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/bin/postInstallStation.sh $ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script makes installation steps for the Campcaster network hub. +# +# Invoke as: +# ./bin/archiveServerSetup.sh +# +# To get usage help, try the -h option +# +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +srcdir=$basedir/src +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster network hub install script."; + echo "parameters"; + echo ""; + echo " -d, --directory The installation directory, required."; + echo " -D, --database The name of the Campcaster database."; + echo " [default: CampcasterHub]"; + echo " -g, --apache-group The group the apache daemon runs as."; + echo " [default: www-data]"; + echo " -r, --www-root The root directory for web documents served"; + echo " by apache [default: /var/www]"; + echo " -s, --dbserver The name of the database server host."; + echo " [default: localhost]"; + echo " -u, --dbuser The name of the database user to access the" + echo " database. [default: campcaster]"; + echo " -w, --dbpassword The database user password."; + echo " [default: campcaster]"; + echo " -p, --postgresql-dir The postgresql data directory, containing"; + echo " pg_hba.conf [default: /etc/postgresql]"; + echo " -i, --postgresql-init-script The name of the postgresql init"; + echo " script [default: /etc/init.d/postgresql]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o d:D:g:hi:p:r:s:u:w: -l apache-group:,database:,dbserver:,dbuser:,dbpassword:,directory:,help,postgresql-dir:,postgresql-init-script:,www-root: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -d|--directory) + installdir=$2; + shift; shift;; + -D|--database) + database=$2; + shift; shift;; + -g|--apache-group) + apache_group=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + -i|--postgresql-init-script) + postgresql_init_script=$2; + shift; shift;; + -p|--postgresql-dir) + postgresql_dir=$2; + shift; shift;; + -r|--www-root) + www_root=$2; + shift; shift;; + -s|--dbserver) + dbserver=$2; + shift; shift;; + -u|--dbuser) + dbuser=$2; + shift; shift;; + -w|--dbpassword) + dbpassword=$2; + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$installdir" == "x" ]; then + echo "Required parameter install directory not specified."; + printUsage; + exit 1; +fi + +if [ "x$dbserver" == "x" ]; then + dbserver=localhost; +fi + +if [ "x$database" == "x" ]; then + database=CampcasterHub; +fi + +if [ "x$dbuser" == "x" ]; then + dbuser=campcaster; +fi + +if [ "x$dbpassword" == "x" ]; then + dbpassword=campcaster; +fi + +if [ "x$apache_group" == "x" ]; then + apache_group=www-data; +fi + +if [ "x$postgresql_dir" == "x" ]; then + postgresql_dir=/etc/postgresql; +fi + +if [ "x$postgresql_init_script" == "x" ]; then + postgresql_init_script=/etc/init.d/postgresql; +fi + +if [ "x$www_root" == "x" ]; then + www_root=/var/www; +fi + +hostname=`hostname -f` +www_port=80 + +echo "Installing Campcaster network hub (archiveServer)."; +echo ""; +echo "Using the following installation parameters:"; +echo ""; +echo " installation directory: $installdir"; +echo " database server: $dbserver"; +echo " database: $database"; +echo " database user: $dbuser"; +echo " database user password: $dbpassword"; +echo " apache daemon group: $apache_group"; +echo " apache document root: $www_root"; +echo " postgresql data directory: $postgresql_dir"; +echo " postgresql init script: $postgresql_init_script"; +echo " hostname: $hostname"; +echo " www port: $www_port"; +echo "" + +#------------------------------------------------------------------------------- +# The details of installation +#------------------------------------------------------------------------------- +ls_dbserver=$dbserver +ls_dbuser=$dbuser +ls_dbpassword=$dbpassword +ls_database=$database + +postgres_user=postgres + +install_bin=$installdir/bin +install_etc=$installdir/etc +install_lib=$installdir/lib +install_usr=$installdir/usr +install_var_ls=$installdir/var/Campcaster + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Check to see if this script is being run as root +#------------------------------------------------------------------------------- +if [ `whoami` != "root" ]; then + echo "Please run this script as root."; + exit ; +fi + + +#------------------------------------------------------------------------------- +# Check for required tools +#------------------------------------------------------------------------------- +echo "Checking for required tools..." + +check_exe "sed" || exit 1; +check_exe "psql" || exit 1; +check_exe "php" || exit 1; +check_exe "pear" || exit 1; + + +#------------------------------------------------------------------------------- +# Check for the apache group to be a real group +#------------------------------------------------------------------------------- +group_tmp_file=/tmp/ls_group_check.$$ +touch $group_tmp_file +test_result=`chgrp $apache_group $group_tmp_file 2> /dev/null` +if [ $? != 0 ]; then + rm -f $group_tmp_file; + echo "Unable to use apache deamon group $apache_group."; + echo "Please check if $apache_group is a correct user group."; + exit 1; +fi +rm -f $group_tmp_file; + + +#------------------------------------------------------------------------------- +# Install the new pg_hba.conf file +#------------------------------------------------------------------------------- +echo "Modifying postgresql access permissions..."; + +pg_config_dir=$postgresql_dir +pg_config_file=pg_hba.conf +pg_config_file_saved=pg_hba.conf.before-campcaster + +if [ -f $pg_config_dir/$pg_config_file ] ; then + mv -vf $pg_config_dir/$pg_config_file $pg_config_dir/$pg_config_file_saved ; +fi +cp -v $etcdir/$pg_config_file $pg_config_dir/$pg_config_file +chown root:$postgres_user $pg_config_dir/$pg_config_file + +# don't use restart for the init script, as it might return prematurely +# and in the later call to psql we wouldn't be able to connect +${postgresql_init_script} stop +${postgresql_init_script} start + + +#------------------------------------------------------------------------------- +# Configuring Apache +#------------------------------------------------------------------------------- +echo "Configuring apache ..." +CONFFILE=90_php_campcaster.conf +AP_DDIR_FOUND=no +for APACHE_DDIR in \ + /etc/apache/conf.d /etc/apache2/conf.d /etc/apache2/conf/modules.d \ + /etc/httpd/conf.d /etc/apache2/modules.d +do + echo -n "$APACHE_DDIR " + if [ -d $APACHE_DDIR ]; then + echo "Y" + AP_DDIR_FOUND=yes + cp -v $basedir/etc/apache/$CONFFILE $APACHE_DDIR + break + else + echo "N" + fi +done +if [ "$AP_DDIR_FOUND" != "yes" ]; then + echo "###############################" + echo " Could not configure Apache" + echo " include following file into apache config manually:" + echo " $basedir/etc/apache/$CONFFILE" + echo "###############################" +else + echo "done" + echo "Restarting apache..."; + AP_SCR_FOUND=no + for APACHE_SCRIPT in apache apache2 httpd ; do + echo -n "$APACHE_SCRIPT " + if [ -x /etc/init.d/$APACHE_SCRIPT ]; then + echo "Y" + AP_SCR_FOUND=yes + /etc/init.d/$APACHE_SCRIPT restart + else + echo "N" + fi + done + if [ "$AP_SCR_FOUND" != "yes" ]; then + echo "###############################" + echo " Could not reload Apache" + echo " please reload apache manually" + echo "###############################" + fi + echo "done" +fi + + +#------------------------------------------------------------------------------- +# Create the necessary database user and database itself +#------------------------------------------------------------------------------- +echo "Creating database user '$ls_dbuser' and database '$ls_database' ..."; + +# FIXME: the below might not work for remote databases + +if [ "x$ls_dbserver" == "xlocalhost" ]; then + su - $postgres_user -c "echo \"CREATE USER $ls_dbuser \ + ENCRYPTED PASSWORD '$ls_dbpassword' \ + CREATEDB NOCREATEUSER;\" \ + | psql template1" \ + || echo "Couldn't create database user $ls_dbuser."; + + su - $postgres_user -c "echo \"CREATE DATABASE \\\"$ls_database\\\" \ + OWNER $ls_dbuser ENCODING 'utf-8';\" \ + | psql template1" \ + || echo "Couldn't create database $ls_database."; +else + echo "Unable to automatically create database user and table for"; + echo "remote database $ls_dbserver."; + echo "Make sure to create database user $ls_dbuser with password"; + echo "$ls_dbpassword on database server at $ls_dbserver."; + echo "Also create a database called $ls_database, owned by this user."; + echo ""; + echo "The easiest way to achieve this is by issuing the following SQL"; + echo "commands to PostgreSQL:"; + echo "CREATE USER $ls_dbuser"; + echo " ENCRYPTED PASSWORD '$ls_dbpassword'"; + echo " CREATEDB NOCREATEUSER;"; + echo "CREATE DATABASE \"$ls_database\""; + echo " OWNER $ls_dbuser ENCODING 'utf-8';"; +fi + + +# TODO: check for the success of these operations somehow + + +#------------------------------------------------------------------------------- +# Configuring modules +#------------------------------------------------------------------------------- +echo "Configuring modules ..."; + +cd $modules_dir/alib && ./configure --prefix=$installdir +cd $modules_dir/archiveServer && \ + ./configure --prefix=$installdir \ + --with-hostname=$hostname \ + --with-www-port=$www_port \ + --with-database-server=$dbserver \ + --with-database=$database \ + --with-database-user=$dbuser \ + --with-database-password=$dbpassword +cd $modules_dir/getid3 && ./configure --prefix=$installdir +#cd $modules_dir/htmlUI && ./configure --prefix=$installdir \ +# --with-apache-group=$apache_group \ +# --with-www-docroot=$www_root \ +# --with-storage-server=$installdir/var/Campcaster/storageServer +cd $modules_dir/storageAdmin && ./configure --prefix=$installdir \ + --with-storage-server=$installdir/var/Campcaster/storageServer \ + --with-phppart-dir=$installdir/var/Campcaster/storageAdmin +cd $modules_dir/storageServer && \ + ./configure --prefix=$installdir \ + --with-apache-group=$apache_group \ + --with-hostname=$hostname \ + --with-www-docroot=$www_root \ + --with-www-port=$www_port \ + --with-database-server=$dbserver \ + --with-database=$database \ + --with-database-user=$dbuser \ + --with-database-password=$dbpassword \ + --with-init-database=no + + +#------------------------------------------------------------------------------- +# Install +#------------------------------------------------------------------------------- +echo "Installing modules ..."; + +make -C $modules_dir/alib install +make -C $modules_dir/getid3 install +make -C $modules_dir/storageServer install +make -C $modules_dir/storageAdmin install +make -C $modules_dir/archiveServer install + +mkdir -p $install_var_ls/storageServer/var/tests +for it in ex1.mp3 ex2.wav; do + cp $modules_dir/storageServer/var/tests/$it \ + $install_var_ls/storageServer/var/tests +done + +#------------------------------------------------------------------------------- +# Create symlinks +#------------------------------------------------------------------------------- +echo "Creating symlinks..."; + +# create symlink for the PHP pages in apache's document root +rm -f $www_root/campcaster +ln -vs $install_var_ls $www_root/campcaster + + +#------------------------------------------------------------------------------- +# Install PEAR packages (locally in the Campcaster) +# only if necessary +#------------------------------------------------------------------------------- +if [ -f $toolsdir/pear/bin/install.sh ]; then + $toolsdir/pear/bin/install.sh -d $installdir || exit 1; +fi + + +#------------------------------------------------------------------------------- +# Setup directory permissions +#------------------------------------------------------------------------------- +echo "Setting up directory permissions..." + +chgrp $apache_group $install_var_ls/archiveServer/var/stor +chgrp $apache_group $install_var_ls/archiveServer/var/access +chgrp $apache_group $install_var_ls/archiveServer/var/trans +chgrp $apache_group $install_var_ls/archiveServer/var/stor/buffer + +chmod g+sw $install_var_ls/archiveServer/var/stor +chmod g+sw $install_var_ls/archiveServer/var/access +chmod g+sw $install_var_ls/archiveServer/var/trans +chmod g+sw $install_var_ls/archiveServer/var/stor/buffer + +#chgrp $apache_group $install_var_ls/storageServer/var/stor +#chgrp $apache_group $install_var_ls/storageServer/var/access +#chgrp $apache_group $install_var_ls/storageServer/var/trans +#chgrp $apache_group $install_var_ls/storageServer/var/stor/buffer + +#chmod g+sw $install_var_ls/storageServer/var/stor +#chmod g+sw $install_var_ls/storageServer/var/access +#chmod g+sw $install_var_ls/storageServer/var/trans +#chmod g+sw $install_var_ls/storageServer/var/stor/buffer + +#chgrp $apache_group $install_var_ls/htmlUI/var/templates_c +#chgrp $apache_group $install_var_ls/htmlUI/var/html/img + +#chmod g+sw $install_var_ls/htmlUI/var/templates_c +#chmod g+sw $install_var_ls/htmlUI/var/html/img + + +#------------------------------------------------------------------------------- +# Initialize the database +#------------------------------------------------------------------------------- +echo "Initializing database..."; + +# create PHP-related database tables +cd $install_var_ls/archiveServer/var/install +php -q install.php || exit 1; +cd - + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + + +exit + diff --git a/campcaster/bin/autogen.sh b/campcaster/bin/autogen.sh new file mode 100755 index 000000000..b75a75243 --- /dev/null +++ b/campcaster/bin/autogen.sh @@ -0,0 +1,95 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="Campcaster" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have automake 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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over install-sh, as it's going to be missed by autoconf +cp -f ${bindir}/install-sh ${tmpdir} + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +echo " aclocal $ACLOCAL_FLAGS" +cp -f ${configure_ac} ${tmpdir} +cp -f ${etcdir}/acinclude.m4 ${tmpdir} +aclocal $ACLOCAL_FLAGS + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + + diff --git a/campcaster/bin/createAServerTarball.sh b/campcaster/bin/createAServerTarball.sh new file mode 100755 index 000000000..4916e13f9 --- /dev/null +++ b/campcaster/bin/createAServerTarball.sh @@ -0,0 +1,231 @@ +#!/bin/bash +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: fgerlits $ +# Version : $Revision: 2292 $ +# Location : $URL: svn+ssh://tomash@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/bin/postInstallStation.sh $ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script creates a distribution tarball for Campcaster network hub. +# (campcaster-aserver-.tar.bz2) +# +# Invoke as: +# ./bin/makeArchiveServerTar.sh -v +# +# To get usage help, try the -h option +# +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +#reldir=`dirname $0`/.. +reldir=`pwd` +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules +products_dir=$srcdir/products + +usrdir=`cd $basedir/usr; pwd;` + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster network hub tar package creator."; + echo "parameters"; + echo ""; + echo " -d, --directory Place the tarball in the specified directory."; + echo " [default: current directory]"; + echo " -v, --version The version number of the created package."; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o d:v:h -l lspath:,output:,version:,help -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -d|--directory) + directory=$2; + shift; shift;; + -v|--version) + version=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$directory" == "x" ]; then + directory=`pwd`; +fi + +if [ "x$version" == "x" ]; then + echo "Required parameter version not specified."; + printUsage; + exit 1; +fi + +echo "Creating Campcaster network hub tar.gz package."; +echo ""; +echo "Using the following installation parameters:"; +echo ""; +echo " LS directory: $lspath"; +echo " output directory: $directory"; +echo "" + +#------------------------------------------------------------------------------- +# Check if there are generated files, and bail out if so +#------------------------------------------------------------------------------- +if [ -f $basedir/Makefile ]; then + echo "ERROR: make sure to run this script on a freshly checked-out copy"; + echo " of Campcaster, with NO generated files!"; + exit 1; +fi + +#------------------------------------------------------------------------------- +# More definitions +#------------------------------------------------------------------------------- +tarball=$directory/campcaster-aserver-$version.tar.bz2 + +ls_tmpdir=$tmpdir/campcaster-$version +src_tmpdir=$ls_tmpdir/src +tools_tmpdir=$src_tmpdir/tools +modules_tmpdir=$src_tmpdir/modules +products_tmpdir=$src_tmpdir/products +bin_tmpdir=$ls_tmpdir/bin +doc_tmpdir=$ls_tmpdir/doc +etc_tmpdir=$ls_tmpdir/etc +tmp_tmpdir=$ls_tmpdir/tmp + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + #echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + +COMMENT=' +#------------------------------------------------------------------------------- +# Check to see if this script is being run as root +#------------------------------------------------------------------------------- +if [ `whoami` != "root" ]; then + echo "Please run this script as root."; + exit ; +fi +' + +#------------------------------------------------------------------------------- +# Check for required tools +#------------------------------------------------------------------------------- +echo "Checking for required tools..." + +check_exe "tar" || exit 1; +check_exe "bzip2" || exit 1; + +#------------------------------------------------------------------------------- +# Create the directories again +#------------------------------------------------------------------------------- +echo "Creating tmp directories and copying files ..." + +mkdir -p $ls_tmpdir +mkdir -p $src_tmpdir +mkdir -p $modules_tmpdir +mkdir -p $tools_tmpdir +mkdir -p $bin_tmpdir +mkdir -p $etc_tmpdir/apache + +#------------------------------------------------------------------------------- +# Copy the modules and tools +#------------------------------------------------------------------------------- +#cp -pPR $modules_dir/* $modules_tmpdir +for it in alib getid3 storageServer storageAdmin archiveServer; do + cp -pPR $modules_dir/$it $modules_tmpdir +done +for it in pear; do + cp -pPR $toolsdir/$it $tools_tmpdir +done +for it in preInstall.sh archiveServerSetup.sh; do + cp -pPR $bindir/$it $bin_tmpdir +done +cp -pPR $etcdir/apache/* $etc_tmpdir/apache +for it in pg_hba.conf; do + cp -pPR $etcdir/$it $etc_tmpdir +done + +#------------------------------------------------------------------------------- +# Copy additional files +#------------------------------------------------------------------------------- +#cp -pPR $bindir $ls_tmpdir +#cp -pPR $etcdir $ls_tmpdir +cp -pPR README INSTALL configure $ls_tmpdir + +#------------------------------------------------------------------------------- +# Get rid of the remnants of the subversion system +#------------------------------------------------------------------------------- +# Paul Baranowski: you dont need to do this when you export from SVN. +#rm -rf `find $ls_tmpdir -name .svn -type d` + +#------------------------------------------------------------------------------- +# Create the tarball +#------------------------------------------------------------------------------- +echo "Creating $tarball ..."; +cd $tmpdir +tar cjf $tarball campcaster-$version +cd $basedir + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/createDebianPackages.sh b/campcaster/bin/createDebianPackages.sh new file mode 100755 index 000000000..7a972ebfd --- /dev/null +++ b/campcaster/bin/createDebianPackages.sh @@ -0,0 +1,258 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script creates Debian packages from Campcaster tarballs. +# To create the tarballs first, see the dist.sh script. +# +# Invoke as: +# ./bin/createDebianPackages.sh +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +tmpdir=$basedir/tmp + +usrdir=`cd $basedir/usr; pwd;` + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster debian source package creation script"; + echo "parameters"; + echo ""; + echo " -d, --directory Place to look for the campcaster source"; + echo " tarballs [default: current directory]"; + echo " -m, --maintainer The name and e-mail address of the package"; + echo " maintainer."; + echo " -o, --output-directory the output directory for the files"; + echo " [default: current directory]"; + echo " -v, --version The version number of the created packages."; + echo " From package_x.y-z_i386.deb, this is x.y"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o d:hm:o:v: -l directory:,help,maintainer:,output-directory,version: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -d|--directory) + directory=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + -m|--maintainer) + maintainer=$2; + shift; shift;; + -o|--output-directory) + outdir=$2; + shift; shift;; + -v|--version) + version=$2; + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$maintainer" == "x" ]; then + echo "Required parameter maintainer not specified."; + printUsage; + exit 1; +fi + +if [ "x$version" == "x" ]; then + echo "Required parameter version not specified."; + printUsage; + exit 1; +fi + +if [ "x$directory" == "x" ]; then + directory=`pwd`; +else + directory=`cd $directory; pwd;` +fi + +if [ "x$outdir" == "x" ]; then + outdir=`pwd`; +else + outdir=`cd $outdir; pwd;` +fi + + +echo "Creating Debian source packages for Campcaster."; +echo ""; +echo "Using the following parameters:"; +echo ""; +echo " tarball directory: $directory"; +echo " maintainer: $maintainer"; +echo " package version: $version"; +echo " output directory: $outdir"; +echo "" + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Check for executables needed by this script +#------------------------------------------------------------------------------- +echo "Checking for tools used by this script..."; +check_exe "tar" || exit 1; +check_exe "dpkg-source" || exit 1; +check_exe "sed" || exit 1; + + +#------------------------------------------------------------------------------- +# More definitions +#------------------------------------------------------------------------------- +tarball=$directory/campcaster-$version.tar.bz2 +tarball_libs=$directory/campcaster-libraries-$version.tar.bz2 + +if [ ! -f $tarball ]; then + echo "source tarball $tarball not found in directory $directory"; + exit 1; +fi + +if [ ! -f $tarball_libs ]; then + echo "source tarball $tarball_libs not found in directory $directory"; + exit 1; +fi + + +packageName=campcaster-$version +packageNameOrig=$packageName.orig +workdir=$tmpdir/debianize + +replace_sed_string="s/ls_maintainer/$maintainer/;" + + +#------------------------------------------------------------------------------- +# Create the environment +#------------------------------------------------------------------------------- +rm -rf $workdir +mkdir -p $workdir +cd $workdir + + +#------------------------------------------------------------------------------- +# Untar the source tarballs +#------------------------------------------------------------------------------- +echo "Extracting source tarballs..."; + +# untar first, and rename as campcaster-$version.orig +tar xfj $tarball +tar xfj $tarball_libs +mv $packageName $packageNameOrig + +# untar again, and leave it as campcaster-$version +tar xfj $tarball +tar xfj $tarball_libs + +#------------------------------------------------------------------------------- +# Debianize the campcaster-$version sources +#------------------------------------------------------------------------------- +echo "Debianizing sources..."; + +cp -pPR $etcdir/debian $packageName + +# customize the control file, with the maintainer name +cat $etcdir/debian/control | sed -e "$replace_sed_string" \ + > $packageName/debian/control + +# get rid of the remnants of the CVS system +rm -rf `find $packageName -name CVS -type d` + + +#------------------------------------------------------------------------------- +# Create a debianized source package. +#------------------------------------------------------------------------------- +echo "Creating debian source package..."; + +dpkg-source -b $packageName $packageNameOrig + + +#------------------------------------------------------------------------------- +# Copy the resulting files to the target directory +#------------------------------------------------------------------------------- +echo "Moving debian source package files to target directory..."; + +mv -f campcaster_$version* $outdir + + +#------------------------------------------------------------------------------- +# Clean up +#------------------------------------------------------------------------------- +echo "Cleaning up..."; + +cd $basedir +rm -rf $workdir + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/dist.sh b/campcaster/bin/dist.sh new file mode 100755 index 000000000..93ff08927 --- /dev/null +++ b/campcaster/bin/dist.sh @@ -0,0 +1,339 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script creates a distribution tarball for Campcaster. +# Creates two tarballs: +# campcaster-.tar.bz2 - the Campcaster source files +# campcaster-libraries-.tar.bz2 - dependent libraries +# +# Invoke as: +# ./bin/dist.sh -v +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules +products_dir=$srcdir/products + +usrdir=`cd $basedir/usr; pwd;` + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster install script."; + echo "parameters"; + echo ""; + echo " -d, --directory Place the tarballs in the specified directory."; + echo " [default: current directory]"; + echo " -h, --help Print this message and exit."; + echo " -v, --version The version number of the created packages."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o d:hv: -l directory:,help,version: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -d|--directory) + directory=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + -v|--version) + version=$2; + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$version" == "x" ]; then + echo "Required parameter version not specified."; + printUsage; + exit 1; +fi + +if [ "x$directory" == "x" ]; then + directory=`pwd`; +fi + +d=`cd $directory; pwd` +directory=$d + + +echo "Creating tarballs for Campcaster."; +echo ""; +echo "Using the following parameters:"; +echo ""; +echo " output directory: $directory"; +echo " package version number: $version"; +echo "" + + +#------------------------------------------------------------------------------- +# Check if there are generated files, and bail out if so +#------------------------------------------------------------------------------- +if [ -f $basedir/Makefile ]; then + echo "ERROR: make sure to run this script on a freshly checked-out copy"; + echo " of Campcaster, with NO generated files!"; + exit 1; +fi + + +#------------------------------------------------------------------------------- +# More definitions +#------------------------------------------------------------------------------- +tarball=$directory/campcaster-$version.tar.bz2 +tarball_libs=$directory/campcaster-libraries-$version.tar.bz2 + +ls_tmpdir=$tmpdir/campcaster-$version +src_tmpdir=$ls_tmpdir/src +tools_tmpdir=$src_tmpdir/tools +modules_tmpdir=$src_tmpdir/modules +products_tmpdir=$src_tmpdir/products +doc_tmpdir=$ls_tmpdir/doc +etc_tmpdir=$ls_tmpdir/etc +tmp_tmpdir=$ls_tmpdir/tmp + +boost_dir=$toolsdir/boost +boost_version=boost-1.33.1 +boost_tmpdir=$tools_tmpdir/boost + +libxmlxx_dir=$toolsdir/libxml++ +libxmlxx_version=libxml++-2.8.1 +libxmlxx_tmpdir=$tools_tmpdir/libxml++ + +cxxunit_dir=$toolsdir/cppunit +cxxunit_version=cppunit-1.10.2 +cxxunit_tmpdir=$tools_tmpdir/cppunit + +libodbcxx_dir=$toolsdir/libodbc++ +libodbcxx_version=libodbc++-0.2.3-20050404 +libodbcxx_tmpdir=$tools_tmpdir/libodbc++ + +xmlrpcxx_dir=$toolsdir/xmlrpc++ +xmlrpcxx_version=xmlrpc++-20040713 +xmlrpcxx_tmpdir=$tools_tmpdir/xmlrpc++ + +lcov_dir=$toolsdir/lcov +lcov_version=lcov-1.3 +lcov_tmpdir=$tools_tmpdir/lcov + +gtk_dir=$toolsdir/gtk+ +gtk_version=gtk+-2.6.10 +gtk_tmpdir=$tools_tmpdir/gtk+ + +gtkmm_dir=$toolsdir/gtkmm +gtkmm_version=gtkmm-2.6.5 +gtkmm_tmpdir=$tools_tmpdir/gtkmm + +gstreamer_dir=$toolsdir/gstreamer +gstreamer_version=gstreamer-0.8.12 +gstreamer_tmpdir=$tools_tmpdir/gstreamer + +icu_dir=$toolsdir/icu +icu_version=icu-3.0 +icu_tmpdir=$tools_tmpdir/icu + +curl_dir=$toolsdir/curl +curl_version=curl-7.12.3 +curl_tmpdir=$tools_tmpdir/curl + +taglib_dir=$toolsdir/taglib +taglib_version=taglib-1.4 +taglib_tmpdir=$tools_tmpdir/taglib + +pear_dir=$toolsdir/pear +pear_tmpdir=$tools_tmpdir/pear + +#------------------------------------------------------------------------------- +# Create the sources tarball first +#------------------------------------------------------------------------------- +echo "Creating $tarball..."; + + +#------------------------------------------------------------------------------- +# Create the directories again +#------------------------------------------------------------------------------- +mkdir -p $ls_tmpdir +mkdir -p $ls_tmpdir/usr +mkdir -p $tmp_tmpdir +mkdir -p $src_tmpdir +mkdir -p $modules_tmpdir +mkdir -p $products_tmpdir + + +#------------------------------------------------------------------------------- +# Copy the modules and products +#------------------------------------------------------------------------------- +cp -pPR $modules_dir/* $modules_tmpdir +cp -pPR $products_dir/* $products_tmpdir + + +#------------------------------------------------------------------------------- +# Copy additional files +#------------------------------------------------------------------------------- +cp -pPR $bindir $ls_tmpdir +cp -pPR $docdir $ls_tmpdir +cp -pPR $etcdir $ls_tmpdir +cp -pPR README INSTALL configure $ls_tmpdir + + +#------------------------------------------------------------------------------- +# Get rid of the remnants of the subversion system +#------------------------------------------------------------------------------- +rm -rf `find $ls_tmpdir -name .svn -type d` + + +#------------------------------------------------------------------------------- +# Create the main configure script +#------------------------------------------------------------------------------- +cd $tmpdir/campcaster-$version +./bin/autogen.sh +cd $basedir + + +#------------------------------------------------------------------------------- +# Create the tarball +#------------------------------------------------------------------------------- +cd $tmpdir +tar cfj $tarball campcaster-$version +cd $basedir + + +#------------------------------------------------------------------------------- +# Create the libraries tarball second +#------------------------------------------------------------------------------- +echo "Creating $tarball_libs..."; + + +#------------------------------------------------------------------------------- +# Create temprorary directory structure again +#------------------------------------------------------------------------------- +rm -rf $ls_tmpdir +mkdir -p $ls_tmpdir +mkdir -p $tools_tmpdir + + +#------------------------------------------------------------------------------- +# Copy needed files to the temporary directory +#------------------------------------------------------------------------------- + + +#------------------------------------------------------------------------------- +# Copy the tools sources +#------------------------------------------------------------------------------- +mkdir -p $boost_tmpdir +cp -pPR $boost_dir/$boost_version $boost_tmpdir + +mkdir -p $libxmlxx_tmpdir +cp -pPR $libxmlxx_dir/$libxmlxx_version $libxmlxx_tmpdir + +mkdir -p $cxxunit_tmpdir +cp -pPR $cxxunit_dir/$cxxunit_version $cxxunit_tmpdir + +mkdir -p $libodbcxx_tmpdir +cp -pPR $libodbcxx_dir/$libodbcxx_version $libodbcxx_tmpdir + +mkdir -p $xmlrpcxx_tmpdir +cp -pPR $xmlrpcxx_dir/$xmlrpcxx_version $xmlrpcxx_tmpdir + +mkdir -p $lcov_tmpdir +cp -pPR $lcov_dir/$lcov_version $lcov_tmpdir + +mkdir -p $gtk_tmpdir +cp -pPR $gtk_dir/$gtk_version $gtk_tmpdir + +mkdir -p $gtkmm_tmpdir +cp -pPR $gtkmm_dir/$gtkmm_version $gtkmm_tmpdir + +mkdir -p $gstreamer_tmpdir +cp -pPR $gstreamer_dir/$gstreamer_version $gstreamer_tmpdir + +mkdir -p $icu_tmpdir +cp -pPR $icu_dir/$icu_version $icu_tmpdir + +mkdir -p $curl_tmpdir +cp -pPR $curl_dir/$curl_version $curl_tmpdir + +mkdir -p $taglib_tmpdir +cp -pPR $taglib_dir/$taglib_version $taglib_tmpdir + +mkdir -p $pear_tmpdir +cp -pPR $pear_dir/* $pear_tmpdir + + +#------------------------------------------------------------------------------- +# Get rid of the remnants of the subversion system +#------------------------------------------------------------------------------- +rm -rf `find $ls_tmpdir -name .svn -type d` + + +#------------------------------------------------------------------------------- +# Create the libraries tarball +#------------------------------------------------------------------------------- +cd $tmpdir +tar cfj $tarball_libs campcaster-$version +cd $basedir + + +#------------------------------------------------------------------------------- +# Clean up +#------------------------------------------------------------------------------- +rm -rf $ls_tmpdir + + +#------------------------------------------------------------------------------- +# We're done +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/gen_coverage_data.sh b/campcaster/bin/gen_coverage_data.sh new file mode 100755 index 000000000..6914efda6 --- /dev/null +++ b/campcaster/bin/gen_coverage_data.sh @@ -0,0 +1,92 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script generates code coverage data for all modules +#------------------------------------------------------------------------------- +module="Campcaster" + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +modules_dir=$srcdir/modules +products_dir=$srcdir/products + +usrdir=`cd $basedir/usr; pwd;` + +coverage_report_dir=$docdir/coverage + +core_coverage_file=$modules_dir/core/tmp/coverage.info +authentication_coverage_file=$modules_dir/authentication/tmp/coverage.info +db_coverage_file=$modules_dir/db/tmp/coverage.info +storageClient_coverage_file=$modules_dir/storageClient/tmp/coverage.info +eventScheduler_coverage_file=$modules_dir/eventScheduler/tmp/coverage.info +schedulerClient_coverage_file=$modules_dir/schedulerClient/tmp/coverage.info +playlistExecutor_coverage_file=$modules_dir/playlistExecutor/tmp/coverage.info +scheduler_coverage_file=$products_dir/scheduler/tmp/coverage.info + +coverage_file=$tmpdir/coverage.info + +lcov=$usrdir/bin/lcov +genhtml=$usrdir/bin/genhtml + + +#------------------------------------------------------------------------------- +# Execute the coverage tests one by one +#------------------------------------------------------------------------------- +$modules_dir/core/bin/gen_coverage_data.sh +$modules_dir/authentication/bin/gen_coverage_data.sh +$modules_dir/db/bin/gen_coverage_data.sh +$modules_dir/storageClient/bin/gen_coverage_data.sh +$modules_dir/eventScheduler/bin/gen_coverage_data.sh +$modules_dir/schedulerClient/bin/gen_coverage_data.sh +$modules_dir/playlistExecutor/bin/gen_coverage_data.sh +$products_dir/scheduler/bin/gen_coverage_data.sh + + +#------------------------------------------------------------------------------- +# Gather all the coverage information into one file +# remove references to the tmp directories, and replace them with the module +# directories themselves. this way the source files are found easlity by lcov +#------------------------------------------------------------------------------- +echo "" > $coverage_file +cat $core_coverage_file | sed -e "s/core\/tmp\//core\//g" >> $coverage_file +cat $authentication_coverage_file | sed -e "s/authentication\/tmp\//authentication\//g" >> $coverage_file +cat $db_coverage_file | sed -e "s/db\/tmp\//db\//g" >> $coverage_file +cat $storageClient_coverage_file | sed -e "s/storageClient\/tmp\//storageClient\//g" >> $coverage_file +cat $eventScheduler_coverage_file | sed -e "s/eventScheduler\/tmp\//eventScheduler\//g" >> $coverage_file +cat $schedulerClient_coverage_file | sed -e "s/schedulerClient\/tmp\//schedulerClient\//g" >> $coverage_file +cat $playlistExecutor_coverage_file | sed -e "s/playlistExecutor\/tmp\//playlistExecutor\//g" >> $coverage_file +cat $scheduler_coverage_file | sed -e "s/scheduler\/tmp\//scheduler\//g" >> $coverage_file + +rm -rf $coverage_report_dir +mkdir -p $coverage_report_dir +$genhtml -t "$module" -o $coverage_report_dir $coverage_file + diff --git a/campcaster/bin/install-sh b/campcaster/bin/install-sh new file mode 100755 index 000000000..1a8353401 --- /dev/null +++ b/campcaster/bin/install-sh @@ -0,0 +1,323 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2005-02-02.21 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= +dstarg= +no_target_directory= + +usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: +-c (ignored) +-d create directories instead of installing files. +-g GROUP $chgrpprog installed files to GROUP. +-m MODE $chmodprog installed files to MODE. +-o USER $chownprog installed files to USER. +-s $stripprog installed files. +-t DIRECTORY install into DIRECTORY. +-T report an error if DSTFILE is a directory. +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -c) shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit $?;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t) dstarg=$2 + shift + shift + continue;; + + -T) no_target_directory=true + shift + continue;; + + --version) echo "$0 $scriptversion"; exit $?;; + + *) # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + test -n "$dir_arg$dstarg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + src= + + if test -d "$dst"; then + mkdircmd=: + chmodcmd= + else + mkdircmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" + + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + shift + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test -d "$pathcomp" || exit + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $mkdircmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Copy the file name to the temp name. + $doit $cpprog "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit 1 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit 1; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit 0 +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/campcaster/bin/livesupport-station b/campcaster/bin/livesupport-station new file mode 100755 index 000000000..20985f0ee --- /dev/null +++ b/campcaster/bin/livesupport-station @@ -0,0 +1,57 @@ +#!/bin/sh +# +# + +CAMPCASTER_DIR=/opt/campcaster +CAMPCASTER_BIN=$CAMPCASTER_DIR/bin +CAMPCASTER_ETC=$CAMPCASTER_DIR/etc +CAMPCASTER_LIB=$CAMPCASTER_DIR/lib +GSTREAMER_DIR=`find $CAMPCASTER_LIB -type d -name "gstreamer-*"` + +PATH=/sbin:/bin:/usr/sbin:/usr/bin:$CAMPCASTER_BIN +LD_LIBRARY_PATH=$CAMPCASTER_LIB:$LD_LIBRARY_PATH +DAEMON=$CAMPCASTER_BIN/scheduler +NAME=campcaster-scheduler +DESC="campcaster scheduler" + +test -x $DAEMON || exit 0 + +export PATH +export LD_LIBRARY_PATH + +DAEMON_OPTS="-c $CAMPCASTER_ETC/scheduler.xml" + +set -e + +case "$1" in + start) + echo -n "Starting $DESC: " + $DAEMON -c $CAMPCASTER_ETC/scheduler.xml start > /dev/null + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + $DAEMON -c $CAMPCASTER_ETC/scheduler.xml stop > /dev/null + echo "$NAME." + ;; + restart|force-reload) + echo -n "Restarting $DESC: " + $DAEMON -c $CAMPCASTER_ETC/scheduler.xml stop > /dev/null + sleep 1 + $DAEMON -c $CAMPCASTER_ETC/scheduler.xml start > /dev/null + echo "$NAME." + ;; + kill) + echo -n "Killing $DESC: " + $DAEMON -c $CAMPCASTER_ETC/scheduler.xml kill > /dev/null + echo "$NAME." + ;; + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload|kill}" >&2 + exit 1 + ;; +esac + +exit 0 + diff --git a/campcaster/bin/nightlyBuild.sh b/campcaster/bin/nightlyBuild.sh new file mode 100755 index 000000000..c0737c3a0 --- /dev/null +++ b/campcaster/bin/nightlyBuild.sh @@ -0,0 +1,72 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# This script generates the nightly builds and logs. +#------------------------------------------------------------------------------- + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=${basedir}/bin +tmpdir=${basedir}/tmp +logdir=${basedir}/tmp + +cd ${basedir} + + +#------------------------------------------------------------------------------- +# Update the source from the repository. +#------------------------------------------------------------------------------- +mv -f ${logdir}/nightlySvnUpdate.log ${logdir}/nightlySvnUpdate.log~ +svn update &> ${logdir}/nightlySvnUpdate.log +ls -l ${logdir}/nightlySvnUpdate.log >> ${logdir}/nightlySvnUpdate.log + + +#------------------------------------------------------------------------------- +# Recompile the code. +#------------------------------------------------------------------------------- +mv -f ${logdir}/nightlyMakeRecompile.log ${logdir}/nightlyMakeRecompile.log~ +make recompile &> ${logdir}/nightlyMakeRecompile.log +ls -l ${logdir}/nightlyMakeRecompile.log >> ${logdir}/nightlyMakeRecompile.log + + +#------------------------------------------------------------------------------- +# Run the unit tests. +#------------------------------------------------------------------------------- +mv -f ${logdir}/nightlyMakeCheck.log ${logdir}/nightlyMakeCheck.log~ +make check &> ${logdir}/nightlyMakeCheck.log +ls -l ${logdir}/nightlyMakeCheck.log >> ${logdir}/nightlyMakeCheck.log + + +#------------------------------------------------------------------------------- +# Generate the documentation. +#------------------------------------------------------------------------------- +mv -f ${logdir}/nightlyMakeDoc.log ${logdir}/nightlyMakeDoc.log~ +make doc &> ${logdir}/nightlyMakeDoc.log +ls -l ${logdir}/nightlyMakeDoc.log >> ${logdir}/nightlyMakeDoc.log + diff --git a/campcaster/bin/postInstallStation.sh b/campcaster/bin/postInstallStation.sh new file mode 100755 index 000000000..0fbff0969 --- /dev/null +++ b/campcaster/bin/postInstallStation.sh @@ -0,0 +1,470 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script makes post-installation steps for the Campcaster Station. +# +# Invoke as: +# ./bin/postInstallStation.sh +# +# To get usage help, try the -h option +# +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster Station post-install script."; + echo "parameters"; + echo ""; + echo " -d, --directory The installation directory, required."; + echo " -D, --database The name of the Campcaster database."; + echo " [default: Campcaster]"; + echo " -g, --apache-group The group the apache daemon runs as."; + echo " [default: www-data]"; + echo " -r, --www-root The root directory for web documents served"; + echo " by apache [default: /var/www]"; + echo " -s, --dbserver The name of the database server host."; + echo " [default: localhost]"; + echo " -u, --dbuser The name of the database user to access the" + echo " database. [default: campcaster]"; + echo " -w, --dbpassword The database user password."; + echo " [default: campcaster]"; + echo " -p, --postgresql-dir The postgresql data directory, containing"; + echo " pg_hba.conf [default: /etc/postgresql]"; + echo " -i, --postgresql-init-script The name of the postgresql init"; + echo " script [default: /etc/init.d/postgresql]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o d:D:g:hi:p:r:s:u:w: -l apache-group:,database:,dbserver:,dbuser:,dbpassword:,directory:,help,postgresql-dir:,postgresql-init-script:,www-root: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -d|--directory) + installdir=$2; + shift; shift;; + -D|--database) + database=$2; + shift; shift;; + -g|--apache-group) + apache_group=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + -i|--postgresql-init-script) + postgresql_init_script=$2; + shift; shift;; + -p|--postgresql-dir) + postgresql_dir=$2; + shift; shift;; + -r|--www-root) + www_root=$2; + shift; shift;; + -s|--dbserver) + dbserver=$2; + shift; shift;; + -u|--dbuser) + dbuser=$2; + shift; shift;; + -w|--dbpassword) + dbpassword=$2; + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$installdir" == "x" ]; then + echo "Required parameter install directory not specified."; + printUsage; + exit 1; +fi + +if [ "x$dbserver" == "x" ]; then + dbserver=localhost; +fi + +if [ "x$database" == "x" ]; then + database=Campcaster; +fi + +if [ "x$dbuser" == "x" ]; then + dbuser=campcaster; +fi + +if [ "x$dbpassword" == "x" ]; then + dbpassword=campcaster; +fi + +if [ "x$apache_group" == "x" ]; then + apache_group=www-data; +fi + +if [ "x$postgresql_dir" == "x" ]; then + postgresql_dir=/etc/postgresql; +fi + +if [ "x$postgresql_init_script" == "x" ]; then + postgresql_init_script=/etc/init.d/postgresql; +fi + +if [ "x$www_root" == "x" ]; then + www_root=/var/www; +fi + +echo "Making post-install steps for Campcaster Station."; +echo ""; +echo "Using the following installation parameters:"; +echo ""; +echo " installation directory: $installdir"; +echo " database server: $dbserver"; +echo " database: $database"; +echo " database user: $dbuser"; +echo " database user password: $dbpassword"; +echo " apache daemon group: $apache_group"; +echo " apache document root: $www_root"; +echo " postgresql data directory: $postgresql_dir"; +echo " postgresql init script: $postgresql_init_script"; +echo "" + +#------------------------------------------------------------------------------- +# The details of installation +#------------------------------------------------------------------------------- +ls_dbserver=$dbserver +ls_dbuser=$dbuser +ls_dbpassword=$dbpassword +ls_database=$database + +postgres_user=postgres + +install_bin=$installdir/bin +install_etc=$installdir/etc +install_lib=$installdir/lib +install_usr=$installdir/usr +install_var_ls=$installdir/var/Campcaster + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Check to see if this script is being run as root +#------------------------------------------------------------------------------- +if [ `whoami` != "root" ]; then + echo "Please run this script as root."; + exit ; +fi + + +#------------------------------------------------------------------------------- +# Check for required tools +#------------------------------------------------------------------------------- +echo "Checking for required tools..." + +check_exe "sed" || exit 1; +check_exe "psql" || exit 1; +check_exe "php" || exit 1; +check_exe "pear" || exit 1; +check_exe "odbcinst" || exit 1; + + +#------------------------------------------------------------------------------- +# Check for the apache group to be a real group +#------------------------------------------------------------------------------- +group_tmp_file=/tmp/ls_group_check.$$ +touch $group_tmp_file +test_result=`chgrp $apache_group $group_tmp_file 2> /dev/null` +if [ $? != 0 ]; then + rm -f $group_tmp_file; + echo "Unable to use apache deamon group $apache_group."; + echo "Please check if $apache_group is a correct user group."; + exit 1; +fi +rm -f $group_tmp_file; + + +#------------------------------------------------------------------------------- +# Install the new pg_hba.conf file +#------------------------------------------------------------------------------- +echo "Modifying postgresql access permissions..."; + +pg_config_dir=$postgresql_dir +pg_config_file=pg_hba.conf +pg_config_file_saved=pg_hba.conf.before-campcaster + +if [ -f $pg_config_dir/$pg_config_file ] ; then + mv -f $pg_config_dir/$pg_config_file $pg_config_dir/$pg_config_file_saved ; +fi +cp $install_etc/$pg_config_file $pg_config_dir/$pg_config_file +chown root:$postgres_user $pg_config_dir/$pg_config_file + +# don't use restart for the init script, as it might return prematurely +# and in the later call to psql we wouldn't be able to connect +${postgresql_init_script} stop +${postgresql_init_script} start + + +#------------------------------------------------------------------------------- +# Create the necessary database user and database itself +#------------------------------------------------------------------------------- +echo "Creating database and database user..."; + +# FIXME: the below might not work for remote databases + +if [ "x$ls_dbserver" == "xlocalhost" ]; then + su - $postgres_user -c "echo \"CREATE USER $ls_dbuser \ + ENCRYPTED PASSWORD '$ls_dbpassword' \ + CREATEDB NOCREATEUSER;\" \ + | psql template1" \ + || echo "Couldn't create database user $ls_dbuser."; + + su - $postgres_user -c "echo \"CREATE DATABASE \\\"$ls_database\\\" \ + OWNER $ls_dbuser ENCODING 'utf-8';\" \ + | psql template1" \ + || echo "Couldn't create database $ls_database."; +else + echo "Unable to automatically create database user and table for"; + echo "remote database $ls_dbserver."; + echo "Make sure to create database user $ls_dbuser with password"; + echo "$ls_dbpassword on database server at $ls_dbserver."; + echo "Also create a database called $ls_database, owned by this user."; + echo ""; + echo "The easiest way to achieve this is by issuing the following SQL"; + echo "commands to PostgreSQL:"; + echo "CREATE USER $ls_dbuser"; + echo " ENCRYPTED PASSWORD '$ls_dbpassword'"; + echo " CREATEDB NOCREATEUSER;"; + echo "CREATE DATABASE \"$ls_database\""; + echo " OWNER $ls_dbuser ENCODING 'utf-8';"; +fi + + +# TODO: check for the success of these operations somehow + + +#------------------------------------------------------------------------------- +# Create the ODBC data source and driver +#------------------------------------------------------------------------------- +echo "Creating ODBC data source and driver..."; + +if [ -f /usr/lib/libodbcpsql.so ]; then + odbcinst_template=$install_etc/odbcinst_template +elif [ -f /usr/lib/odbc/psqlodbc.so ]; then + odbcinst_template=$install_etc/odbcinst_old_debian_template +elif [ -f /usr/lib/odbc/psqlodbcw.so ]; then + odbcinst_template=$install_etc/odbcinst_new_debian_template +else + echo "###############################" + echo "Postgresql driver for unixODBC not found;" + echo "please register the PostgreSQL ODBC driver manually." + echo "###############################" +fi +odbc_template=$install_etc/odbc_template +odbc_template_tmp=/tmp/odbc_template.$$ + +# check for an existing PostgreSQL ODBC driver, and only install if necessary +odbcinst_res=`odbcinst -q -d | grep "\[PostgreSQL\]"` +if [ "x$odbcinst_template" != "x" ] && [ "x$odbcinst_res" == "x" ]; then + echo "Registering ODBC PostgreSQL driver..."; + odbcinst -i -d -v -f $odbcinst_template || exit 1; +fi + +echo "Registering Campcaster ODBC data source..."; +odbcinst -i -s -l -f $odbc_template || exit 1; + + +#------------------------------------------------------------------------------- +# Install PEAR packages (locally in the Campcaster) +# only if necessary +#------------------------------------------------------------------------------- +if [ -f $install_usr/lib/pear/bin/install.sh ]; then + $install_usr/lib/pear/bin/install.sh -d $installdir || exit 1; +fi + + +#------------------------------------------------------------------------------- +# Setup directory permissions +#------------------------------------------------------------------------------- +echo "Setting up directory permissions..." + +chgrp $apache_group $install_var_ls/archiveServer/var/stor +chgrp $apache_group $install_var_ls/archiveServer/var/access +chgrp $apache_group $install_var_ls/archiveServer/var/trans +chgrp $apache_group $install_var_ls/archiveServer/var/stor/buffer + +chmod g+sw $install_var_ls/archiveServer/var/stor +chmod g+sw $install_var_ls/archiveServer/var/access +chmod g+sw $install_var_ls/archiveServer/var/trans +chmod g+sw $install_var_ls/archiveServer/var/stor/buffer + +chgrp $apache_group $install_var_ls/storageServer/var/stor +chgrp $apache_group $install_var_ls/storageServer/var/access +chgrp $apache_group $install_var_ls/storageServer/var/trans +chgrp $apache_group $install_var_ls/storageServer/var/stor/buffer + +chmod g+sw $install_var_ls/storageServer/var/stor +chmod g+sw $install_var_ls/storageServer/var/access +chmod g+sw $install_var_ls/storageServer/var/trans +chmod g+sw $install_var_ls/storageServer/var/stor/buffer + +chgrp $apache_group $install_var_ls/htmlUI/var/templates_c +chgrp $apache_group $install_var_ls/htmlUI/var/html/img + +chmod g+sw $install_var_ls/htmlUI/var/templates_c +chmod g+sw $install_var_ls/htmlUI/var/html/img + +#------------------------------------------------------------------------------- +# Configuring Apache +#------------------------------------------------------------------------------- +echo "Configuring apache ..." +CONFFILE=90_php_campcaster.conf +AP_DDIR_FOUND=no +for APACHE_DDIR in \ + /etc/apache/conf.d /etc/apache2/conf.d /etc/apache2/conf/modules.d \ + /etc/httpd/conf.d +do + echo -n "$APACHE_DDIR " + if [ -d $APACHE_DDIR ]; then + echo "Y" + AP_DDIR_FOUND=yes + cp $basedir/etc/apache/$CONFFILE $APACHE_DDIR + break + else + echo "N" + fi +done +if [ "$AP_DDIR_FOUND" != "yes" ]; then + echo "###############################" + echo " Could not configure Apache" + echo " include following file into apache config manually:" + echo " $basedir/etc/apache/$CONFFILE" + echo "###############################" +fi +echo "done" + +echo "Restarting apache..."; +AP_SCR_FOUND=no +for APACHE_SCRIPT in apache apache2 httpd ; do + echo -n "$APACHE_SCRIPT " + if [ -x /etc/init.d/$APACHE_SCRIPT ]; then + echo "Y" + AP_SCR_FOUND=yes + /etc/init.d/$APACHE_SCRIPT restart + else + echo "N" + fi +done +if [ "$AP_SCR_FOUND" != "yes" ]; then + echo "###############################" + echo " Could not reload Apache" + echo " please reload apache manually" + echo "###############################" +fi +echo "done" + + +#------------------------------------------------------------------------------- +# Create symlinks +#------------------------------------------------------------------------------- +echo "Creating symlinks..."; + +# create symlink for the PHP pages in apache's document root +rm -f $www_root/campcaster +ln -s $install_var_ls $www_root/campcaster + + +#------------------------------------------------------------------------------- +# Initialize the database +#------------------------------------------------------------------------------- +echo "Initializing database..."; + +# create PHP-related database tables +cd $install_var_ls/storageServer/var/install +php -q install.php || exit 1; +cd - + +# create scheduler-related database tables +cd $installdir +./bin/scheduler.sh install || exit 1; +cd - + + +#------------------------------------------------------------------------------- +# Create the gstreamer registry +#------------------------------------------------------------------------------- +echo "Creating gstreamer registry..."; + +gstreamer_dir=`find $install_lib -type d -name "gstreamer-*"` +export LD_LIBRARY_PATH=$install_lib +export GST_REGISTRY=$install_etc/gst-registry.xml +export GST_PLUGIN_PATH=$gstreamer_dir +$install_bin/gst-register > /dev/null 2>&1 + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/postUninstall.sh b/campcaster/bin/postUninstall.sh new file mode 100755 index 000000000..b6fe0e357 --- /dev/null +++ b/campcaster/bin/postUninstall.sh @@ -0,0 +1,264 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script makes post-uninstallation steps for Campcaster. +# +# Invoke as: +# ./bin/postUninstall.sh +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +tmpdir=$basedir/tmp + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster post-uninstall script."; + echo "parameters"; + echo ""; + echo " -d, --directory The installation directory, required."; + echo " -D, --database The name of the Campcaster database."; + echo " [default: Campcaster]"; + echo " -r, --www-root The root directory for web documents served"; + echo " by apache [default: /var/www]"; + echo " -s, --dbserver The name of the database server host."; + echo " [default: localhost]"; + echo " -u, --dbuser The name of the database user to access the" + echo " database. [default: campcaster]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o d:D:hr:s:u: -l database:,dbserver:,dbuser:,directory:,help,www-root: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -d|--directory) + installdir=$2; + shift; shift;; + -D|--database) + database=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + -r|--www-root) + www_root=$2; + shift; shift;; + -s|--dbserver) + dbserver=$2; + shift; shift;; + -u|--dbuser) + dbuser=$2; + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$installdir" == "x" ]; then + echo "Required parameter install directory not specified."; + printUsage; + exit 1; +fi + +if [ "x$dbserver" == "x" ]; then + dbserver=localhost; +fi + +if [ "x$database" == "x" ]; then + database=Campcaster; +fi + +if [ "x$dbuser" == "x" ]; then + dbuser=campcaster; +fi + +if [ "x$www_root" == "x" ]; then + www_root=/var/www +fi + + +echo "Making post-uninstall steps for Campcaster."; +echo ""; +echo "Using the following installation parameters:"; +echo ""; +echo " installation directory: $installdir"; +echo " database server: $dbserver"; +echo " database: $database"; +echo " database user: $dbuser"; +echo " apache document root: $www_root"; +echo "" + +#------------------------------------------------------------------------------- +# The details of installation +#------------------------------------------------------------------------------- +ls_dbserver=$dbserver +ls_dbuser=$dbuser +ls_database=$database + + +postgres_user=postgres + +install_bin=$installdir/bin +install_etc=$installdir/etc +install_lib=$installdir/lib +install_tmp=$installdir/tmp +install_var=$installdir/var + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Check to see if this script is being run as root +#------------------------------------------------------------------------------- +if [ `whoami` != "root" ]; then + echo "Please run this script as root."; + exit ; +fi + + +#------------------------------------------------------------------------------- +# Check for required tools +#------------------------------------------------------------------------------- +echo "Checking for required tools..." + +check_exe "psql" || exit 1; +check_exe "odbcinst" || exit 1; + + +#------------------------------------------------------------------------------- +# Remove symlinks +#------------------------------------------------------------------------------- +echo "Removing symlinks..."; + +# remove symlink for the PHP pages in apache's document root +rm -f $www_root/campcaster + + +#------------------------------------------------------------------------------- +# Delete data files +#------------------------------------------------------------------------------- +echo "Deleting data files..."; + +rm -rf $installdir/var/htmlUI/var/html/img/* +rm -rf $installdir/var/htmlUI/var/templates_c/* +rm -rf $installdir/var/storageServer/var/stor/* +rm -rf $installdir/var/storageServer/var/access/* +rm -rf $installdir/var/storageServer/var/trans/* +rm -rf $installdir/var/archiveServer/var/stor/* +rm -rf $installdir/var/archiveServer/var/access/* +rm -rf $installdir/var/archiveServer/var/trans/* + + +#------------------------------------------------------------------------------- +# Remove the ODBC data source and driver +#------------------------------------------------------------------------------- +echo "Removing ODBC data source and driver..."; + +echo "Removing Campcaster ODBC data source..."; +odbcinst -u -s -l -n $ls_database || exit 1; + +echo "De-registering ODBC PostgreSQL driver..."; +odbcinst -u -d -v -n PostgreSQL || exit 1; + + +#------------------------------------------------------------------------------- +# Remove the database user and the database itself +#------------------------------------------------------------------------------- +echo "Removing database and database user..."; + +if [ "x$ls_dbserver" == "xlocalhost" ]; then + su - $postgres_user -c "echo \"DROP DATABASE \\\"$ls_database\\\" \"\ + | psql template1" \ + || echo "Couldn't drop database $ls_database."; + + su - $postgres_user -c "echo \"DROP USER $ls_dbuser \"\ + | psql template1" \ + || echo "Couldn't drop database user $ls_dbuser."; + +else + echo "Unable to automatically drop database user and table for"; + echo "remote database $ls_dbserver."; + echo "Make sure to drop database user $ls_dbuser on database server"; + echo "at $ls_dbserver."; + echo "Also drop the database called $ld_database, owned by this user."; + echo ""; + echo "The easiest way to achieve this is by issuing the following SQL"; + echo "commands to PostgreSQL:"; + echo "DROP DATABASE \"$ls_database\";"; + echo "DROP USER $ls_dbuser;"; +fi + + +# TODO: check for the success of these operations somehow + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/preInstall.sh b/campcaster/bin/preInstall.sh new file mode 100755 index 000000000..c948b452b --- /dev/null +++ b/campcaster/bin/preInstall.sh @@ -0,0 +1,173 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script makes pre-install steps and checks for Campcaster. +# +# Invoke as: +# ./bin/preInstall.sh +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules +products_dir=$srcdir/products + +usrdir=`cd $basedir/usr; pwd;` + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster pre-install script."; + echo "parameters"; + echo ""; + echo " -g, --apache-group The group the apache daemon runs as."; + echo " [default: apache]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o g:h -l apache-group:,help -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -g|--apache-group) + apache_group=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$apache_group" == "x" ]; then + apache_group=apache; +fi + + +echo "Making pre-install steps for Campcaster."; +echo ""; +echo "Using the following installation parameters:"; +echo ""; +echo " apache daemon group: $apache_group"; +echo "" + + +#------------------------------------------------------------------------------- +# Check for the apache group to be a real group +#------------------------------------------------------------------------------- +group_tmp_file=/tmp/ls_group_check.$$ +touch $group_tmp_file +test_result=`chgrp $apache_group $group_tmp_file 2> /dev/null` +if [ $? != 0 ]; then + rm -f $group_tmp_file; + echo "Unable to use apache deamon group $apache_group."; + echo "Please check if $apache_group is a correct user group."; + exit 1; +fi +rm -f $group_tmp_file; + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Function to check for a PEAR module +# +# @param $1 the name of the PEAR module +# @return 0 if the module is available, non-0 otherwise +#------------------------------------------------------------------------------- +check_pear_module() { + test_result=`pear info $1` + if [ $? = 0 ]; then + echo "PEAR module $1 found..."; + return 0; + else + echo "PEAR module $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Check for required tools +#------------------------------------------------------------------------------- +echo "Checking for required tools..." + +check_exe "sed" || exit 1; +check_exe "psql" || exit 1; +check_exe "php" || exit 1; +check_exe "pear" || exit 1; +check_exe "odbcinst" || exit 1; + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/setupDevelopmentEnvironment.sh b/campcaster/bin/setupDevelopmentEnvironment.sh new file mode 100755 index 000000000..fb2c77ad5 --- /dev/null +++ b/campcaster/bin/setupDevelopmentEnvironment.sh @@ -0,0 +1,126 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# A script to set up the development environment for Campcaster +# +# Invoke as: +# ./bin/setupDevelopmentEnvironment.sh +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules +products_dir=$srcdir/products + +usrdir=`cd $basedir/usr; pwd;` + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster development environment setup script."; + echo "parameters"; + echo ""; + echo " -g, --apache-group The group the apache daemon runs as."; + echo " [default: apache]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o g:h -l apache-group:,help -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -g|--apache-group) + apache_group=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$apache_group" == "x" ]; then + apache_group=apache; +fi + + +#------------------------------------------------------------------------------- +# Create the configure script +#------------------------------------------------------------------------------- +rm -rf $tmpdir/configure +$bindir/autogen.sh || exit 1 +$basedir/configure --prefix=$usrdir \ + --with-www-docroot=$usrdir/var \ + --with-apache-group=$apache_group \ + --enable-debug || exit 1 + + +#------------------------------------------------------------------------------- +# Compile everything at once, including the tools +#------------------------------------------------------------------------------- +make -C $basedir all || exit 1 + + +#------------------------------------------------------------------------------- +# User setup +#------------------------------------------------------------------------------- +#echo "Setting up user settings..." + +$bindir/user_setup.sh --apache-group=$apache_group || exit 1 + + +#------------------------------------------------------------------------------- +# We're done +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/setupDevelopmentEnvironmentAndLog.sh b/campcaster/bin/setupDevelopmentEnvironmentAndLog.sh new file mode 100755 index 000000000..a99066af6 --- /dev/null +++ b/campcaster/bin/setupDevelopmentEnvironmentAndLog.sh @@ -0,0 +1,222 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# A script to set up the development environment for Campcaster +# +# Invoke as: +# ./bin/setupDevelopmentEnvironmentAndLog.sh +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +tmpdir=$basedir/tmp +logdir=$basedir/tmp + +usrdir=`cd $basedir/usr; pwd;` + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster development environment setup script."; + echo "parameters"; + echo ""; + echo " -g, --apache-group The group the apache daemon runs as."; + echo " [default: apache]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o g:h -l apache-group:,help -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -g|--apache-group) + apache_group=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$apache_group" = "x" ]; then + apache_group=apache; +fi + + +#------------------------------------------------------------------------------ +# All steps are being logged +#------------------------------------------------------------------------------ +echo ""; +echo "The compile process will be started. All steps are being logged in"; +echo "$logdir "; +echo ""; + +#------------------------------------------------------------------------------ +# Cleaning the setup +#------------------------------------------------------------------------------ +mv -f $logdir/make_modprod_distclean_setup.log \ + $logdir/make_modprod_distclean_setup.log~ +make -C $basedir modprod_distclean \ + > $logdir/make_modprod_distclean_setup.log 2>&1 +ls -l $logdir/make_modprod_distclean_setup.log \ + >> $logdir/make_modprod_distclean_setup.log + +#------------------------------------------------------------------------------- +# Create the configure script, using setup parameters +#------------------------------------------------------------------------------- +# --prefix=$usrdir --with-www-docroot=$usrdir/var =/var/www +# --with-hostname=localhost --with-apache-group=$apache_group +# --enable-debug --with-configure-apache=no =yes +# +# --with-check-boost=no =yes --with-check-gtk=yes =no +# --with-check-gtkmm=yes =no --with-check-icu=yes =no +# --with-check-libxmlpp=yes =no +# +# --with-create-database=no =yes --with-create-odbc-data-source=no =yes +# --with-init-database=no =yes +# +# --with-database=Campcaster =Campcaster-test +# --with-database-user=campcaster =test +# --with-database-password=campcaster =test +# +# --with-station-audio-out=default +# --with-studio-audio-out=default +# --with-studio-audio-cue=default + +rm -rf $tmpdir/configure +echo "Now Configure ... "; +mv -f $logdir/configure_development_environment_autogen.log \ + $logdir/configure_development_environment_autogen.log~ +mv -f $logdir/configure_development_environment.log \ + $logdir/configure_development_environment.log~ +$bindir/autogen.sh \ + > $logdir/configure_development_environment_autogen.log 2>&1 +$basedir/configure --with-hostname=localhost --with-www-docroot=$usrdir/var \ + --prefix=$usrdir --with-apache-group=$apache_group \ + --with-check-boost=yes --with-check-gtk=yes \ + --with-check-gtkmm=yes --with-check-icu=yes \ + --with-check-libxmlpp=yes --enable-debug \ + > $logdir/configure_development_environment.log 2>&1 +echo ""; +echo "Configure is done, configure_development_environment.log is created"; +echo ""; + + +#------------------------------------------------------------------------------- +# Compile step by step, including the tools +#------------------------------------------------------------------------------- +echo "Now Compiling ... Tools"; +mv -f $logdir/make_install_tools_setup.log \ + $logdir/make_install_tools_setup.log~ +make -C $basedir tools_setup \ + > $logdir/make_install_tools_setup.log 2>&1 +ls -l $logdir/make_install_tools_setup.log \ + >> $logdir/make_install_tools_setup.log +echo "Done Tools Setup, make_install_tools_setup.log is created"; +echo ""; +echo "Now Compiling ... Doxytag"; +mv -f $logdir/make_doxytag_setup.log \ + $logdir/make_doxytag_setup.log~ +make -C $basedir doxytag_setup \ + > $logdir/make_doxytag_setup.log 2>&1 +ls -l $logdir/make_doxytag_setup.log \ + >> $logdir/make_doxytag_setup.log +echo "Done Doxytag Setup, make_doxytag_setup.log is created"; +echo ""; +echo "Now Configure ... Modules ... Products"; +mv -f $logdir/make_configure_modules_setup.log \ + $logdir/make_configure_modules_setup.log~ +make -C $basedir modules_setup \ + > $logdir/make_configure_modules_setup.log 2>&1 +ls -l $logdir/make_configure_modules_setup.log \ + >> $logdir/make_configure_modules_setup.log +echo "Configure the Modules is done, make_configure_modules_setup.log is created"; +mv -f $logdir/make_configure_products_setup.log \ + $logdir/make_configure_products_setup.log~ +make -C $basedir products_setup \ + > $logdir/make_configure_products_setup.log 2>&1 +ls -l $logdir/make_configure_products_setup.log \ + >> $logdir/make_configure_products_setup.log +echo "Configure the Products is done, make_configure_products_setup.log is created"; +echo ""; +echo "Now Compiling ..."; +mv -f $logdir/make_compile_setup.log \ + $logdir/make_compile_setup.log~ +make -C $basedir compile \ + > $logdir/make_compile_setup.log 2>&1 +ls -l $logdir/make_compile_setup.log \ + >> $logdir/make_compile_setup.log +echo "Compiling is done, make_compile_setup.log is created"; +echo ""; + +#------------------------------------------------------------------------------- +# Checking what we have done +#------------------------------------------------------------------------------- +echo "Now Checking ..."; +mv -f $logdir/make_check_setup.log \ + $logdir/make_check_setup.log~ +make -C $basedir check \ + > $logdir/make_check_setup.log 2>&1 +ls -l $logdir/make_check_setup.log \ + >> $logdir/make_check_setup.log +echo "Checking is be done, make_check_setup.log is created"; +echo ""; + +#------------------------------------------------------------------------------- +# User setup +#------------------------------------------------------------------------------- +echo "Setting up user settings ..."; + +$bindir/user_setup.sh --apache-group=$apache_group || exit 1 + + +#------------------------------------------------------------------------------- +# We're done +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/svnUpdate.sh b/campcaster/bin/svnUpdate.sh new file mode 100755 index 000000000..06a2b6010 --- /dev/null +++ b/campcaster/bin/svnUpdate.sh @@ -0,0 +1,49 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# This script runs cvs to update the Campcaster source code. +#------------------------------------------------------------------------------- + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +tmpdir=$basedir/tmp +logdir=$basedir/tmp + +echo ""; +echo "The Campcaster source code will be updated now ... and logged in"; +echo "$logdir"; +echo ""; + +cd $bindir/.. +svn update >& $logdir/svn_update.log +ls -l $logdir/svn_update.log >> $logdir/svn_update.log +cat $logdir/svn_update.log +echo ""; +echo "The svn update is done, svn_update.log is created"; diff --git a/campcaster/bin/test_setup_db.sh b/campcaster/bin/test_setup_db.sh new file mode 100755 index 000000000..fc1ce4694 --- /dev/null +++ b/campcaster/bin/test_setup_db.sh @@ -0,0 +1,83 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script sets up the test database for Campcaster +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules +products_dir=$srcdir/products + +scheduler_dir=${products_dir}/scheduler +scheduler_bindir=${scheduler_dir}/bin + +usrdir=`cd $basedir/usr; pwd;` + +installlog=/tmp/campcaster_install.log + + +#------------------------------------------------------------------------------- +# The details of the setup +#------------------------------------------------------------------------------- +ls_database=Campcaster-test +ls_dbuser=test +ls_dbpassword=test +ls_dbserver=localhost + + +#------------------------------------------------------------------------------- +# Create the necessary database user and database itself +#------------------------------------------------------------------------------- +${scheduler_bindir}/createDatabase.sh --database=${ls_database} \ + --dbuser=${ls_dbuser} \ + --dbpassword=${ls_dbpassword} \ + --dbserver=${ls_dbserver} + + +#------------------------------------------------------------------------------- +# Create the ODBC data source and driver +#------------------------------------------------------------------------------- +${scheduler_bindir}/createOdbcDataSource.sh --database=${ls_database} \ + --dbserver=${ls_dbserver} + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/updateStudioConfig.sh b/campcaster/bin/updateStudioConfig.sh new file mode 100755 index 000000000..b003201fb --- /dev/null +++ b/campcaster/bin/updateStudioConfig.sh @@ -0,0 +1,241 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script updates the configuration file of Campcaster Studio. +# +# Invoke as: +# ./bin/updateStudioConfig.sh +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +tmpdir=$basedir/tmp + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster Studio post-install script."; + echo "parameters"; + echo ""; + echo " -d, --directory The installation directory, required."; + echo " -H, --host The fully qualified host name of the system"; + echo " [default: guess]."; + echo " -p, --port The port of the apache web server [default: 80]" + echo " -P, --scheduler-port The port of the scheduler daemon to install" + echo " [default: 3344]"; + echo " -o, --output-device The audio device of live-mode broadcast"; + echo " [default: default]"; + echo " -c, --cue-device The audio device of preview listening"; + echo " [default: default]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o d:H:hp:P:c:o: -l directory:,host:,help,port:,scheduler-port:,cue-device:,output-device: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -d|--directory) + installdir=$2; + shift; shift;; + -H|--host) + hostname=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + -p|--port) + http_port=$2; + shift; shift;; + -P|--scheduler-port) + scheduler_port=$2; + shift; shift;; + -o|--output-device) + output_alsa_device=$2; + shift; shift;; + -c|--cue-device) + cue_alsa_device=$2; + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$installdir" == "x" ]; then + echo "Required parameter install directory not specified."; + printUsage; + exit 1; +fi + +if [ "x$hostname" == "x" ]; then + hostname=`hostname -f`; +fi + +if [ "x$http_port" == "x" ]; then + http_port=80; +fi + +if [ "x$scheduler_port" == "x" ]; then + scheduler_port=3344; +fi + +if [ "x$output_alsa_device" == "x" ]; then + output_alsa_device="default"; +fi + +if [ "x$cue_alsa_device" == "x" ]; then + cue_alsa_device="default"; +fi + +echo "Making post-install steps for Campcaster Studio."; +echo ""; +echo "Using the following installation parameters:"; +echo ""; +echo " installation directory: $installdir"; +echo " host name: $hostname"; +echo " web server port: $http_port"; +echo " scheduler port: $scheduler_port"; +echo " live broadcast device: $output_alsa_device"; +echo " preview device: $cue_alsa_device"; +echo "" + +#------------------------------------------------------------------------------- +# The details of installation +#------------------------------------------------------------------------------- +ls_php_host=$hostname +ls_php_port=$http_port +ls_php_urlPrefix=campcaster + +ls_alib_xmlRpcPrefix="xmlrpc/xrLocStor.php" +ls_storage_xmlRpcPrefix="xmlrpc/xrLocStor.php" + +ls_scheduler_host=$hostname +ls_scheduler_port=$scheduler_port +ls_scheduler_urlPrefix= +ls_scheduler_xmlRpcPrefix=RC2 +ls_output_alsa_device=$output_alsa_device +ls_cue_alsa_device=$cue_alsa_device + + +install_bin=$installdir/bin +install_etc=$installdir/etc +install_lib=$installdir/lib +install_tmp=$installdir/tmp +install_var=$installdir/var + + +# replace / characters with a \/ sequence, for sed below +# the sed statement is really "s/\//\\\\\//g", but needs escaping because of +# bash, hence the extra '\' characters +install_var_s=`echo $install_var | sed -e "s/\//\\\\\\\\\//g"` +ls_storage_xmlRpcPrefix_s=`echo $ls_storage_xmlRpcPrefix | \ + sed -e "s/\//\\\\\\\\\//g"` +ls_alib_xmlRpcPrefix_s=`echo $ls_alib_xmlRpcPrefix | sed -e "s/\//\\\\\\\\\//g"` +ls_php_urlPrefix_s=`echo $ls_php_urlPrefix | sed -e "s/\//\\\\\\\\\//g"` +ls_scheduler_urlPrefix_s=`echo $ls_scheduler_urlPrefix | \ + sed -e "s/\//\\\\\\\\\//g"` +ls_scheduler_xmlRpcPrefix_s=`echo $ls_scheduler_xmlRpcPrefix | \ + sed -e "s/\//\\\\\\\\\//g"` +ls_output_alsa_device_s=`echo $ls_output_alsa_device | sed -e "s/\//\\\\\\\\\//g"` +ls_cue_alsa_device_s=`echo $ls_cue_alsa_device | sed -e "s/\//\\\\\\\\\//g"` + +replace_sed_string="s/ls_var_dir/$install_var_s/; \ + s/ls_php_urlPrefix/$ls_php_urlPrefix_s/; \ + s/ls_php_host/$ls_php_host/; \ + s/ls_php_port/$ls_php_port/; \ + s/ls_alib_xmlRpcPrefix/$ls_alib_xmlRpcPrefix_s/; \ + s/ls_audio_output_device/$ls_output_alsa_device_s/; \ + s/ls_audio_cue_device/$ls_cue_alsa_device_s/; \ + s/ls_scheduler_host/$ls_scheduler_host/; \ + s/ls_scheduler_port/$ls_scheduler_port/; \ + s/ls_scheduler_xmlRpcPrefix/$ls_scheduler_xmlRpcPrefix_s/;" + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Check for required tools +#------------------------------------------------------------------------------- +echo "Checking for required tools..." + +check_exe "sed" || exit 1; + + +#------------------------------------------------------------------------------- +# Customize the configuration files with the appropriate values +#------------------------------------------------------------------------------- +echo "Customizing configuration files..." + +# customize the Campcaster Studio config file +cat $install_etc/campcaster-studio.xml.template \ + | sed -e "$replace_sed_string" \ + > $install_etc/campcaster-studio.xml + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/bin/user_setup.sh b/campcaster/bin/user_setup.sh new file mode 100755 index 000000000..de6f92b6a --- /dev/null +++ b/campcaster/bin/user_setup.sh @@ -0,0 +1,390 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script configures the environment for a developer. +# +# Invoke as: +# ./bin/user_setup.sh +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules +products_dir=$srcdir/products +scheduler_dir=$products_dir/scheduler +scheduler_bin_dir=$scheduler_dir/bin + +usrdir=`cd $basedir/usr; pwd;` + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster local user settings setup script."; + echo "parameters"; + echo ""; + echo " -g, --apache-group The group the apache daemon runs as."; + echo " [default: apache]"; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o g:h -l apache-group:,help -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -g|--apache-group) + apache_group=$2; + shift; shift;; + -h|--help) + printUsage; + exit 0;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$apache_group" == "x" ]; then + apache_group=apache; +fi + +scheduler_base_port=3344 + +user=`whoami` +# force localhost always +hostname=localhost +http_port=80 +scheduler_port=`expr $scheduler_base_port + $UID` +dbserver=localhost +database=Campcaster-$user +dbuser=test +dbpassword=test +homedir=$HOME +configdir=$homedir/.campcaster +htmldir=$homedir/public_html +output_device=default +cue_device=default + + +echo "Configuring Campcaster development environment for user $user."; +echo ""; +echo "Using the following installation parameters:"; +echo ""; +echo " host name: $hostname"; +echo " web server port: $http_port"; +echo " scheduler port: $scheduler_port"; +echo " database server: $dbserver"; +echo " database: $database"; +echo " database user: $dbuser"; +echo " database user password: $dbpassword"; +echo " apache daemon group: $apache_group"; +echo " home directory: $homedir"; +echo " configuration directory: $configdir"; +echo " web base directory: $htmldir"; +echo " output audio device: $output_device"; +echo "" + + +# check for the apache group to be a real group +group_tmp_file=/tmp/ls_group_check.$$ +touch $group_tmp_file +test_result=`chgrp $apache_group $group_tmp_file 2> /dev/null` +if [ $? != 0 ]; then + rm -f $group_tmp_file; + echo "Unable to use apache deamon group $apache_group."; + echo "Please check if $apache_group is a correct user group."; + exit 1; +fi +rm -f $group_tmp_file; + + +#------------------------------------------------------------------------------- +# The details of installation +#------------------------------------------------------------------------------- + +installdir=$usrdir + +ls_php_host=$hostname +ls_php_port=$http_port +ls_php_urlPrefix=~$user/campcaster + +ls_alib_xmlRpcPrefix="xmlrpc/xrLocStor.php" +ls_storage_xmlRpcPrefix="xmlrpc/xrLocStor.php" + +ls_dbserver=$dbserver +ls_dbuser=$dbuser +ls_dbpassword=$dbpassword +ls_database=$database + +ls_scheduler_host=$hostname +ls_scheduler_port=$scheduler_port +ls_scheduler_urlPrefix= +ls_scheduler_xmlRpcPrefix=RC2 +ls_tmp_dir=$tmpdir +ls_scheduler_daemon_command="$scheduler_bin_dir/scheduler_devenv.sh" + +ls_audio_output_device=$output_device +ls_audio_cue_device=$cue_device + +# replace / characters with a \/ sequence, for sed below +# the sed statement is really "s/\//\\\\\//g", but needs escaping because of +# bash, hence the extra '\' characters +installdir_s=`echo $installdir | sed -e "s/\//\\\\\\\\\//g"` +ls_storage_xmlRpcPrefix_s=`echo $ls_storage_xmlRpcPrefix | \ + sed -e "s/\//\\\\\\\\\//g"` +ls_alib_xmlRpcPrefix_s=`echo $ls_alib_xmlRpcPrefix | sed -e "s/\//\\\\\\\\\//g"` +ls_php_urlPrefix_s=`echo $ls_php_urlPrefix | sed -e "s/\//\\\\\\\\\//g"` +ls_scheduler_urlPrefix_s=`echo $ls_scheduler_urlPrefix | \ + sed -e "s/\//\\\\\\\\\//g"` +ls_scheduler_xmlRpcPrefix_s=`echo $ls_scheduler_xmlRpcPrefix | \ + sed -e "s/\//\\\\\\\\\//g"` +ls_tmp_dir_s=`echo $ls_tmp_dir | sed -e "s/\//\\\\\\\\\//g"` +ls_scheduler_daemon_command_s=`echo $ls_scheduler_daemon_command | \ + sed -e "s/\//\\\\\\\\\//g"` + +replace_sed_string="s/ls_install_dir/$installdir_s/; \ + s/ls_dbuser/$ls_dbuser/; \ + s/ls_dbpassword/$ls_dbpassword/; \ + s/ls_dbserver/$ls_dbserver/; \ + s/ls_database/$ls_database/; \ + s/ls_storageUrlPath/\/$ls_php_urlPrefix_s\/storageServer\/var/; \ + s/ls_php_urlPrefix/$ls_php_urlPrefix_s/; \ + s/ls_storage_xmlRpcPrefix/$ls_storage_xmlRpcPrefix_s/; \ + s/ls_alib_xmlRpcPrefix/$ls_alib_xmlRpcPrefix_s/; \ + s/ls_php_host/$ls_php_host/; \ + s/ls_php_port/$ls_php_port/; \ + s/ls_archiveUrlPath/\/$ls_php_urlPrefix_s\/archiveServer\/var/; \ + s/ls_scheduler_urlPrefix/$ls_scheduler_urlPrefix_s/; \ + s/ls_scheduler_xmlRpcPrefix/$ls_scheduler_xmlRpcPrefix_s/; \ + s/ls_scheduler_host/$ls_scheduler_host/; \ + s/ls_scheduler_port/$ls_scheduler_port/; \ + s/ls_audio_output_device/$ls_audio_output_device/; \ + s/ls_audio_cue_device/$ls_audio_cue_device/; \ + s/ls_tmp_dir/$ls_tmp_dir_s/; \ + s/ls_scheduler_daemon_command/$ls_scheduler_daemon_command_s/;" +echo +echo $replace_sed_string +echo + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Executable $1 found..."; + return 0; + else + echo "Executable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Function to check for a PEAR module +# +# @param $1 the name of the PEAR module +# @return 0 if the module is available, non-0 otherwise +#------------------------------------------------------------------------------- +check_pear_module() { + test_result=`pear info $1` + if [ $? = 0 ]; then + echo "PEAR module $1 found..."; + return 0; + else + echo "PEAR module $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Check for required tools +#------------------------------------------------------------------------------- +echo "Checking for required tools..." + +check_exe "sed" || exit 1; +check_exe "php" || exit 1; +check_exe "pear" || exit 1; + + +#------------------------------------------------------------------------------- +# Customize the configuration files with the appropriate values +#------------------------------------------------------------------------------- +echo "Customizing configuration files..." + +mkdir -p $configdir + +cat $modules_dir/storageServer/var/conf_only.php.template \ + | sed -e "$replace_sed_string" \ + > $configdir/storageServer.conf.php + +cat $modules_dir/archiveServer/var/conf_only.php.template \ + | sed -e "$replace_sed_string" \ + > $configdir/archiveServer.conf.php + +cat $modules_dir/authentication/etc/webAuthentication.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/webAuthentication.xml + +cat $modules_dir/db/etc/connectionManagerFactory.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/connectionManagerFactory.xml + +cat $modules_dir/db/etc/simpleConnectionManager.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/simpleConnectionManager.xml + +cat $modules_dir/schedulerClient/etc/schedulerClientFactory.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/schedulerClientFactory.xml + +cat $modules_dir/schedulerClient/etc/schedulerDaemonXmlRpcClient.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/schedulerDaemonXmlRpcClient.xml + +cat $modules_dir/storageClient/etc/webAuthenticationClient.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/webAuthenticationClient.xml + +cat $modules_dir/storageClient/etc/webStorage.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/webStorage.xml + +cat $products_dir/scheduler/etc/scheduler.xml.template \ + | sed -e "$replace_sed_string" \ + > $configdir/scheduler.xml + +cat $products_dir/gLiveSupport/etc/campcaster-studio.xml.user-template \ + | sed -e "$replace_sed_string" \ + > $configdir/campcaster-studio.xml + +cat $products_dir/gLiveSupport/etc/authenticationClient.xml.user-template \ + | sed -e "$replace_sed_string" \ + > $configdir/authenticationClient.xml + +cat $products_dir/gLiveSupport/etc/storageClient.xml.user-template \ + | sed -e "$replace_sed_string" \ + > $configdir/storageClient.xml + + +#------------------------------------------------------------------------------- +# Create the public html directory, and links to the PHP directories +#------------------------------------------------------------------------------- +echo "Creating public HTML directory and links to web interfaces..." + +mkdir -p $htmldir + +rm -f $htmldir/campcaster + +ln -s $modules_dir $htmldir/campcaster + + +#------------------------------------------------------------------------------- +# Setup storageServer +#------------------------------------------------------------------------------- +echo "Setting up storageServer..." + +make -C $modules_dir/storageServer storage || exit 1 +make -C $modules_dir/archiveServer storage || exit 1 + + +#------------------------------------------------------------------------------- +# Setup directory permissions +#------------------------------------------------------------------------------- +echo "Setting up directory permissions..." + +chgrp $apache_group $modules_dir/archiveServer/var/stor +chgrp $apache_group $modules_dir/archiveServer/var/access +chgrp $apache_group $modules_dir/archiveServer/var/trans +chgrp $apache_group $modules_dir/archiveServer/var/stor/buffer + +chmod g+sw $modules_dir/archiveServer/var/stor +chmod g+sw $modules_dir/archiveServer/var/access +chmod g+sw $modules_dir/archiveServer/var/trans +chmod g+sw $modules_dir/archiveServer/var/stor/buffer + +chgrp $apache_group $modules_dir/storageServer/var/stor +chgrp $apache_group $modules_dir/storageServer/var/access +chgrp $apache_group $modules_dir/storageServer/var/trans +chgrp $apache_group $modules_dir/storageServer/var/stor/buffer + +chmod g+sw $modules_dir/storageServer/var/stor +chmod g+sw $modules_dir/storageServer/var/access +chmod g+sw $modules_dir/storageServer/var/trans +chmod g+sw $modules_dir/storageServer/var/stor/buffer + +chgrp $apache_group $modules_dir/htmlUI/var/templates_c +chgrp $apache_group $modules_dir/htmlUI/var/html/img + +chmod g+sw $modules_dir/htmlUI/var/templates_c +chmod g+sw $modules_dir/htmlUI/var/html/img + +cp $modules_dir/htmlUI/var/redirect.php $modules_dir/index.php +cp $modules_dir/htmlUI/var/redirect.php $modules_dir/htmlUI/index.php +cp $modules_dir/htmlUI/var/redirect.php $modules_dir/htmlUI/var/index.php + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo ""; +echo "The HTML user interface for the Campcaster development environment"; +echo "for user $user is available at:"; +echo "http://$ls_php_host:$ls_php_port/$ls_php_urlPrefix/htmlUI/var"; +echo ""; +echo "Done." + diff --git a/campcaster/bin/user_setup_db.sh b/campcaster/bin/user_setup_db.sh new file mode 100755 index 000000000..e1680de6c --- /dev/null +++ b/campcaster/bin/user_setup_db.sh @@ -0,0 +1,140 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script sets up the development environment for a user. +# +# Invoke as: +# ./bin/user_setup_root.sh +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +etcdir=$basedir/etc +docdir=$basedir/doc +srcdir=$basedir/src +tmpdir=$basedir/tmp +toolsdir=$srcdir/tools +modules_dir=$srcdir/modules +products_dir=$srcdir/products + +scheduler_dir=${products_dir}/scheduler +scheduler_bindir=${scheduler_dir}/bin + +usrdir=`cd $basedir/usr; pwd;` + + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "Campcaster user database setup script."; + echo "parameters:"; + echo ""; + echo " -u, --user The user to set up the environment for."; + echo " Required parameter."; + echo " -h, --help Print this message and exit."; + echo ""; +} + + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o hu: -l help,user: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -h|--help) + printUsage; + exit 0;; + -u|--user) + user=$2; + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$user" == "x" ]; then + echo "Required parameter user missing."; + printUsage; + exit 1; +fi + + +echo "Creating the Campcaster user database"; +echo "for user: $user."; +echo "" + + +#------------------------------------------------------------------------------- +# The details of installation +#------------------------------------------------------------------------------- +postgres_user=postgres + +ls_database=Campcaster-$user +ls_dbuser=test +ls_dbpassword=test +ls_dbserver=localhost + + +#------------------------------------------------------------------------------- +# Create the necessary database user and database itself +#------------------------------------------------------------------------------- +${scheduler_bindir}/createDatabase.sh --database=${ls_database} \ + --dbuser=${ls_dbuser} \ + --dbpassword=${ls_dbpassword} \ + --dbserver=${ls_dbserver} + + +#------------------------------------------------------------------------------- +# Create the ODBC data source and driver +#------------------------------------------------------------------------------- +${scheduler_bindir}/createOdbcDataSource.sh --database=${ls_database} \ + --dbserver=${ls_dbserver} + + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "Done." + diff --git a/campcaster/configure b/campcaster/configure new file mode 100755 index 000000000..03e54b0b4 --- /dev/null +++ b/campcaster/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen $*) +fi + +(cd $tmpdir && $configure $*) + diff --git a/campcaster/doc/db/dbSchema.sql b/campcaster/doc/db/dbSchema.sql new file mode 100644 index 000000000..8bbaaf59b --- /dev/null +++ b/campcaster/doc/db/dbSchema.sql @@ -0,0 +1,1756 @@ +-- +-- PostgreSQL database dump +-- + +SET client_encoding = 'UNICODE'; +SET check_function_bodies = false; + +SET SESSION AUTHORIZATION 'postgres'; + +-- +-- TOC entry 4 (OID 2200) +-- Name: public; Type: ACL; Schema: -; Owner: postgres +-- + +REVOKE ALL ON SCHEMA public FROM PUBLIC; +GRANT ALL ON SCHEMA public TO PUBLIC; + + +SET SESSION AUTHORIZATION 'test'; + +SET search_path = public, pg_catalog; + +-- +-- TOC entry 24 (OID 104453) +-- Name: schedule; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE schedule ( + id bigint NOT NULL, + playlist bigint NOT NULL, + starts timestamp without time zone NOT NULL, + ends timestamp without time zone NOT NULL +); + + +-- +-- TOC entry 25 (OID 104457) +-- Name: playlog; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE playlog ( + id bigint NOT NULL, + audioclipid bigint NOT NULL, + "timestamp" timestamp without time zone NOT NULL +); + + +-- +-- TOC entry 26 (OID 196314) +-- Name: al_test_tree; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_tree ( + id integer NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL, + "type" character varying(255) DEFAULT ''::character varying NOT NULL, + param character varying(255) +); + + +-- +-- TOC entry 5 (OID 196323) +-- Name: al_test_tree_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE al_test_tree_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 27 (OID 196327) +-- Name: al_test_struct; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_struct ( + rid integer NOT NULL, + objid integer NOT NULL, + parid integer NOT NULL, + "level" integer +); + + +-- +-- TOC entry 6 (OID 196339) +-- Name: al_test_struct_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE al_test_struct_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 28 (OID 196348) +-- Name: al_test_classes; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_classes ( + id integer NOT NULL, + cname character varying(20) +); + + +-- +-- TOC entry 29 (OID 196354) +-- Name: al_test_cmemb; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_cmemb ( + objid integer NOT NULL, + cid integer NOT NULL +); + + +-- +-- TOC entry 30 (OID 196357) +-- Name: al_test_subjs; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_subjs ( + id integer NOT NULL, + login character varying(255) DEFAULT ''::character varying NOT NULL, + pass character varying(255) DEFAULT ''::character varying NOT NULL, + "type" character(1) DEFAULT 'U'::bpchar NOT NULL, + realname character varying(255) DEFAULT ''::character varying NOT NULL, + lastlogin timestamp without time zone, + lastfail timestamp without time zone +); + + +-- +-- TOC entry 7 (OID 196370) +-- Name: al_test_subjs_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE al_test_subjs_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 31 (OID 196372) +-- Name: al_test_smemb; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_smemb ( + id integer NOT NULL, + uid integer DEFAULT 0 NOT NULL, + gid integer DEFAULT 0 NOT NULL, + "level" integer DEFAULT 0 NOT NULL, + mid integer +); + + +-- +-- TOC entry 8 (OID 196380) +-- Name: al_test_smemb_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE al_test_smemb_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 32 (OID 196382) +-- Name: al_test_perms; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_perms ( + permid integer NOT NULL, + subj integer, + "action" character varying(20), + obj integer, + "type" character(1) +); + + +-- +-- TOC entry 9 (OID 196393) +-- Name: al_test_perms_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE al_test_perms_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 33 (OID 196395) +-- Name: al_test_sess; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE al_test_sess ( + sessid character(32) NOT NULL, + userid integer, + login character varying(255), + ts timestamp without time zone +); + + +-- +-- TOC entry 34 (OID 206723) +-- Name: ls_tree; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_tree ( + id integer NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL, + "type" character varying(255) DEFAULT ''::character varying NOT NULL, + param character varying(255) +); + + +-- +-- TOC entry 10 (OID 206732) +-- Name: ls_tree_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_tree_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 35 (OID 206736) +-- Name: ls_struct; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_struct ( + rid integer NOT NULL, + objid integer NOT NULL, + parid integer NOT NULL, + "level" integer +); + + +-- +-- TOC entry 11 (OID 206748) +-- Name: ls_struct_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_struct_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 36 (OID 206757) +-- Name: ls_classes; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_classes ( + id integer NOT NULL, + cname character varying(20) +); + + +-- +-- TOC entry 37 (OID 206763) +-- Name: ls_cmemb; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_cmemb ( + objid integer NOT NULL, + cid integer NOT NULL +); + + +-- +-- TOC entry 38 (OID 206766) +-- Name: ls_subjs; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_subjs ( + id integer NOT NULL, + login character varying(255) DEFAULT ''::character varying NOT NULL, + pass character varying(255) DEFAULT ''::character varying NOT NULL, + "type" character(1) DEFAULT 'U'::bpchar NOT NULL, + realname character varying(255) DEFAULT ''::character varying NOT NULL, + lastlogin timestamp without time zone, + lastfail timestamp without time zone +); + + +-- +-- TOC entry 12 (OID 206779) +-- Name: ls_subjs_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_subjs_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 39 (OID 206781) +-- Name: ls_smemb; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_smemb ( + id integer NOT NULL, + uid integer DEFAULT 0 NOT NULL, + gid integer DEFAULT 0 NOT NULL, + "level" integer DEFAULT 0 NOT NULL, + mid integer +); + + +-- +-- TOC entry 13 (OID 206789) +-- Name: ls_smemb_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_smemb_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 40 (OID 206791) +-- Name: ls_perms; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_perms ( + permid integer NOT NULL, + subj integer, + "action" character varying(20), + obj integer, + "type" character(1) +); + + +-- +-- TOC entry 14 (OID 206802) +-- Name: ls_perms_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_perms_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 41 (OID 206804) +-- Name: ls_sess; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_sess ( + sessid character(32) NOT NULL, + userid integer, + login character varying(255), + ts timestamp without time zone +); + + +-- +-- TOC entry 42 (OID 206815) +-- Name: ls_files; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_files ( + id integer NOT NULL, + gunid bigint NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL, + mime character varying(255) DEFAULT ''::character varying NOT NULL, + ftype character varying(128) DEFAULT ''::character varying NOT NULL, + state character varying(128) DEFAULT 'empty'::character varying NOT NULL, + currentlyaccessing integer DEFAULT 0 NOT NULL, + editedby integer +); + + +-- +-- TOC entry 15 (OID 206832) +-- Name: ls_mdata_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_mdata_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 43 (OID 206834) +-- Name: ls_mdata; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_mdata ( + id integer NOT NULL, + gunid bigint, + subjns character varying(255), + subject character varying(255) DEFAULT ''::character varying NOT NULL, + predns character varying(255), + predicate character varying(255) NOT NULL, + predxml character(1) DEFAULT 'T'::bpchar NOT NULL, + objns character varying(255), + object text +); + + +-- +-- TOC entry 44 (OID 206845) +-- Name: ls_access; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_access ( + gunid bigint, + token bigint, + chsum character(32) DEFAULT ''::bpchar NOT NULL, + ext character varying(128) DEFAULT ''::character varying NOT NULL, + "type" character varying(20) DEFAULT ''::character varying NOT NULL, + ts timestamp without time zone +); + + +-- +-- TOC entry 45 (OID 207013) +-- Name: ls_trans; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_trans ( + id integer NOT NULL, + trtok character(16) NOT NULL, + direction character varying(128) NOT NULL, + state character varying(128) NOT NULL, + trtype character varying(128) NOT NULL, + gunid bigint, + pdtoken bigint, + url character varying(255), + fname character varying(255), + localfile character varying(255), + expectedsum character(32), + realsum character(32), + expectedsize integer, + realsize integer, + uid integer, + parid integer, + ts timestamp without time zone +); + + +-- +-- TOC entry 16 (OID 207018) +-- Name: ls_trans_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_trans_id_seq_seq + START WITH 1 + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 17 (OID 207023) +-- Name: ls_pref_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE ls_pref_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 46 (OID 207025) +-- Name: ls_pref; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE ls_pref ( + id integer NOT NULL, + subjid integer, + keystr character varying(255), + valstr text +); + + +-- +-- TOC entry 47 (OID 207039) +-- Name: as_tree; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_tree ( + id integer NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL, + "type" character varying(255) DEFAULT ''::character varying NOT NULL, + param character varying(255) +); + + +-- +-- TOC entry 18 (OID 207048) +-- Name: as_tree_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE as_tree_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 48 (OID 207052) +-- Name: as_struct; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_struct ( + rid integer NOT NULL, + objid integer NOT NULL, + parid integer NOT NULL, + "level" integer +); + + +-- +-- TOC entry 19 (OID 207064) +-- Name: as_struct_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE as_struct_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 49 (OID 207073) +-- Name: as_classes; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_classes ( + id integer NOT NULL, + cname character varying(20) +); + + +-- +-- TOC entry 50 (OID 207079) +-- Name: as_cmemb; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_cmemb ( + objid integer NOT NULL, + cid integer NOT NULL +); + + +-- +-- TOC entry 51 (OID 207082) +-- Name: as_subjs; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_subjs ( + id integer NOT NULL, + login character varying(255) DEFAULT ''::character varying NOT NULL, + pass character varying(255) DEFAULT ''::character varying NOT NULL, + "type" character(1) DEFAULT 'U'::bpchar NOT NULL, + realname character varying(255) DEFAULT ''::character varying NOT NULL, + lastlogin timestamp without time zone, + lastfail timestamp without time zone +); + + +-- +-- TOC entry 20 (OID 207095) +-- Name: as_subjs_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE as_subjs_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 52 (OID 207097) +-- Name: as_smemb; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_smemb ( + id integer NOT NULL, + uid integer DEFAULT 0 NOT NULL, + gid integer DEFAULT 0 NOT NULL, + "level" integer DEFAULT 0 NOT NULL, + mid integer +); + + +-- +-- TOC entry 21 (OID 207105) +-- Name: as_smemb_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE as_smemb_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 53 (OID 207107) +-- Name: as_perms; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_perms ( + permid integer NOT NULL, + subj integer, + "action" character varying(20), + obj integer, + "type" character(1) +); + + +-- +-- TOC entry 22 (OID 207118) +-- Name: as_perms_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE as_perms_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 54 (OID 207120) +-- Name: as_sess; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_sess ( + sessid character(32) NOT NULL, + userid integer, + login character varying(255), + ts timestamp without time zone +); + + +-- +-- TOC entry 55 (OID 207131) +-- Name: as_files; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_files ( + id integer NOT NULL, + gunid bigint NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL, + mime character varying(255) DEFAULT ''::character varying NOT NULL, + ftype character varying(128) DEFAULT ''::character varying NOT NULL, + state character varying(128) DEFAULT 'empty'::character varying NOT NULL, + currentlyaccessing integer DEFAULT 0 NOT NULL, + editedby integer +); + + +-- +-- TOC entry 23 (OID 207148) +-- Name: as_mdata_id_seq_seq; Type: SEQUENCE; Schema: public; Owner: test +-- + +CREATE SEQUENCE as_mdata_id_seq_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + +-- +-- TOC entry 56 (OID 207150) +-- Name: as_mdata; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_mdata ( + id integer NOT NULL, + gunid bigint, + subjns character varying(255), + subject character varying(255) DEFAULT ''::character varying NOT NULL, + predns character varying(255), + predicate character varying(255) NOT NULL, + predxml character(1) DEFAULT 'T'::bpchar NOT NULL, + objns character varying(255), + object text +); + + +-- +-- TOC entry 57 (OID 207161) +-- Name: as_access; Type: TABLE; Schema: public; Owner: test +-- + +CREATE TABLE as_access ( + gunid bigint, + token bigint, + chsum character(32) DEFAULT ''::bpchar NOT NULL, + ext character varying(128) DEFAULT ''::character varying NOT NULL, + "type" character varying(20) DEFAULT ''::character varying NOT NULL, + ts timestamp without time zone +); + + +-- +-- TOC entry 60 (OID 196325) +-- Name: al_test_tree_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_tree_id_idx ON al_test_tree USING btree (id); + + +-- +-- TOC entry 61 (OID 196326) +-- Name: al_test_tree_name_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX al_test_tree_name_idx ON al_test_tree USING btree (name); + + +-- +-- TOC entry 69 (OID 196341) +-- Name: al_test_struct_rid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_struct_rid_idx ON al_test_struct USING btree (rid); + + +-- +-- TOC entry 64 (OID 196342) +-- Name: al_test_struct_objid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX al_test_struct_objid_idx ON al_test_struct USING btree (objid); + + +-- +-- TOC entry 67 (OID 196343) +-- Name: al_test_struct_parid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX al_test_struct_parid_idx ON al_test_struct USING btree (parid); + + +-- +-- TOC entry 63 (OID 196344) +-- Name: al_test_struct_level_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX al_test_struct_level_idx ON al_test_struct USING btree ("level"); + + +-- +-- TOC entry 65 (OID 196345) +-- Name: al_test_struct_objid_level_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_struct_objid_level_idx ON al_test_struct USING btree (objid, "level"); + + +-- +-- TOC entry 66 (OID 196346) +-- Name: al_test_struct_objid_parid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_struct_objid_parid_idx ON al_test_struct USING btree (objid, parid); + + +-- +-- TOC entry 71 (OID 196352) +-- Name: al_test_classes_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_classes_id_idx ON al_test_classes USING btree (id); + + +-- +-- TOC entry 70 (OID 196353) +-- Name: al_test_classes_cname_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_classes_cname_idx ON al_test_classes USING btree (cname); + + +-- +-- TOC entry 73 (OID 196356) +-- Name: al_test_cmemb_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_cmemb_idx ON al_test_cmemb USING btree (objid, cid); + + +-- +-- TOC entry 74 (OID 196368) +-- Name: al_test_subjs_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_subjs_id_idx ON al_test_subjs USING btree (id); + + +-- +-- TOC entry 75 (OID 196369) +-- Name: al_test_subjs_login_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_subjs_login_idx ON al_test_subjs USING btree (login); + + +-- +-- TOC entry 77 (OID 196379) +-- Name: al_test_smemb_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_smemb_id_idx ON al_test_smemb USING btree (id); + + +-- +-- TOC entry 80 (OID 196390) +-- Name: al_test_perms_permid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_perms_permid_idx ON al_test_perms USING btree (permid); + + +-- +-- TOC entry 82 (OID 196391) +-- Name: al_test_perms_subj_obj_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX al_test_perms_subj_obj_idx ON al_test_perms USING btree (subj, obj); + + +-- +-- TOC entry 79 (OID 196392) +-- Name: al_test_perms_all_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_perms_all_idx ON al_test_perms USING btree (subj, "action", obj); + + +-- +-- TOC entry 85 (OID 196403) +-- Name: al_test_sess_sessid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX al_test_sess_sessid_idx ON al_test_sess USING btree (sessid); + + +-- +-- TOC entry 86 (OID 196404) +-- Name: al_test_sess_userid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX al_test_sess_userid_idx ON al_test_sess USING btree (userid); + + +-- +-- TOC entry 83 (OID 196405) +-- Name: al_test_sess_login_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX al_test_sess_login_idx ON al_test_sess USING btree (login); + + +-- +-- TOC entry 87 (OID 206734) +-- Name: ls_tree_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_tree_id_idx ON ls_tree USING btree (id); + + +-- +-- TOC entry 88 (OID 206735) +-- Name: ls_tree_name_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_tree_name_idx ON ls_tree USING btree (name); + + +-- +-- TOC entry 96 (OID 206750) +-- Name: ls_struct_rid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_struct_rid_idx ON ls_struct USING btree (rid); + + +-- +-- TOC entry 91 (OID 206751) +-- Name: ls_struct_objid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_struct_objid_idx ON ls_struct USING btree (objid); + + +-- +-- TOC entry 94 (OID 206752) +-- Name: ls_struct_parid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_struct_parid_idx ON ls_struct USING btree (parid); + + +-- +-- TOC entry 90 (OID 206753) +-- Name: ls_struct_level_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_struct_level_idx ON ls_struct USING btree ("level"); + + +-- +-- TOC entry 92 (OID 206754) +-- Name: ls_struct_objid_level_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_struct_objid_level_idx ON ls_struct USING btree (objid, "level"); + + +-- +-- TOC entry 93 (OID 206755) +-- Name: ls_struct_objid_parid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_struct_objid_parid_idx ON ls_struct USING btree (objid, parid); + + +-- +-- TOC entry 98 (OID 206761) +-- Name: ls_classes_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_classes_id_idx ON ls_classes USING btree (id); + + +-- +-- TOC entry 97 (OID 206762) +-- Name: ls_classes_cname_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_classes_cname_idx ON ls_classes USING btree (cname); + + +-- +-- TOC entry 100 (OID 206765) +-- Name: ls_cmemb_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_cmemb_idx ON ls_cmemb USING btree (objid, cid); + + +-- +-- TOC entry 101 (OID 206777) +-- Name: ls_subjs_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_subjs_id_idx ON ls_subjs USING btree (id); + + +-- +-- TOC entry 102 (OID 206778) +-- Name: ls_subjs_login_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_subjs_login_idx ON ls_subjs USING btree (login); + + +-- +-- TOC entry 104 (OID 206788) +-- Name: ls_smemb_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_smemb_id_idx ON ls_smemb USING btree (id); + + +-- +-- TOC entry 107 (OID 206799) +-- Name: ls_perms_permid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_perms_permid_idx ON ls_perms USING btree (permid); + + +-- +-- TOC entry 109 (OID 206800) +-- Name: ls_perms_subj_obj_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_perms_subj_obj_idx ON ls_perms USING btree (subj, obj); + + +-- +-- TOC entry 106 (OID 206801) +-- Name: ls_perms_all_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_perms_all_idx ON ls_perms USING btree (subj, "action", obj); + + +-- +-- TOC entry 112 (OID 206812) +-- Name: ls_sess_sessid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_sess_sessid_idx ON ls_sess USING btree (sessid); + + +-- +-- TOC entry 113 (OID 206813) +-- Name: ls_sess_userid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_sess_userid_idx ON ls_sess USING btree (userid); + + +-- +-- TOC entry 110 (OID 206814) +-- Name: ls_sess_login_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_sess_login_idx ON ls_sess USING btree (login); + + +-- +-- TOC entry 115 (OID 206829) +-- Name: ls_files_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_files_id_idx ON ls_files USING btree (id); + + +-- +-- TOC entry 114 (OID 206830) +-- Name: ls_files_gunid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_files_gunid_idx ON ls_files USING btree (gunid); + + +-- +-- TOC entry 116 (OID 206831) +-- Name: ls_files_name_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_files_name_idx ON ls_files USING btree (name); + + +-- +-- TOC entry 118 (OID 206841) +-- Name: ls_mdata_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_mdata_id_idx ON ls_mdata USING btree (id); + + +-- +-- TOC entry 117 (OID 206842) +-- Name: ls_mdata_gunid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_mdata_gunid_idx ON ls_mdata USING btree (gunid); + + +-- +-- TOC entry 120 (OID 206843) +-- Name: ls_mdata_subj_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_mdata_subj_idx ON ls_mdata USING btree (subjns, subject); + + +-- +-- TOC entry 119 (OID 206844) +-- Name: ls_mdata_pred_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_mdata_pred_idx ON ls_mdata USING btree (predns, predicate); + + +-- +-- TOC entry 122 (OID 206850) +-- Name: ls_access_token_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_access_token_idx ON ls_access USING btree (token); + + +-- +-- TOC entry 121 (OID 206851) +-- Name: ls_access_gunid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_access_gunid_idx ON ls_access USING btree (gunid); + + +-- +-- TOC entry 124 (OID 207020) +-- Name: ls_trans_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_trans_id_idx ON ls_trans USING btree (id); + + +-- +-- TOC entry 125 (OID 207021) +-- Name: ls_trans_trtok_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_trans_trtok_idx ON ls_trans USING btree (trtok); + + +-- +-- TOC entry 123 (OID 207022) +-- Name: ls_trans_gunid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_trans_gunid_idx ON ls_trans USING btree (gunid); + + +-- +-- TOC entry 126 (OID 207034) +-- Name: ls_pref_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_pref_id_idx ON ls_pref USING btree (id); + + +-- +-- TOC entry 127 (OID 207035) +-- Name: ls_pref_subj_key_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX ls_pref_subj_key_idx ON ls_pref USING btree (subjid, keystr); + + +-- +-- TOC entry 128 (OID 207036) +-- Name: ls_pref_subjid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX ls_pref_subjid_idx ON ls_pref USING btree (subjid); + + +-- +-- TOC entry 129 (OID 207050) +-- Name: as_tree_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_tree_id_idx ON as_tree USING btree (id); + + +-- +-- TOC entry 130 (OID 207051) +-- Name: as_tree_name_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_tree_name_idx ON as_tree USING btree (name); + + +-- +-- TOC entry 138 (OID 207066) +-- Name: as_struct_rid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_struct_rid_idx ON as_struct USING btree (rid); + + +-- +-- TOC entry 133 (OID 207067) +-- Name: as_struct_objid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_struct_objid_idx ON as_struct USING btree (objid); + + +-- +-- TOC entry 136 (OID 207068) +-- Name: as_struct_parid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_struct_parid_idx ON as_struct USING btree (parid); + + +-- +-- TOC entry 132 (OID 207069) +-- Name: as_struct_level_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_struct_level_idx ON as_struct USING btree ("level"); + + +-- +-- TOC entry 134 (OID 207070) +-- Name: as_struct_objid_level_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_struct_objid_level_idx ON as_struct USING btree (objid, "level"); + + +-- +-- TOC entry 135 (OID 207071) +-- Name: as_struct_objid_parid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_struct_objid_parid_idx ON as_struct USING btree (objid, parid); + + +-- +-- TOC entry 140 (OID 207077) +-- Name: as_classes_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_classes_id_idx ON as_classes USING btree (id); + + +-- +-- TOC entry 139 (OID 207078) +-- Name: as_classes_cname_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_classes_cname_idx ON as_classes USING btree (cname); + + +-- +-- TOC entry 142 (OID 207081) +-- Name: as_cmemb_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_cmemb_idx ON as_cmemb USING btree (objid, cid); + + +-- +-- TOC entry 143 (OID 207093) +-- Name: as_subjs_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_subjs_id_idx ON as_subjs USING btree (id); + + +-- +-- TOC entry 144 (OID 207094) +-- Name: as_subjs_login_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_subjs_login_idx ON as_subjs USING btree (login); + + +-- +-- TOC entry 146 (OID 207104) +-- Name: as_smemb_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_smemb_id_idx ON as_smemb USING btree (id); + + +-- +-- TOC entry 149 (OID 207115) +-- Name: as_perms_permid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_perms_permid_idx ON as_perms USING btree (permid); + + +-- +-- TOC entry 151 (OID 207116) +-- Name: as_perms_subj_obj_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_perms_subj_obj_idx ON as_perms USING btree (subj, obj); + + +-- +-- TOC entry 148 (OID 207117) +-- Name: as_perms_all_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_perms_all_idx ON as_perms USING btree (subj, "action", obj); + + +-- +-- TOC entry 154 (OID 207128) +-- Name: as_sess_sessid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_sess_sessid_idx ON as_sess USING btree (sessid); + + +-- +-- TOC entry 155 (OID 207129) +-- Name: as_sess_userid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_sess_userid_idx ON as_sess USING btree (userid); + + +-- +-- TOC entry 152 (OID 207130) +-- Name: as_sess_login_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_sess_login_idx ON as_sess USING btree (login); + + +-- +-- TOC entry 157 (OID 207145) +-- Name: as_files_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_files_id_idx ON as_files USING btree (id); + + +-- +-- TOC entry 156 (OID 207146) +-- Name: as_files_gunid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_files_gunid_idx ON as_files USING btree (gunid); + + +-- +-- TOC entry 158 (OID 207147) +-- Name: as_files_name_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_files_name_idx ON as_files USING btree (name); + + +-- +-- TOC entry 160 (OID 207157) +-- Name: as_mdata_id_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE UNIQUE INDEX as_mdata_id_idx ON as_mdata USING btree (id); + + +-- +-- TOC entry 159 (OID 207158) +-- Name: as_mdata_gunid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_mdata_gunid_idx ON as_mdata USING btree (gunid); + + +-- +-- TOC entry 162 (OID 207159) +-- Name: as_mdata_subj_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_mdata_subj_idx ON as_mdata USING btree (subjns, subject); + + +-- +-- TOC entry 161 (OID 207160) +-- Name: as_mdata_pred_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_mdata_pred_idx ON as_mdata USING btree (predns, predicate); + + +-- +-- TOC entry 164 (OID 207166) +-- Name: as_access_token_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_access_token_idx ON as_access USING btree (token); + + +-- +-- TOC entry 163 (OID 207167) +-- Name: as_access_gunid_idx; Type: INDEX; Schema: public; Owner: test +-- + +CREATE INDEX as_access_gunid_idx ON as_access USING btree (gunid); + + +-- +-- TOC entry 58 (OID 104455) +-- Name: schedule_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY schedule + ADD CONSTRAINT schedule_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 59 (OID 104459) +-- Name: playlog_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY playlog + ADD CONSTRAINT playlog_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 62 (OID 196321) +-- Name: al_test_tree_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_tree + ADD CONSTRAINT al_test_tree_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 68 (OID 196329) +-- Name: al_test_struct_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_struct + ADD CONSTRAINT al_test_struct_pkey PRIMARY KEY (rid); + + +-- +-- TOC entry 72 (OID 196350) +-- Name: al_test_classes_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_classes + ADD CONSTRAINT al_test_classes_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 76 (OID 196366) +-- Name: al_test_subjs_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_subjs + ADD CONSTRAINT al_test_subjs_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 78 (OID 196377) +-- Name: al_test_smemb_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_smemb + ADD CONSTRAINT al_test_smemb_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 81 (OID 196384) +-- Name: al_test_perms_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_perms + ADD CONSTRAINT al_test_perms_pkey PRIMARY KEY (permid); + + +-- +-- TOC entry 84 (OID 196397) +-- Name: al_test_sess_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_sess + ADD CONSTRAINT al_test_sess_pkey PRIMARY KEY (sessid); + + +-- +-- TOC entry 89 (OID 206730) +-- Name: ls_tree_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_tree + ADD CONSTRAINT ls_tree_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 95 (OID 206738) +-- Name: ls_struct_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_struct + ADD CONSTRAINT ls_struct_pkey PRIMARY KEY (rid); + + +-- +-- TOC entry 99 (OID 206759) +-- Name: ls_classes_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_classes + ADD CONSTRAINT ls_classes_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 103 (OID 206775) +-- Name: ls_subjs_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_subjs + ADD CONSTRAINT ls_subjs_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 105 (OID 206786) +-- Name: ls_smemb_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_smemb + ADD CONSTRAINT ls_smemb_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 108 (OID 206793) +-- Name: ls_perms_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_perms + ADD CONSTRAINT ls_perms_pkey PRIMARY KEY (permid); + + +-- +-- TOC entry 111 (OID 206806) +-- Name: ls_sess_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_sess + ADD CONSTRAINT ls_sess_pkey PRIMARY KEY (sessid); + + +-- +-- TOC entry 131 (OID 207046) +-- Name: as_tree_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_tree + ADD CONSTRAINT as_tree_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 137 (OID 207054) +-- Name: as_struct_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_struct + ADD CONSTRAINT as_struct_pkey PRIMARY KEY (rid); + + +-- +-- TOC entry 141 (OID 207075) +-- Name: as_classes_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_classes + ADD CONSTRAINT as_classes_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 145 (OID 207091) +-- Name: as_subjs_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_subjs + ADD CONSTRAINT as_subjs_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 147 (OID 207102) +-- Name: as_smemb_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_smemb + ADD CONSTRAINT as_smemb_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 150 (OID 207109) +-- Name: as_perms_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_perms + ADD CONSTRAINT as_perms_pkey PRIMARY KEY (permid); + + +-- +-- TOC entry 153 (OID 207122) +-- Name: as_sess_pkey; Type: CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_sess + ADD CONSTRAINT as_sess_pkey PRIMARY KEY (sessid); + + +-- +-- TOC entry 165 (OID 196331) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_struct + ADD CONSTRAINT "$1" FOREIGN KEY (objid) REFERENCES al_test_tree(id) ON DELETE CASCADE; + + +-- +-- TOC entry 166 (OID 196335) +-- Name: $2; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_struct + ADD CONSTRAINT "$2" FOREIGN KEY (parid) REFERENCES al_test_tree(id) ON DELETE CASCADE; + + +-- +-- TOC entry 167 (OID 196386) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_perms + ADD CONSTRAINT "$1" FOREIGN KEY (subj) REFERENCES al_test_subjs(id) ON DELETE CASCADE; + + +-- +-- TOC entry 168 (OID 196399) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY al_test_sess + ADD CONSTRAINT "$1" FOREIGN KEY (userid) REFERENCES al_test_subjs(id) ON DELETE CASCADE; + + +-- +-- TOC entry 169 (OID 206740) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_struct + ADD CONSTRAINT "$1" FOREIGN KEY (objid) REFERENCES ls_tree(id) ON DELETE CASCADE; + + +-- +-- TOC entry 170 (OID 206744) +-- Name: $2; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_struct + ADD CONSTRAINT "$2" FOREIGN KEY (parid) REFERENCES ls_tree(id) ON DELETE CASCADE; + + +-- +-- TOC entry 171 (OID 206795) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_perms + ADD CONSTRAINT "$1" FOREIGN KEY (subj) REFERENCES ls_subjs(id) ON DELETE CASCADE; + + +-- +-- TOC entry 172 (OID 206808) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_sess + ADD CONSTRAINT "$1" FOREIGN KEY (userid) REFERENCES ls_subjs(id) ON DELETE CASCADE; + + +-- +-- TOC entry 173 (OID 206825) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_files + ADD CONSTRAINT "$1" FOREIGN KEY (editedby) REFERENCES ls_subjs(id); + + +-- +-- TOC entry 174 (OID 207030) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY ls_pref + ADD CONSTRAINT "$1" FOREIGN KEY (subjid) REFERENCES ls_subjs(id) ON DELETE CASCADE; + + +-- +-- TOC entry 175 (OID 207056) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_struct + ADD CONSTRAINT "$1" FOREIGN KEY (objid) REFERENCES as_tree(id) ON DELETE CASCADE; + + +-- +-- TOC entry 176 (OID 207060) +-- Name: $2; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_struct + ADD CONSTRAINT "$2" FOREIGN KEY (parid) REFERENCES as_tree(id) ON DELETE CASCADE; + + +-- +-- TOC entry 177 (OID 207111) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_perms + ADD CONSTRAINT "$1" FOREIGN KEY (subj) REFERENCES as_subjs(id) ON DELETE CASCADE; + + +-- +-- TOC entry 178 (OID 207124) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_sess + ADD CONSTRAINT "$1" FOREIGN KEY (userid) REFERENCES as_subjs(id) ON DELETE CASCADE; + + +-- +-- TOC entry 179 (OID 207141) +-- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: test +-- + +ALTER TABLE ONLY as_files + ADD CONSTRAINT "$1" FOREIGN KEY (editedby) REFERENCES as_subjs(id); + + +SET SESSION AUTHORIZATION 'postgres'; + +-- +-- TOC entry 3 (OID 2200) +-- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: postgres +-- + +COMMENT ON SCHEMA public IS 'Standard public schema'; + + + +-- End of dump. diff --git a/campcaster/doc/developmentEnvironment/autoconfConfigureConventions.html b/campcaster/doc/developmentEnvironment/autoconfConfigureConventions.html new file mode 100644 index 000000000..6c092eee4 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/autoconfConfigureConventions.html @@ -0,0 +1,67 @@ + + + + + autoconf configure file conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the autoconf configure file conventions for the +LiveSupport +project. See also the generic description of the file +conventions in the LiveSupport +project.
+

Introduction

+Autoconf configure input files are processed by GNU autoconf and automake to generate +a configure script, which in turn generates Makefiles and other files +based on the system specifics it is run on. These are text +based files, thus they should adhere to the generic text-based +conventions.
+

Naming

+Autoconf configure files are named either configure.ac +(for autoconf) or sometimes configure.am (for automake).
+

Structure

+Autoconf configure files are partitioned by using the following 80 +column +wide partitioning comment:
+
dnl-----------------------------------------------------------------------------
dnl This is the title of the partition
dnl-----------------------------------------------------------------------------
+The file has the +following mandatory structure:
+
    +
  • Header
  • +
  • Additional sections+
  • +
+

Header

+The header holds all information mandated by the generic guidelines, but +starting with the autoconf comment sequence dnl. Note the +80 +column wide partitioning delimiter enclosing the header.
+
dnl-----------------------------------------------------------------------------
dnl Copyright (c) 2004 Media Development Loan Fund
dnl
dnl This file is part of the Campcaster project.
dnl http://campcaster.campware.org/
dnl To report bugs, send an e-mail to bugs@campware.org
dnl
dnl Campcaster 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 Campcaster 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 Campcaster; 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$
dnl Version : $Revision$
dnl Location : $URL$
dnl-----------------------------------------------------------------------------
+

Additional sections

+Additional sections contain the autoconf configuration macro calls. +Bigger +parts of the file may be partitioned by the partitioning commend seen +above.
+

Template

+See a generic template +for autoconf configurations. You may freely copy this +template when starting to create a new document.
+
+ + diff --git a/campcaster/doc/developmentEnvironment/buildEnvironment.html b/campcaster/doc/developmentEnvironment/buildEnvironment.html new file mode 100644 index 000000000..a31eac310 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/buildEnvironment.html @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + Build environment + + + + + + + +

Preface

+ + +This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+ + +
    + + +
  • Author: $Author$
  • + + +
  • Version: $Revision$
  • + + +
  • Location: $URL: +svn+ssh://maroy@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/doc/developmentEnvironment/buildEnvironment.html +$
    + + +
  • + + +
+ + +

Scope

+ + +This document describes the build environment for components of the +LiveSupport project.
+ + +

Introduction

+ + +As seen in the directory structure +description, each component is contained in its own directory, and has +the same general directory layout, which includes a configure script on the top +of the directory. This script is responsible for gathering compilation and installation information, and for creating a Makefile in the top directory. All components are built by using GNU make working on +that Makefile.
+ +
+ +This document describes details about the configure script, the targets for the generated Makefile, and related files involved with the installation of the component.
+ + +
+ + +Parts of this document are inspired by the GNU Coding Standards +Makefile +Conventions Standard targets.
+ + +

The configure script and generated files
+ +

+ +

configure options

+ +The configure script should honor the generic directory settings passed to it:
+ +
+ +
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]

Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--datadir=DIR read-only architecture-independent data [PREFIX/share]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--infodir=DIR info documentation [PREFIX/info]
--mandir=DIR man documentation [PREFIX/man]
+ +
+ +Other configuration-time options should be processed using --with-XXX arguments, using the AC_ARG_WITH autoconf macro.
+ +
+ +Note: when writing etc/configure.ac, the input for the configure script, the Autoconf Macro Archive can provide quite useful.
+ +
+ +

generated files

+ +The main file generated by the configure script will the the Makefile. The input for the Makefile, etc/Makefile.in, can refer to the variables substituted by configure in the following way:
+ +
+ +
prefix = @prefix@
some_other_var = @some_other_var@
+ +
+ +Because these variables might need to be overwritten when running the Makefile, make sure to use the same name for the variable inside the Makefile as was used by the configure script (as in the above example). For example:
+ +
+ +
# these are wrong!
PREFIX = @prefix@
myvar = @some_other_var@

# these are correct, and have the same desired effect:
prefix = @prefix@
some_other_var = @some_other_var@
PREFIX = ${prefix}
myvar = ${some_other_var}
+ +
+ +
Using the same names will make it possible to overwrite the values substituted by configure when invoking the Makefile, for example:
+ +
+ +
make prefix=/foo/bar install
+ +
+ +will cause installation under the prefix /foo/bar, irrespective of the prefix supplied to configure.
+ + +

Make targets
+ + +

+ + +The following make targets are required for all components to support:
+ + +
    + + +
  • all
  • + + +
  • clean
  • + + +
  • depclean
  • + + +
  • doc
    + + +
  • + + +
  • dist
  • + + +
  • check
  • + +
  • install
  • + + +
+ + +

all

+ + +Compile all source files for this component.  As a result, the +component is ready to be run (if an executable) or linked to (if a +library).
+ + +This target traverses the dependent modules, and executes the all +target on them, if their targets do not exist.
+ + +

clean

+ + +Delete all files generated by the all target, but only for this module +(e..g. no files for dependent modules are deleted).
+ + +

depclean

+ + +Delete all the dependent target files. Executing the depclean target +with an all target afterwards results in a full recompilation of all +the dependent modules.
+ + +

doc

+ + +Generate the documentation for this component. This would include +processing info pages, or using tools to generate documentation based +on comments in the source code (like javadoc).
+ + +

dist

+ + +Create a distribution package for this component. This involves +possibly compiling, document generation and other tasks, and results in +an archive containing the distribution.
+ + +

check

+ + +Run all tests, especially unit tests, for the component. This usually +results in a generated test-report.
+ + +
+ +

install

+ +Installs the component into the specified prefix. (See the Installation document for details.)
+ +
+ + + diff --git a/campcaster/doc/developmentEnvironment/cxxHeaderFileConventions.html b/campcaster/doc/developmentEnvironment/cxxHeaderFileConventions.html new file mode 100644 index 000000000..a8ad409c1 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/cxxHeaderFileConventions.html @@ -0,0 +1,199 @@ + + + + + C++ header file conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes C++ header file conventions for the +LiveSupport +project. See also the generic description of the file +conventions in the LiveSupport +project.
+

Introduction

+C++ header files are files containing declarations of structures, +functions and classes, that may be shared among object files, by +including them with the pre-processor directive #include +in multiple source files. They are text +based files, thus they should adhere to the generic text-based +conventions.
+
+The LiveSupport project uses a strong object oriented approach. Part of +this approach is to group declarations of classes into their own files: +one header file and one source file for each class. Therefore each C++ +header file contains the declaration of exactly one C++ class, although +inner types are defined in the same file.
+

Naming

+A C++ header files name reflects the class it is defining. Class names +begin with a capital letter, followed by lower case letters. In case of +a multiple word class name, the first letter of each word is +capitalized. Example class names are Foo and FooBar.
+
+As the name of the header file reflects the name of the class defined +in it, the header file will be named exactly as the class inside, with +the .h extension. Thus a class named Foo is +defined in +the header file Foo.h, and the class named SomeOtherLongNamedClass +is defined in the header file named SomeOtherLongNamedClass.h.
+

Structure

+C++ files are partitioned by using the following 80 column wide +partitioning comment:
+
/* ==================================================== name of the partition */
+Note that the comment is always 80 columns wide, independent of the +length of the text within.
+
+The file has the +following mandatory structure:
+
    +
  • Header
  • +
  • Include files & namespaces
  • +
  • Constants
  • +
  • Macros
  • +
  • Data types
  • +
  • External data signatures
  • +
  • Function Prototypes
  • +
  • Footer
    +
  • +
+

Header

+The header holds all information mandated by the generic guidelines. It begins +with the generic header information, enclosed in 80 +column wide partitioning delimiters.
+
+After this a macro definition follows, prohibiting the multiple time +inclusion of the header file. The name of the header-identity macro is +derived from the full name the file is expected to be included as. The +macro name is formed by replacing all non-alphanumeric characters from +the expected include definition with the '_' (underscore) character. +For a header file that will be included with the line:
+
#include "Foo.h"
+the identity macro is defined as Foo_h. For a header file +that is expected to be included as:
+
#include "LiveSupport/Foo/Bar.h"
+the identity macro is defined as LiveSupport_Foo_Bar_h.
+
+After the identity macro, a preprocessor check is performed to see if +the file is being processessed by a C++ compiler (and say not a C +compiler).
+

Sample

+A sample for a C++ header file header follows, where the file itself +would be expected to be included as "LiveSupport/Foo/Bar.h".
+
+
/*------------------------------------------------------------------------------

Copyright (c) 2004 Media Development Loan Fund

This file is part of the Campcaster project.
http://campcaster.campware.org/
To report bugs, send an e-mail to bugs@campware.org

Campcaster 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.

Campcaster 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 Campcaster; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


Author : $Author$
Version : $Revision$
Location : $URL$

------------------------------------------------------------------------------*/
#ifndef LiveSupport_Foo_Bar_h
#define LiveSupport_Foo_Bar_h

#ifndef __cplusplus
#error This is a C++ include file
#endif

+

Include files & namespace
+

+This section contains all the include files that the header file needs +to include, plus namespace declarations. The include files are listed +in a most generic to most specific order: firts system include files, +then other LiveSupport module include files, and finnally include files +from the same module / product are listed.
+
+After the includes, namespace definitions follow. Each LiveSupport +object is contained in its own namespace inside the LiveSupport +namespace, thus this is a nested namespace declaration.
+
+After the namespace declarations, the namespaces used within the +include file itself are listed with using namespace +clauses. Note that the using namespace clauses are +strictly within the namespace declaration clauses, so that they only +take effect within the header file, but not afterwards.
+

Sample

+A sample include files & namespaces section follows.
+
/* =============================================== include files & namespaces */

#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif

#if HAVE_STDLIB_H
#include <stdlib.h>
#else
#error need stdlib.h
#endif

#include <string>


namespace LiveSupport {
namespace Foo {

using namespace LiveSupport::Core;

+

Constants

+The constants section contains static constant values defined in the +header file. +Nowhere in the header file may be other static constants defined. This +section is +rarely used, as static constants  outside classes are discurraged,
+

Sample

+A sample constants section follows.
+
/* ================================================================ constants */

/**
* The contant value of foo bar.
*/
static const int fooBarConst;
+

Macros

+The macros section contains any macros defined in the header file. +Nowhere in the header file may be other macros defined. This section is +rarely used, as macros are discurraged,
+

Sample

+A sample macros section follows.
+
/* =================================================================== macros */

/**
* Some very important macro.
*/
#define SOME_MACRO "some macro"
+

Data types

+This section contains the data type definitions of the header file, +most notable the definition of the class this header file is named +after.
+
+The class itself and all its members (including private members) are +described by doxygen comments. +The Java style of commenting is to be used.  For the comment +describing the entire class, the @author and @version +tags are mandatory. For each member function, all parameters, the +return value and all possibly thrown exceptions are to be documented.
+
+The class lists its members in the following order:
+
    +
  • private
  • +
  • protected
  • +
  • public
  • +
+Within each of the above blocks, the order is the following:
+
    +
  • static data members
  • +
  • dynamic data members
  • +
  • constructors
  • +
  • destructor
  • +
  • static functions
  • +
  • dynamic functions
  • +
+For proper indentation of the above blocks, see the example below.
+

Sample

+A sample data types section follows.
+
/* =============================================================== data types */

/**
* Hello class.
* The only purpose of this class is to say hello.
*
* @author $Author$
* @version $Revision$
*/
class Hello
{
private:
/**
* Our famous hello string.
*/
static const std::string helloWorld;

public:
/**
* Default constructor.
*/
Hello (void) throw ()
{
}

/**
* Say hello.
*
* @return the string "Hello, World!"
* @exception std::exception on problems
*/
const std::string
hello (void) throw (std::exception)
{
return helloWorld;
}
};

+

External data structures
+

+The external data structures section contains any external data +definitions needed by the header file, that may be defined externally. +Nowhere in the header file may other external data definitions exist. +This section is +rarely used, as external data definitions are discouraged.
+

Sample

+A sample external data structures section follows.
+
/* ================================================= external data structures */

/**
* An externally defined data, which the linker will find.
*/
extern int fooBarInt;

+

Function prototypes
+

+The function prototypes section contains any function prototypes +defined by the header file, that are not members of classes. +Nowhere in the header file may other such definitions exist. +This section is seldom used, as functions outside classes are +discouraged.
+

Sample

+A sample function prototypes section follows.
+
/* ====================================================== function prototypes */

/**
* An important foo function.
*
* @return the result of foo.
*/
int foo(void) throw ();
+

Footer

+The footer of the header file closes the namespace brackets opened in +the include files & namespaces section, and also ends the header +identity macro #ifdef section opened in the header.
+

Sample

+A sample footer section follows.
+
+
} // namespace Foo
} // namespace LiveSupport

#endif // LiveSupport_Foo_Bar_h
+

Template

+See a template +C++ header file. You may freely copy this +template when starting to create a new header file.
+
+ + diff --git a/campcaster/doc/developmentEnvironment/cxxSourceFileConventions.html b/campcaster/doc/developmentEnvironment/cxxSourceFileConventions.html new file mode 100644 index 000000000..42dbc01e2 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/cxxSourceFileConventions.html @@ -0,0 +1,150 @@ + + + + + C++ source file conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes C++ source file conventions for the +LiveSupport +project. See also the generic description of the file +conventions in the LiveSupport +project.
+

Introduction

+C++ source files are files containing implementations of functions and +definitions of static data. They are text +based files, thus they should adhere to the generic text-based +conventions.
+
+The LiveSupport project uses a strong object oriented approach. Part of +this approach is to group implementations of classes into their own +files: one header file and one source file for each class. Therefore +each C++ source file contains implementation of exactly one C++ class, +although static (local) functions may be defined as well.
+

Naming

+A C++ source files name reflects the class it is implementing. Class +names begin with a capital letter, followed by lower case letters. In +case of a multiple word class name, the first letter of each word is +capitalized. Example class names are Foo and FooBar.
+
+As the name of the source file reflects the name of the class it +implements, the source file will be named exactly as the class inside, +with the .cxx extension. Thus a class named Foo +is implemented in the source file Foo.cxx, and the class +named SomeOtherLongNamedClass is implemented in the +source file named SomeOtherLongNamedClass.cxx.
+

Structure

+C++ files are partitioned by using the following 80 column wide +partitioning comment:
+
/* ==================================================== name of the partition */
+Note that the comment is always 80 columns wide, independent of the +length of the text within.
+
+Local data type definitions and function prototypes required +doxygen-style commenting.
+
+Function implementations and static data definitions were already +commented for doxygen at their place of declaration. Therefore these +are preceded by the following simple comment header.
+
/*------------------------------------------------------------------------------
 * Function implementation below.
*----------------------------------------------------------------------------*/
+
+The file has the +following mandatory structure:
+
    +
  • Header
  • +
  • Include files & namespaces
  • +
  • Local data structures
    +
  • +
  • Local constants & macros
    +
  • +
  • Local function prototypes
    +
  • +
  • Module code
    +
  • +
+

Header

+The header holds all information mandated by the generic guidelines. It contains +with the generic header information, enclosed in 80 +column wide partitioning delimiters.
+

Sample

+A sample for a C++ source file header follows.
+
/*------------------------------------------------------------------------------

Copyright (c) 2004 Media Development Loan Fund

This file is part of the Campcaster project.
http://campcaster.campware.org/
To report bugs, send an e-mail to bugs@campware.org

Campcaster 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.

Campcaster 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 Campcaster; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


Author : $Author$
Version : $Revision$
Location : $URL$

------------------------------------------------------------------------------*/

+

Include files & namespaces
+

+This section contains all the include files that the source file needs +to include, plus namespace references. The include files are listed in +a most generic to most specific order: first system include files, then +other LiveSupport module include files, and finally include files from +the same module / product are listed. The last one is the header file +for the class this source file implements.
+
+After the includes, the namespaces used within the source file itself +are listed with using namespace clauses. The order of the +using namespace declarations is also from most generic to +most specific, the last one being the namespace of the class this +source file implements.
+

Sample

+A sample include files & namespaces section follows.
+
/* =============================================== include files & namespaces */

#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif

#if HAVE_STDLIB_H
#include <stdlib.h>
#else
#error need stdlib.h
#endif

#include <string>

#include <LiveSupport/Foo/Bar.h>


using namespace LiveSupport::Core;
using namespace LiveSupport::Foo;

+

Local data structures
+

+The constants section contains locally defined data structures, that +are not used anywhere outside this source file. +Nowhere in the source file may be other data structure definitions. +This section is +rarely used, as reusable data structures are encouraged.
+

Sample

+A sample local data structures section follows.
+
/* ===================================================  local data structures */

/**
* The union of foo.
*/
union foo {
int foo;
long bar;
};
+

Local constants & macros

+The local constants & macros section contains any macros and +constant values used in this source file. It also contains the +definitions for constant values of the class this source file +implements. Nowhere in the source file may be other macros or constants +defined.
+
+Having local constants is discouraged. Have private static class +members instead.
+

Sample

+A sample local constants & macros section follows.
+
/* ================================================  local constants & macros */

/*------------------------------------------------------------------------------
 * The famous foo string for the class Bar.
*----------------------------------------------------------------------------*/
const std::string Bar::fooStr = "foo";

+

Local function prototypes
+

+This section contains the prototypes for local functions, which are +only used in this source file. Nowhere else in the source file may +function prototypes be other than in this section. This section is +rarely used, local functions are discouraged. Use private class member +functions instead.
+

Sample

+A sample local function prototypes section follows.
+
/* ===============================================  local function prototypes */

/**
* Some local function.
*
* @param parameter some parameter
* @return a very big return value.
*/
int
localFunction(int parameter) throw ();

+

Module code
+

+This section contains the implementation for the class it is made for. +Also contains the implementation for all local functions. The +implementation order is not defined.
+

Sample

+A sample module code section follows.
+
/* =============================================================  module code */

/*------------------------------------------------------------------------------
 * Return the famous bar string.
*----------------------------------------------------------------------------*/
const std::string
Bar :: sayBar(void) throw (std::exception)
{
if (barInt) {
throw std::exception();
}

return barStr;
}

+

Template

+See a template +C++ source file. You may freely copy this +template when starting to create a new source file.
+
+ + diff --git a/campcaster/doc/developmentEnvironment/directoryStructure.html b/campcaster/doc/developmentEnvironment/directoryStructure.html new file mode 100644 index 000000000..e100a3c0c --- /dev/null +++ b/campcaster/doc/developmentEnvironment/directoryStructure.html @@ -0,0 +1,250 @@ + + + + + + + + + + Directory structure + + + + + + +

Preface

+ +This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+ +
    + +
  • Author: $Author$
  • + +
  • Version: $Revision$
  • + +
  • Location: $URL: +svn+ssh://maroy@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/doc/developmentEnvironment/directoryStructure.html +$
    + +
  • + +
+ +

Scope

+ +This document describes the directory structure used for all component +of the LiveSupport project.
+ +

Introduction

+ +It is important to define a common and uniform directory structure in +order to allow more seamless cooperation between participants of the +project. It also helps referencing the various components (modules, +etc.), as all the components will have a predictable and stable file +hierarchy.
+ +
+ +As seen below, the main inspiration for each components directory +structure is the Filesystem +Hierarchy Standard.
+ +

Overall structure

+ +The base livesupport directory contains all the special tools needed to +build, test and run LiveSupport, along with all the source code that +constitutes LiveSupport itself.
+ +
+ +The self written part of LiveSupport project consists of re-usable +modules, and products. +Modules are components that do not execute by themselves, but have a +useful, preferably generic functionality. Products are the executable +components that are actually run by users.
+ +
+ +Both modules and products may reference (depend on) other modules, but +circular reference is not allowed.
+ +
+ +Other needed parts of the directory structure are involved with +external libraries LiveSupport depends on, and a running environment +where LiveSupport can run.
+ +
+ +The directory structure is organized in the following way:
+ +
+ + +
livesupport
|-- configure
|-- bin
|-- doc
|-- etc
|-- src
| |-- modules
| | |-- module1
| | |-- module2
| ...
| | `-- moduleN
| |-- products
| | |-- product1
| | |-- product2
| | ...
| | `-- productN
| `-- tools
| |-- tool1
| |-- tool2
| ...
| `-- tool3
|-- tmp
|-- usr
`-- var
+ +
+ +

Referencing modules and the running environment
+ +

+ +As a consequence of the directory structure above, if a module is +referencing an other (e.g. moduleX), than it can be sure that it is +located at ../moduleX. If a product is referencing the +same module, it can be sure that it is located at ../../modules/moduleX.
+ +
+ +Furthermore, if a module or product is referencing the running +environment under livesupport/usr, it can also be sure +that it is located at ../../../usr from either the module or +the product directory.
+ +
+ +Referencing always means exactly that: no contents are copied from one +module directory to an other. For example for a module or product to +reference the shared libraries of moduleX means to do exactly that: +link to the library ../../modules/moduleX/lib/libmoduleX.so.
+
+Please note that the above relative reference are valid in the build +environment only! After a module or product is installed, it can make +no assumptions on the relative locations of other components.
+ +

Top-level configure script

+ +The top-level configure script takes care of autoconf-style configuring the whole LiveSupport project. This involves running configure in all tool, module and product directories, and creating a top-level Makefile.
+
+The configure script is expected to run autoconf in case the +autoconf-style environment has not yet been set up. This typically +involves executing an autogen.sh script from the bin directory.
+ +
+ +

Documentation directory

+ +The doc directory contains generic documentation with respect to the +whole LiveSupport project. Documentation pertaining to a module or +products should go under the modules' or products' directory, +respectively.
+ +

Configuration files

+ +Under the etc directory project-wide configuration files +are found, like the ones used by the top-level configure script. This +typically involves having autoconf sources (configure.ac, +acinlcude.m4), and the input for the top-level Makefile (Makefile.in).
+ +

Module structure

+ +Each module has the same directory structure, which is as follows:
+ +
+ +
moduleX
|-- configure
|-- bin
|-- etc
|-- include
| `-- LiveSupport
| `-- ModuleX
|-- lib
|-- src
|-- tmp
`-- var
+ +

configure

+ +An autoconf-style configure script. See the build environment document for a +detailed description.
+ +

bin

+ +Directory containing all executables.
+ +

etc

+ +All configuration files go here.
+ +

include

+ +The public C/C++ header files for this module. The include files are +stored in a subdirectory that completely replicates the namespacing of +the module itself, in a case-sensitive manner. Thus a header file name Foo.h +for ModuleX would be contained in the directory include/LiveSupport/ModuleX/Foo.h, +and would be included with the line:
+ +
+ +
#include "LiveSupport/ModuleX/Foo.h"
+ +

lib

+ +Directory containing all shared and static libraries that are generated +by building the module. All external, third-party libraries used by +this module should be installed into the ../../../usr/lib +directory. The libraries are named resembling the full namespacing of +the module, but all lower cased. For example, the library for moduleX +would be named liblivesupport_modulex.so, and thus would +be linked to with the linker option -L../../modules/moduleX/lib +-llivesupport_modulex.
+ +

src

+ +Contains all source files. A source file is a file which is processed +(compiled, etc.) by the build process, and as a result some target +files are generated from it.
+ +

tmp

+ +A temporary directory, holding temporary files used by the build +process. This directory either does not exist in the configuration +management system, or is empty there.
+ +

var

+ +Directory containing data. This can range from XML data to HTML pages +to all other files that are not source files (are not processed by the +build process). Note that web-page scripting files like PHP files also +fall into this category.
+ +

Product structure

+ +The directory structure for a product is in essence the same as for +modules, described above, with the difference that products don't have +externally visible include files, thus their directories don't contain +an include directory.
+ +

Tools structure

+ +The tools directory is an archive of tools and external libraries used +for either building or running the LiveSupport system. These tools are +installable to the usr directory of the LiveSupport directory tree.
+ +Each tool has its own directory, where several versions of the same +tool may reside. Thus the generic directory structure is as follows:
+ +
tools
|-- tool1
| |-- tool1-X
| |-- tool1-Y
| ...
| `-- tool1-Z
...
`-- toolN
|-- toolN-A
|-- toolN-B
...
`-- toolN-C
+ +Thus a user can select version X of toolK to be installed by selecting +the directory tools/toolK/toolK-X. Each tool directory +has the following structure:
+ +
toolK-X
|-- configure
|-- bin
|-- etc
|-- src
| `-- toolK-X.tar.gz
`-- tmp
+ +The configure script is an autoconf-style configure script that creates a Makefile in the tool directory, reflecting typical configuration settings like --prefix. +Executing make install in the tool directory will result in the +compilation and installation of the specific tool into the specified ${prefix}.
+
+In case the source needs to patched before compilation, the patches may +be contained in the etc directory.
+ +

usr structure

+ +The usr directory is similar to the /usr system directory on UNIX +systems (see the Filesystem +Hierarchy Standard). This directory contains all the external tools +needed by either developing or running the LiveSupport system. This +directory is separate from the system /usr directory in order to +facilitate changing the configuration for LiveSupport related libraries +and tools in user space.
+ +
+ + + diff --git a/campcaster/doc/developmentEnvironment/fileConventions.html b/campcaster/doc/developmentEnvironment/fileConventions.html new file mode 100644 index 000000000..261afdfec --- /dev/null +++ b/campcaster/doc/developmentEnvironment/fileConventions.html @@ -0,0 +1,118 @@ + + + + + File Conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the conventions used for files in the +LiveSupport project.
+

Introduction

+To facilitate cooperation between multiple contributors, it is +advisable to have common file conventions, so as the result of +different peoples work have a uniform look and form. This document +lists the file conventions for the different file formats used by the +project.
+
+Where the description of the conventions is ambiguous, the examples +given are binding, and are to be followed.
+

Generic conventions

+In general, all documents have the following structure:
+
    +
  • header
  • +
  • partition1
  • +
  • partition2
  • +
  • ...
  • +
  • partitionN
  • +
+

header
+

+The header of the file holds:
+
    +
  • a reference to the LiveSupport project itself
  • +
  • copyright information
  • +
  • reference to the license of the file
  • +
  • the latest author of the file
  • +
  • the current version of the file
  • +
  • the full location of the file in the configuration management +system
    +
  • +
+Following the GNU GPL guidelines on +applying a license term to source files, the typical header for a text +file looks like the following:
+
+
    Copyright (c) 2004 Media Development Loan Fund

This file is part of the Campcaster project.
http://campcaster.campware.org/
To report bugs, send an e-mail to bugs@campware.org

Campcaster 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.

Campcaster 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 Campcaster; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


Author : $Author$
Version : $Revision$
Location : $URL$

+Note the CVS keywords (as an example) for having up-to-date information +on the author, version and location of the file.
+

partitions

+Each file is split into separate partitions, and maintains its +structure with the fixed sequence of these partitions. File formats +differ heavily on the capabilities of defining partitions - some have +explicit support (like HTML with headers and paragraphs), while in some +the commenting feature can be used to visually split up the file (like +comments in source code).
+
+The exact nature and sequence of the partitions is dependent on the +nature of the file itself.
+

Generic text-based conventions

+The majority (if not) all sources files are text-based. As a general +rule, text-based files adhere to the following conventions in the +LiveSupport project:
+

UTF-8

+Whenever possible, the text files should be saved in the UTF-8 character +encoding, to enable all characters within covered by the Unicode +character set.
+

80 columns

+Don't exceed 80 columns for any line in the file, unless it's +absolutely necessary (like having a single expression over 80 columns +that can not be broken up by a new-line character).
+

no tabs - 4 spaces

+Don't use the tab character in text files - use 4 spaces instead for +indentation.
+

Specific conventions

+For specific file conventions, see the separate descriptions below.
+

html

+convention and template.
+

shell scripts

+convention and template.
+

Makefiles

+convention and template.
+

Autoconf configure files
+

+convention and template.
+

C++ files

+There are specific conventions for the header files and the source +files.
+

C++ header files

+convention and template.
+

C++ source files

+convention and template.
+

PHP scripts

+convention and template + (downlodable version).
+
+ + diff --git a/campcaster/doc/developmentEnvironment/htmlFileConventions.html b/campcaster/doc/developmentEnvironment/htmlFileConventions.html new file mode 100644 index 000000000..68914f1e3 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/htmlFileConventions.html @@ -0,0 +1,93 @@ + + + + + HTML file conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the HTML file conventions for the LiveSupport +project. See also the generic description of the file conventions in the LiveSupport +project.
+

Introduction

+HTML pages written as part of the LiveSupport documentation should +conform to either the HTML 4.01 +Transitional or XHTML 1.0 +Transitional specifications.
+

Naming

+HTML document files are named by the following rules:
+
    +
  • there are no spaces in the file name
  • +
  • the file name begins with a lower case letter
  • +
  • for file names containing multiple words, each additional word +begins with a capital letter
  • +
  • the extension of the file is .html (not .htm)
    +
  • +
+For example, a file with a single-word name may be named like: single.html, +whereas a file with multiple word name would be like: multipleWordNameFile.html.
+

Structure

+Each HTML file is partitioned by using the <h1> +element to mark the start and name of each partition. The file has the +following mandatory structure:
+
    +
  • Preface
  • +
  • Scope
  • +
  • Introduction?
  • +
  • Additional sections+
  • +
+

HTML header

+The HTML header of the document should describe the title and author of +the document. The following HTML code should be inside the <head> +element for the HTML page:
+
+
    <title>The title of the file</title>
<meta name="author" content="$Author$"/>
+

The Preface section

+This section holds the following specific text:
+
+
This document is part of the LiveSupport project, +Copyright © 2004 Media Development Loan +Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+
+

The Scope section

+This section describes the scope of the document in short form. This +details the areas which the document covers, and sometimes holds +references to related documents.
+

The Introductions section

+This optional section introduces the topic of the document to the +reader.
+

Additional sections

+These section hold the real content of the document, with freely named +sections and sub-sections. The normal HTML heading elements (<h1>, +<h2>, ...) should be used to mark and group the +sections. Sample source code included in the HTML document should be +put inside a <pre><code>...</code></pre> +block, like the following:
+
+
    // some sample code here
int i = 1;
+

Template

+See a generic template +for HTML documents. You may freely copy this +template when starting to create a new document.
+
+ + diff --git a/campcaster/doc/developmentEnvironment/index.html b/campcaster/doc/developmentEnvironment/index.html new file mode 100644 index 000000000..6bac3135f --- /dev/null +++ b/campcaster/doc/developmentEnvironment/index.html @@ -0,0 +1,63 @@ + + + + + + + + + + LiveSupport development environment + + + + + + +

Preface

+ +This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+ +
    + +
  • Author: $Author$
  • + +
  • Version: $Revision$
  • + +
  • Location: $URL: +svn+ssh://maroy@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/doc/developmentEnvironment/index.html +$
  • + +
+ +

Scope

+ +This document gives an overview of the LiveSupport development +environment.
+ +

Introduction

+ +The LiveSupport project defines a uniform development environment to +enhance collaboration of participants in the project. The following +aspects of the environment are defined so far:
+ + + +
+ +
+ + + diff --git a/campcaster/doc/developmentEnvironment/installation.html b/campcaster/doc/developmentEnvironment/installation.html new file mode 100644 index 000000000..fb3397374 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/installation.html @@ -0,0 +1,166 @@ + + + + + + + + + + Component Installation Guidelines + + + + + + +

Preface

+ +This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+ +
    + +
  • Author: $Author$
  • + +
  • Version: $Revision$
  • + +
  • Location: $URL: +svn+ssh://maroy@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/doc/developmentEnvironment/buildEnvironment.html +$
    + +
  • + +
+ +

Scope

+ +This document describes the installation procedures used by the components of the LiveSupport project.
+ +

Introduction

+Component installation is a process more tricky than it seems at first. +For example, when using a binary package manager, the component is +configured and compiled on a different system (the one creating the +binary package) than the one it will run on at the end.
+
+Installation also involves related issues like uninstallation and product +version migration, which also have to be discussed here.
+
+

Installation use cases

+

Basic installation

+The basic installation procedure is as follows.
+

1.  setting up the sources

+Get and unpack the source tarball(s), patch them if necessary. Make sure all tools required by the build are present.
+

2. configuring the sources

+Run the configure script on the unpacked source tree.
+
+Assumptions:
+
    +
  • don't assume that the directory prefixes supplied to configure will be the final installation directories for the component
  • +
  • don't assume that the machine used for compilation will be the same machine the tool is used on (think binary package building)
  • +
+

3. compile the sources

+The sources are compiled (if needed) by the invoking make all.
+

4. install the component

+Install (copy) the component, possibly into a different directory than +what was specified at step 2. This basically involves copying relevant +files from the (built) source directory tree into a target directory +tree.
+

5. post-installation setup

+Do post-installation (post-copy) setup of the component. This might involve the following:
+
    +
  • create and customize configuration files
  • +
  • setup & configure external resources, like:
  • +
      +
    • database tables
    • +
    • update configuration files of other tools used by this component
    • +
    +
+Assumptions:
+
    +
  • don't assume that the component has been built (compiled) on the same system as the one doing post-installation setup.
  • +
  • running this step and pre-uninstallation should be a null operation
  • +
+
+

Basic uninstallation

+The basic uninstallation procedure is the following.
+

1. pre-uninstallation steps

+Destroy any resources used by the component, with the components itself still being installed. This might involve:
+
    +
  • destroying databases
  • +
  • reverting configuration changes to external resources made in during post-installation setup
  • +
+Assumptions:
+
    +
  • this is the inverse of the post-installation setup procedure
  • +
+

2. uninstall the component

+Remove the components files from the filesystem.
+
+

Upgrading

+TODO: detail the upgrading procedure
+
+

Provisions in the build environment

+For the above goals to be met, the following structure is needed for each component in the build environment:
+
+
componentX
|-- configure
|-- bin
| |-- autogen.sh
| |-- postInstall.sh
| `-- preUninstall.sh
`-- etc
|-- acinclude.m4
|-- configure.ac
`-- Makefile.in
+

Considerations about specific installation steps

+

1.  setting up the sources

+none: this step is external to the package.
+

2. configuring the sources

+Assumptions: +
    +
  • don't assume that the directory prefixes supplied to configure will be the final installation directories for the component
  • +
  • don't assume that the machine used for compilation will be the same machine the tool is used on (think binary package building)
  • +
+

3. compile the sources

+Assumptions:
+
    +
  • No hard-coded references should be made to any resources the component depends on. For example:
  • +
      +
    • don't hard-code shared library paths that are being linked to
    • +
    • don't hard-code PHP include paths that are referenced
    • +
    • don't hard-code paths that were supplied to configure
    • +
    +
+

4. install the component

+When using package managers, this step is usually two-fold:
+
    +
  • make install is executed, with ${prefix} and other variables overwritten, so that the package is installed into a temporary directory
  • +
  • the files installed by the call to make install will be copied to their true target location when the package build based on them is installed on a target system
  • +
+Note that there is a lot of package manager-specific magic happening +between these two steps, and that the steps usually take place on +different machines (after all the package is only build on one, while +it will be installed on a miriad of systems).
+
+Assumptions:
+
    +
  • make install really should just copy files, and neither do, nor assume anything more than that.
  • +
  • make install should also copy all files needed to perform the post-installation setup and pre-uninstall steps.
  • +
+

5. post-installation setup

+The bin/postInstall.sh script should be used to perform +the post-installation setup. The script should expect all variables it +needs to be supplied by command-line arguments.
+
+Assumptions:
+
    +
  • only files that were installed by make install can be used to perform the post-installation setup
  • +
+

Considerations about specific uninstallation steps

+

1. pre-uninstallation steps

+The bin/preUninstall.sh script should be used to perform +the pre-uninstallation steps. The script should expect all variables it +needs to be supplied by command-line arguments.
+
+Assumptions:
+
    +
  • only files that were installed by make install can be used to perform the pre-uninstallation step
  • +
+

2. uninstall the component

+none: this step is external to the package
+ + + diff --git a/campcaster/doc/developmentEnvironment/makefileConventions.html b/campcaster/doc/developmentEnvironment/makefileConventions.html new file mode 100644 index 000000000..5d5d1ce97 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/makefileConventions.html @@ -0,0 +1,142 @@ + + + + + Makefile conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the Makefile file conventions for the +LiveSupport +project. See also the generic description of the file +conventions in the LiveSupport +project. This document does not describe the mandatory targets for +Makefiles, see the build environment +description for such details.
+

Introduction

+Makefiles are text-based files processed by GNU make. As text based +files, they should adhere to the generic text-based +conventions.
+

Naming

+Makefiles are always named Makefile. In case they are +input files for automake or autoconf, they can be named Makefile.in +or Makefile.am.
+

Structure

+Makefiles are partitioned by using the following 80 column wide +partitioning comment:
+
#-------------------------------------------------------------------------------
# This is the title of the partition
#-------------------------------------------------------------------------------
+The file has the +following mandatory structure:
+
    +
  • Header
  • +
  • General command definitions
  • +
  • Basic directory and file definitions
  • +
  • Configuration parameters
  • +
  • Dependencies
  • +
  • Targets
  • +
  • Specific targets
  • +
  • Pattern rules
    +
  • +
+

Header

+The header holds all information mandated by the generic guidelines, but +starting with the Makefile comment character #. Note the +80 +column wide partitioning delimiter enclosing the header.
+
#-------------------------------------------------------------------------------
# Copyright (c) 2004 Media Development Loan Fund
#
# This file is part of the Campcaster project.
# http://campcaster.campware.org/
# To report bugs, send an e-mail to bugs@campware.org
#
# Campcaster 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.
#
# Campcaster 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 Campcaster; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# Author : $Author$
# Version : $Revision$
# Location : $URL$
#-------------------------------------------------------------------------------
+

General command definitions
+

+This section contains definitions to commands used when executing the +make targets within this Makefile. All the commands should be collected +here, and a variable defined for them. This insures easy overview of +the commands the Makefile uses, and also makes it easy to migrate to +new commands, or the same commands in different locations.
+
+No external commands may be directly referenced outside this section.
+

Sample

+A sample general command definitions section follows.
+
#-------------------------------------------------------------------------------
# General command definitions
#-------------------------------------------------------------------------------
MKDIR = mkdir -p
RM = rm -f
RMDIR = rm -rf
DOXYGEN = doxygen

+

Basic directory and file definitions

+This section contains definitions for the directories and files +referenced in this Makefile. All directories referenced from the +Makefile, and all external files referenced by the Makefile should be +collected here. This insures easy adoption in case some external +directories or files change.
+
+No directories or external files may be directory referenced outside +this section.
+
+When referencing other LiveSupport modules, typically the following +variables are defined for them:
+
MODULEX_DIR         = ${MODULES_DIR}/moduleX
MODULEX_INCLUDE_DIR = ${MODULEX_DIR}/include
MODULEX_LIB_DIR = ${MODULEX_DIR}/lib
MODULEX_LIB = livesupport_modulex
+

Sample

+A sample directory and file definition section follows.
+
#-------------------------------------------------------------------------------
# Basic directory and file definitions
#-------------------------------------------------------------------------------
BASE_DIR = .
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

MODULES_DIR = ${BASE_DIR}/../../modules

HELLOLIB_DIR = ${MODULES_DIR}/hello
HELLOLIB_INCLUDE_DIR = ${HELLOLIB_DIR}/include
HELLOLIB_LIB_DIR = ${HELLOLIB_DIR}/lib
HELLOLIB_LIB = livesupport_hello

VPATH = ${SRC_DIR}

HELLO_EXE = ${TMP_DIR}/hello

DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config

+

Configuration parameters

+This section contains the parameters passed to the building tools +(compiler, linker, etc.) When invoking building tools, they should be +parametrized by the definitions made here.
+

Sample
+

+A sample configuration parameters section follows.
+
#-------------------------------------------------------------------------------
# Configuration parameters
#-------------------------------------------------------------------------------
CPPFLAGS =
CXXFLAGS = -pedantic -Wall \
 -I${USR_INCLUDE_DIR} -I${HELLOLIB_INCLUDE_DIR} \
-I${INCLUDE_DIR} -I${TMP_DIR}
LDFLAGS = -L${USR_LIB_DIR} -L${HELLOLIB_LIB_DIR} -L${LIB_DIR}

+

Dependencies

+The dependencies section lists the objects that are build by implicit +rules, and that main targets depend on. This is the place where all +object files are listed, basically, for each library or executable.
+
+No object files that are built by this Makefile should be directly +referred to outside this section.
+

Sample

+A sample dependencies section follows.
+
#-------------------------------------------------------------------------------
# Dependencies
#-------------------------------------------------------------------------------
HELLO_EXE_OBJS = ${TMP_DIR}/main.o

+

Targets

+This section lists all the explicit, external targets for the makefile. +For a list of targets required, see the description +of the build environment. All targets in this section are marked as +.PHONY, as these targets are not building the files they are named +after.
+
+No explicit targets should be defined in the Makefile outside this +directory.
+

Sample

+A sample targets section follows.
+
#-------------------------------------------------------------------------------
# Targets
#-------------------------------------------------------------------------------
.PHONY: all dir_setup doc clean docclean depclean distclean

all: dir_setup ${HELLO_EXE}

dir_setup: ${TMP_DIR} ${DOXYGEN_DIR}

doc:
${DOXYGEN} ${DOXYGEN_CONFIG}

clean:
${RM} ${HELLO_EXE_OBJS} ${HELLO_EXE}

docclean:
${RMDIR} ${DOXYGEN_DIR}/html

depclean: clean

distclean: clean docclean
${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te*

+

Specific targets

+This section defines the targets for files to be built by the Makefile. +These are the targets that specify how files are built, but are not +covered by pattern rules.
+

Sample

+A sample specific targets section follows.
+
#-------------------------------------------------------------------------------
# Specific targets
#-------------------------------------------------------------------------------
${HELLO_EXE}: ${HELLO_EXE_OBJS}
${CXX} ${LDFLAGS} -o $@ $^ -l${HELLOLIB_LIB}

${TMP_DIR}:
${MKDIR} ${TMP_DIR}

${DOXYGEN_DIR}:
${MKDIR} ${DOXYGEN_DIR}

+

Pattern rules

+Pattern rules are the generic rules to build target files from object +files. Define these pattern rules in this section.
+
+No pattern rules should exist outside this section.
+

Sample

+A sample pattern rules section follows.
+
#-------------------------------------------------------------------------------
# Pattern rules
#-------------------------------------------------------------------------------
${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx
${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $<

+
+

Template

+See a generic template +for Makefiles. You may freely copy this +template when starting to create a new Makefile.
+
+ + diff --git a/campcaster/doc/developmentEnvironment/phpFileConventions.html b/campcaster/doc/developmentEnvironment/phpFileConventions.html new file mode 100644 index 000000000..baf7cc859 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/phpFileConventions.html @@ -0,0 +1,136 @@ + + + + + PHP file conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the PHP script file conventions for the LiveSupport +project. See also the generic description of the file conventions in the LiveSupport +project.
+

Introduction

+PHP scripts are text-based files containing PHP class definitions and/or commands.
+They should adhere to the PEAR coding standards +conventions.
+As text based files, they should adhere to the generic text-based +conventions.
+

Naming

+A PHP script containing only class definition should have filename which reflects the class, +it is implementing. +Class names begin with a capital letter, followed by lower case letters. +In case of a multiple word file name, the first letter of each word is +capitalized.
+Other PHP scripts should have name starting with lowecase letter.
+PHP script files are named by the following rules:
+
    +
  • there are no spaces in the file name
  • +
  • for file names containing multiple words, each additional word +begins with a capital letter
  • +
  • the extension of the file is .php
    +
  • +
+

Structure

+PHP scripts are partitioned by using the following 80 column wide partitioning comments:
+
+/* ==================================================== name of the partition */
+
+and +
+/* ------------------------------------------------- name of the subpartition */
+
+The file has the following mandatory structure:
+
    +
  • PHP starting tag <?php
  • +
  • Header
  • +
  • Defines ?
  • +
  • Include files ?
  • +
  • Code sections +
  • +
  • PHP ending tag ?>
  • +
+Because PHP is in-HTML embedable script language, it is possible to mix PHP and HTML code +using PHP tags <?php and ?>. This mixing approach is little bit +obsolete and it is better to use pure PHP (with structure described above) and some template system to generate HTML. + + +

Header

+The header holds all information mandated by the generic guidelines, but +are enclosed in the PHP multiline comments /* */. Note the 80 +column wide partitioning delimiter enclosing the header.
+
+/*------------------------------------------------------------------------------
+    Copyright (c) 2004 Media Development Loan Fund
+ 
+    This file is part of the Campcaster project.
+    http://campcaster.campware.org/
+    To report bugs, send an e-mail to bugs@campware.org
+ 
+    Campcaster 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.
+ 
+    Campcaster 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 Campcaster; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ 
+ 
+    Author   : $Author$
+    Version  : $Revision$
+    Location : $URL$
+
+------------------------------------------------------------------------------*/
+
+ +

Defines
+

+This section contains all the constant defines, similar as:
+
+define('CONSTAT_NAME', 10);
+
+ +

Include files
+

+This section contains all the include files that the script needs +to include. +The include files are listed in +a most generic to most specific order: first PEAR classes, then +other LiveSupport module include files, and finally include files from +the same module / product are listed.
+Is much safer to use include_once or require_once, not the original versions +of this statement.
+
+ +

Code sections

+This sections contain class definitions, function definitions or runable PHP commands.
+ + +

Template

+See a generic template +for PHP scripts. +You may freely download and copy this +template when starting to create a new script.
+
+ + diff --git a/campcaster/doc/developmentEnvironment/shellScriptConventions.html b/campcaster/doc/developmentEnvironment/shellScriptConventions.html new file mode 100644 index 000000000..5f615fca6 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/shellScriptConventions.html @@ -0,0 +1,76 @@ + + + + + shell script conventions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the shell script file conventions for the +LiveSupport +project. See also the generic description of the file +conventions in the LiveSupport +project.
+

Introduction

+Shell scripts are text-based executable shell command files. As text +based files, they should adhere to the generic text-based +conventions.
+

Naming

+Shell script files are named by the following rules:
+
    +
  • there are no spaces in the file name
  • +
  • the file name begins with a lower case letter
  • +
  • for file names containing multiple words, each additional word +begins with a capital letter
  • +
  • the extension of the file is .sh
    +
  • +
+For example, a file with a single-word name may be named like: single.sh, +whereas a file with multiple word name would be like: multipleWordNameFile.sh.
+

Structure

+Shell script files are partitioned by using the following 80 column +wide partitioning comment:
+
#-------------------------------------------------------------------------------
# This is the title of the partition
#-------------------------------------------------------------------------------
+The file has the +following mandatory structure:
+
    +
  • Reference to the shell
    +
  • +
  • Header
  • +
  • Additional sections+
  • +
+

Reference to the shell
+

+This is the mandatory reference to the shell executable each script has +to begin with:
+
#!/bin/sh
+

Header

+The header holds all information mandated by the generic guidelines, but +starting with the shell comment character #. Note the 80 +column wide partitioning delimiter enclosing the header.
+
#-------------------------------------------------------------------------------
# Copyright (c) 2004 Media Development Loan Fund
#
# This file is part of the Campcaster project.
# http://campcaster.campware.org/
# To report bugs, send an e-mail to bugs@campware.org
#
# Campcaster 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.
#
# Campcaster 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 Campcaster; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# Author : $Author$
# Version : $Revision$
# Location : $URL$
#-------------------------------------------------------------------------------
+

Additional sections

+Additional sections contain the executing code of the script. Bigger +parts of the script may be partitioned by the partitioning commend seen +above.
+

Template

+See a generic template +for shell scripts. You may freely copy this +template when starting to create a new document.
+
+ + diff --git a/campcaster/doc/developmentEnvironment/templates/Bar.cxx b/campcaster/doc/developmentEnvironment/templates/Bar.cxx new file mode 100644 index 000000000..3c2cfebc1 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/Bar.cxx @@ -0,0 +1,70 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* =============================================== include files & namespaces */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +using namespace LiveSupport::Core; +using namespace LiveSupport::Bar; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * Our famous foo string. + *----------------------------------------------------------------------------*/ +const std::string Bar::fooStr = "foo"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Return the famous bar string. + *----------------------------------------------------------------------------*/ +const std::string +Bar :: sayBar(void) throw (std::exception) +{ + if (barInt) { + throw std::exception(); + } + + return barStr; +} + diff --git a/campcaster/doc/developmentEnvironment/templates/Bar.h b/campcaster/doc/developmentEnvironment/templates/Bar.h new file mode 100644 index 000000000..f4369b311 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/Bar.h @@ -0,0 +1,111 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Foo_Bar_h +#define LiveSupport_Foo_Bar_H + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* =============================================== include files & namespaces */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Foo { + +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Bar class. + * This does nothing. + * + * @author $Author$ + * @version $Revision$ + */ +class Bar +{ + private: + /** + * A static member variable. + */ + static const std::string barStr; + + /** + * A member variable. + */ + int barInt; + + public: + /** + * Default constructor. + */ + Bar (void) throw () + { + } + + /** + * Say something. + * + * @param parameter a parameter we don't care about. + * @return the bar string. + * @exception std::exception on some problems. + */ + const std::string + sayBar (void) throw (std::exception) + { + return barStr; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + +} // namespace Foo +} // namespace LiveSupport + + +#endif // LiveSupport_Foo_Bar_H diff --git a/campcaster/doc/developmentEnvironment/templates/Makefile b/campcaster/doc/developmentEnvironment/templates/Makefile new file mode 100644 index 000000000..3ecdc1b92 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/Makefile @@ -0,0 +1,123 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen + + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +BASE_DIR = . +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 + +VPATH = ${SRC_DIR} + +MODULES_DIR = ${BASE_DIR}/../../modules + +HELLOLIB_DIR = ${MODULES_DIR}/hello +HELLOLIB_INCLUDE_DIR = ${HELLOLIB_DIR}/include +HELLOLIB_LIB_DIR = ${HELLOLIB_DIR}/lib +HELLOLIB_LIB = livesupport_hello + +HELLO_EXE = ${TMP_DIR}/hello + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +CPPFLAGS = +CXXFLAGS = -pedantic -Wall \ + -I${TMP_DIR} -I${HELLOLIB_INCLUDE_DIR} +LDFLAGS = -L${HELLOLIB_LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +HELLO_EXE_OBJS = ${TMP_DIR}/main.o + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean + +all: ${HELLOLIB_LIB} dir_setup ${HELLO_EXE} + +dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: + ${RM} ${HELLO_EXE_OBJS} ${HELLO_EXE} + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + +depclean: clean + ${MAKE} -C ${HELLOLIB_DIR} clean + +distclean: clean docclean + ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +${HELLO_EXE}: ${HELLO_EXE_OBJS} + ${CXX} ${LDFLAGS} -o $@ $^ -l${HELLOLIB_LIB} + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${HELLOLIB_LIB}: + ${MAKE} -C ${HELLOLIB_DIR} all + + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx + ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/doc/developmentEnvironment/templates/configure.ac b/campcaster/doc/developmentEnvironment/templates/configure.ac new file mode 100644 index 000000000..302237d7b --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/configure.ac @@ -0,0 +1,49 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(Hello, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../src/main.cxx) + +AC_CONFIG_HEADERS(configure.h) +AC_PROG_CXX() + +AC_CHECK_HEADERS(unistd.h getopt.h) + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/doc/developmentEnvironment/templates/htmlDocumentTemplate.html b/campcaster/doc/developmentEnvironment/templates/htmlDocumentTemplate.html new file mode 100644 index 000000000..1d86688ab --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/htmlDocumentTemplate.html @@ -0,0 +1,29 @@ + + + + + HTML document template + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+Describe the scope of your document here, e.g. what topic it is all +about
+

Introduction

+Introduce the content of the document to your reader
+

Additional sections

+Write about your topic in details here..
+
+ + diff --git a/campcaster/doc/developmentEnvironment/templates/phpScriptTemplate.php.txt b/campcaster/doc/developmentEnvironment/templates/phpScriptTemplate.php.txt new file mode 100644 index 000000000..dd4ea806f --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/phpScriptTemplate.php.txt @@ -0,0 +1,98 @@ + diff --git a/campcaster/doc/developmentEnvironment/templates/phpScriptTemplate.phps b/campcaster/doc/developmentEnvironment/templates/phpScriptTemplate.phps new file mode 100644 index 000000000..dd4ea806f --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/phpScriptTemplate.phps @@ -0,0 +1,98 @@ + diff --git a/campcaster/doc/developmentEnvironment/templates/shellScriptTemplate.sh b/campcaster/doc/developmentEnvironment/templates/shellScriptTemplate.sh new file mode 100755 index 000000000..f2166d595 --- /dev/null +++ b/campcaster/doc/developmentEnvironment/templates/shellScriptTemplate.sh @@ -0,0 +1,33 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# This script does nothing else, but says hello. +#------------------------------------------------------------------------------- + +echo "Hello!"; diff --git a/campcaster/doc/developmentTools.html b/campcaster/doc/developmentTools.html new file mode 100644 index 000000000..b79afbe48 --- /dev/null +++ b/campcaster/doc/developmentTools.html @@ -0,0 +1,109 @@ + + + + + LiveSupport developer tools + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document lists the development tools that are expected to be on a +system that intends to compile and develop LiveSupport.
+

Introduction

+LiveSupport expects a generic development environment on the system to +be built, which is basically a generic install of a POSIX-compliant +operating system, with a set of GNU development tools and some +utilities.
+

Tools

+The following tools are expected on the development system:
+ +

Libraries

+Note that if you are installing these libraries as binary packages, then you +will need to install the "development" package, as well. (For example, for +libpng, you might need to install the libpng and +libpng-dev packages. The package names vary by distribution.) +
+

Required libraries
+

+The following development libraries are expected on the development +system:
+ + +

Recommended libraries

+The following libraries are used by LiveSupport. If they are not found +on the system, LiveSupport will compile them from sources on its own. +While having these libraries is not necessary, Compiling takes longer +without them, and the generated LiveSupport directory will be larger as +well.
+ + + diff --git a/campcaster/doc/doxygen/.keepme b/campcaster/doc/doxygen/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/doc/doxygen/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/doc/gettingStarted.html b/campcaster/doc/gettingStarted.html new file mode 100644 index 000000000..0259093b0 --- /dev/null +++ b/campcaster/doc/gettingStarted.html @@ -0,0 +1,213 @@ + + + + + Getting started with the LiveSupport development environment + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes how to set up the LiveSupport development +environment.
+ +

Introduction

+LiveSupport uses a well-defined development environment. +Most of the LiveSupport-specific files are included in the version +control system, but some preparation and setup has to be made on system +used to develop LiveSupport as well.
+
+There is a simplified and Ubuntu-centric version of this document in the + +LiveSupport Trac wiki. + +

Steps
+

+The following steps needed to be taken for setting up the LiveSupport +development environment.
+
    +
  • install development tools
    +
  • +
  • set up additional system resources
  • +
  • check out the sources
  • +
  • configure the environment
    +
  • +
  • set up tools used by LiveSupport
  • +
  • personalize your development environment
    +
  • +
+

Install development tools

+Install all the tools needed for the development of LiveSupport. Please +see the development tools document +for a list of tools needed.
+

Set up additional system resources

+The LiveSupport development environment uses some system resources, +that are not reasonable to include in the environment itself.
+

Test database
+

+One such +resource is an ODBC datasource to a test database. This +database has to be accessible for executing the test suites and +applications within the LiveSupport development environment.
+
+First, LiveSupport expects a PostgreSQL +database, and an ODBC +Data Source accessible to it through unixODBC. +Please refer to the documentation of these tools to set them up.
+
+The test environment assumes that it can connect to the PostgreSQL +database as localhost via a TCP/IP connection, as the user test.
+
+In newer versions of PostgreSQL (≥ 8), TCP/IP connections from localhost +are enabled by default. If you are using an older version, do the following: +
    +
  • edit postgresql.conf + (usually /var/lib/postgres/data/postgresql.conf), to have + to following line:
    +
    +
    tcpip_socket = true
    +
    +
  • and also edit pg_hba.conf (usually + /var/lib/postgres/data/pg_hba.conf) + to include the following line, before other lines related to access + through localhost:
    +
    +
    host    all         all         127.0.0.1         255.255.255.255   password
    +
    +After the above two manual edits to the PostgreSQL configuration, +restart the postgresql daemon.
    +
+ + +

Web server
+

+Second, LiveSupport expects: +
    +
  • Apache httpd server +running on the development computer
  • +
  • PHP interpreter
  • +
  • PHP apache module
  • +
  • PHP iconv extension (--with-iconv)
    +
  • DOMXML PHP extension - an +XMLv2 module for PHP
    +
  • +
  • PostgreSQL support in PHP
  • +
  • PEAR
  • +
+ +

Apache group membership

+The setup script assumes that the current user is a member of the Apache group. +Add the user who will be using the development environment to this group; +it's usually called apache; on debian-based systems, it is +called www-data. + +

Apache configuration

+The storage server uses some directives which are not enabled by default. +To enable them, find the configuration file for the userdir module of +apache, and change the AllowOverride directive in the +<Directory /home/*/public_html> section to All. +

+ +

Check out the sources

+The LiveSupport development directory tree can be accessed anonymously via +Subversion, at +svn+ssh://code.campware.org/home/svn/repo/livesupport/trunk/livesupport. +The following Subversion command +would check out the development tree:

+
svn checkout svn+ssh://code.campware.org/home/svn/repo/livesupport/trunk/livesupport

+This will check out and create the LiveSupport development directory +structure.
+
+ +

Configure the environment

+First, you need to create the database and ODBC data source used by +LiveSupport. This is done most easily by running the script +livesupport/bin/user_setup_db.sh. +Run the scripts as root, and provide your user name with the +--user option: + +

+cd livesupport
+sudo ./bin/user_setup_db.sh --user=<ls_developer_user>
+
+
+The script will set up the following resources:
+
    +
  • a PostgreSQL user named test with the password + test (if it does not exist)
  • +
  • a PostgreSQL database named + LiveSupport-<ls_developer_user>
  • +
  • an ODBC data source of the same name, with user name + and password test
  • + +
+
+ +Next (and last), you compile the code and set up the configuration files. +Both are done by the script +

+cd livesupport
+./bin/setupDevelopmentEnvironment.sh --apache-group=<apache_group>
+
+
+This script will set up the libraries used by LiveSupport (by compiling +and installing them under livesupport/usr), and set up the development +environment for all LiveSupport modules.
+
+It will also create your personalized configuration files under +~/.livesupport, make certain directories writable for Apache +(this is where we need the current user to be a member of the +apache group), define a user-specific port for the scheduler +daemon, and create a symlink in ~/public_html/ to the PHP +entry points.
+
+After running the above script, the livesupport development environment +for the current user will be unique on the system, and will not +conflict with resources used by other developers. For example, the +LiveSupport HTML user interface for the user will be reachable at:
+

+http://localhost/~<ls_developer_user>/livesupport/htmlUI/var
+
+
+ +

Single-user setup

+It is also possible to set up a shared configuration, instead of the +per-user setup described in the previous section.
+
+To do this, use the script test_setup_db.sh instead of +user_setup_db.sh. You will also need to manually execute +the commands in setupDevelopmentEnvironment up to, and not +including, the call to user_setup.sh; and manually execute +the "Setup storage server" and "Setup directory permissions" portions +of the user_setup.sh script. Finally, create a symlink +livesupport in the root data directory of the Apache server +which points to livesupport/src/modules/. +The address of the HTML interface will now be
+

+http://localhost/livesupport/htmlUI/var
+
+
+After this, the development environment should work, using the default +configuration files. NOTE: this single-user method has not been used by any +developers for quite some time, so these instructions may be +out of date or incomplete.
+
+ +

Ready to roll

+With the above steps completed, the LiveSupport modules and products +are ready to be compiled and developed further. Have fun!
+
+
+ + diff --git a/campcaster/doc/gui/c_gui_finaltimetable.xls b/campcaster/doc/gui/c_gui_finaltimetable.xls new file mode 100644 index 000000000..e1ad394a7 Binary files /dev/null and b/campcaster/doc/gui/c_gui_finaltimetable.xls differ diff --git a/campcaster/doc/gui/designs/advancedsearch.gif b/campcaster/doc/gui/designs/advancedsearch.gif new file mode 100644 index 000000000..d5bbcd317 Binary files /dev/null and b/campcaster/doc/gui/designs/advancedsearch.gif differ diff --git a/campcaster/doc/gui/designs/editfile.gif b/campcaster/doc/gui/designs/editfile.gif new file mode 100644 index 000000000..5c3697324 Binary files /dev/null and b/campcaster/doc/gui/designs/editfile.gif differ diff --git a/campcaster/doc/gui/designs/index.html b/campcaster/doc/gui/designs/index.html new file mode 100644 index 000000000..106b48efc --- /dev/null +++ b/campcaster/doc/gui/designs/index.html @@ -0,0 +1,13 @@ +final designs : livesupport + +master palette, live mode, cue, history, scratchpad and xfader
+advanced search
+search : browser and simple search
+info palette
+upload stream
+edit file
+login and upload palettes
+scheduler, week view
+scheduler, day view
+playlist, list view
+playlist, timeline view diff --git a/campcaster/doc/gui/designs/info.gif b/campcaster/doc/gui/designs/info.gif new file mode 100644 index 000000000..04cac3881 Binary files /dev/null and b/campcaster/doc/gui/designs/info.gif differ diff --git a/campcaster/doc/gui/designs/livemode.gif b/campcaster/doc/gui/designs/livemode.gif new file mode 100644 index 000000000..55319764d Binary files /dev/null and b/campcaster/doc/gui/designs/livemode.gif differ diff --git a/campcaster/doc/gui/designs/login_upload.gif b/campcaster/doc/gui/designs/login_upload.gif new file mode 100644 index 000000000..8cf3ff592 Binary files /dev/null and b/campcaster/doc/gui/designs/login_upload.gif differ diff --git a/campcaster/doc/gui/designs/playlist_list_view.gif b/campcaster/doc/gui/designs/playlist_list_view.gif new file mode 100644 index 000000000..73378e9bd Binary files /dev/null and b/campcaster/doc/gui/designs/playlist_list_view.gif differ diff --git a/campcaster/doc/gui/designs/playlist_timeline_view.gif b/campcaster/doc/gui/designs/playlist_timeline_view.gif new file mode 100644 index 000000000..af974594c Binary files /dev/null and b/campcaster/doc/gui/designs/playlist_timeline_view.gif differ diff --git a/campcaster/doc/gui/designs/scheduler_day.gif b/campcaster/doc/gui/designs/scheduler_day.gif new file mode 100644 index 000000000..8061d6dd7 Binary files /dev/null and b/campcaster/doc/gui/designs/scheduler_day.gif differ diff --git a/campcaster/doc/gui/designs/scheduler_week.gif b/campcaster/doc/gui/designs/scheduler_week.gif new file mode 100644 index 000000000..f3ac940c7 Binary files /dev/null and b/campcaster/doc/gui/designs/scheduler_week.gif differ diff --git a/campcaster/doc/gui/designs/simple-browser.gif b/campcaster/doc/gui/designs/simple-browser.gif new file mode 100644 index 000000000..2bad0c870 Binary files /dev/null and b/campcaster/doc/gui/designs/simple-browser.gif differ diff --git a/campcaster/doc/gui/designs/uploadstream.gif b/campcaster/doc/gui/designs/uploadstream.gif new file mode 100644 index 000000000..5a90b4dc7 Binary files /dev/null and b/campcaster/doc/gui/designs/uploadstream.gif differ diff --git a/campcaster/doc/gui/htmlPageDescription.rtf b/campcaster/doc/gui/htmlPageDescription.rtf new file mode 100644 index 000000000..e95a3a531 --- /dev/null +++ b/campcaster/doc/gui/htmlPageDescription.rtf @@ -0,0 +1,1535 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f36\froman\fcharset238\fprq2 Times New Roman CE;}{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}{\f40\froman\fcharset162\fprq2 Times New Roman Tur;} +{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\f46\fswiss\fcharset238\fprq2 Arial CE;}{\f47\fswiss\fcharset204\fprq2 Arial Cyr;}{\f49\fswiss\fcharset161\fprq2 Arial Greek;}{\f50\fswiss\fcharset162\fprq2 Arial Tur;}{\f51\fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\f52\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f53\fswiss\fcharset186\fprq2 Arial Baltic;}{\f54\fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f56\fmodern\fcharset238\fprq1 Courier New CE;}{\f57\fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f59\fmodern\fcharset161\fprq1 Courier New Greek;}{\f60\fmodern\fcharset162\fprq1 Courier New Tur;}{\f61\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f62\fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f63\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f64\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0; +\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{ +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 +\b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \styrsid7808687 heading 1;}{\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 +\b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \styrsid2364186 heading 2;}{\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 +\b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 \sbasedon0 \snext0 \sautoupd \styrsid12474292 heading 3;}{\s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0 +\b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \styrsid4536037 heading 4;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\widctlpar +\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext15 \styrsid8406911 header;}{\s16\ql \li0\ri0\widctlpar +\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext16 \styrsid8406911 footer;}{\*\cs17 \additive \sbasedon10 \styrsid8406911 page number;}{\*\cs18 \additive +\ul\cf2 \sbasedon10 \styrsid16411736 Hyperlink;}{\*\ts19\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \sbasedon11 \snext19 \styrsid2560916 Table Grid;}{\s20\ql \li0\ri0\sb120\sa120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 1;}{\s21\ql \li240\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 +\scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 2;}{\s22\ql \li480\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 +\i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 3;}{\s23\ql \li720\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 4;}{\s24\ql \li960\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin960\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 5;}{\s25\ql \li1200\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1200\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 6;}{\s26\ql \li1440\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1440\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 7;}{\s27\ql \li1680\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1680\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 8;}{\s28\ql \li1920\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1920\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 9;}{\s29\ql \li0\ri0\widctlpar +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f2\fs20\lang2074\langfe1033\cgrid\langnp2074\langfenp1033 +\sbasedon0 \snext29 \styrsid8283629 HTML Preformatted;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable{\list\listtemplateid1731750002\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li1492\jclisttab\tx1492\lin1492 }{\listname ;}\listid-132}{\list\listtemplateid437127930\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li1209\jclisttab\tx1209\lin1209 }{\listname ;}\listid-131}{\list\listtemplateid902973714\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li926\jclisttab\tx926\lin926 }{\listname ;}\listid-130}{\list\listtemplateid-833979220\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li643\jclisttab\tx643\lin643 }{\listname ;}\listid-129}{\list\listtemplateid276612358\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1492\jclisttab\tx1492\lin1492 }{\listname ;}\listid-128}{\list\listtemplateid-801372542\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1209\jclisttab\tx1209\lin1209 }{\listname ;}\listid-127}{\list\listtemplateid122300088\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li926\jclisttab\tx926\lin926 }{\listname ;}\listid-126}{\list\listtemplateid-1328123770\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li643\jclisttab\tx643\lin643 }{\listname ;}\listid-125}{\list\listtemplateid-804373920\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-120}{\list\listtemplateid-647585512\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-119}{\list\listtemplateid1363804504\listhybrid{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid111360257} +{\list\listtemplateid-1331890960\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720 +\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid149251787}{\list\listtemplateid-2094081540\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid176239687}{\list\listtemplateid-1186667090\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid196159275}{\list\listtemplateid-2011650680\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid283662526}{\list\listtemplateid-205238550\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid319651020}{\list\listtemplateid115503630\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid335302263}{\list\listtemplateid309469072\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid381027044}{\list\listtemplateid1302125000\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid462117874}{\list\listtemplateid1056898566\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid516770084}{\list\listtemplateid-148206224\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid799151151}{\list\listtemplateid-1184436284\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid971055508}{\list\listtemplateid1599222170\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1021202524}{\list\listtemplateid-554772544\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1115831479}{\list\listtemplateid-52774062\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1201354651}{\list\listtemplateid714002106\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1215583941}{\list\listtemplateid1133778160\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1258099724}{\list\listtemplateid456451792\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1359501324}{\list\listtemplateid-111496594\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1381981516}{\list\listtemplateid-935423906\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1465780323}{\list\listtemplateid-335746746\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1689285519}{\list\listtemplateid-2121651376\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3960\jclisttab\tx3960\lin3960 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4680\jclisttab\tx4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5400\jclisttab\tx5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6120 +\jclisttab\tx6120\lin6120 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6840\jclisttab\tx6840\lin6840 } +{\listname ;}\listid1689866703}{\list\listtemplateid-1735908832\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1699088692}{\list\listtemplateid-1543187310\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1746999783}{\list\listtemplateid-772923238\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1786607916}{\list\listtemplateid1158283444\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat11\levelspace0\levelindent0{\leveltext\leveltemplateid-437354988\'01-;}{\levelnumbers;} +\loch\af0\hich\af0\dbch\af0\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 +\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1870531578}{\list\listtemplateid1158283444{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat11 +\levelspace0\levelindent0{\leveltext\'01-;}{\levelnumbers;}\loch\af0\hich\af0\dbch\af0\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname +;}\listid1874920252}{\list\listtemplateid281947714\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1883443674}{\list\listtemplateid-1662761508\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1891258171}{\list\listtemplateid1361489580\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1904295166}{\list\listtemplateid-1768898404\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1910267990}{\list\listtemplateid1417836132\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1972705535}{\list\listtemplateid535174426\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid2021620681}{\list\listtemplateid1814071032\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2051875221}{\list\listtemplateid273994028\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2069067059}}{\*\listoverridetable +{\listoverride\listid1972705535\listoverridecount0\ls1}{\listoverride\listid1381981516\listoverridecount0\ls2}{\listoverride\listid2021620681\listoverridecount0\ls3}{\listoverride\listid1883443674\listoverridecount0\ls4}{\listoverride\listid462117874 +\listoverridecount0\ls5}{\listoverride\listid-119\listoverridecount0\ls6}{\listoverride\listid-125\listoverridecount0\ls7}{\listoverride\listid-126\listoverridecount0\ls8}{\listoverride\listid-127\listoverridecount0\ls9}{\listoverride\listid-128 +\listoverridecount0\ls10}{\listoverride\listid-120\listoverridecount0\ls11}{\listoverride\listid-129\listoverridecount0\ls12}{\listoverride\listid-130\listoverridecount0\ls13}{\listoverride\listid-131\listoverridecount0\ls14}{\listoverride\listid-132 +\listoverridecount0\ls15}{\listoverride\listid176239687\listoverridecount0\ls16}{\listoverride\listid381027044\listoverridecount0\ls17}{\listoverride\listid1910267990\listoverridecount0\ls18}{\listoverride\listid111360257\listoverridecount0\ls19} +{\listoverride\listid335302263\listoverridecount0\ls20}{\listoverride\listid1786607916\listoverridecount0\ls21}{\listoverride\listid149251787\listoverridecount0\ls22}{\listoverride\listid1904295166\listoverridecount0\ls23}{\listoverride\listid2051875221 +\listoverridecount0\ls24}{\listoverride\listid1258099724\listoverridecount0\ls25}{\listoverride\listid1746999783\listoverridecount0\ls26}{\listoverride\listid1359501324\listoverridecount0\ls27}{\listoverride\listid283662526\listoverridecount0\ls28} +{\listoverride\listid319651020\listoverridecount0\ls29}{\listoverride\listid1215583941\listoverridecount0\ls30}{\listoverride\listid1021202524\listoverridecount0\ls31}{\listoverride\listid196159275\listoverridecount0\ls32}{\listoverride\listid2069067059 +\listoverridecount0\ls33}{\listoverride\listid516770084\listoverridecount0\ls34}{\listoverride\listid1870531578\listoverridecount0\ls35}{\listoverride\listid1689285519\listoverridecount0\ls36}{\listoverride\listid1874920252\listoverridecount0\ls37} +{\listoverride\listid971055508\listoverridecount0\ls38}{\listoverride\listid1689866703\listoverridecount0\ls39}{\listoverride\listid1891258171\listoverridecount0\ls40}{\listoverride\listid1201354651\listoverridecount0\ls41}{\listoverride\listid1699088692 +\listoverridecount0\ls42}{\listoverride\listid1115831479\listoverridecount0\ls43}{\listoverride\listid799151151\listoverridecount0\ls44}{\listoverride\listid1465780323\listoverridecount0\ls45}}{\*\rsidtbl \rsid5606\rsid84972\rsid93759\rsid279828 +\rsid338081\rsid338302\rsid353388\rsid403238\rsid525137\rsid534437\rsid556831\rsid597303\rsid620663\rsid728252\rsid743655\rsid873682\rsid875711\rsid1052329\rsid1052817\rsid1077137\rsid1141904\rsid1207448\rsid1207899\rsid1253662\rsid1334983\rsid1339160 +\rsid1400663\rsid1577794\rsid1582066\rsid1593142\rsid1780831\rsid1867486\rsid1907956\rsid1981424\rsid1993713\rsid2033356\rsid2109254\rsid2111105\rsid2188252\rsid2364186\rsid2370101\rsid2446275\rsid2520008\rsid2560916\rsid2637360\rsid2693463\rsid2764868 +\rsid2775972\rsid2848434\rsid3039356\rsid3222878\rsid3242838\rsid3350176\rsid3367757\rsid3412524\rsid3621462\rsid3691965\rsid3867572\rsid4006540\rsid4014001\rsid4204924\rsid4217381\rsid4409133\rsid4536037\rsid4655542\rsid4730303\rsid4920384\rsid4932664 +\rsid5051338\rsid5063614\rsid5074305\rsid5113369\rsid5202891\rsid5268167\rsid5452165\rsid5581702\rsid5599797\rsid6300556\rsid6431368\rsid6705152\rsid7088866\rsid7348600\rsid7552355\rsid7607439\rsid7619615\rsid7757091\rsid7758789\rsid7759020\rsid7808687 +\rsid7952295\rsid7999091\rsid8068550\rsid8133754\rsid8139555\rsid8218757\rsid8283629\rsid8327662\rsid8339573\rsid8406911\rsid8416880\rsid8476729\rsid8662583\rsid8865384\rsid8997258\rsid9441111\rsid9532527\rsid9599581\rsid9600687\rsid9731452\rsid9842054 +\rsid9860289\rsid9910620\rsid9923887\rsid10112697\rsid10120207\rsid10358824\rsid10623485\rsid10698856\rsid10714125\rsid10714751\rsid10764249\rsid10826198\rsid11036725\rsid11281446\rsid11360489\rsid11551536\rsid11555562\rsid11603768\rsid11818869 +\rsid12129795\rsid12270098\rsid12283844\rsid12394895\rsid12470370\rsid12474292\rsid12541268\rsid12599431\rsid12605384\rsid12611656\rsid12676815\rsid12728480\rsid12852167\rsid12910717\rsid13048422\rsid13265408\rsid13268333\rsid13270669\rsid13389201 +\rsid13398770\rsid13436755\rsid13463385\rsid13918709\rsid14029788\rsid14296232\rsid14439181\rsid14444417\rsid14486893\rsid14886159\rsid14901303\rsid14952783\rsid14958399\rsid15298160\rsid15341335\rsid15349349\rsid15351607\rsid15356409\rsid15361338 +\rsid15553266\rsid15563602\rsid15626287\rsid15869539\rsid15878439\rsid15933635\rsid15993845\rsid16079447\rsid16127656\rsid16215702\rsid16263532\rsid16404736\rsid16411736\rsid16465826\rsid16469864\rsid16671400\rsid16719418}{\*\generator Microsoft Word 11. +0.6113;}{\info{\title LIVESUPPORT WINDOW DESCRIPTION FOR C++}{\author richard castlefield}{\operator Douglas Arellanes}{\creatim\yr2004\mo12\dy15\hr17\min33}{\revtim\yr2005\mo1\dy14\hr15\min46}{\version20}{\edmins134}{\nofpages15}{\nofwords4793} +{\nofchars27322}{\*\company }{\nofcharsws32051}{\vern24699}}\paperw11906\paperh16838\margl1417\margr1417\margt1417\margb1134 +\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1417\dgvorigin1417\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot14444417 \fet0{\*\ftnsep +\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid279828 \chftnsep +\par }}{\*\ftnsepc \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid279828 \chftnsepc +\par }}{\*\aftnsep \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid279828 \chftnsep +\par }}{\*\aftnsepc \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid279828 \chftnsepc +\par }}\sectd \linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\header \pard\plain \s15\qc \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8406911 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\f1\fs20\lang2057\langfe1031\langnp2057\insrsid279828\charrsid8406911 LiveSupport Window description for }{\f1\fs20\lang2057\langfe1031\langnp2057\insrsid4014001 HTML GUI}{ +\f1\fs20\lang2057\langfe1031\langnp2057\insrsid279828\charrsid8406911 +\par }}{\footer \pard\plain \s16\qc \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8406911 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field{\*\fldinst {\cs17\insrsid279828 PAGE }}{\fldrslt { +\cs17\lang1024\langfe1024\noproof\insrsid11818869 12}}}{\cs17\insrsid279828 of }{\field{\*\fldinst {\cs17\insrsid279828 NUMPAGES }}{\fldrslt {\cs17\lang1024\langfe1024\noproof\insrsid11818869 15}}}{\insrsid279828 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2693463 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2693463 {\*\bkmkstart _Toc90357953} +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\lang2057\langfe1031\langnp2057\insrsid2693463 TOC \\o "1-4" \\h \\z \\u }}{\fldrslt {\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\ +l "_Toc93466769"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370036003900000000}}}{\fldrslt {\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 +LiveSupport Window description for HTML GUI application}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466769 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370036003900000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 2}}}}}{ +\b0\caps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466770"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003000000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 Definition Master versus Content Panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466770 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003000000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 2}}}}}{\b0\caps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466771"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003100000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 Individual screens in order of (possible appearance)}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466771 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003100000020}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 2}}}}}{\b0\caps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466772"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003200000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 1.a. Starting the application: opening the Master Panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466772 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003200000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 2}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466773"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003300000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Starting other panels from Master panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466773 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003300000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 3}}}}}{\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466774"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003400000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 2. Loging in: the login content panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466774 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003400000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 3}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466775"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003500000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 This screen appears}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466775 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003500000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 3}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466776"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003600000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window contains}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466776 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003600000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 3}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466777"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003700000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The function of the items}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466777 +\\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003700000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 3}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466778"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003800000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Additional functions}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466778 \\h } +{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003800000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 3}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466779"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003900000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 3. Uploading files panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466779 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370037003900000036}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 4}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466780"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003000000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window opens when}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466780 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003000000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 4}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466781"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003100000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window contains}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466781 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003100000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 4}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466782"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003200000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The function of items}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466782 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003200000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 4}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466783"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003300000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Additional functions:}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466783 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003300000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 4}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466784"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003400000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 12. Add web stream panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466784 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003400000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 5}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466785"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003500000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window opens when}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466785 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003500000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 5}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466786"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003600000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window contains}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466786 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003600000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 5}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466787"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003700000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The function of items}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466787 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003700000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 5}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466788"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003800000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Additional functions:}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466788 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003800000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 5}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466789"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003900000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 13. Edit file information panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466789 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370038003900000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 5}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466790"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003000000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window opens when}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466790 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003000000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 5}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466791"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003100000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window contains}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466791 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003100000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 6}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466792"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003200000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Default status}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466792 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003200000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 6}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466793"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003300000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The function of items}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466793 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003300000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 6}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466794"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003400000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Additional functions:}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466794 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003400000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 6}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466795"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003500000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 4. DJ Bag panel}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466795 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003500000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 7}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466796"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003600000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window contains}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466796 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003600000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 7}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466797"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003700000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The function of items}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466797 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003700000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 7}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466798"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003800000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Additional functions}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466798 \\h } +{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003800000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 7}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466799"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003900000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 6. Scheduler window}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466799 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600370039003900000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 7}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466800"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003000000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window opens when}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466800 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003000000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 7}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466801"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003100000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window contains}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466801 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003100000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 8}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466802"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003200000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The function of the items}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466802 +\\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003200000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 8}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466803"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003300000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Additional functions}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466803 \\h } +{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003300000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 9}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466804"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003400000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Scheduler popup window to schedule playlist}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466804 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003400000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 10}}}}}{\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466805"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003500000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 5. Playlist management window (simple)}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466805 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003500000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 10}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466806"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003600000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window opens when}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466806 \\h +}{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003600000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 10}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466807"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003700000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The window contains}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466807 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003700000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 10}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466808"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003800000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 The function of the items}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466808 +\\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003800000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 10}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466809"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003900000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Additional functions}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466809 \\h } +{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380030003900000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 11}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466810"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003000000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 7. Library / Search}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466810 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003000000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 11}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466811"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003100000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 When starting the application}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466811 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003100000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 12}}}}}{\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466812"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003200000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Search form}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466812 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003200000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 12}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466813"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003300000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Search - Advanced mode}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466813 \\ +h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003300000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 12}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466814"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003400000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 How does it work :}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466814 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003400000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 12}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466815"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003500000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Example:}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466815 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003500000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 13}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466816"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003600000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Form field with the Search results}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466816 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003600000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 13}}}}}{\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466817"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003700000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 How does it work :}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466817 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003700000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 13}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466818"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003800000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Play list}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466818 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003800000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 13}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466819"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003900000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Browse}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466819 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380031003900000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 13}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466820"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003000000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 HTML1 User preferences}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF +_Toc93466820 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003000000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 15}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466821"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003100000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 HTML2 Station preferences}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466821 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003100000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 15}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466822"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003200000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 HTML3 User management}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466822 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003200000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 15}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466823"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003300000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 HTML4 Log viewer}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _T +oc93466823 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003300000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 +15}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466824"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003400000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 HTML5 Upload download status for central server}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466824 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003400000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 15}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466825"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003500000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 Options}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466825 \\h }{ +\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003500000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 15}}}}}{ +\i0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466826"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003600000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 HTML6 workflow\'85 for 1.x version}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466826 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003600000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466827"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003700000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 General issues}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466827 +\\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003700000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{ +\b0\caps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466828"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003800000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 General link of our design so far :}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466828 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003800000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466829"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003900000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 On-Air Off-air definition}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466829 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380032003900000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466830"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003000000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 Right mouse sensitive for files and playlists}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466830 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003000000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{\b0\caps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466831"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003100000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp1036\insrsid2775972\charrsid5599797 Information formats (date, names, etc.)}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466831 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003100000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{\b0\caps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466832"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003200000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 Date format}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 PAGEREF _Toc93466832 \\ +h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003200000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{ +\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{\lang1024\langfe1024\noproof\insrsid2775972 HYPERLINK \\l "_Toc93466833"}{\cs18\ul\cf2\lang1024\langfe1024\noproof\insrsid2775972\charrsid5599797 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid2370101\charrsid2775972 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003300000000}}}{\fldrslt { +\cs18\ul\cf2\lang1024\langfe1024\noproof\langnp2057\insrsid2775972\charrsid5599797 Station information}{\lang1024\langfe1024\noproof\webhidden\insrsid2775972 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid2775972 + PAGEREF _Toc93466833 \\h }{\lang1024\langfe1024\noproof\insrsid2370101 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f00630039003300340036003600380033003300000000}}}{\fldrslt { +\lang1024\langfe1024\noproof\webhidden\insrsid2775972 16}}}}}{\scaps0\fs24\lang1024\langfe1024\noproof\langnp1033\langfenp1033\insrsid2775972 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2693463 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 }}\pard\plain +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2693463 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2693463 +\par +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid1253662 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid2693463 {\*\bkmkstart _Toc93466769}L}{\lang2057\langfe1031\langnp2057\insrsid8406911 iveSupport }{\lang2057\langfe1031\langnp2057\insrsid1253662 Window description for }{ +\lang2057\langfe1031\langnp2057\insrsid15361338 {\*\bkmkend _Toc90357953}HTML }{\lang2057\langfe1031\langnp2057\insrsid1077137 GUI application}{\lang2057\langfe1031\langnp2057\insrsid1253662 {\*\bkmkend _Toc93466769} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8406911 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8406911 +\par }{\lang2057\langfe1031\langnp2057\insrsid12129795 (Version: 2005-01}{\lang2057\langfe1031\langnp2057\insrsid620663 -1}{\lang2057\langfe1031\langnp2057\insrsid12129795 2}{\lang2057\langfe1031\langnp2057\insrsid8406911 )}{ +\lang2057\langfe1031\langnp2057\insrsid8406911\charrsid8406911 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\lang2057\langfe1031\langnp2057\insrsid1253662 +\par }{\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 The following document describes the }{\lang2057\langfe1031\langnp2057\insrsid13389201 +\par +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid728252\charrsid728252 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid13389201 {\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 items}{\lang2057\langfe1031\langnp2057\insrsid728252 (buttons, }{ +\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 }{\lang2057\langfe1031\langnp2057\insrsid13389201 information, visuals) and +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13389201 \loch\af3\dbch\af0\hich\f3 \'b7\tab}functions (of these items) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9731452 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid9731452 the interface feedback (e.g. login error, what next?) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\lang2057\langfe1031\langnp2057\insrsid13389201 +\par }{\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 for each individual screen of LiveSuppo}{\lang2057\langfe1031\langnp2057\insrsid728252 rt. It does }{\lang2057\langfe1031\langnp2057\insrsid9731452 +not describe their position. And it raises a number of questions \endash you will see as you go along.}{\lang2057\langfe1031\langnp2057\insrsid14444417 +\par }{\lang2057\langfe1031\langnp2057\insrsid9731452 +\par }{\lang2057\langfe1031\langnp2057\insrsid13048422 This document is used by the}{\lang2057\langfe1031\langnp2057\insrsid9731452 +\par +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9731452 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid9731452 { +\lang2057\langfe1031\langnp2057\insrsid9731452 programmers to implement the functionality on the screen and the +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9731452 \loch\af3\dbch\af0\hich\f3 \'b7\tab}designers to design the screen according to the functionality +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid279828 {\lang2057\langfe1031\langnp2057\insrsid279828 {\*\bkmkstart _Toc93466770}Definition Master versus Content Panel}{ +\lang2057\langfe1031\langnp2057\insrsid9731452 {\*\bkmkend _Toc93466770} +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\lang2057\langfe1031\langnp2057\insrsid279828 +Master Panel means the shading of the page including the pulldown menu and the bottom of the page. Content Panel is the center of the page that changes according to functions of the system, chosen by the user. +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid16411736 {\*\bkmkstart _Toc90357956}{\*\bkmkstart _Toc93466771}Individual screens in order of (possible appearance)}{\lang2057\langfe1031\langnp2057\insrsid9923887 {\*\bkmkend _Toc90357956}{\*\bkmkend _Toc93466771} + +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc90357957}{\*\bkmkstart _Toc93466772}1.a. }{\lang2057\langfe1031\langnp2057\insrsid16411736 Starting the application: opening the Master }{\lang2057\langfe1031\langnp2057\insrsid8339573 {\*\bkmkend _Toc90357957}Panel}{ +\lang2057\langfe1031\langnp2057\insrsid16411736 {\*\bkmkend _Toc93466772} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16411736 +When starting the application it will open the Master }{\lang2057\langfe1031\langnp2057\insrsid8339573 Panel}{\lang2057\langfe1031\langnp2057\insrsid16411736 which contains the following items: +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4536037 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid4536037 Time at broadcast station (big)}{\lang2057\langfe1031\langnp2057\insrsid8339573 with Javascript ticking away the seconds}{\lang2057\langfe1031\langnp2057\insrsid4536037 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8339573 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid8339573 Time at client (? If remote}{\lang2057\langfe1031\langnp2057\insrsid4536037 )}{ +\lang2057\langfe1031\langnp2057\insrsid8339573 with JavaScript clock}{\lang2057\langfe1031\langnp2057\insrsid4536037 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid16411736 LiveSupport logo +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Station information (frequency, station name, station logo,...)}{\lang2057\langfe1031\langnp2057\insrsid8068550 + (see end of document for details)}{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Playing next (metadata to be specified) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid8339573 { +\lang2057\langfe1031\langnp2057\insrsid16411736 Playing now (metadata info to be specified) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid16411736 Login OR Logout / Signover +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}User information (if logged in) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8339573 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid8339573 Menu for different functions }{\lang2057\langfe1031\langnp2057\insrsid2560916 Launchin +}{\lang2057\langfe1031\langnp2057\insrsid8339573 g different functions / panels}{\lang2057\langfe1031\langnp2057\insrsid5581702\charrsid5581702 }{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13048422 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid13048422 +THE DJ BAG is part of the master panel because this list of items will alwazs be available!!! +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid6431368 {\*\bkmkstart _Toc93466773} +{\*\bkmkstart _Toc90357958}Starting other panels from }{\insrsid279828 Master}{\insrsid6431368 panel{\*\bkmkend _Toc93466773} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid6431368 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls20\adjustright\rin0\lin720\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid6431368 Available depending on user rights +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid6431368 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls20\adjustright\rin0\lin720\itap0\pararsid279828 { +\lang2057\langfe1031\langnp2057\insrsid6431368 Clicking on }{\lang2057\langfe1031\langnp2057\insrsid279828 a function in the menu will change the content of the Content Panel +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid279828 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If change is invoked, if information was altered and not saved, popup Javascript> Do you want to leave this page and lose changes? + +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466774}2. }{\lang2057\langfe1031\langnp2057\insrsid9441111 Loging in: the login }{\lang2057\langfe1031\langnp2057\insrsid279828 {\*\bkmkend _Toc90357958}content panel}{\lang2057\langfe1031\langnp2057\insrsid4730303 +{\*\bkmkend _Toc93466774} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid403238 {\*\bkmkstart _Toc93466775}This }{ +\insrsid279828 screen appears}{\insrsid13265408 {\*\bkmkend _Toc93466775} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid279828 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls16\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid279828 User clicked on log out}{\lang2057\langfe1031\langnp2057\insrsid13265408 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid279828 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid279828 URL is called +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338302 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid338302 User clicks on \lquote sign over\rquote +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid403238 {\*\bkmkstart _Toc93466776} +The window contains}{\insrsid338302 {\*\bkmkend _Toc93466776} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls17\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid403238 Text: Login +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (text): login +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Text: password +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (text / password): password +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Text: language +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (pulldown): available languages +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (button): OK +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (button): Cancel +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid403238 {\*\bkmkstart _Toc93466777} +The function of the items{\*\bkmkend _Toc93466777} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls18\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid403238 OK button: check valid login +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls18\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 +{\lang2057\langfe1031\langnp2057\insrsid403238 Valid login +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar +\jclisttab\tx2160\aspalpha\aspnum\faauto\ls18\ilvl2\adjustright\rin0\lin2160\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid403238 Close login window +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Change Main panel to status logged in / on or off air (see above) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls18\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 +{\lang2057\langfe1031\langnp2057\insrsid403238 Invalid login +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar +\jclisttab\tx2160\aspalpha\aspnum\faauto\ls18\ilvl2\adjustright\rin0\lin2160\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid12270098 Change content of popup:}{\lang2057\langfe1031\langnp2057\insrsid403238 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12270098 Text: Login invalid, please try again +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Form field: Button OK +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}OK returns to login window +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls18\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15553266 Cancel button +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls18\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 +{\lang2057\langfe1031\langnp2057\insrsid403238 close popup window +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}}{\lang2057\langfe1031\langnp2057\insrsid15553266 return to main panel in previous state +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid15553266 {\*\bkmkstart _Toc93466778} +Additional functions{\*\bkmkend _Toc93466778} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls19\adjustright\rin0\lin720\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15553266 When pressing \lquote sign over\rquote or \lquote logout +\rquote +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls19\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid15553266 Open popup information window with: \'93sure you want to logout user \lquote username\rquote \'94 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}Button OK (logs out) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}Button Cancel (returns to main panel at previous status) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls19\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15553266 When pressing \lquote sign over\rquote +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls19\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid15553266 After confirming to log out user: +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar +\jclisttab\tx2160\aspalpha\aspnum\faauto\ls19\ilvl2\adjustright\rin0\lin2160\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid15553266 Open Login window in popup +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Change status of main panel to logged out (on or off air) +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466779}3. }{\lang2057\langfe1031\langnp2057\insrsid5113369 Uploading files}{\lang2057\langfe1031\langnp2057\insrsid2111105 }{\lang2057\langfe1031\langnp2057\insrsid5113369 panel}{\lang2057\langfe1031\langnp2057\insrsid15553266 +{\*\bkmkend _Toc93466779} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid3691965 {\*\bkmkstart _Toc93466780} +The window opens when}{\insrsid5113369 {\*\bkmkend _Toc93466780} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid3691965 The user selects this from the main panel +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid3691965 {\*\bkmkstart _Toc93466781} +The window contains{\*\bkmkend _Toc93466781} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid3691965 File browser +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Upload button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15933635 Cancel}{\lang2057\langfe1031\langnp2057\insrsid3691965 button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Information bar to be used for status / error / upload progress +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid12605384 {\*\bkmkstart _Toc93466782} +The function of items}{\insrsid3691965 {\*\bkmkend _Toc93466782} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15933635 File browser: standard \lquote +open explorer style window to find file\rquote }{\lang2057\langfe1031\langnp2057\insrsid12605384 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15933635 +Metadata form: a mix of text, pulldown, multiple select, radio buttons and check boxes, depending on the metadata specs +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Upload button: posts data and starts uploading file (to local }{\lang2057\langfe1031\langnp2057\insrsid15341335 storage system}{ +\lang2057\langfe1031\langnp2057\insrsid15933635 ) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button: interrupts the upload and/or clears the fields in the form +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid15933635 If upload started: open popup to check if really interrupt upload +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15933635 Close window: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid15933635 open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \hich\af2\dbch\af0\loch\f2 o\tab}if yes:}{\lang2057\langfe1031\langnp2057\insrsid8133754 close }{\lang2057\langfe1031\langnp2057\insrsid15933635 window +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid1334983 {\*\bkmkstart _Toc93466783} +Additional functions:}{\insrsid15933635 {\*\bkmkend _Toc93466783} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16671400 Error checking: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid16671400 Err +ors when filling in the form will not launch a popup, but display in the status bar (probably at the bottom of the window) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \hich\af2\dbch\af0\loch\f2 o\tab}One error at a time will be displayed (one line only) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid16671400 Progress bar: when starting the upload, the status bar will be used as the progress bar similar to safari page loading.}{\lang2057\langfe1031\langnp2057\insrsid16671400\charrsid16671400 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1334983 Metadata language pulldown: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid1334983 There will be the option to select in what language you add the metadata. +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \hich\af2\dbch\af0\loch\f2 o\tab}This pulldown functions like a filter: if changed, it will display the metadata of this language set +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \hich\af2\dbch\af0\loch\f2 o\tab}If \lquote upload\rquote is pressed, all language sets where there is at least one item filled in, will be saved in the metadata. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8997258 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid8997258 Uploading file}{\lang2057\langfe1031\langnp2057\insrsid1334983 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8997258 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid8997258 The form will be inactive, displaying the information but making it impossible to change. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid9532527 After upload: success +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid9532527 After the successful upload, the form remains inactive +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \hich\af2\dbch\af0\loch\f2 o\tab}The buttons change to display possible options (e.g. upload another, add uploaded to playlist, create new playlist with uploaded}{ +\lang2057\langfe1031\langnp2057\insrsid1593142 , close window}{\lang2057\langfe1031\langnp2057\insrsid9532527 ) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \hich\af2\dbch\af0\loch\f2 o\tab}The file will be added to the DJ bag (working title) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2111105 {\lang2057\langfe1031\langnp2057\insrsid2111105 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid2111105 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466784}12. }{\lang2057\langfe1031\langnp2057\insrsid2111105 Add web stream panel{\*\bkmkend _Toc93466784} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2111105 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid2111105 {\*\bkmkstart _Toc93466785} +The window opens when{\*\bkmkend _Toc93466785} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid2111105 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2111105 The user selects this from the main panel +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2111105 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid2111105 {\*\bkmkstart _Toc93466786} +The window contains{\*\bkmkend _Toc93466786} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid2111105 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2111105 Form field for stream URL +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Add button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Information bar to be used for status / error +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2111105 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid2111105 {\*\bkmkstart _Toc93466787} +The function of items{\*\bkmkend _Toc93466787} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid2111105 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2111105 Form field for stream URL used to add full URL of webstream + +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form: a mix of text, pulldown, multiple select, radio buttons and check boxes, depending on the metadata specs +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Add button: posts data +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button: clears form after confirmation popup \'93sure you want to...?\'94 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2111105 +{\lang2057\langfe1031\langnp2057\insrsid2111105 If information added, open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}if no information added, close without popup confirmation +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2111105 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid2111105 {\*\bkmkstart _Toc93466788} +Additional functions:{\*\bkmkend _Toc93466788} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid873682 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls27\adjustright\rin0\lin720\itap0\pararsid873682 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid873682 +Metadata: adding length of file: the user will ener the length of the file here in 00:00:00 format. For live streams, leave set to zero}{\lang2057\langfe1031\langnp2057\insrsid873682\charrsid873682 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid2111105 { +\lang2057\langfe1031\langnp2057\insrsid2111105 Error checking: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2111105 +{\lang2057\langfe1031\langnp2057\insrsid2111105 Errors when filling in the form will not launch a popup, but display in the status bar (probably at the bottom of the window) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid2111105 { +\lang2057\langfe1031\langnp2057\insrsid2111105 One error at a time will be displayed (one line only)}{\lang2057\langfe1031\langnp2057\insrsid2111105\charrsid16671400 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2111105 Metadata language pulldown: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2111105 +{\lang2057\langfe1031\langnp2057\insrsid2111105 There will be the option to select in what language you add the metadata. +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}This pulldown functions like a filter: if changed, it will display the metadata of this language set +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}If \lquote upload\rquote is pressed, all language sets where there is at least one item filled in, will be saved in the metadata. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid2111105 { +\lang2057\langfe1031\langnp2057\insrsid2111105 After successful adding +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2111105 +{\lang2057\langfe1031\langnp2057\insrsid2111105 the form remains inactive +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}The buttons change to display possible options (e.g. add another stream, add stream to playlist, create new playlist with stream, close wi +ndow) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}The file will be added to the DJ bag (working title) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2111105 {\lang2057\langfe1031\langnp2057\insrsid2111105 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid13268333 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466789}13. }{\lang2057\langfe1031\langnp2057\insrsid13268333 Edit file information panel{\*\bkmkend _Toc93466789} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93466790} +The window opens when{\*\bkmkend _Toc93466790} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid13268333 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 +The user selects aq file (from DJ bag or search or otherwise?) and selects \lquote edit file\rquote (right mouse click or button?) +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93466791} +The window contains{\*\bkmkend _Toc93466791} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid13268333 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 File browser +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Save changes button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Delete file button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Information bar to be used for status / error / upload progress +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13268333 {\lang2057\langfe1031\langnp2057\insrsid13268333 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93466792} +Default status{\*\bkmkend _Toc93466792} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13268333 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid7607439 Shows }{ +\lang2057\langfe1031\langnp2057\insrsid4217381 information about the file in}{\lang2057\langfe1031\langnp2057\insrsid13268333 the form +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93466793} +The function of items{\*\bkmkend _Toc93466793} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 File browser: standard \lquote +open explorer style window to find file\rquote +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid7607439 +{\lang2057\langfe1031\langnp2057\insrsid7607439 Additional information: leave empty to keep file +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}To change file in storage, browse file on hard disk +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Metadata form: a mix of text, pulldown, multiple select, radio buttons and check boxes, depending on the metadata specs +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid7607439 Save changes }{\lang2057\langfe1031\langnp2057\insrsid13268333 button: + posts data and starts uploading file (}{\lang2057\langfe1031\langnp2057\insrsid7607439 no upload if no file selected}{\lang2057\langfe1031\langnp2057\insrsid13268333 ) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid7607439 +{\lang2057\langfe1031\langnp2057\insrsid7607439 Confirm popup before starting process: are you sure you want to change file and/or information? (Yes Cancel -> cancel returns to window with information as changed before, not uploaded) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid7607439 { +\lang2057\langfe1031\langnp2057\insrsid7607439 Delete file -> popup confirmation: Are you sure you want to delete the file? (Yes Cancel -> cancel returns to window with information as edited before pressing delete) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid7607439 Reset }{\lang2057\langfe1031\langnp2057\insrsid13268333 button:}{\lang2057\langfe1031\langnp2057\insrsid7607439 sets the value to default }{\lang2057\langfe1031\langnp2057\insrsid13268333 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid13268333 {\lang2057\langfe1031\langnp2057\insrsid13268333 If upload started: open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}}{\lang2057\langfe1031\langnp2057\insrsid7607439 +If upload started but file not fully transferred, reset values to values before starting save changes +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Close window: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid13268333 {\lang2057\langfe1031\langnp2057\insrsid13268333 open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}if yes:close window +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93466794} +Additional functions:{\*\bkmkend _Toc93466794} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 Error checking: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15351607 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid15351607 {\lang2057\langfe1031\langnp2057\insrsid15351607 +If delete file: check if used in playlists. If yes, what do we do? Not allo delete or remove from playlist after confirmation??? +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid13268333 {\lang2057\langfe1031\langnp2057\insrsid13268333 Errors when filling in the form will not launch a popup, but display in the status bar (prob +ably at the bottom of the window) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}One error at a time will be displayed (one line only) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Progress bar: when starting the upload, the status bar will be used as the progress bar similar to safari page loading.}{\lang2057\langfe1031\langnp2057\insrsid13268333\charrsid16671400 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid13268333 Metadata language pulldown: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid13268333 {\lang2057\langfe1031\langnp2057\insrsid13268333 There will be the option to select in what language you add the metadata. +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}This pulldown functions like a filter: if changed, it will display the metadata of this language set +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}If \lquote upload\rquote is pressed, all language sets where there is at least one item filled in, will be saved in the metadata. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Uploading file +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid13268333 {\lang2057\langfe1031\langnp2057\insrsid13268333 The form will be inactive, displaying the information but making it impossible to change. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 After upload: success +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1\adjustright\rin0\lin1440\itap0\pararsid13268333 {\lang2057\langfe1031\langnp2057\insrsid13268333 After the successful upload, the form remains inactive +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}The buttons change to d +isplay possible options (e.g. upload another, add uploaded to playlist, create new playlist with uploaded, close window) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}The file will be added to the DJ bag (working title) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15626287 {\lang2057\langfe1031\langnp2057\insrsid15626287 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15626287 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15626287 14}{ +\lang2057\langfe1031\langnp2057\insrsid15626287 . }{\lang2057\langfe1031\langnp2057\insrsid15626287 View}{\lang2057\langfe1031\langnp2057\insrsid15626287 file information panel }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15626287\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid15626287 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15626287 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid15626287 The window opens when +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15626287 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid15626287 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15626287 The user selects a}{ +\lang2057\langfe1031\langnp2057\insrsid15626287 file (from DJ bag or search or otherwise?) and selects \lquote }{\lang2057\langfe1031\langnp2057\insrsid15626287 view information}{\lang2057\langfe1031\langnp2057\insrsid15626287 \rquote }{ +\lang2057\langfe1031\langnp2057\insrsid15626287 (right mouse click or button?) +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15626287 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid15626287 The window contains +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15626287 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\adjustright\rin0\lin720\itap0\pararsid15626287 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15626287 Metadata }{ +\lang2057\langfe1031\langnp2057\insrsid15626287 display}{\lang2057\langfe1031\langnp2057\insrsid15626287 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15626287 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15626287 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15626287 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button to publish to network archive +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15626287 {\lang2057\langfe1031\langnp2057\insrsid15626287 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466795}4. }{\lang2057\langfe1031\langnp2057\insrsid13436755 DJ Bag }{\lang2057\langfe1031\langnp2057\insrsid13048422 panel{\*\bkmkend _Toc93466795} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13048422 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls23\adjustright\rin0\lin720\itap0\pararsid13270669 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13048422 Part of the master panel set up> alwazs available!!!}{ +\lang2057\langfe1031\langnp2057\insrsid15351607 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2637360 Contains a list of files and/or playlists added by system or user +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Single and multi select of item}{\lang2057\langfe1031\langnp2057\insrsid13048422 s in list (}{ +\lang2057\langfe1031\langnp2057\insrsid2637360 HTML with checkboxes) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}sensitive to multiple selection (different if only files or playlists from flises AND playlists) +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14486893 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid14486893 {\*\bkmkstart _Toc93466796} +The window contains{\*\bkmkend _Toc93466796} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls24\adjustright\rin0\lin720\itap0\pararsid14486893 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid14486893 List of files and or playlists +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Icons to separate between items and playlists +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Minimal metadata info +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Table headers on top with name of metadata category +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button: clear list +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button}{\lang2057\langfe1031\langnp2057\insrsid12394895 clear }{\lang2057\langfe1031\langnp2057\insrsid14486893 selected }{ +\lang2057\langfe1031\langnp2057\insrsid12394895 items }{\lang2057\langfe1031\langnp2057\insrsid14486893 from list +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid11603768 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid11603768 {\*\bkmkstart _Toc93466797} +The function of items}{\insrsid14486893 {\*\bkmkend _Toc93466797} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11603768 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls25\adjustright\rin0\lin720\itap0\pararsid3367757 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid11603768 List of files and or playlists +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11603768 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls25\ilvl1\adjustright\rin0\lin1440\itap0\pararsid3367757 {\lang2057\langfe1031\langnp2057\insrsid11603768 Icons for files and playlists have no function but to indicate +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11603768 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls25\adjustright\rin0\lin720\itap0\pararsid3367757 { +\lang2057\langfe1031\langnp2057\insrsid11603768 Table headers can be clicked and will order alphanumerlically, toggling ascending and descending +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3367757 Clear list button removes all items from list: Confirmation pop up: are you sure...? + +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Clear selected items from list removes selected items. Confirmation pop up: are you sure...?}{ +\lang2057\langfe1031\langnp2057\insrsid13048422 }{\lang2057\langfe1031\langnp2057\insrsid3367757 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1141904 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid1141904 {\*\bkmkstart _Toc93466798} +Additional functions}{\insrsid11603768 {\*\bkmkend _Toc93466798} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls25\adjustright\rin0\lin720\itap0\pararsid1141904 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1141904 New items are inserted at the top of the list +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}DJ Bag behaves different for individual users (length, display period -> version 1.x) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}List length set in system defaults (V.1.x -> user can alter the preset) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Display period set in system defaults (V.1.x -> user can alter the preset) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}If list is getting too long, bottom items are cleared from list +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}If items are over their display period, they are removed from the list +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Content of DJ Bag is saved for each user}{\lang2057\langfe1031\langnp2057\insrsid1577794 (item id, rank in list, added to list date)}{ +\lang2057\langfe1031\langnp2057\insrsid1141904 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Content of DJ Bag is displayed after successfull login +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid13436755 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466799}6. }{\lang2057\langfe1031\langnp2057\insrsid13436755 Scheduler}{\lang2057\langfe1031\langnp2057\insrsid15869539 window}{\lang2057\langfe1031\langnp2057\insrsid13436755 {\*\bkmkend _Toc93466799} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1052329 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid1052329 {\*\bkmkstart _Toc93466800} +The window opens when}{\insrsid13436755 {\*\bkmkend _Toc93466800} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1052329 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid1052329 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1052329 Button or pulldown in main panel is selected +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1052329 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Right mouse activated from playlist +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid10714125 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid8476729 {\*\bkmkstart _Toc93466801} +The window contains}{\insrsid1052329 {\*\bkmkend _Toc93466801} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid10714125 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8476729 Small calendar month +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Pulldown to select month +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Previous next button to change month +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Larger calendar week +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1582066 Previ}{\lang2057\langfe1031\langnp2057\insrsid8476729 ous next button to change week + +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Large day with times +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid1582066 { +\lang2057\langfe1031\langnp2057\insrsid1582066 Previous next button to change week +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid10714125 { +\lang2057\langfe1031\langnp2057\insrsid8476729 Scrollbars to go up and down inside the day +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Plus and minus to zoom in and out of day view (change scale) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1582066 Scale bar between plus and minus +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714125 Button to go to \lquote today\rquote }{ +\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714125 Button Add playlist +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button remove playlist +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button edit selected playlist +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12676815 Button to stop / start scheduler +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12676815 {\lang2057\langfe1031\langnp2057\insrsid12676815 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12676815 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid12676815 {\*\bkmkstart _Toc93466802} +The function of the items{\*\bkmkend _Toc93466802} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12676815 Small calendar month +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid12676815 {\lang2057\langfe1031\langnp2057\insrsid12676815 Each day can be clicked and will change the week and day display to contain the selected day +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab}The month will be displayed in lines of weeks, starting with Sunday or Monday (system preset) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab} +Left to each week in the month overview is the calendar week as a number, this can be clicked and will change the week display to display this calendar week +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2520008 {\lang2057\langfe1031\langnp2057\insrsid12676815 If something is scheduled for the calendar day, the number is bold}{ +\lang2057\langfe1031\langnp2057\insrsid2520008 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Days within week one or last week from previous or next month are of a greyer colour but can be clicked and are bold, if scheduled + +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Pulldown to select month will change the calendar view to this month +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Previous next button to change month}{\lang2057\langfe1031\langnp2057\insrsid2520008 will change the month to display previous o +r next}{\lang2057\langfe1031\langnp2057\insrsid12676815 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2520008 C}{\lang2057\langfe1031\langnp2057\insrsid12676815 alendar week +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2520008 {\lang2057\langfe1031\langnp2057\insrsid2520008 Displays each day of the week starting with Sunday or Monday (system preset}{ +\lang2057\langfe1031\langnp2057\insrsid2188252 later user preset}{\lang2057\langfe1031\langnp2057\insrsid2520008 ) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}The display starts from midnight to midnight +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Playlists are displayed according to their start and stop time +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Minimal metadata is displayed if there is room in the display +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If the scheduled playlist is too small to display metadata it will be only a bar +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Each bar (i.e. scheduled playlist) is mouse over sensitive and displays metadata information of the playlist and the start time, s +top time and duration of the playlist. This display is attached to the mouse pointer and disappears when leaving the playlist bar +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}The day names on top of each week are clickable and change the day display to show that day +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Playlists on the week }{\lang2057\langfe1031\langnp2057\insrsid2188252 have a c +heck box in the displaz so thez can be selected. Multiple selects are possible}{\lang2057\langfe1031\langnp2057\insrsid2520008 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid2520008 Previ}{\lang2057\langfe1031\langnp2057\insrsid12676815 ous next button to change week +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid8416880 {\lang2057\langfe1031\langnp2057\insrsid8416880 +Changes the week display to show that week, if the week runs into next or prev month, the month display changes too (only if the full week is in next or prev, not if half of it is still the same month) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Large day with times +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2033356 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2033356 {\lang2057\langfe1031\langnp2057\insrsid2033356 Displays the date at the top +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid8416880 {\lang2057\langfe1031\langnp2057\insrsid8416880 Displays the time of day on the left +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Displays the playlists scheduled as fields +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid1582066 {\lang2057\langfe1031\langnp2057\insrsid8416880 +The playlist fields act as described for the week in terms of metadata display, mouse over sensitivity and right mouse click}{\lang2057\langfe1031\langnp2057\insrsid1582066 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid1582066 { +\lang2057\langfe1031\langnp2057\insrsid1582066 Previous }{\lang2057\langfe1031\langnp2057\insrsid2188252 next button to change day}{\lang2057\langfe1031\langnp2057\insrsid1582066 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid1582066 {\lang2057\langfe1031\langnp2057\insrsid1582066 Changes to next and previous day in the day display +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If the day is in the prev or next week, the week display changes +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If the day is in the next or prev month, the month display changes +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid2033356 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Scrollbars to go up and down inside the day}{\lang2057\langfe1031\langnp2057\insrsid2033356 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2033356 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2033356 {\lang2057\langfe1031\langnp2057\insrsid2033356 start with midnight on the top and finish with midnight at the bottom +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2033356 \loch\af10\dbch\af0\hich\f10 \'a7\tab}you can not scroll into previous and next days +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Button to go to \lquote today\rquote }{\lang2057\langfe1031\langnp2057\insrsid338081 Sets month, week and day to today +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12676815 Button Add playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid338081 {\lang2057\langfe1031\langnp2057\insrsid338081 Opens popup window to add playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Required fields: date, time and playlist name/id +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2188252 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2188252 Pulldown in the popup with the playlists which are in the DJ Bag +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2188252 {\lang2057\langfe1031\langnp2057\insrsid2188252 Pulldown menu with actions for selected plazlists in scheduler +\par This is similar to the user interface of webmail where zou have a pulldown menu with various possibilities of what you can do with the selected items [selected by checkbox] +\par The user guidance is: +\par Select one or more by ckicking the checkbox +\par Select the action in the pulldown menu +\par Press button to execute the action +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2188252 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid2188252 Pulldown option: }{\lang2057\langfe1031\langnp2057\insrsid12676815 remove playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid338081 {\lang2057\langfe1031\langnp2057\insrsid338081 Only acitve if playlist selected (one mouse click on playlist in week or day overview) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Opens popup for confirmation: sure you want to...? +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If confirmation is cancelled, return to scheduler window with playlist still selected +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2188252 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid2188252 Pulldown optin:}{\lang2057\langfe1031\langnp2057\insrsid12676815 edit selected playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid338081 {\lang2057\langfe1031\langnp2057\insrsid338081 Only active if playlist is selected (one mouse click on playlist in week or day view) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2188252 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2188252 +If more than one plazlist is selected, this will trigger a javascript popup at client side to indicate that onlz one playlist can be edited. +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815\charrsid4014001 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls26\adjustright\rin0\lin720\itap0\pararsid12676815 {\b\lang2057\langfe1031\langnp2057\insrsid12676815\charrsid4014001 Button to stop / start scheduler +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1981424 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1\adjustright\rin0\lin1440\itap0\pararsid1981424 {\lang2057\langfe1031\langnp2057\insrsid1981424 Button toggles: default STOP, then START +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1981424 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If scheduler is stopped, main panel shows information: Scheduler is stopped in very alarming and vibrant letters +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15878439 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid15878439 {\*\bkmkstart _Toc93466803} +Additional functions{\*\bkmkend _Toc93466803} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls28\adjustright\rin0\lin720\itap0\pararsid15878439 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15878439 Display of length +of playlist always with hours: minutes: seconds 00:00:00 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If playlist larger than 100 hours(-1 second), display goes to day... 00:00:00:00 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Gaps between playlists also show data: start, stop, length of gap +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}After last scheduled entry, metadata only displays start time +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Gap display follows same rules as Playlist display of time (hh:mm:ss or dd:hh:mm:ss) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14901303 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid14901303 Gaps }{\lang2057\langfe1031\langnp2057\insrsid4014001 +also have checkboxes to : insert plazlist here}{\lang2057\langfe1031\langnp2057\insrsid14901303 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3350176 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3350176 Today is marked differently in month, day and week view +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3350176 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Currently playing playlist is locked and marked differently in week and day view +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4920384 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid4920384 {\*\bkmkstart _Toc93466804} +Scheduler popup window to schedule playlist{\*\bkmkend _Toc93466804} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4014001 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin720\itap0\pararsid5202891 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid4014001 +The popup window is invoked either by pressing the button ADD PLAZLIST or by chosing the action INSERT PLAYLIST HERE from the pulldown ofter selecting a gap in the calendar}{\lang2057\langfe1031\langnp2057\insrsid5202891\charrsid5202891 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls30\adjustright\rin0\lin720\itap0\pararsid2109254 { +\lang2057\langfe1031\langnp2057\insrsid2109254 Button OK -> assigns values and changes the display containing newly added playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button Cancel +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls30\ilvl1\adjustright\rin0\lin1440\itap0\pararsid2109254 +{\lang2057\langfe1031\langnp2057\insrsid2109254 If nothing selected, close popup +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \hich\af2\dbch\af0\loch\f2 o\tab}If information typed in or selected, confirmation window Are you sure...?}{\lang2057\langfe1031\langnp2057\insrsid2109254\charrsid2109254 + +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29\adjustright\rin0\lin720\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4920384 Requires date time and playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If launched from scheduler, playlist can be entered in the following ways: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls29\ilvl1\adjustright\rin0\lin1440\itap0\pararsid4920384 +{\lang2057\langfe1031\langnp2057\insrsid4920384 By ID of playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}With additional button: Select Playlist... +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4014001 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29\adjustright\rin0\lin720\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4014001 Pulldown}{\lang2057\langfe1031\langnp2057\insrsid4920384 Select Playlist}{\lang2057\langfe1031\langnp2057\insrsid4014001 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4014001 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls29\ilvl1\adjustright\rin0\lin1440\itap0\pararsid4920384 +{\lang2057\langfe1031\langnp2057\insrsid4014001 A list from the playlists in the DJ bag}{\lang2057\langfe1031\langnp2057\insrsid4920384 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29\adjustright\rin0\lin720\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4920384 Error checking in popup window +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls29\ilvl1\adjustright\rin0\lin1440\itap0\pararsid4920384 +{\lang2057\langfe1031\langnp2057\insrsid4920384 No playlist selected +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}Overlap (length too big for gap, start time inside scheduled playlist) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10714125 {\lang2057\langfe1031\langnp2057\insrsid4920384 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466805}5. }{\lang2057\langfe1031\langnp2057\insrsid13436755 Playlist management}{\lang2057\langfe1031\langnp2057\insrsid15869539 window}{\lang2057\langfe1031\langnp2057\insrsid16215702 (simple)}{ +\lang2057\langfe1031\langnp2057\insrsid13436755 {\*\bkmkend _Toc93466805} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls29\adjustright\rin0\lin720\itap0\pararsid15349349 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid14952783 Resizable window +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Contains scrollbars and resize handlers +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Playlist item are listed vertially with first on top +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29\adjustright\rin0\lin720\itap0\pararsid10120207 { +\lang2057\langfe1031\langnp2057\insrsid14952783 All items have the same size in the list}{\lang2057\langfe1031\langnp2057\insrsid10120207 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15349349 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid16404736 {\*\bkmkstart _Toc93466806} +The window opens when}{\insrsid14952783 {\*\bkmkend _Toc93466806} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16404736 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls32\adjustright\rin0\lin720\itap0\pararsid15349349 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16404736 Selected from the main panel +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10120207 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls32\ilvl1\adjustright\rin0\lin1440\itap0\pararsid10120207 {\lang2057\langfe1031\langnp2057\insrsid10120207 When opened from main panel, the playlist editor opens with a new playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16404736 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls32\adjustright\rin0\lin720\itap0\pararsid15349349 { +\lang2057\langfe1031\langnp2057\insrsid16404736 Actived with right mouse click on playlist or file}{\lang2057\langfe1031\langnp2057\insrsid16404736\charrsid14952783 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1052817 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10764249 {\*\bkmkstart _Toc93466807} +The window contains}{\insrsid4409133 {\*\bkmkend _Toc93466807} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7757091 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid7757091 List of items in playlist}{ +\lang2057\langfe1031\langnp2057\insrsid4655542 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1052817 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1052817 Metadata for items in list +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7757091 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid7757091 Buttons to move items +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7757091 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Buttons to change transition between items +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12283844 Button Add item to playlist}{\lang2057\langfe1031\langnp2057\insrsid7757091 + +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12283844 Button Remove item from playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button Save playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button Create new playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3242838 Button to Delete playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14439181 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid14439181 Icons for files and playlists in list}{ +\lang2057\langfe1031\langnp2057\insrsid3039356 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid11036725 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid11036725 {\*\bkmkstart _Toc93466808} +The function of the items}{\insrsid14439181 {\*\bkmkend _Toc93466808} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid11036725 List of items in playlist}{ +\lang2057\langfe1031\langnp2057\insrsid16263532 displays the }{\lang2057\langfe1031\langnp2057\insrsid11036725 Metadata for items in list +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4014001 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid4014001 +Similar to the ist in the scheduler, the items on the plazlist have checkboxes next to them so there can be one or more items selected / and then deleted or whatever by selecting this function in the pulldown menu. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4014001 \loch\af10\dbch\af0\hich\f10 \'a7\tab} +What is described as BUTTONS in the following is mostlz available in the pulldown of actions at the end. For actions which can also be done to individual or groups of items *like delete( there is a +n icon next to the item in the playlist which allows direct action *e.g. deleting item from plazlist(. These items invoke a javascript to confirm chosen action. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid11036725 Buttons to move items +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 Inside the item info list, moving up down top and bottom +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Buttons to change transition between items +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 Clicking here opens }{\lang2057\langfe1031\langnp2057\insrsid4014001 +a popup window where the user can specify a number of seconds for alinear cross fade}{\lang2057\langfe1031\langnp2057\insrsid16263532 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Add item to playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 This changes the mouse to become the \lquote select item\rquote icon and items can be selected fr +omn search or DJ bag with single click +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}New items are added to the bottom of the list +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Remove item from playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 Active only if one or more items are selected +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}Popup confirmation \'93are you sure...?\'94 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Save playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 If editing existing playlist: +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar +\jclisttab\tx2160\aspalpha\aspnum\faauto\ls33\ilvl2\adjustright\rin0\lin2160\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 confirm popup Overwrite changes...? +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \loch\af10\dbch\af0\hich\f10 \'a7\tab}display current metadata available for editing +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 If saving new playlist, ask for name and metadata +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Create new playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar +\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid16263532 {\lang2057\langfe1031\langnp2057\insrsid16263532 If no playlist in playlist editor, create empty playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}If playlist in editor, but not changed, create new playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}If playlist in editor and changed but not saved, popup confirm: \'93Discard changes to current playlist?\'94 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin720\itap0\pararsid11036725 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Icons for files and playlists in list}{\lang2057\langfe1031\langnp2057\insrsid16263532 show if item is a playlist or a file}{\lang2057\langfe1031\langnp2057\insrsid11036725 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Icon for each item \'93set IN and OUT points\'94}{\lang2057\langfe1031\langnp2057\insrsid16263532 + opens Cue window to set IN and OUT points}{\lang2057\langfe1031\langnp2057\insrsid11036725 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3242838 Button to delete playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1\adjustright\rin0\lin1440\itap0\pararsid3242838 +{\lang2057\langfe1031\langnp2057\insrsid3242838 Only active if playlist in playlist editor window}{\lang2057\langfe1031\langnp2057\insrsid13463385 (not if new playlist was created and nothing added, not if playlist editor contains no playlist)}{ +\lang2057\langfe1031\langnp2057\insrsid3242838 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}open confirmation popup \'93do you want to delete this playlist?\'94 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}Deleted playlists are removed from the DJ bag and search results +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}Delete process checks if playlist is used by other playlists or inside scheduler??? +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4006540 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10698856 {\*\bkmkstart _Toc93466809} +Additional functions{\*\bkmkend _Toc93466809} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10698856 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls34\adjustright\rin0\lin720\itap0\pararsid4006540 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10698856 Version 1.x expand and close sub playlists +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10698856 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If attemtping to add playlist which is locked because played in scheduler, popup: Can not be edited, because this is cur}{ +\lang2057\langfe1031\langnp2057\insrsid2446275 r}{\lang2057\langfe1031\langnp2057\insrsid10698856 ently playling +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10698856 {\lang2057\langfe1031\langnp2057\insrsid2848434 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid353388 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93466810}7. }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Search{\*\bkmkend _Toc93466810} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Current proposition of + screen appearance: +\par }{\field\flddirty{\*\fldinst {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 HYPERLINK "http://a.parsons.edu/~livesupport/designs/images/library_search.jpg" }{\insrsid2370101 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000004400000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f0069006d0061006700650073002f00 +6c006900620072006100720079005f007300650061007200630068002e006a00700067000000e0c9ea79f9bace118c8200aa004ba90b8800000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f0064 +0065007300690067006e0073002f0069006d0061006700650073002f006c006900620072006100720079005f007300650061007200630068002e006a00700067000000000000}}}{\fldrslt {\cs18\ul\cf2\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +http://a.parsons.edu/~livesupport/designs/images/library_search.jpg}}}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par +\par Function : basically for searching audio files, +\par optionally , (?) for search, playlist arrangment of files , subplaylist , mails ..etc .... +\par +\par It can be called and started from the other programs or separately +\par +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751 {\*\bkmkstart _Toc93466811} +When starting the application{\*\bkmkend _Toc93466811} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751 + it will open the panel which contains the following items: +\par }\pard \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid11281446 {\lang2057\langfe1031\langnp2057\insrsid11281446 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11281446 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls38\adjustright\rin0\lin720\itap0\pararsid7999091 { +\lang2057\langfe1031\langnp2057\insrsid11281446 Search part }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 , with the option of choosing the way of searching the entered item +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11281446 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid11281446 +Browse part, with the ability to browse files according to user-specified criteria (see iTunes for reference) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Player for preview of music tracks and fast rewind + +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Field with the results of searching files +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button or commands for choosing, creating, rewinding playlist +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Field with playlist and all its informations +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par Details (function) of the items : +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12474292 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751 {\*\bkmkstart _Toc93466812}Search}{ +\insrsid12474292 form}{\insrsid7999091\charrsid12474292 {\*\bkmkend _Toc93466812} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li1080\ri0\widctlpar +\jclisttab\tx1080\aspalpha\aspnum\faauto\ls39\adjustright\rin0\lin1080\itap0\pararsid7999091 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 contains the form field w +here we enter the wanted item (name, track..) and the confirmation button GO (enter) }{\lang2057\langfe1031\langnp2057\insrsid7999091 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Button for starting the additional more precise advanced mode}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid7952295 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93466813}Search - Advanced mode}{\insrsid7999091 {\*\bkmkend _Toc93466813} +\par }\pard\plain \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Opens up the advanced possibilities for searching the entered item \'84SEARCH BY\'93 + in the dropdown menu, searching by the name of the artist, song, album, Bpm , energy description , tempo, and other relevant informations that contains metadata of the file. I hope we will use small selector . +\par +\par Useful link for that info +\par }\pard \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid10623485 {\field\flddirty{\*\fldinst {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 + HYPERLINK "http://www.rcsworks.com/products/selector/radio101.asp" }{\insrsid2370101 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6e00000068007400740070003a002f002f007700770077002e0072006300730077006f0072006b0073002e0063006f006d002f00700072006f00640075006300740073002f00730065006c006500630074006f007200 +2f0072006100640069006f003100300031002e006100730070000000000000}}}{\fldrslt {\cs18\ul\cf2\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 http://www.rcsworks.com/products/selector/radio101.asp}}}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid10623485 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93466814}How does it work :{\*\bkmkend _Toc93466814} +\par }\pard\plain \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 We enter the word or the + phrase that we want to find in our library of audio files, into the matching field, then we choose whether it is going to search it by the whole name or by the word or a phrase that is in the file name. +\par +\par With the combination of the dropdown menus and by choosing the search options / name of the group / name of the song / energy / bpm / the publishing year of the album / description of the audio material\rquote +s content / we can get the precisely wanted or approximate results. +\par +\par I personally like when I can see also the percent of sucessfullness next to the list of the results, in some search engines. +\par Can this be performed in this version and how would that look like in our program? This piece of information is not so important for the work , it simply gives us the report about the sucessfullness of our result. +\par }{\lang2057\langfe1031\langnp2057\insrsid7999091 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 selection button , that contains full name plus button GO +\par +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \hich\af0\dbch\af0\loch\f0 -\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls35\adjustright\rin0\lin720\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 selection button , where the item is searched for, on the local net, on server, on the internet.... + +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid11360489 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751 {\*\bkmkstart _Toc93466815}E}{ +\insrsid10714751\charrsid6300556 xample}{\insrsid10714751 :}{\insrsid10714751\charrsid6300556 {\*\bkmkend _Toc93466815} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Just example of screen design and precise tools for search : +\par }{\field\flddirty{\*\fldinst {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 HYPERLINK "http://www.rcsworks.com/products/selector/tour/slide_02.asp" }{\insrsid2370101 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7800000068007400740070003a002f002f007700770077002e0072006300730077006f0072006b0073002e0063006f006d002f00700072006f00640075006300740073002f00730065006c006500630074006f007200 +2f0074006f00750072002f0073006c006900640065005f00300032002e006100730070000000000000}}}{\fldrslt {\cs18\ul\cf2\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 http://www.rcsworks.com/products/selector/tour/slide_02.asp}}}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93466816}Form field with the Search results{\*\bkmkend _Toc93466816} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +This field gives us the list of the found audio files, also contains the informations from metadata. It is desirable to have the option of variable displaying of the search results number (5,15,20) or the possibillity of scrolling. +\par This is wide and easy to be surveyed. }{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid8662583\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8662583 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 2 buttons with the functions of where to go with the founded audio file +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 In list \endash when we double click on it (because of the more simple operations)}{ +\lang2057\langfe1031\langnp2057\insrsid7999091 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls41\adjustright\rin0\lin720\itap0\pararsid7999091 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 add to playlist or}{\lang2057\langfe1031\langnp2057\insrsid7999091 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 add to cue ( preview ) listening . +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93466817}How does it work :{\*\bkmkend _Toc93466817} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +By simple clicking on the audio file in the form field with the search results, file goes either in the playlist automatically on the last place, or right into the play mode where we start with listening. Rewinding back and f +orward can be done by clicking on the cursor and by its moving on the line that represents the whole audio file. +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7088866 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93466818}Play list{\*\bkmkend _Toc93466818} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Field that shows us the queue of the audio files in the created playlist +\par +\par Crucial question : +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls42\adjustright\rin0\lin720\itap0\pararsid7999091 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Is it right to set the option \'84creating the playlist\'93 + as the part of the search library engine (that is not bad) or to set it separately? +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab} +Depending on the connection with the other programes, are they in thet moment on the same screen (playlist and search library), or are they separated? +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par Contains the functions: \'84import\'93 (open, bew), \'84export\'93 (save to...) and \'84send to\'93 (mail, hard disc, to relevant program...)}{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid11281446 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid11281446 {\*\bkmkstart _Toc93466819}Browse +{\*\bkmkend _Toc93466819} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid11281446 +Users will be able to browse files according to criteria they set, according to metadata fields they pull down. +\par +\par Four columns in the browse section will have pull-down menus above them. The pull-down menus will contain all available metadata fields, as well as \lquote All\rquote and \lquote None\rquote options. When a field is specified, the system li +sts not only files that are found with the criteria selected, but also the other columns display the categories containing such files. +\par +\par An example from iTunes is enclosed below: +\par +\par }{\lang2057\langfe1031\langnp2057\insrsid16465826 +\par }{\lang2057\langfe1031\langnp2057\insrsid11281446 When a user sets certain criteria, the file browse (search results) window updates its view accordingly: +\par +\par +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid93759 {\insrsid93759 +\par }{\insrsid93759\charrsid93759 Users will be able to store their browsing field preferences with a \'93save this browse\'94 function, which will write the fields into user preferences in Alib. +\par }{\lang2057\langfe1031\langnp2057\insrsid93759 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16465826 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid9600687 +{\*\bkmkstart _Toc93466820}HTML1 User preferences{\*\bkmkend _Toc93466820} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16465826 HTML form with to be defined fields +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16465826 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid9600687 +{\*\bkmkstart _Toc93466821}HTML2 Station preferences{\*\bkmkend _Toc93466821} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16465826 HTML form with to be defined fileds +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16465826 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid9600687 +{\*\bkmkstart _Toc93466822}HTML3 User management{\*\bkmkend _Toc93466822} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16465826 HTML form with to be defined fields +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7619615 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid7619615 +{\*\bkmkstart _Toc93466823}HTML4 Log viewer{\*\bkmkend _Toc93466823} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid7619615 List of items }{ +\lang2057\langfe1031\langnp2057\insrsid12129795 played}{\lang2057\langfe1031\langnp2057\insrsid7619615 }{\lang2057\langfe1031\langnp2057\insrsid12129795 by}{\lang2057\langfe1031\langnp2057\insrsid7619615 + scheduler. Just displaying the metadata information. +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16719418 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16719418 +{\*\bkmkstart _Toc93466824}HTML5 Upload download status for central server{\*\bkmkend _Toc93466824} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16719418 List of files which are either + sent to the central storage or retrieved from the storage +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid16719418 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid16719418 {\*\bkmkstart _Toc93466825}Options +{\*\bkmkend _Toc93466825} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16719418 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls45\adjustright\rin0\lin720\itap0\pararsid16719418 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16719418 Cancel upload & download +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16719418 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Pause upload or download +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11551536 {\lang2057\langfe1031\langnp2057\insrsid11551536 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid11551536 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid11551536 +{\*\bkmkstart _Toc93466826}HTML6 workflow\'85 for 1.x version}{\lang2057\langfe1031\langnp2057\insrsid11551536\charrsid6300556 {\*\bkmkend _Toc93466826} +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid11555562 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid13436755 {\*\bkmkstart _Toc93466827}General issues}{\lang2057\langfe1031\langnp2057\insrsid11555562\charrsid11555562 {\*\bkmkend _Toc93466827} }{\lang2057\langfe1031\langnp2057\insrsid11555562 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid4204924 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid11555562 {\*\bkmkstart _Toc93466828}Ge +neral link of our design so far}{\insrsid11555562\charrsid3621462 :{\*\bkmkend _Toc93466828} +\par }\pard\plain \s29\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11555562 +\f2\fs20\lang2074\langfe1033\cgrid\langnp2074\langfenp1033 {\field\flddirty{\*\fldinst {\f0\fs22\insrsid11555562\charrsid3621462 HYPERLINK "http://a.parsons.edu/~livesupport/designs/" }{\f0\fs22\insrsid2370101\charrsid3621462 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000002b00000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f000000e0c9ea79f9bace118c8200aa +004ba90b5600000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f000000000000}}}{\fldrslt { +\cs18\f0\fs22\ul\cf2\insrsid11555562\charrsid3621462 http://a.parsons.edu/~livesupport/designs/}}}{\f0\fs22\insrsid11555562\charrsid3621462 +\par 7. Library/Search (Robert) +\par }{\field\flddirty{\*\fldinst {\f0\fs22\insrsid11555562\charrsid3621462 HYPERLINK "http://a.parsons.edu/~livesupport/designs/images/library_search.jpg" }{\f0\fs22\insrsid2370101\charrsid3621462 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000004400000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f0069006d0061006700650073002f00 +6c006900620072006100720079005f007300650061007200630068002e006a00700067000000e0c9ea79f9bace118c8200aa004ba90b8800000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f0064 +0065007300690067006e0073002f0069006d0061006700650073002f006c006900620072006100720079005f007300650061007200630068002e006a00700067000000000000}}}{\fldrslt {\cs18\f0\fs22\ul\cf2\insrsid11555562\charrsid3621462 +http://a.parsons.edu/~livesupport/designs/images/library_search.jpg}}}{\f0\fs22\insrsid11555562\charrsid3621462 +\par 9. Live Mode (Robert) +\par }{\field\fldedit{\*\fldinst {\f0\fs22\insrsid11555562\charrsid3621462 HYPERLINK "http://a.parsons.edu/%7Elivesupport/designs/images/livemode.gif" }{\f0\fs22\insrsid2370101\charrsid15361338 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b8000000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f002500370045006c0069007600650073007500700070006f00720074002f0064006500730069006700 +6e0073002f0069006d0061006700650073002f006c006900760065006d006f00640065002e0067006900660000000000}}}{\fldrslt {\cs18\f0\fs22\ul\cf2\insrsid11555562\charrsid3621462 http://a.parsons.edu/~livesupport/designs/images/livemode.gif}}}{\f0\fs22\insrsid11555562 + +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid4204924 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid4204924\charrsid15341335 {\*\bkmkstart _Toc93466829}On-Air Off-air definition{\*\bkmkend _Toc93466829} +\par }\pard\plain \s29\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11555562 +\f2\fs20\lang2074\langfe1033\cgrid\langnp2074\langfenp1033 {\f0\fs22\insrsid4204924 The system is on-air when either the server or the client or both soundcards are playing}{\f0\fs22\insrsid4204924\charrsid3621462 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid15993845 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid13436755 {\*\bkmkstart _Toc93466830}Right mouse sensitive for files and playlists{\*\bkmkend _Toc93466830} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5606 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5606 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid5606 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang1036\langfe1031\langnp1036\insrsid5606\charrsid5606 {\*\bkmkstart _Toc93466831}Information formats (date, names, etc.){\*\bkmkend _Toc93466831} +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid9842054 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid5606\charrsid84972 {\*\bkmkstart _Toc93466832}Date format}{\lang2057\langfe1031\langnp2057\insrsid9842054 {\*\bkmkend _Toc93466832} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5606 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5606\charrsid84972 \~}{ +\lang2057\langfe1031\langnp2057\insrsid8218757\charrsid84972 (until system configure individually for all users}{\lang2057\langfe1031\langnp2057\insrsid84972 individually}{\lang2057\langfe1031\langnp2057\insrsid8218757\charrsid84972 )}{ +\lang2057\langfe1031\langnp2057\insrsid5606\charrsid84972 : 2004-12-24 18:56:12}{\lang2057\langfe1031\langnp2057\insrsid5606 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid8068550 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8068550 +{\*\bkmkstart _Toc93466833}Station information{\*\bkmkend _Toc93466833} +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls35\adjustright\rin0\lin720\itap0\pararsid8068550 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8068550 will be added at install procedure +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}station name is a text Unicode string +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}additional information can be added +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}a station logo can be uploaded as JPEG or PNG file +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4204924 {\lang2057\langfe1031\langnp2057\insrsid4204924 +\par }{\lang2057\langfe1031\langnp2057\insrsid4204924\charrsid84972 +\par }} \ No newline at end of file diff --git a/campcaster/doc/gui/metadataFields.html b/campcaster/doc/gui/metadataFields.html new file mode 100644 index 000000000..fffe49b84 --- /dev/null +++ b/campcaster/doc/gui/metadataFields.html @@ -0,0 +1,2390 @@ + + + + + + + + + + + + + + + + + + +
+

+

Overview

+ DC terms
+ Main
+ Music tabs
+ Talk tabs
+ Music _ Raw fields
+ News _ Raw fields
+ Music _ Element extensions
+ +

+
+

Sheet 1: DC terms

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementExists in DC Metadata?Field name
(+DC Equivalent)
URIModifiesExists in Tech3293?







CreatorYesdc:creatorhttp://purl.org/dc/elements/1.1/creator
Exists
Creator.RoleNo-


Exists
Creator.Role.ConductorMaybels:conductor (by TH instead of dcterms:contributor:conductor)http://www.loc.gov/marc/sourcecode/relator/relatorlist.htmlhttp://purl.org/dc/elements/1.1/contributorNewModifies Creator.Role
Creator.Role.LyricistMaybels:lyricist (by TH instead of dcterms:contributor:lyricist)http://www.loc.gov/marc/sourcecode/relator/relatorlist.html


Date.CreatedYesdcterms:created (by TH instead of dcterms:date:created)http://purl.org/dc/terms/1.1/created


Date.YearYesls:year (by TH instead of dcterms:coverage:temporal:year)http://purl.org/dc/terms/1.1/temporalhttp://purl.org/dc/elements/1.1/coverageExists
DescriptionYesdc:descriptionhttp://purl.org/dc/elements/1.1/description
Exists
Description.ArtistURLNols:artisturl

NewModifies Description
Description.AudioFileInfoURLNols:audiofileinfourl

NewModifies Description
Description.AudioSourceURLNols:audiosourceurl

NewModifies Description
Description.BuyCDURLNols:buycdurl

NewModifies Description
Description.LyricsNols:lyrics

NewModifies Description
Description.MoodNols:mood

NewModifies Description
Description.RadioStationURLNols:radiostationurl

NewModifies Description
Description.RatingNols:rating

NewModifies Description
Description.BPMNols:bpm



FormatYesdc:formathttp://purl.org/dc/elements/1.1/format
Exists
Format.CRCNols:crc

NewModifies Format
Format.ExtentNodcterms:extent

NewModifies Format
Format.Medium.BitrateNols:bitrate

NewModifies Format
Format.Medium.ChannelsNols:channels

NewModifies Format
Format.Medium.EncoderNols:encoder

NewModifies Format
Format.Medium.SamplerateNols:samplerate

NewModifies Format
IdentifierYesdc:identifierhttp://purl.org/dc/elements/1.1/format


Identifier.CatalogNumberNols:catalognumber

NewModifies Identifier
Identifier.ISRCNumberNols:isrcnumber

NewModifies Identifier
Identifier.URLNo?

NewModifies Identifier
PublisherYesdc:publisherhttp://purl.org/dc/elements/1.1/identifier
Exists
RightsYesls:copyright ???

Exists
Source.AlbumYesdc:sourcehttp://purl.org/dc/elements/1.1/source
NewModifies Source
Source.Album.DiscNumberNols:disc_num

NewModifies Source
Source.Album.TrackNumberNols:track_num

NewModifies Source
TitleYesdc:titlehttp://purl.org/dc/elements/1.1/title
Exists





NewModifies Type
Type.GenreYesdc:type (by TH instead of dcterms:type:sound)http://purl.org/dc/dcmitype/Soundhttp://purl.org/dc/elements/1.1/typeNewModifies Type
LanguageYesdc:languagehttp://purl.org/dc/elements/1.1/language


maybe this is helpful for playlist?
dcterms:ispartof (by TH instead of dcterms:relation:ispartof)http://purl.org/dc/terms/isPartOfhttp://purl.org/dc/elements/1.1/relation

+ +
+

Sheet 2: Main

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID3v2 nameLS field labelLS field nameTypeComment






Main Tab



Weight
TitleTitledc:titleText
250
ArtistCreatordc:creatorText
200
GenreGenredc:type (by TH instead of dcterms:type:sound)Menu
40

File formatdc:formatMenuFile, live stream, networked file
+ (TH: It looks like category for MIME type, isn't it?)
10
DurationLengthdcterms:extent (by TH instead of dc:format:extent)TimeAutomatically generated0





500








































































































































































Hidden/Unused fields




URL
Identifier.URLURLNot used in LS 1.0
File
Identifier.FileTextGenerated automatically by system on input
+ +
+

Sheet 3: Music tabs

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID3v2 nameLS field labelLS field nameTypeCommentWeight







Music Basic Tab





TIT2, TitleTitledc:titleText
250see main
TPE1, ArtistCreatordc:creatorText
200see main
TALB, AlbumAlbumdc:sourceText
50
TYER, YearYearls:year (by TH instead of dcterms:coverage:temporal:year)MenuTH: may be extracted from dcterms:temporal
50
TCON, GenreGenredc:typeMenu
40see main
COMM, CommentDescriptiondc:descriptionLongtext
200

Formatdc:formatMenuFile, live stream, networked file10see main
TBPMBPMls:bpmNumberType or Description?10
POPM, RatingRatingls:ratingNumberNumber of stars50
????, DurationLengthdcterms:extent (by TH instead of dcterms:format:extent)Time
0see main







Music Advanced Tab





TENC, Encoded byEncoded byls:encoded_by (by TH instead of Creator.Role.Encoder)Text

count as creator
TRCK, Track #Track numberls:track_num (by TH instead of Source.Album.TrackNumber)Menu

count as source.album
TPOS, Disc #Disc numberls:disc_num (by TH instead of Source.Album.DiscNumber)Menu

count as source.album
TMOO, MoodMoodls:mood (by TH instead of Description.Mood)Menu

count as description
TPUB, LabelLabeldc:publisherText
100
TCOM, ComposerComposerls:composer (by TH instead of Creator.Role.Composer)Text

count as creator
????, BitrateBitratels:bitrate (by TH instead of Format.Medium.Bitrate)Number
0
????, ChannelsChannelsls:channels (by TH instead of Format.Medium.Channels)MenuMono, Stereo, 5.1?0
????, SamplerateSample ratels:samplerate (by TH instead of Format.Medium.Samplerate)Menu
0
TSSE, EncoderEncoder software usedls:encoder (by TH instead of Format.Medium.Encoder)TextName of encoder software0
????, CRCChecksumls:crc (by TH instead of Format.CRC)NumberChecksum0
????, LyricsLyricsls:lyrics (by TH instead of Description.Lyrics)Longtext

count as description
TPE2, Orchestra or bandOrchestra or bandls:orchestra (by TH instead of Creator.Role.Orchestra)Text

count as creator
TPE3, ConductorConductorls:conductor (by TH instead of Creator.Role.Conductor)Text

count as creator
TEXT, LyricistLyricistls:lyricist (by TH instead of Creator.Role.Lyricist)Text

count as creator
TOLY, Original lyricistOriginal lyricistls:originallyricist (by TH instead of Creator.Role.OriginalLyricist)Text

count as creator
TRSN, Radio station nameRadio station namels:radiostationname (by TH instead of Creator.Role.RadioStationName)TextAutomatically generated from
count as creator
WOAF, Audio file information webpageAudio file information web pagels:audiofileinfourl (by TH instead of Description.AudioFileInfoURL)URL

count as description
WOAR, Artist webpageArtist web pagels:artisturl (by TH instead of Description.ArtistURL)URL

count as description
WOAS, Audio source webpageAudio source web pagels:audiosourceurl (by TH instead of Description.AudioSourceURL)URLCreator or Publisher?
count as description
WORS, Radio station webpageRadio station web pagels:radiostationurl (by TH instead of Description.RadioStationURL)URL

count as description
WPAY, Buy CD webpageBuy CD web pagels:buycdurl (by TH instead of Description.BuyCDURL)URL

count as description
TSRC, ISRC #ISRC numberls:isrcnumber (by TH instead of Identifier.ISRCNumber)Number
20
????, Catalog #Catalog numberls:catalognumber (by TH instead of Identifier.CatalogNumber)Number
20
TOPE, Original ArtistOriginal artistls:originalartist (by TH instead of Creator.Role.OriginalArtist)Text
count as creator
TCOP, CopyrightCopyrightdc:rights or ls:license ? (by TH instead of dc:rights:license)Text
0





1000
Hidden/Unused fields





URL
? (by TH instead of Identifier.URL)URLNot used in LS 1.0

File
ls:filename (by TH instead of Identifier.File)TextGenerated automatically by system on input
TH: menmonic filename in storageServer ?


Is part of (for playlists)
dcterms:ispartof (by TH instead of dcterms:resource:ispartof)TextGenerated automatically by system on inclusion in playlist

Requires (for playlists)
dcterms:requires (by TH instead of dcterms:resource:requires)TextGenerated automatically by system on inclusion in playlist

+ +
+

Sheet 4: Talk tabs

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LS field labelLS Field name (based on Dublin Core)TypeCommentWeight






Talk Basic Tab




Titledc:titleTextFile or playlist title name250
Report date/timedcterms:temporal (by TH instead of dcterms:coverage:temporal)Time/DateKeywords for what the report covers; time the report is about

Report locationdcterms:spatial (by TH instead of dcterms:coverage:spatial)TextKeywords for what the report covers; place the report is about

Report organizationsdcterms:entity (by TH instead of dcterms:coverage:entity)TextKeywords for what the report covers150All coverage tags share same weighting. Future version should support Yahoo-style ontology
Descriptiondc:descriptionLong textAccount of the content; could be an abstract, a script, etc.200
Creatordc:creatorMenuName of creator (could be reporter, editor, moderator): Automatically generate menu from user names?100
Subjectdc:subjectTextTopic of the content as keywords; a person can be a subject too200
Genredc:typeMenuGenre of the content or resource50
Formatdc:formatMenuStream, file, networked file0


















Talk Advanced Tab




Contributordc:contributorTextEntity making contributions to the content of the resource (could be person, organization or service)50
Languagedc:languageMenuLanguage of the file, according to W3C RFC 17660
Copyrightdc:rightsMenuCan include URL pointing to copyright or CC license info0
























Automatically-generated fields





dcterms:ispartof (by TH instead of dcterms:relation:ispartof)TextWhether the report is related to other reports (part of a playlist, for example)


dc:dateDateDate file was created (if report is about a time, that goes in coverage)


dcterms:extent (by TH instead of dcterms:format:extent)TimeLength of file in hours, minutes and seconds.


dc:identifierText?Unique filesystem ID, probably file name GUNID


dc:publisherTextStation name; take from Station Preferences/Station Name


? (by TH instead of Source)TextNot used in LS1.0





1000
+ +
+

Sheet 5: Music _ Raw fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ID3v2 nameTech 3293 nameTypeComment
Main




FileIdentifier.FileText






TitleTitleText

ArtistCreatorText

AlbumSource.AlbumText

YearDate.YearDate

GenreType.GenreText

CommentDescriptionLongtext

ComposerCreator.Role.ComposerText

Original ArtistCreator.Role.OriginalArtistText

CopyrightRights.CopyrightText

URLIdentifier.URLURL

Encoded byCreator.Role.EncoderText

Track #Source.Album.TrackNumberNumber

Disc #Source.Album.DiscNumberNumber

RatingDescription.RatingNumberNumber of stars

MoodDescription.MoodText

BPMType.BPMNumberType or Description?





File Information




DurationFormat.ExtentTime

BitrateFormat.Medium.BitrateNumber

ChannelsFormat.Medium.ChannelsTextMono, Stereo, 5.1?

SamplerateFormat.Medium.SamplerateNumber

EncoderFormat.Medium.EncoderTextName of encoder software

CRCFormat.CRCNumberChecksum


FormatTextFile, live stream, networked file






LyricsDescription.LyricsLongtext





Additional




Orchestra or bandCreator.Role.OrchestraText

ConductorCreator.Role.ConductorText

LyricistCreator.Role.LyricistText

Original lyricistCreator.Role.OriginalLyricistText

LabelPublisherText

Radio station nameCreator.Role.RadioStationNameTextCreator or Publisher?

Audio file information webpageDescription.AudioFileInfoURLURL

Artist webpageDescription.ArtistURLURL

Audio source webpageDescription.AudioSourceURLURL

Radio station webpageDescription.RadioStationURLURL

Buy CD webpageDescription.BuyCDURLURL

ISRC #Identifier.ISRCNumberNumber

Catalog #Identifier.CatalogNumberNumber
+ +
+

Sheet 6: News _ Raw fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field nameTypeComment
TitleTextFile or playlist title name
CreatorTextName of creator (could be reporter, editor, moderator)
SubjectTextTopic of the content as keywords; a persons who is the subject can go here too)
DescriptionLong textAccount of the content; could be an abstract, a script, etc.
PublisherTextStation name; take from Station Preferences/Station Name
ContributorTextEntity making contributions to the content of the resource (could be person, organization or service)
DateDateDate file was created (if report is about a time, that goes in coverage)
TypeTextGenre of the content or resource
FormatTextStream, file, networked file
IdentifierText?Unique ID, probably file name GUNID
SourceTextNot used in 1.0
LanguageTextLanguage of the file, according to W3C RFC 1766
RelationTextWhether the report is related to other reports (part of a playlist, for example)
CoverageTextWhat the report covers; could include time, place, organization (beat)
RightsTextCan include URL pointing to copyright or CC license info
+ +
+

Sheet 7: Music _ Element extensions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ID3v2 nameTech 3293 nameTypeComment




Main









FileIdentifier.FileText












ElementExists in Tech3293?

ArtistCreatorText


CreatorExists

ComposerCreator.Role.ComposerText


Creator.RoleExists

ConductorCreator.Role.ConductorText


Creator.Role.ConductorNewModifies Creator.Role

Encoded byCreator.Role.EncoderText


Creator.Role.EncoderNewModifies Creator.Role

LyricistCreator.Role.LyricistText


Creator.Role.LyricistNewModifies Creator.Role

Orchestra or bandCreator.Role.OrchestraText


Creator.Role.OrchestraNewModifies Creator.Role

Original ArtistCreator.Role.OriginalArtistText


Creator.Role.OriginalArtistNewModifies Creator.Role

Original lyricistCreator.Role.OriginalLyricistText


Creator.Role.OriginalLyricistNewModifies Creator.Role

Radio station nameCreator.Role.RadioStationNameTextCreator or Publisher?

Creator.Role.RadioStationNameNewModifies Creator.Role

YearDate.YearDate


Date.YearExists

CommentDescriptionLongtext


DescriptionExists

Artist webpageDescription.ArtistURLURL


Description.ArtistURLNewModifies Description

Audio file information webpageDescription.AudioFileInfoURLURL


Description.AudioFileInfoURLNewModifies Description

Audio source webpageDescription.AudioSourceURLURL


Description.AudioSourceURLNewModifies Description

Buy CD webpageDescription.BuyCDURLURL


Description.BuyCDURLNewModifies Description

LyricsDescription.LyricsLongtext


Description.LyricsNewModifies Description

MoodDescription.MoodText


Description.MoodNewModifies Description

Radio station webpageDescription.RadioStationURLURL


Description.RadioStationURLNewModifies Description

RatingDescription.RatingNumberNumber of stars

Description.RatingNewModifies Description


FormatTextFile, live stream, networked file

FormatExists

CRCFormat.CRCNumberChecksum

Format.CRCNewModifies Format

DurationFormat.ExtentTime


Format.Extent
Modifies Format

BitrateFormat.Medium.BitrateNumber


Format.Medium.Bitrate
Modifies Format

ChannelsFormat.Medium.ChannelsTextMono, Stereo, 5.1?

Format.Medium.Channels
Modifies Format

EncoderFormat.Medium.EncoderTextName of encoder software

Format.Medium.Encoder
Modifies Format

SamplerateFormat.Medium.SamplerateNumber


Format.Medium.Samplerate
Modifies Format

Catalog #Identifier.CatalogNumberNumber


Identifier.CatalogNumberNewModifies Identifier

ISRC #Identifier.ISRCNumberNumber


Identifier.ISRCNumberNewModifies Identifier

URLIdentifier.URLURL


Identifier.URLNewModifies Identifier

LabelPublisherText


PublisherExists

CopyrightRights.CopyrightText


Rights.CopyrightExists

AlbumSource.AlbumText


Source.AlbumNewModifies Source

Disc #Source.Album.DiscNumberNumber


Source.Album.DiscNumberNewModifies Source

Track #Source.Album.TrackNumberNumber


Source.Album.TrackNumberNewModifies Source

TitleTitleText


TitleExists

BPMType.BPMNumberType or Description?

Type.BPMNewModifies Type

GenreType.GenreText


Type.GenreNewModifies Type










File Information




























Additional








+ + + + diff --git a/campcaster/doc/gui/styleguide.pdf b/campcaster/doc/gui/styleguide.pdf new file mode 100644 index 000000000..2cf305d2e Binary files /dev/null and b/campcaster/doc/gui/styleguide.pdf differ diff --git a/campcaster/doc/gui/tec_doc_t3293_tcm6-10494.pdf b/campcaster/doc/gui/tec_doc_t3293_tcm6-10494.pdf new file mode 100644 index 000000000..276a7c278 Binary files /dev/null and b/campcaster/doc/gui/tec_doc_t3293_tcm6-10494.pdf differ diff --git a/campcaster/doc/gui/windowDescription.rtf b/campcaster/doc/gui/windowDescription.rtf new file mode 100644 index 000000000..e8554592c --- /dev/null +++ b/campcaster/doc/gui/windowDescription.rtf @@ -0,0 +1,3538 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f35\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f134\froman\fcharset238\fprq2 Times New Roman CE;}{\f135\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f137\froman\fcharset161\fprq2 Times New Roman Greek;} +{\f138\froman\fcharset162\fprq2 Times New Roman Tur;}{\f139\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f140\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f141\froman\fcharset186\fprq2 Times New Roman Baltic;} +{\f142\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f144\fswiss\fcharset238\fprq2 Arial CE;}{\f145\fswiss\fcharset204\fprq2 Arial Cyr;}{\f147\fswiss\fcharset161\fprq2 Arial Greek;}{\f148\fswiss\fcharset162\fprq2 Arial Tur;} +{\f149\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f150\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f151\fswiss\fcharset186\fprq2 Arial Baltic;}{\f152\fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f154\fmodern\fcharset238\fprq1 Courier New CE;} +{\f155\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f157\fmodern\fcharset161\fprq1 Courier New Greek;}{\f158\fmodern\fcharset162\fprq1 Courier New Tur;}{\f159\fmodern\fcharset177\fprq1 Courier New (Hebrew);} +{\f160\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f161\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f162\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f484\fswiss\fcharset238\fprq2 Tahoma CE;}{\f485\fswiss\fcharset204\fprq2 Tahoma Cyr;} +{\f487\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f488\fswiss\fcharset162\fprq2 Tahoma Tur;}{\f489\fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f490\fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f491\fswiss\fcharset186\fprq2 Tahoma Baltic;} +{\f492\fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f493\fswiss\fcharset222\fprq2 Tahoma (Thai);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0; +\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{ +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 +\b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \styrsid7808687 heading 1;}{\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 +\b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \styrsid2364186 heading 2;}{\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 +\b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 \sbasedon0 \snext0 \sautoupd \styrsid12474292 heading 3;}{\s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0 +\b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \styrsid4536037 heading 4;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\widctlpar +\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext15 \styrsid8406911 header;}{\s16\ql \li0\ri0\widctlpar +\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext16 \styrsid8406911 footer;}{\*\cs17 \additive \sbasedon10 \styrsid8406911 page number;}{\*\cs18 \additive +\ul\cf2 \sbasedon10 \styrsid16411736 Hyperlink;}{\*\ts19\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \sbasedon11 \snext19 \styrsid2560916 Table Grid;}{\s20\ql \li0\ri0\sb120\sa120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 1;}{\s21\ql \li240\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 +\scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 2;}{\s22\ql \li480\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 +\i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 3;}{\s23\ql \li720\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 4;}{\s24\ql \li960\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin960\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 5;}{\s25\ql \li1200\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1200\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 6;}{\s26\ql \li1440\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1440\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 7;}{\s27\ql \li1680\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1680\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 8;}{\s28\ql \li1920\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1920\itap0 +\fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext0 \sautoupd \ssemihidden \styrsid2693463 toc 9;}{\s29\ql \li0\ri0\widctlpar +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f2\fs20\lang2074\langfe1033\cgrid\langnp2074\langfenp1033 +\sbasedon0 \snext29 \styrsid8283629 HTML Preformatted;}{\s30\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f35\fs16\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext30 \ssemihidden \styrsid15533137 +Balloon Text;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable{\list\listtemplateid-500409900\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers +\'01;}\fi-360\li1492\jclisttab\tx1492\lin1492 }{\listname ;}\listid-132}{\list\listtemplateid-1136386430\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers +\'01;}\fi-360\li1209\jclisttab\tx1209\lin1209 }{\listname ;}\listid-131}{\list\listtemplateid-879313700\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers +\'01;}\fi-360\li926\jclisttab\tx926\lin926 }{\listname ;}\listid-130}{\list\listtemplateid-1442677072\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers +\'01;}\fi-360\li643\jclisttab\tx643\lin643 }{\listname ;}\listid-129}{\list\listtemplateid-798047370\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1492\jclisttab\tx1492\lin1492 }{\listname ;}\listid-128}{\list\listtemplateid-1877201296\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1209\jclisttab\tx1209\lin1209 }{\listname ;}\listid-127}{\list\listtemplateid-1757509174\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li926\jclisttab\tx926\lin926 }{\listname ;}\listid-126}{\list\listtemplateid1125824520\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li643\jclisttab\tx643\lin643 }{\listname ;}\listid-125}{\list\listtemplateid957225064\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-120}{\list\listtemplateid-736231278\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-119}{\list\listtemplateid1363804504\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid111360257} +{\list\listtemplateid-1331890960\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720 +\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid149251787}{\list\listtemplateid-2094081540\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid176239687}{\list\listtemplateid-1186667090\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid196159275}{\list\listtemplateid-2011650680\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid283662526}{\list\listtemplateid-205238550\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid319651020}{\list\listtemplateid115503630\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid335302263}{\list\listtemplateid309469072\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 +\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid381027044}{\list\listtemplateid-1058616850\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3960 +\jclisttab\tx3960\lin3960 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4680\jclisttab\tx4680\lin4680 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5400\jclisttab\tx5400\lin5400 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6120\jclisttab\tx6120\lin6120 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6840\jclisttab\tx6840\lin6840 }{\listname ;}\listid430974723}{\list\listtemplateid1302125000\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid462117874}{\list\listtemplateid1056898566\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid516770084}{\list\listtemplateid-148206224\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid799151151}{\list\listtemplateid-1184436284\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid971055508}{\list\listtemplateid1599222170\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1021202524}{\list\listtemplateid-554772544\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1115831479}{\list\listtemplateid-52774062\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1201354651}{\list\listtemplateid714002106\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1215583941}{\list\listtemplateid1133778160\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1258099724}{\list\listtemplateid456451792\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1359501324}{\list\listtemplateid-111496594\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1381981516}{\list\listtemplateid-140479316\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1430\jclisttab\tx1430\lin1430 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2150\jclisttab\tx2150\lin2150 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2870\jclisttab\tx2870\lin2870 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li3590\jclisttab\tx3590\lin3590 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4310 +\jclisttab\tx4310\lin4310 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5030\jclisttab\tx5030\lin5030 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5750\jclisttab\tx5750\lin5750 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6470\jclisttab\tx6470\lin6470 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7190\jclisttab\tx7190\lin7190 }{\listname ;}\listid1544899565}{\list\listtemplateid-335746746\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1689285519}{\list\listtemplateid-2121651376\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1800 +\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3960\jclisttab\tx3960\lin3960 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4680\jclisttab\tx4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5400\jclisttab\tx5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6120\jclisttab\tx6120\lin6120 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6840\jclisttab\tx6840\lin6840 }{\listname ;}\listid1689866703}{\list\listtemplateid-1735908832\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1699088692}{\list\listtemplateid-1543187310\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1746999783}{\list\listtemplateid-772923238\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1786607916}{\list\listtemplateid1158283444\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat11\levelspace0\levelindent0{\leveltext\leveltemplateid-437354988\'01-;}{\levelnumbers;}\loch\af0\hich\af0\dbch\af0\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1870531578}{\list\listtemplateid1158283444 +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat11\levelspace0\levelindent0{\leveltext\'01-;}{\levelnumbers;}\loch\af0\hich\af0\dbch\af0\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1874920252}{\list\listtemplateid281947714\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1883443674}{\list\listtemplateid-1662761508\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1891258171}{\list\listtemplateid1361489580 +\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1904295166}{\list\listtemplateid-1768898404\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1910267990}{\list\listtemplateid1417836132\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1972705535}{\list\listtemplateid-1837583566\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1994403915}{\list\listtemplateid535174426\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2021620681}{\list\listtemplateid1814071032\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 +\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2051875221}{\list\listtemplateid273994028\listhybrid +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567617\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567619\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67567621\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid2069067059}{\list\listtemplateid-1453926946\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0 +{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2130512874}}{\*\listoverridetable{\listoverride\listid1972705535\listoverridecount0\ls1}{\listoverride\listid1381981516\listoverridecount0\ls2} +{\listoverride\listid2021620681\listoverridecount0\ls3}{\listoverride\listid1883443674\listoverridecount0\ls4}{\listoverride\listid462117874\listoverridecount0\ls5}{\listoverride\listid-119\listoverridecount0\ls6}{\listoverride\listid-125 +\listoverridecount0\ls7}{\listoverride\listid-126\listoverridecount0\ls8}{\listoverride\listid-127\listoverridecount0\ls9}{\listoverride\listid-128\listoverridecount0\ls10}{\listoverride\listid-120\listoverridecount0\ls11}{\listoverride\listid-129 +\listoverridecount0\ls12}{\listoverride\listid-130\listoverridecount0\ls13}{\listoverride\listid-131\listoverridecount0\ls14}{\listoverride\listid-132\listoverridecount0\ls15}{\listoverride\listid176239687\listoverridecount0\ls16} +{\listoverride\listid381027044\listoverridecount0\ls17}{\listoverride\listid1910267990\listoverridecount0\ls18}{\listoverride\listid111360257\listoverridecount0\ls19}{\listoverride\listid335302263\listoverridecount0\ls20}{\listoverride\listid1786607916 +\listoverridecount0\ls21}{\listoverride\listid149251787\listoverridecount0\ls22}{\listoverride\listid1904295166\listoverridecount0\ls23}{\listoverride\listid2051875221\listoverridecount0\ls24}{\listoverride\listid1258099724\listoverridecount0\ls25} +{\listoverride\listid1746999783\listoverridecount0\ls26}{\listoverride\listid1359501324\listoverridecount0\ls27}{\listoverride\listid283662526\listoverridecount0\ls28}{\listoverride\listid319651020\listoverridecount0\ls29}{\listoverride\listid1215583941 +\listoverridecount0\ls30}{\listoverride\listid1021202524\listoverridecount0\ls31}{\listoverride\listid196159275\listoverridecount0\ls32}{\listoverride\listid2069067059\listoverridecount0\ls33}{\listoverride\listid516770084\listoverridecount0\ls34} +{\listoverride\listid1870531578\listoverridecount0\ls35}{\listoverride\listid1689285519\listoverridecount0\ls36}{\listoverride\listid1874920252\listoverridecount0\ls37}{\listoverride\listid971055508\listoverridecount0\ls38}{\listoverride\listid1689866703 +\listoverridecount0\ls39}{\listoverride\listid1891258171\listoverridecount0\ls40}{\listoverride\listid1201354651\listoverridecount0\ls41}{\listoverride\listid1699088692\listoverridecount0\ls42}{\listoverride\listid1115831479\listoverridecount0\ls43} +{\listoverride\listid799151151\listoverridecount0\ls44}{\listoverride\listid1544899565\listoverridecount0\ls45}{\listoverride\listid1994403915\listoverridecount0\ls46}{\listoverride\listid2130512874\listoverridecount0\ls47}{\listoverride\listid430974723 +\listoverridecount0\ls48}}{\*\revtbl {Unknown;}{Douglas Arellanes;}}{\*\rsidtbl \rsid5606\rsid84972\rsid93759\rsid338081\rsid338302\rsid353388\rsid403238\rsid524972\rsid525137\rsid534437\rsid537730\rsid553299\rsid556831\rsid591721\rsid597303\rsid620663\rsid728252\rsid743655\rsid873682 +\rsid875711\rsid1052329\rsid1052817\rsid1070637\rsid1077137\rsid1141904\rsid1207448\rsid1207899\rsid1253662\rsid1334983\rsid1339160\rsid1400663\rsid1577794\rsid1582066\rsid1593142\rsid1600853\rsid1654761\rsid1780831\rsid1867486\rsid1907956\rsid1981424 +\rsid1993713\rsid2033356\rsid2109254\rsid2111105\rsid2364186\rsid2375508\rsid2446275\rsid2493485\rsid2520008\rsid2560916\rsid2637360\rsid2693463\rsid2764868\rsid2831923\rsid2837605\rsid2848434\rsid3039356\rsid3214303\rsid3222878\rsid3242838\rsid3350176 +\rsid3367757\rsid3412524\rsid3505407\rsid3621462\rsid3691965\rsid3767246\rsid3896650\rsid4006540\rsid4204924\rsid4217381\rsid4409133\rsid4536037\rsid4536429\rsid4655542\rsid4730303\rsid4920384\rsid4932664\rsid5051338\rsid5063614\rsid5113369\rsid5202891 +\rsid5268167\rsid5452165\rsid5581702\rsid6300556\rsid6381798\rsid6431368\rsid6705152\rsid7088866\rsid7096017\rsid7348600\rsid7418535\rsid7552355\rsid7607439\rsid7609622\rsid7757091\rsid7758789\rsid7759020\rsid7808687\rsid7952295\rsid7999091\rsid8068550 +\rsid8133754\rsid8139555\rsid8218757\rsid8262684\rsid8283629\rsid8406911\rsid8416880\rsid8474017\rsid8476729\rsid8599621\rsid8662583\rsid8669708\rsid8865384\rsid8922850\rsid8997258\rsid9115585\rsid9393188\rsid9441111\rsid9532527\rsid9599581\rsid9731452 +\rsid9772727\rsid9842054\rsid9860289\rsid9923887\rsid10112697\rsid10120207\rsid10358824\rsid10438290\rsid10492113\rsid10623485\rsid10698856\rsid10714125\rsid10714751\rsid10764249\rsid10826198\rsid11036725\rsid11281446\rsid11360489\rsid11555562 +\rsid11603768\rsid11890322\rsid12085996\rsid12206215\rsid12256603\rsid12270098\rsid12276673\rsid12283844\rsid12394895\rsid12470370\rsid12474292\rsid12477272\rsid12481097\rsid12541268\rsid12599431\rsid12605384\rsid12676815\rsid12714428\rsid12728480 +\rsid12852167\rsid12910717\rsid13004469\rsid13136500\rsid13178549\rsid13265408\rsid13268333\rsid13270669\rsid13389201\rsid13398770\rsid13436755\rsid13463385\rsid13790097\rsid14029788\rsid14108688\rsid14109158\rsid14187354\rsid14234458\rsid14296232 +\rsid14315723\rsid14439181\rsid14444417\rsid14486893\rsid14886159\rsid14901303\rsid14952783\rsid14958399\rsid15021988\rsid15037064\rsid15298160\rsid15341335\rsid15349349\rsid15351607\rsid15356409\rsid15533137\rsid15553266\rsid15563602\rsid15869539 +\rsid15878439\rsid15933635\rsid15993845\rsid16057227\rsid16079447\rsid16131165\rsid16215702\rsid16263532\rsid16326225\rsid16404736\rsid16411736\rsid16469864\rsid16671400\rsid16677977}{\*\generator Microsoft Word 11.0.6113;}{\info +{\title LIVESUPPORT WINDOW DESCRIPTION FOR C++}{\author richard castlefield}{\operator Douglas Arellanes}{\creatim\yr2005\mo1\dy14\hr13\min33}{\revtim\yr2005\mo1\dy14\hr19\min31}{\version21}{\edmins283}{\nofpages25}{\nofwords8305}{\nofchars47341} +{\*\company }{\nofcharsws55535}{\vern24699}}\paperw11906\paperh16838\margl1417\margr1417\margt1417\margb1134 +\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\revisions\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1417\dgvorigin1417\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot14444417 \fet0{\*\ftnsep +\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid16057227 \chftnsep +\par }}{\*\ftnsepc \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid16057227 \chftnsepc +\par }}{\*\aftnsep \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid16057227 \chftnsep +\par }}{\*\aftnsepc \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid16057227 \chftnsepc +\par }}\sectd \linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\header \pard\plain \s15\qc \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8406911 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\f1\fs20\lang2057\langfe1031\langnp2057\insrsid16057227\charrsid8406911 LiveSupport Window description for C++}{\f1\fs20\lang2057\langfe1031\langnp2057\insrsid16057227 (2004-12-09)}{ +\f1\fs20\lang2057\langfe1031\langnp2057\insrsid16057227\charrsid8406911 +\par }}{\footer \pard\plain \s16\qc \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8406911 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field{\*\fldinst {\cs17\insrsid16057227 PAGE }}{\fldrslt +{\cs17\lang1024\langfe1024\noproof\insrsid2837605 22}}}{\cs17\insrsid16057227 of }{\field{\*\fldinst {\cs17\insrsid16057227 NUMPAGES }}{\fldrslt {\cs17\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416802\noproof\insrsid2837605 25}{ +\cs17\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416806\noproof\insrsid16057227\delrsid12256603 7}}}{\insrsid16057227 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2693463 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2693463 {\*\bkmkstart _Toc90357953} +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\lang2057\langfe1031\langnp2057\insrsid2693463 TOC \\o "1-4" \\h \\z \\u }}{\fldrslt {\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489732"}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330032000000}}}{\fldrslt { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 LiveSupport Window description for GUI application}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489732 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 2}}}}}{\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489733" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +General window description}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489733 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 3}}}}}{\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489734"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +Popup Window}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489734 \\ +h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330034000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 3}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489735"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +Individual screens in order of (possible appearance)}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489735 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330035000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 3}}}}}{ +\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489736"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +1.a. Master Panel}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489736 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 3}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489737"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Always visible in Master Panel (independent from status):}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489737 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330037000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 4}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489738" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Status sensitive (on-air vs. off-air, logged in vs. logged out, etc.)}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489738 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330038000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 4}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489739" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Status 1: Launch application, off-air nobody logged in}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489739 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700330039000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 4}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489740" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Status 2: Launch application, on-air nobody logged in}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489740 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340030000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 4}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489741" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Status 3: Launch application, on-air after successful login}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489741 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340031000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 5}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489742" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Status 4: Launch application, off-air after successful login}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489742 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340032000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 5}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489743" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Close down LiveSupport}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489743 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 5}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489744" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Starting other panels from main panel}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489744 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340034000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 5}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489745" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +1.b. Roberts additions: Master panel Live Mode}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489745 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340035000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 6}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s23\ql \li720\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin720\itap0 \fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489746"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +contains the following informations :}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489746 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 6}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489747"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +2. Logging in: the login popup }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\langnp2057\insrsid16057227\charrsid16723315 1 done}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489747 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340037000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 6}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489748"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 This w +indow pops up when}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489748 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 6}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489749" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489749 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700340039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 6}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489750" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +The function of the items}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489750 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 6}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489751" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions} +{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489751 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350031000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 6}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489752"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +3. Add files panel}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489752 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 7}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489753"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window opens when +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489753 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 7}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489754" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489754 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350034000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 7}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489755" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The function of items +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489755 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350035000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 7}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489756" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions: +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489756 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 7}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489757" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 4 +. Add web stream panel }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\insrsid16057227\charrsid16723315 3}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab } +{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489757 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350037000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 8}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s23\ql \li720\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin720\itap0 \fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489758"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window opens when +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489758 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 8}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489759" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489759 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700350039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 8}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489760" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The function of items +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489760 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 8}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489761" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions: +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489761 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360031000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 8}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489762"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Add Networked File URL}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489762 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 9}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s23\ql \li720\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin720\itap0 \fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489763"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window opens when +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489763 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 9}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489764" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489764 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360034000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 9}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489765" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The function of items +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489765 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360035000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 9}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489766" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions: +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489766 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 9}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489767"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +5. Edit file information panel }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\langnp2057\insrsid16057227\charrsid16723315 1}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489767 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360037000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 10}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489768"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window opens when +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489768 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 10}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489769" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489769 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700360039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 10}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489770" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Default status}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489770 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 10}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489771" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The function of items +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489771 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370031000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 10}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489772" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions: +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489772 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 11}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489773"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +6. View file information panel }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\langnp2057\insrsid16057227\charrsid16723315 1}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489773 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 11}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489774"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window opens when +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489774 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370034000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 11}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489775" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489775 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370035000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 11}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489776"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +7. Scratchpad window }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\langnp2057\insrsid16057227\charrsid16723315 1}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 +\tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489776 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370036000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 11}}}}}{ +\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489777"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Window opens when}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489777 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370037000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 11}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489778" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489778 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 12}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489779" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The function of items +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489779 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700370039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 12}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489780" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions} +{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489780 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 12}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489781"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +8. Scheduler window }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\langnp2057\insrsid16057227\charrsid16723315 1}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 +\tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489781 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380031000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 12}}}}}{ +\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489782"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window opens when +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489782 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 12}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489783" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489783 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 13}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489784" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +The function of the items}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489784 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380034000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 13}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489785" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions} +{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489785 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380035000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 14}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489786" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Scheduler popup window to schedule playlist}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489786 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380036000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 15}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489787"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +9. Playlist window }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\langnp2057\insrsid16057227\charrsid16723315 1}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 +\tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489787 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380037000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 15}}}}}{ +\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489788"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 List view }{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\insrsid16057227\charrsid16723315 1}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489788 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380038000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 15}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s23\ql \li720\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin720\itap0 \fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489789"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window opens when +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489789 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700380039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 15}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489790" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489790 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 16}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489791" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +The function of the items}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489791 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390031000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 16}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489792" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions} +{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489792 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489793" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +X-fader window}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489793 +\\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489794"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Timeline view }{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\insrsid16057227\charrsid16723315 3}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489794 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390034000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s23\ql \li720\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin720\itap0 \fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489795"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 The window contains:} +{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489795 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390035000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489796" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +The window opens when:}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489796 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489797" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Function of the items:}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489797 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390037000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489798" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Additional functions: +}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489798 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489799"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +10. Search }{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\langnp2057\insrsid16057227\charrsid16723315 1}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab } +{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489799 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003700390039000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{ +\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489800"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +When starting the application}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489800 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 17}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489801" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Search form}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489801 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300031000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 18}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489802" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Search - Advanced mode}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489802 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 18}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489803" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Browse}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489803 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 18}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489804" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 How does it work :}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489804 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300034000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 18}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489805" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Example:}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489805 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300035000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 19}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489806" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Cue window}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489806 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 19}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489807" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Form field with the Search results}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489807 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300037000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 19}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489808" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 How does it work :}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489808 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 19}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489809" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Play list}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489809 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800300039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 19}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489810" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 User\rquote s idea :} +{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489810 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 20}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489811"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +11. Live Mode}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489811 \\ +h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310031000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 20}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489812"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +Description, recommendations:}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489812 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 20}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489813" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Starting Live Mode}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489813 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 20}}}}}{\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489814" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Live assist }{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\insrsid16057227\charrsid16723315 1}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489814 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310034000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 21}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489815" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Automatic }{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\highlight7\noproof\insrsid16057227\charrsid16723315 1}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489815 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310035000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 21}}}}}{ +\i0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s23\ql \li720\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin720\itap0 \fs18\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489816"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +X-fader window}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489816 +\\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 21}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489817" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Mix Time}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489817 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310037000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 21}}}}}{\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489818"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 12. Cue palette}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489818 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 21}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489819" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +13. X-fader window}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489819 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800310039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 22}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489820" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320030000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Commands:}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489820 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320030000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 22}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489821"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320031000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +General issues}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489821 +\\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320031000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 22}}}}}{\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489822"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320032000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 +General link of our design so far :}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489822 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320032000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 22}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489823" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320033000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +On-Air Off-air definition}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489823 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320033000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 23}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489824"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320034000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +Right mouse sensitive for files and playlists}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489824 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320034000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 23}}}}}{ +\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489825" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320035000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1036\insrsid16057227\charrsid16723315 +Information formats (date, names, etc.)}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489825 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320035000000}}}{\fldrslt {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 23}}}}}{ +\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489826"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320036000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +Date format}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489826 \\h +}{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320036000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 23}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489827" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320037000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp2057\insrsid16057227\charrsid16723315 +Station information}{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 + PAGEREF _Toc93489827 \\h }{\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320037000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 23}}}}}{\scaps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416883\pnrnot1\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\field\fldedit{\*\fldinst { +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489828"}{ +\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320038000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 About window}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489828 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320038000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 23}}}}}{\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }{\field\fldedit{\*\fldinst {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227 HYPERLINK \\l "_Toc93489829" +}{\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid16057227\charrsid16057227 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320039000000}}}{\fldrslt {\cs18\ul\cf2\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\insrsid16057227\charrsid16723315 Menu Bar}{ +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 \tab }{\field{\*\fldinst {\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\webhidden\insrsid16057227 PAGEREF _Toc93489829 \\h }{ +\lang1024\langfe1024\noproof\insrsid16057227 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300390033003400380039003800320039000000}}}{\fldrslt { +\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416806\noproof\webhidden\insrsid12256603 24}}}}}{\b0\caps0\fs24\cf0\revised\lang1024\langfe1024\revauth1\revdttm-1500416883\noproof\langnp1033\langfenp1033\insrsid16057227 +\par }\pard \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 LiveSupport Window description for GUI application}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 2}{\b0\deleted\caps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 General window description}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 2}{\b0\deleted\caps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 Popup Window}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 2}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 Individual screens in order of (possible appearance)}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 3}{\b0\deleted\caps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 1.a. Starting the application: opening the Master Panel}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 3}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Always visible in Mater Panel (independent from status):}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 3}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Status sensitive (on-air vs. off-air, logged in vs. logged out, etc.)}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 3}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Status 1: Launch application, off-air nobody logged in}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 4}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Status 2: Launch application, on-air nobody logged in}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 4}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Status 3: Launch application, on-air after successful login}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 4}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Status 4: Launch application, off-air after successful login}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 5}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Close down LiveSupport}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 5}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Starting other panels from main panel}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 5}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 1.b. Roberts additions: Master panel Live Mode}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 5}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 contains the following informations :}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 5}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 2. Loging in: the login popup}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 6}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 This window pops up when}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 6}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window contains}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 6}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The function of the items}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 6}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Additional functions}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 6}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 3. Uploading files panel}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 7}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window opens when}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 7}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window contains}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 7}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The function of items}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 7}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Additional functions:}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 7}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 12. Add web stream panel}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 8}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window opens when}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 8}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window contains}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 8}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The function of items}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 8}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Additional functions:}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 8}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 13. Edit file information panel}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 9}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window opens when}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 9}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window contains}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 9}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Default status}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 9}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The function of items}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 9}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Additional functions:}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 9}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 4. }{ +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500417018\noproof\langnp2057\insrsid7348600\delrsid3767246\charrsid16057227 DJ Bag}{ +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 window}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 10}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Window opens when}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 10}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window contains}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 10}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The function of items}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 10}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Additional functions}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 11}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 6. Scheduler window}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 11}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window opens when}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 11}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window contains}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 11}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The function of the items}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 11}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Additional functions}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 13}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Scheduler popup window to schedule playlist}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 13}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 5. Playlist management window (simple)}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 13}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window opens when}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 14}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The window contains}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 14}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 The function of the items}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 14}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Additional functions}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 15}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 10. Playlist management window (advanced)}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 15}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 7. Library / Search}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 15}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 When starting the application}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 15}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Search form}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 15}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Search - Advanced mode}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 15}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 How does it work :}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 16}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Example:}{\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 +\tab 16}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Player (??? Robert what do you mean by this???)}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 16}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Form field with the Search results}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 16}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 How does it work :}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 17}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Play list}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 17}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 User\rquote s idea :}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 17}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 9. Live Mode}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 17}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s22\ql \li480\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin480\itap0 \i\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Description, recommendations:}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 17}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Starting Live Mode}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 17}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Live assistant mode}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 18}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Mix Time}{\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 +\tab 18}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 Commands:}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\i0\deleted\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 General issues}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\b0\deleted\caps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227\charrsid16057227 General link of our design so far :}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 On-Air Off-air definition}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s20\ql \li0\ri0\sb120\sa120\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\caps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 Right mouse sensitive for files and playlists}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\b0\deleted\caps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp1036\insrsid7348600\delrsid16057227\charrsid16057227 Information formats (date, names, etc.)}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\b0\deleted\caps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \s21\ql \li240\ri0\widctlpar\tqr\tldot\tx9062\aspalpha\aspnum\faauto\adjustright\rin0\lin240\itap0 \scaps\fs20\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 Date format}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }{\cs18\deleted\ul\cf2\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\langnp2057\insrsid7348600\delrsid16057227\charrsid16057227 Station information}{ +\deleted\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\webhidden\insrsid7348600\delrsid16057227 \tab 19}{\deleted\scaps0\fs24\lang1024\langfe1024\revauthdel1\revdttmdel-1500416883\noproof\insrsid7348600\delrsid16057227 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2693463 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 }}\pard\plain +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2693463 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2693463 +\par +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid1253662 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid2693463 {\*\bkmkstart _Toc93489732}L}{\lang2057\langfe1031\langnp2057\insrsid8406911 iveSupport }{\lang2057\langfe1031\langnp2057\insrsid1253662 Window description for }{ +\lang2057\langfe1031\langnp2057\insrsid1077137 {\*\bkmkend _Toc90357953}GUI application}{\lang2057\langfe1031\langnp2057\insrsid1253662 {\*\bkmkend _Toc93489732} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8406911 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8406911 +\par }{\lang2057\langfe1031\langnp2057\insrsid620663 (Version: 2004-12-14}{\lang2057\langfe1031\langnp2057\insrsid8406911 )}{\lang2057\langfe1031\langnp2057\insrsid8406911\charrsid8406911 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\lang2057\langfe1031\langnp2057\insrsid1253662 +\par }{\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 The following document describes the }{\lang2057\langfe1031\langnp2057\insrsid13389201 +\par +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid728252\charrsid728252 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13389201 { +\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 items}{\lang2057\langfe1031\langnp2057\insrsid728252 (buttons, }{\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 }{\lang2057\langfe1031\langnp2057\insrsid13389201 +information, visuals) and +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13389201 \loch\af3\dbch\af0\hich\f3 \'b7\tab}functions (of these items) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9731452 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid9731452 the interface feedback (e.g. login error, what next?) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\lang2057\langfe1031\langnp2057\insrsid13389201 +\par }{\lang2057\langfe1031\langnp2057\insrsid728252\charrsid728252 for each individual screen of LiveSuppo}{\lang2057\langfe1031\langnp2057\insrsid728252 rt. It does }{\lang2057\langfe1031\langnp2057\insrsid9731452 +not describe their position. And it raises a number of questions \endash you will see as you go along.}{\lang2057\langfe1031\langnp2057\insrsid14444417 +\par }{\lang2057\langfe1031\langnp2057\insrsid9731452 +\par This document is used by the +\par +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9731452 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls2 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid9731452 { +\lang2057\langfe1031\langnp2057\insrsid9731452 programmers to implement the functionality on the screen and the +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9731452 \loch\af3\dbch\af0\hich\f3 \'b7\tab}designers to design the screen according to the functionality +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\lang2057\langfe1031\langnp2057\insrsid9731452 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid7808687 {\*\bkmkstart _Toc90357954}{\*\bkmkstart _Toc93489733}General window description{\*\bkmkend _Toc90357954}{\*\bkmkend _Toc93489733} +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2364186 +{\*\bkmkstart _Toc90357955}{\*\bkmkstart _Toc93489734}Popup }{\lang2057\langfe1031\langnp2057\insrsid597303 {\*\bkmkend _Toc90357955}Window}{\lang2057\langfe1031\langnp2057\insrsid9731452 {\*\bkmkend _Toc93489734} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2364186 The Popup }{ +\lang2057\langfe1031\langnp2057\insrsid597303 window}{\lang2057\langfe1031\langnp2057\insrsid2364186 is new. It is used for example when login in or signing over the application to another user.}{\lang2057\langfe1031\langnp2057\insrsid8139555 + Other than that it is mainly used for feedback, such as \'93you can not delete this file\'94 or \'93do you want to upload another file?\'94.}{\lang2057\langfe1031\langnp2057\insrsid9923887 +\par +\par Design requirements: +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9923887 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls3 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid9923887 Can contain a form (e.g. login screen) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9923887 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Can contain a feedback message (e.g. \'93sure you want to close LiveSupport?\'94)}{\lang2057\langfe1031\langnp2057\insrsid2364186 + +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid9923887 +\par Programming requirements +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9923887 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls4 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid9923887 Pops up when clicking on certain features (e.g. \'93Log in\'94) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9923887 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Pops up for confirmation at some functions (e.g. \'93Sure you want to...\'94) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9923887 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Pops up as error or warning message (e.g. \'93Closing this window will...\'94) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid9923887 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid16411736 {\*\bkmkstart _Toc90357956}{\*\bkmkstart _Toc93489735}Individual screens in order of (possible appearance)}{\lang2057\langfe1031\langnp2057\insrsid9923887 {\*\bkmkend _Toc90357956}{\*\bkmkend _Toc93489735} + +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc90357957}{\*\bkmkstart _Toc93489736}1.a. }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416914\langnp2057\insrsid16411736\delrsid524972 Starting the application: opening the }{\lang2057\langfe1031\langnp2057\insrsid16411736 +Master Panel{\*\bkmkend _Toc90357957}{\*\bkmkend _Toc93489736} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16411736 Current screen design: +\par }{\field\flddirty{\*\fldinst {\lang2057\langfe1031\langnp2057\insrsid16411736 HYPERLINK "}{\lang2057\langfe1031\langnp2057\insrsid16411736\charrsid16411736 http://a.parsons.edu/~livesupport/designs/images/master.jpg}{ +\lang2057\langfe1031\langnp2057\insrsid16411736 " }{\lang2057\langfe1031\langnp2057\insrsid14187354\charrsid7758789 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000003c00000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f0069006d0061006700650073002f00 +6d00610073007400650072002e006a00700067000000e0c9ea79f9bace118c8200aa004ba90b7800000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f0069 +006d0061006700650073002f006d00610073007400650072002e006a00700067000000000000}}}{\fldrslt {\cs18\ul\cf2\lang2057\langfe1031\langnp2057\insrsid16411736\charrsid7758789 http://a.parsons.edu/~livesupport/designs/images/master.jpg}}}{ +\lang2057\langfe1031\langnp2057\insrsid16411736 +\par }{\lang2057\langfe1031\langnp2057\insrsid16411736\charrsid16411736 +\par }{\lang2057\langfe1031\langnp2057\insrsid16411736 When starting the application it will open the Master Panel which contains the following items: +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4536037 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls5 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid4536037 Time at broadcast station (big)}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1}{ +\lang2057\langfe1031\langnp2057\insrsid4536037 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4536037 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Time at client (? If remote ?)}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 nonexistent}{\lang2057\langfe1031\langnp2057\insrsid4536037 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid16411736 LiveSupport logo}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1}{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Station information (frequency, station name, station logo,...)}{\lang2057\langfe1031\langnp2057\insrsid8068550 + (see end of document for details)}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137 10}{\lang2057\langfe1031\highlight7\langnp2057\insrsid16411736\charrsid15533137 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid16411736 Playing next (metadata to be specified)}{ +\lang2057\langfe1031\langnp2057\insrsid15533137 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 7}{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Playing now (metadata info to be specified)}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1}{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}VU-meter}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 5}{\lang2057\langfe1031\highlight7\langnp2057\insrsid16411736\charrsid15533137 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid16411736 Login OR Logout / Signover}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1}{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}User information (if logged in)}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 3}{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Language pulldown (if nobody is logged in)}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 10}{\lang2057\langfe1031\langnp2057\insrsid16411736 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16411736 \loch\af3\dbch\af0\hich\f3 \'b7\tab}On-Air / Off-Air Lamp (indicating if the system is broadcasting)}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 define operation}{\lang2057\langfe1031\highlight7\langnp2057\insrsid16411736\charrsid15533137 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2560916 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2560916 +Launching different functions / panels (liveassist vs scheduler, search, playlist management etc.)}{\lang2057\langfe1031\langnp2057\insrsid5581702\charrsid5581702 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1}{ +\lang2057\langfe1031\langnp2057\insrsid5581702 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid5581702 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Close down LiveSupport (depending on user rights}{\lang2057\langfe1031\highlight7\langnp2057\insrsid5581702\charrsid15533137 )}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1, no user rights in 1.0}{\lang2057\langfe1031\highlight7\langnp2057\insrsid2560916\charrsid15533137 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid16411736 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid875711 {\*\bkmkstart _Toc93489737} +Always visible in Ma}{\cf0\revised\revauth1\revdttm-1500417067\insrsid7418535 s}{\insrsid875711 ter Panel (independent from status):{\*\bkmkend _Toc93489737} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls5 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc14\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr14\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid875711 Time at broadcast station (big) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Time at client (? If remote ?) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}LiveSupport logo +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Station information (frequency, station name, station logo,...)}{\lang2057\langfe1031\langnp2057\insrsid875711\charrsid875711 }{ +\lang2057\langfe1031\langnp2057\insrsid875711 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}On-Air / Off-Air Lamp (indicating if the system is broadcasting) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid875711 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid875711 {\*\bkmkstart _Toc93489738} +Status sensitive (on-air vs. off-air, logged in vs. logged out, etc.){\*\bkmkend _Toc93489738} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls5 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid875711 Playing next +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Playing now +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}VU-meter +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Login OR Logout / Signover +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}User information +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid875711 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Language pulldown }{\lang2057\langfe1031\langnp2057\insrsid4730303 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4730303 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Launching different functions / panels (liveassist vs scheduler, search, playlist management etc.)}{ +\lang2057\langfe1031\langnp2057\insrsid875711 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid5581702 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid5581702 Close down LiveSupport (depending on user rights) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid875711 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid4536037 {\*\bkmkstart _Toc93489739} +Status 1: Launch application, off-air nobody logged in{\*\bkmkend _Toc93489739} +\par }\trowd \irow0\irowband0\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid2560916\charrsid2560916 ITEM\cell SHOWING\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid2560916\charrsid2560916 \trowd \irow0\irowband0\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 Time at broadcast station\cell big\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow1\irowband1\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 Time at client\cell Optional: if remote admin\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow2\irowband2\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 LiveSupport logo\cell yes\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow3\irowband3\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 Station information\cell +frequency, station name, station logo\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 +\trowd \irow4\irowband4\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 Playing next\cell }{ +\lang2057\langfe1031\langnp2057\insrsid4730303 place holder empty}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow5\irowband5\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl +\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid4730303 Playing now}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }{\lang2057\langfe1031\langnp2057\insrsid4730303 place holder empty}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow6\irowband6\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid4730303 VU-meter}{ +\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }{\lang2057\langfe1031\langnp2057\insrsid4730303 place holder empty}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow7\irowband7\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid4730303 Login OR Logout / Signover}{ +\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }{\lang2057\langfe1031\langnp2057\insrsid4730303 Login option}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow8\irowband8\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid4730303 User information}{ +\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }{\lang2057\langfe1031\langnp2057\insrsid4730303 none}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow9\irowband9\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl +\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid4730303 Language pulldown}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }{\lang2057\langfe1031\langnp2057\insrsid4730303 yes}{\lang2057\langfe1031\langnp2057\insrsid2560916 \cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2560916 \trowd \irow10\irowband10\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid4730303 On-Air / Off-Air Lamp\cell Off-Air\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid4730303 \trowd \irow11\irowband11\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid4730303 Launching different functions / panels\cell }{ +\lang2057\langfe1031\langnp2057\insrsid5581702 N}{\lang2057\langfe1031\langnp2057\insrsid4730303 one\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid4730303 \trowd \irow12\irowband12\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 Close down LiveSupport \cell No\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 \trowd \irow13\irowband13\lastrow \ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid1867486 {\*\bkmkstart _Toc93489740} +Status 2: Launch application, on-air nobody logged in{\*\bkmkend _Toc93489740} +\par }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid1867486\charrsid2560916 ITEM\cell SHOWING\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid1867486\charrsid2560916 \trowd \irow0\irowband0 +\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Time at broadcast station\cell big\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow1\irowband1\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Time at client\cell Optional: if remote admin\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow2\irowband2\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 LiveSupport logo\cell yes\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow3\irowband3\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Station information\cell +frequency, station name, station logo\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 +\trowd \irow4\irowband4\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Playing next\cell Showing metadata\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow5\irowband5\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Playing now\cell Showing metadata\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow6\irowband6\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 VU-meter\cell Showing meter values\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow7\irowband7\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Login OR Logout / Signover\cell Login option\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow8\irowband8\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 User information\cell none\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow9\irowband9\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Language pulldown\cell yes\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow10\irowband10\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 On-Air / Off-Air Lamp\cell On-Air\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow11\irowband11\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1867486 Launching different functions / panels\cell }{ +\lang2057\langfe1031\langnp2057\insrsid5581702 N}{\lang2057\langfe1031\langnp2057\insrsid1867486 one\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid1867486 \trowd \irow12\irowband12\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 Close down LiveSupport \cell No\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 \trowd \irow13\irowband13\lastrow \ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid743655 {\*\bkmkstart _Toc93489741} +Status 3: Launch application, on-air after successful login{\*\bkmkend _Toc93489741} +\par }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid743655\charrsid2560916 ITEM\cell SHOWING\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid743655\charrsid2560916 \trowd \irow0\irowband0 +\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Time at broadcast station\cell big\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow1\irowband1\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Time at client\cell Optional: if remote admin\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow2\irowband2\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 LiveSupport logo\cell yes\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow3\irowband3\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Station information\cell +frequency, station name, station logo\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 +\trowd \irow4\irowband4\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Playing next\cell Showing metadata\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow5\irowband5\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Playing now\cell Showing metadata\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow6\irowband6\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 VU-meter\cell Showing meter values\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow7\irowband7\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Login OR Logout / Signover\cell }{ +\lang2057\langfe1031\langnp2057\insrsid7552355 Logut / Signover option}{\lang2057\langfe1031\langnp2057\insrsid743655 \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow8\irowband8\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl +\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid743655 User information\cell }{\lang2057\langfe1031\langnp2057\insrsid7552355 Name}{\lang2057\langfe1031\langnp2057\insrsid743655 \cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow9\irowband9\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Language pulldown\cell }{ +\lang2057\langfe1031\langnp2057\insrsid7552355 No}{\lang2057\langfe1031\langnp2057\insrsid743655 \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow10\irowband10\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 On-Air / Off-Air Lamp\cell On-Air\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow11\irowband11\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid743655 Launching different functions / panels\cell }{ +\lang2057\langfe1031\langnp2057\insrsid7552355 yes}{\lang2057\langfe1031\langnp2057\insrsid743655 \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid743655 \trowd \irow12\irowband12\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 Close down LiveSupport \cell Depending on user rights +\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 \trowd \irow13\irowband13\lastrow +\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid8865384 {\*\bkmkstart _Toc93489742} +Status 4: Launch application, off-air after successful login{\*\bkmkend _Toc93489742} +\par }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid8865384\charrsid2560916 ITEM\cell SHOWING\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\b\lang2057\langfe1031\langnp2057\insrsid8865384\charrsid2560916 \trowd \irow0\irowband0 +\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 Time at broadcast station\cell big\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 \trowd \irow1\irowband1\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 Time at client\cell Optional: if remote admin\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 \trowd \irow2\irowband2\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 LiveSupport logo\cell yes\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 \trowd \irow3\irowband3\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 Station information\cell frequency, station + name, station logo\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 \trowd \irow4\irowband4 +\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 Playing next\cell place holder empty\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 \trowd \irow5\irowband5\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 Playing now\cell place holder empty\cell +}\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 \trowd \irow6\irowband6\ts19\trgaph70\trleft-108\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 VU-meter\cell place holder empty\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15356409 \trowd \irow7\irowband7\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 Login OR Logout / Signover\cell +Logut / Signover option\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 \trowd \irow8\irowband8 +\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 User information\cell Name\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 \trowd \irow9\irowband9\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 Language pulldown\cell No\cell }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 \trowd \irow10\irowband10\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 On-Air / Off-Air Lamp\cell }{ +\lang2057\langfe1031\langnp2057\insrsid10112697 Off}{\lang2057\langfe1031\langnp2057\insrsid8865384 -Air\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid8865384 \trowd \irow11\irowband11\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8865384 Launching different functions / panels\cell }{ +\lang2057\langfe1031\langnp2057\insrsid5581702 Y}{\lang2057\langfe1031\langnp2057\insrsid8865384 es\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid8865384 \trowd \irow12\irowband12\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard\plain +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid15869539\yts19 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 Close down LiveSupport \cell Depending on user rights +\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5581702 \trowd \irow13\irowband13\lastrow +\ts19\trgaph70\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx4498\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4606\clshdrawnil \cellx9104\row }\pard +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid14886159 {\*\bkmkstart _Toc90357958} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid12728480 {\*\bkmkstart _Toc93489743} +Close down LiveSupport}{\insrsid14886159 {\*\bkmkend _Toc93489743} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12728480 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls20 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12728480 Displayed only if user has the rights to close down the application +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12728480 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If decided to close down: popup +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12728480 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls20\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid12728480 \'93Sure you want to close down the application?\'94 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12728480 \hich\af2\dbch\af0\loch\f2 o\tab}Button OK (->close down) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12728480 \hich\af2\dbch\af0\loch\f2 o\tab}Button Cancel (-> return to main panel in previous status)}{\lang2057\langfe1031\langnp2057\insrsid6431368 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid6431368 {\*\bkmkstart _Toc93489744} +Starting other panels from main panel{\*\bkmkend _Toc93489744} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid6431368 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls20 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc3\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr3\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid6431368 Possibly more than one way to open additional panels (pulldown AND buttons/tabs?) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid6431368 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Available depending on user rights}{\lang2057\langfe1031\langnp2057\insrsid15533137 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 nonexistent}{\lang2057\langfe1031\langnp2057\insrsid6431368 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid6431368 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Clicking on *open ???* will open a floating window or an attached panel, to be decided}{ +\lang2057\langfe1031\langnp2057\insrsid15533137 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1 floating only}{\lang2057\langfe1031\langnp2057\insrsid6431368 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1339160 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1339160 More on additional panels see below +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\prauth1\prdate-1500416914\adjustright\rin0\lin0\itap0\pararsid524972 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid524972 }{\insrsid12474292 {\*\bkmkstart _Toc93489745}1.b. }{\insrsid13398770 Roberts additions: }{\insrsid13398770\charrsid6300556 +Master panel }{\insrsid13398770 Live Mode}{\insrsid13398770\charrsid6300556 {\*\bkmkend _Toc93489745} +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416914\adjustright\rin0\lin0\itap0\pararsid524972 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid524972 }{\insrsid13398770\charrsid6300556 {\*\bkmkstart _Toc93489746}contains the following informations :{\*\bkmkend _Toc93489746} }{ +\insrsid7999091 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13398770\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls36 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid524972 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13398770\charrsid6300556 remaining time of the current on air file, that blinks and flashes for the last 15 seconds, }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 7 only in live mode}{\lang2057\langfe1031\highlight7\langnp2057\insrsid7999091\charrsid15533137 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13398770\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid13398770\charrsid6300556 +one button for choosing audio files one by one waiting for the manual activation, or for choosing automatically song by song, by the s}{\lang2057\langfe1031\langnp2057\insrsid15533137 c}{\lang2057\langfe1031\langnp2057\insrsid13398770\charrsid6300556 +hedule we have already prepared, }{\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1 - in live mode}{\lang2057\langfe1031\highlight7\langnp2057\insrsid7999091\charrsid15533137 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 {\i\lang2057\langfe1031\langnp2057\insrsid13398770\charrsid6300556 +\par +\par +\par }{\lang2057\langfe1031\langnp2057\insrsid13398770\charrsid6300556 Below the Master panel is master playlist of files that are waiting to be broadcasted, whether automatically one after another, or file by file. +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93489747}2. }{\lang2057\langfe1031\langnp2057\insrsid9441111 Lo}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416942\langnp2057\insrsid2831923 g}{\lang2057\langfe1031\langnp2057\insrsid9441111 ging in: the login popup}{ +\lang2057\langfe1031\langnp2057\insrsid15533137 {\*\bkmkend _Toc90357958} }{\lang2057\langfe1031\highlight7\langnp2057\insrsid15533137\charrsid15533137 1 done}{\lang2057\langfe1031\langnp2057\insrsid4730303 {\*\bkmkend _Toc93489747} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid403238 {\*\bkmkstart _Toc93489748} +This window pops up when}{\insrsid13265408 {\*\bkmkend _Toc93489748} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338302 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls16 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid338302 User clicks on \lquote log in\rquote }{\lang2057\langfe1031\langnp2057\insrsid13265408 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338302 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid338302 User clicks on \lquote sign over\rquote +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid403238 {\*\bkmkstart _Toc93489749} +The window contains}{\insrsid338302 {\*\bkmkend _Toc93489749} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls17 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid403238 Text: Login +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (text): login +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Text: password +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (text / password): password +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Text: language +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (pulldown): available languages +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (button): OK +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Form field (button): Cancel +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid403238 {\*\bkmkstart _Toc93489750} +The function of the items{\*\bkmkend _Toc93489750} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls18 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid403238 OK button: check valid login +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls18\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid403238 Valid login +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar\jclisttab\tx2160\aspalpha\aspnum\faauto\ls18\ilvl2 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin2160\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid403238 Close login window +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Change Main panel to status logged in / on or off air (see above) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls18\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid403238 Invalid login +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar\jclisttab\tx2160\aspalpha\aspnum\faauto\ls18\ilvl2 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin2160\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid12270098 Change content of popup:}{\lang2057\langfe1031\langnp2057\insrsid403238 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12270098 Text: Login invalid, please try again +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Form field: Button OK +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12270098 \loch\af10\dbch\af0\hich\f10 \'a7\tab}OK returns to login window +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls18 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15553266 Cancel button +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid403238 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls18\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid403238 close popup window +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}}{\lang2057\langfe1031\langnp2057\insrsid15553266 return to main panel in previous state +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid15553266 {\*\bkmkstart _Toc93489751} +Additional functions{\*\bkmkend _Toc93489751} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls19 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15553266 When pressing \lquote sign over\rquote or \lquote logout\rquote +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls19\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15553266 Open popup information window with: \'93sure you want to logout user \lquote username\rquote \'94 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}Button OK (logs out) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}Button Cancel (returns to main panel at previous status) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls19 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15553266 When pressing \lquote sign over\rquote }{\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 10}{ +\lang2057\langfe1031\langnp2057\insrsid15553266 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls19\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15553266 After confirming to log out user: +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar\jclisttab\tx2160\aspalpha\aspnum\faauto\ls19\ilvl2 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin2160\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15553266 Open Login window in popup +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15553266 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Change status of main panel to logged out (on or off air) +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12474292 +{\*\bkmkstart _Toc93489752}3. }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416890\langnp2057\insrsid5113369\delrsid2375508 Uploading }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 Add }{ +\lang2057\langfe1031\langnp2057\insrsid5113369 files}{\lang2057\langfe1031\langnp2057\insrsid2111105 }{\lang2057\langfe1031\langnp2057\insrsid5113369 panel}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid15553266 +{\*\bkmkend _Toc93489752} +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\langfenp1031\insrsid7096017 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li1080\ri0\widctlpar\jclisttab\tx1080\aspalpha\aspnum\faauto\ls48 +\pnrauth1\pnrdate-1500416901\pnrnot1\adjustright\rin0\lin1080\itap0\pararsid7096017 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 +The user selects this from the main panel. The \lquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 Add}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 files\rquote + window allows users to upload the following}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416895\langnp2057\insrsid7096017 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\langfenp1031\insrsid7096017 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 +Binary sound files +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\langfenp1031\insrsid7096017 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Web streams}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416894\langnp2057\insrsid7096017 \rquote URL}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\langfenp1031\insrsid7096017 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Remote networked file}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416894\langnp2057\insrsid7096017 URL}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\langfenp1031\insrsid7096017 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li1080\ri0\widctlpar +\jclisttab\tx1080\aspalpha\aspnum\faauto\ls48\prauth1\prdate-1500416901\pnrauth1\pnrdate-1500416901\pnrnot1\adjustright\rin0\lin1080\itap0\pararsid7096017 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1 +\pnrauth1\pnrdate-1500416901\pnrnot1\adjustright\rin0\lin0\itap0\pararsid7096017 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 Metadata describing the file}{\lang2057\langfe1031\langnp2057\insrsid7096017 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid3691965 {\*\bkmkstart _Toc93489753} +The window opens when}{\insrsid5113369 {\*\bkmkend _Toc93489753} +\par {\listtext\pard\plain\deleted\f10\lang2057\langfe1031\revauthdel1\revdttmdel-1500416901\langnp2057\langfenp1031\insrsid3691965\delrsid7096017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\prauth1\prdate-1500416902\adjustright\rin0\lin720\itap0\pararsid7096017 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7096017 }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416901\langnp2057\insrsid3691965\delrsid7096017 The user selects this from the main panel +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\langfenp1031\insrsid7096017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\prauth1\prdate-1500416902\adjustright\rin0\lin720\itap0\pararsid7096017 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7096017 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 User selects \lquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\insrsid2375508 Add}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416901\langnp2057\insrsid7096017 File}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416896\langnp2057\insrsid7096017 \rquote from}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416895\langnp2057\insrsid7096017 Master Panel +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416895\langnp2057\langfenp1031\insrsid7096017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls21\prauth1\prdate-1500416902\pnrauth1\pnrdate-1500416895\pnrnot1\adjustright\rin0\lin720\itap0\pararsid7096017 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto +\pnrauth1\pnrdate-1500416895\pnrnot1\adjustright\rin0\lin0\itap0\pararsid7096017 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416895\langnp2057\insrsid7096017 User pulls down \lquote File -> }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\insrsid2375508 Add}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416895\langnp2057\insrsid7096017 File\rquote from the menu bar}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416896\langnp2057\insrsid7096017 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid3691965 {\*\bkmkstart _Toc93489754} +The window contains{\*\bkmkend _Toc93489754} +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416880\langnp2057\langfenp1031\insrsid13790097 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416880\langnp2057\insrsid13790097 Toggle}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\insrsid2375508 for: +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls21\ilvl1 +\pnrauth1\pnrdate-1500416889\pnrnot1\adjustright\rin0\lin1440\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\insrsid2375508 Sound file +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}Web stream +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416888\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416888\langnp2057\insrsid2375508 +Remote networked file +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500416888\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\insrsid3691965 File browser}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\insrsid1070637 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416889\langnp2057\insrsid3691965 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc3\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr3\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid3691965 Metadata form}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid3691965 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Upload button}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid3691965 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15933635 Cancel}{\lang2057\langfe1031\langnp2057\insrsid3691965 button}{ +\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid3691965 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form)}{ +\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid3691965 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3691965 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Information bar to be used for status / error / upload progress}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 7 lower priority on progress itself; grey bar not necessary, and verbal \'93uploading, done, error\'94 messages will suffice}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3691965\charrsid1070637 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid12605384 {\*\bkmkstart _Toc93489755} +The function of items}{\insrsid3691965 {\*\bkmkend _Toc93489755} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15933635 File browser: standard \lquote open explorer style window to find file\rquote }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid12605384 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15933635 +Metadata form: a mix of text, pulldown, multiple select, radio buttons and check boxes, depending on the metadata specs}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15933635\charrsid1070637 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15933635 Upload button: posts data and starts uploading file (to local }{ +\lang2057\langfe1031\langnp2057\insrsid15341335 storage system}{\lang2057\langfe1031\langnp2057\insrsid15933635 )}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{ +\lang2057\langfe1031\langnp2057\insrsid15933635 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button: interrupts the upload and/or clears the fields in the form}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\langnp2057\insrsid15933635 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc4\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr4\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15933635 If upload started: open popup to check if really interrupt upload +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc5\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr5\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15933635 Close window: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc5\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr5\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid15933635 open popup to check if really interrupt upload }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid15933635 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15933635 \hich\af2\dbch\af0\loch\f2 o\tab}if yes:}{\lang2057\langfe1031\langnp2057\insrsid8133754 close }{\lang2057\langfe1031\langnp2057\insrsid15933635 window}{ +\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid15933635 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15869539 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid1334983 {\*\bkmkstart _Toc93489756} +Additional functions:}{\insrsid15933635 {\*\bkmkend _Toc93489756} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc6\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr6\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16671400 Error checking: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc6\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr6\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid16671400 Errors when filling in the form will not launch a popup, but display in the status bar (probably at the bottom of the window)}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 8}{\lang2057\langfe1031\langnp2057\insrsid1070637 return error only for required fields when left blank}{\lang2057\langfe1031\langnp2057\insrsid16671400 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \hich\af2\dbch\af0\loch\f2 o\tab}One error at a time will be displayed (one line only) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16671400 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc7\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr7\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid16671400 Progress bar: when starting the upload, the status bar will be used as the progress bar similar to safari page loading.}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 10}{\lang2057\langfe1031\langnp2057\insrsid16671400\charrsid16671400 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1334983 Metadata language pulldown:}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 9}{\lang2057\langfe1031\langnp2057\insrsid1334983 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc8\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr8\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid1334983 There will be the option to select in what language you add the metadata. +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \hich\af2\dbch\af0\loch\f2 o\tab}This pulldown functions like a filter: if changed, it will display the metadata of this language set +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1334983 \hich\af2\dbch\af0\loch\f2 o\tab}If \lquote upload\rquote is pressed, all language sets where there is at least one item filled in, will be saved in the metadata. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8997258 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc9\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr9\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid8997258 Uploading file}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid1334983 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8997258 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc9\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr9\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid8997258 The form will be inactive, displaying the information but making it impossible to change. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc10\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr10\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid9532527 After upload: success}{\lang2057\langfe1031\langnp2057\insrsid1070637 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid1070637\charrsid1070637 1}{\lang2057\langfe1031\langnp2057\insrsid9532527 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc10\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr10\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15869539 { +\lang2057\langfe1031\langnp2057\insrsid9532527 After the successful upload, the form remains inactive +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \hich\af2\dbch\af0\loch\f2 o\tab}The buttons change to display possible options (e.g. upload another, add uploaded to playlist, create new playlist with uploaded}{ +\lang2057\langfe1031\langnp2057\insrsid1593142 ,}{\lang2057\langfe1031\highlight7\langnp2057\insrsid9532527\charrsid12481097 )}{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 5}{\lang2057\langfe1031\langnp2057\insrsid9532527 + +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9532527 \hich\af2\dbch\af0\loch\f2 o\tab}The file will be added to the }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid9532527\delrsid3767246 +DJ bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\lang2057\langfe1031\langnp2057\insrsid9532527 (working title}{\lang2057\langfe1031\highlight7\langnp2057\insrsid9532527\charrsid12481097 )}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid9532527 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2111105 {\lang2057\langfe1031\langnp2057\insrsid2111105 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\prauth1\prdate-1500416903\adjustright\rin0\lin0\itap0\pararsid7096017 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7096017 }{\cf0\revised\revauth1\revdttm-1500416942\insrsid2831923 {\*\bkmkstart _Toc93489757}4}{ +\deleted\revauthdel1\revdttmdel-1500416942\insrsid12474292\delrsid2831923 12}{\insrsid12474292 . }{\insrsid2111105 Add }{\deleted\revauthdel1\revdttmdel-1500416877\insrsid2111105\delrsid13790097 web }{ +\cf0\revised\revauth1\revdttm-1500416877\insrsid13790097 Live Web}{\deleted\revauthdel1\revdttmdel-1500416876\insrsid2111105\delrsid13790097 st}{\cf0\revised\revauth1\revdttm-1500416876\insrsid13790097 St}{\insrsid2111105 ream }{ +\deleted\revauthdel1\revdttmdel-1500416879\insrsid2111105\delrsid13790097 panel}{\deleted\revauthdel1\revdttmdel-1500416879\insrsid12481097\delrsid13790097 }{\cf0\revised\revauth1\revdttm-1500416879\insrsid13790097 toggle}{ +\cf0\revised\revauth1\revdttm-1500416879\insrsid13790097 }{\highlight7\insrsid12481097\charrsid12481097 3}{\cf0\revised\revauth1\revdttm-1500416876\insrsid2111105 {\*\bkmkend _Toc93489757} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416876\pnrauth1\pnrdate-1500416876\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13790097 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416876\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13790097 }{\cf0\revised\revauth1\revdttm-1500416876\insrsid13790097 A Live Web Stream is }{ +\cf0\revised\revauth1\revdttm-1500416874\insrsid13790097 meant to be used for web streams of}{\cf0\revised\revauth1\revdttm-1500416876\insrsid13790097 unknown length. For }{\cf0\revised\revauth1\revdttm-1500416874\insrsid13790097 +files available on the Internet}{\cf0\revised\revauth1\revdttm-1500416876\insrsid13790097 of finite length, such as songs or single programs, use }{\cf0\revised\revauth1\revdttm-1500416876\insrsid13790097 \lquote }{ +\cf0\revised\revauth1\revdttm-1500416876\insrsid13790097 Networked File}{\cf0\revised\revauth1\revdttm-1500416876\insrsid13790097 \rquote }{\insrsid13790097 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416903\adjustright\rin0\lin0\itap0\pararsid7096017 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7096017 }{\insrsid2111105 {\*\bkmkstart _Toc93489758}The window opens when{\*\bkmkend _Toc93489758} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc8\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr8\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7096017 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2111105 The user selects this from the }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416890\langnp2057\insrsid2111105\delrsid2375508 main }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 \lquote Add File\rquote }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416890\langnp2057\insrsid2111105\delrsid2375508 panel}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 window}{\lang2057\langfe1031\langnp2057\insrsid2111105 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416903\adjustright\rin0\lin0\itap0\pararsid7096017 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7096017 }{\insrsid2111105 {\*\bkmkstart _Toc93489759}The window contains{\*\bkmkend _Toc93489759} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc9\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr9\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7096017 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2111105 Form field for stream URL +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Add button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Information bar to be used for status / error +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416903\adjustright\rin0\lin0\itap0\pararsid7096017 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7096017 }{\insrsid2111105 {\*\bkmkstart _Toc93489760}The function of items{\*\bkmkend _Toc93489760} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc11\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr11\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7096017 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2111105 Form field for stream URL used to add full URL of webstream +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form: a mix of text, pulldown, multiple select, radio buttons and check boxes, depending on the metadata specs +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Add button: posts data +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button: clears form after confirmation popup \'93sure you want to...?\'94 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc15\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr15\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid7096017 { +\lang2057\langfe1031\langnp2057\insrsid2111105 If information added, open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}if no information added, close without popup confirmation +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416903\adjustright\rin0\lin0\itap0\pararsid7096017 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7096017 }{\insrsid2111105 {\*\bkmkstart _Toc93489761}Additional functions:{\*\bkmkend _Toc93489761} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid873682 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls27 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7096017 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid873682 Metadata: }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416878\langnp2057\insrsid873682\delrsid13790097 +adding length of file: the user will ener the length of the file here in 00:00:00 format.}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416878\langnp2057\insrsid13790097 The system will determine the length of the file automatically.}{ +\lang2057\langfe1031\langnp2057\insrsid873682 }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416877\langnp2057\insrsid873682\delrsid13790097 For live streams, leave set to zero}{\lang2057\langfe1031\langnp2057\insrsid873682\charrsid873682 + +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc16\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr16\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7096017 { +\lang2057\langfe1031\langnp2057\insrsid2111105 Error checking: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc16\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr16\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid7096017 { +\lang2057\langfe1031\langnp2057\insrsid2111105 Errors when filling in the form will not launch a popup, but display in the status bar (probably at the bottom of the window) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc17\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr17\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7096017 { +\lang2057\langfe1031\langnp2057\insrsid2111105 One error at a time will be displayed (one line only)}{\lang2057\langfe1031\langnp2057\insrsid2111105\charrsid16671400 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2111105 Metadata language pulldown: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc18\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr18\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid7096017 { +\lang2057\langfe1031\langnp2057\insrsid2111105 There will be the option to select in what language you add the metadata. +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}This pulldown functions like a filter: if changed, it will display the metadata of this language set +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}If \lquote upload\rquote is pressed, all language sets where there is at least one item filled in, will be saved in the metadata. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7096017 { +\lang2057\langfe1031\langnp2057\insrsid2111105 After successful adding +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid7096017 { +\lang2057\langfe1031\langnp2057\insrsid2111105 the form remains inactive +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}Th +e buttons change to display possible options (e.g. add another stream, add stream to playlist, create new playlist with stream, close window) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2111105 \hich\af2\dbch\af0\loch\f2 o\tab}The file will be added to the }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid2111105\delrsid3767246 +DJ bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\lang2057\langfe1031\langnp2057\insrsid2111105 (working title) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7096017 {\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416891\langnp2057\insrsid2111105\delrsid2375508 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\prauth1\prdate-1500416890\pnrauth1\pnrdate-1500416891\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 +\b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416891\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 }{ +\cf0\revised\revauth1\revdttm-1500416891\insrsid2375508 {\*\bkmkstart _Toc93489762}Add Networked File URL}{\cf0\revised\revauth1\revdttm-1500416874\insrsid13790097 {\*\bkmkend _Toc93489762} toggle}{\cf0\revised\revauth1\revdttm-1500416874\insrsid2375508 + +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416874\pnrauth1\pnrdate-1500416874\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13790097 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416874\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13790097 }{\cf0\revised\revauth1\revdttm-1500416874\insrsid13790097 The }{ +\cf0\revised\revauth1\revdttm-1500416874\insrsid13790097 \'82}{\cf0\revised\revauth1\revdttm-1500416874\insrsid13790097 Networked File URL}{\cf0\revised\revauth1\revdttm-1500416873\insrsid13790097 \rquote }{ +\cf0\revised\revauth1\revdttm-1500416873\insrsid13790097 toggle is for files available on the internet of known length, such as songs or programs. It can be used for streaming files or for sound files (such as MP3s) available over the Internet.}{ +\cf0\revised\revauth1\revdttm-1500416891\insrsid13790097 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\revauth1\revdttm-1500416890\insrsid2375508 {\*\bkmkstart _Toc93489763}The window opens when{\*\bkmkend _Toc93489763} +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 The u +ser selects this from the main panel +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\revauth1\revdttm-1500416890\insrsid2375508 {\*\bkmkstart _Toc93489764}The window contains{\*\bkmkend _Toc93489764} +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 Form field for }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416879\langnp2057\insrsid13790097 networked file}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 URL +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Add button +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Information bar to be used for status / error +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\revauth1\revdttm-1500416890\insrsid2375508 {\*\bkmkstart _Toc93489765}The function of items{\*\bkmkend _Toc93489765} +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 +Form field for stream URL used to add full URL of webstream +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab} +Metadata form: a mix of text, pulldown, multiple select, radio buttons and check boxes, depending on the metadata specs +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Add button: posts data +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button: clears form after confirmation popup \'93sure you want to...?\'94 +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window: +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin1440\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 If information added, open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}if no information added, close without popup confirmation +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\revauth1\revdttm-1500416890\insrsid2375508 {\*\bkmkstart _Toc93489766}Additional functions:{\*\bkmkend _Toc93489766} +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416878\langnp2057\langfenp1031\insrsid13790097 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls27 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416878\langnp2057\insrsid13790097 The system will }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416878\langnp2057\insrsid13790097 determine}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416878\langnp2057\insrsid13790097 the length of the file automatically.}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508\charrsid873682 +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 Error checking: +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin1440\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 +Errors when filling in the form will not launch a popup, but display in the status bar (probably at the bottom of the window) +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 One error at a time will be displayed (one line only)}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508\charrsid16671400 +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 +Metadata language pulldown: +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin1440\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 There will be the option to select in what language you add the metadata. +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab} +This pulldown functions like a filter: if changed, it will display the metadata of this language set +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}If \lquote upload\rquote is pressed, a +ll language sets where there is at least one item filled in, will be saved in the metadata. +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin720\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 After successful adding +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin1440\itap0\pararsid2375508 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\insrsid2375508 the form remains inactive +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab} +The buttons change to display possible options (e.g. add another stream, add stream to playlist, create new playlist with stream, close window) +\par {\listtext\pard\plain\f2\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416890\langnp2057\langfenp1031\insrsid2375508 \hich\af2\dbch\af0\loch\f2 o\tab}The file will be added to the Scratchpad (working title) +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416890\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 +\b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416890\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2375508 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416891\langnp2057\insrsid2375508 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid13268333 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416942\langnp2057\insrsid2831923 {\*\bkmkstart _Toc93489767}5}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416942\langnp2057\insrsid12474292\delrsid2831923 13}{ +\lang2057\langfe1031\langnp2057\insrsid12474292 . }{\lang2057\langfe1031\langnp2057\insrsid13268333 Edit file information panel}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid13268333 {\*\bkmkend _Toc93489767} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93489768} +The window opens when{\*\bkmkend _Toc93489768} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc15\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr15\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 The user selects a}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416892\langnp2057\insrsid13268333\delrsid7096017 q}{ +\lang2057\langfe1031\langnp2057\insrsid13268333 file (from }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid13268333\delrsid3767246 DJ bag}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416892\langnp2057\insrsid13268333\delrsid7096017 or search or otherwise?}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416892\langnp2057\insrsid7096017 Or any other place where file information would be displayed}{\lang2057\langfe1031\langnp2057\insrsid13268333 ) and selects \lquote edit file\rquote + (right mouse click or button?) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416892\pnrnot1\adjustright\rin0\lin0\itap0\pararsid7096017 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416892\langnp2057\insrsid7096017 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93489769} +The window contains{\*\bkmkend _Toc93489769} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc16\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr16\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 File browser +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Metadata form +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Save changes button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Delete file button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Information bar to be used for status / error / upload progress +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15037064 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15037064 Button to publish to network archive +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500417071\pnrnot1\adjustright\rin0\lin0\itap0\pararsid8474017 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417071\langnp2057\insrsid8474017 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13268333 {\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417070\langnp2057\insrsid13268333\delrsid8474017 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93489770} +Default status{\*\bkmkend _Toc93489770} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13268333 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid7607439 Shows }{ +\lang2057\langfe1031\langnp2057\insrsid4217381 information about the file in}{\lang2057\langfe1031\langnp2057\insrsid13268333 the form +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93489771} +The function of items{\*\bkmkend _Toc93489771} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc20\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr20\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 File browser: standard \lquote open explorer style window to find file\rquote +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc20\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr20\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid7607439 { +\lang2057\langfe1031\langnp2057\insrsid7607439 Additional information: leave empty to keep file +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}To change file in storage, browse file on hard disk +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc21\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr21\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Metadata form: a mix of text, pulldown, multiple select, radio buttons and check boxes, depending on the metadata specs +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid7607439 Save changes }{\lang2057\langfe1031\langnp2057\insrsid13268333 button: posts data +and starts uploading file (}{\lang2057\langfe1031\langnp2057\insrsid7607439 no upload if no file selected}{\lang2057\langfe1031\langnp2057\insrsid13268333 ) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc22\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr22\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid7607439 { +\lang2057\langfe1031\langnp2057\insrsid7607439 Confirm popup before starting process: are you sure you want to change file and/or information? (Yes Cancel -> cancel returns to window with information as changed before, not uploaded) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr23\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7607439 { +\lang2057\langfe1031\langnp2057\insrsid7607439 Delete file -> popup confirmation: Are you sure you want to delete the file? (Yes Cancel -> cancel returns to window with information as edited before pressing delete) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc24\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr24\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid7607439 Reset }{\lang2057\langfe1031\langnp2057\insrsid13268333 button:}{\lang2057\langfe1031\langnp2057\insrsid7607439 sets the value to default }{\lang2057\langfe1031\langnp2057\insrsid13268333 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc24\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr24\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 If upload started: open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7607439 \hich\af2\dbch\af0\loch\f2 o\tab}}{\lang2057\langfe1031\langnp2057\insrsid7607439 +If upload started but file not fully transferred, reset values to values before starting save changes +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc25\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr25\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Close window: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc25\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr25\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 open popup to check if really interrupt upload +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}if yes:close window +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13268333 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid13268333 {\*\bkmkstart _Toc93489772} +Additional functions:{\*\bkmkend _Toc93489772} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc26\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr26\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid13268333 Error checking: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15351607 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc26\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr26\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid15351607 { +\lang2057\langfe1031\langnp2057\insrsid15351607 If delete file: check if used in playlists. If yes, what do we do? Not allo delete or remove from playlist after confirmation??? +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc26\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr26\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Errors when filling in the form will not launch a popup, but display in the status bar (probably at the bottom of the window) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}One error at a time will be displayed (one line only) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc27\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr27\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Progress bar: when starting the upload, the status bar will be used as the progress bar similar to safari page loading.}{\lang2057\langfe1031\langnp2057\insrsid13268333\charrsid16671400 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid13268333 Metadata language pulldown: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc28\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr28\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 There will be the option to select in what language you add the metadata. +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}This pulldown functions like a filter: if changed, it will display the metadata of this language set +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}If \lquote upload\rquote is pressed, all language sets where there is at least one item filled in, will be saved in the metadata. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc29\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr29\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 Uploading file +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc29\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr29\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 The form will be inactive, displaying the information but making it impossible to change. +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls22 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc30\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr30\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 After upload: success +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls22\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc30\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr30\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13268333 { +\lang2057\langfe1031\langnp2057\insrsid13268333 After the successful upload, the form remains inactive +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}The buttons change to display possible options (e.g. upload another, add uploaded to playlist, create new playlist with + uploaded, close window) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13268333 \hich\af2\dbch\af0\loch\f2 o\tab}The file will be added to the }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid13268333\delrsid3767246 +DJ bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\lang2057\langfe1031\langnp2057\insrsid13268333 (working title) +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417070\pnrnot1\adjustright\rin0\lin0\itap0\pararsid8474017 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416942\langnp2057\insrsid2831923 {\*\bkmkstart _Toc93489773}6}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\insrsid8474017 . View file information panel }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\highlight7\langnp2057\insrsid8474017\charrsid12481097 1}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\insrsid8474017 {\*\bkmkend _Toc93489773} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\pnrauth1\pnrdate-1500417070\pnrnot1\adjustright\rin0\lin0\itap0\pararsid8474017 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 { +\cf0\revised\revauth1\revdttm-1500417070\insrsid8474017 {\*\bkmkstart _Toc93489774}The window opens when{\*\bkmkend _Toc93489774} +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\langfenp1031\insrsid8474017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417070\pnrnot1\adjustright\rin0\lin720\itap0\pararsid8474017 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\insrsid8474017 +The user selects a file (from }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\insrsid8474017 + or search or otherwise?) and selects \lquote view information\rquote (right mouse click or button?) +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\pnrauth1\pnrdate-1500417070\pnrnot1\adjustright\rin0\lin0\itap0\pararsid8474017 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 { +\cf0\revised\revauth1\revdttm-1500417070\insrsid8474017 {\*\bkmkstart _Toc93489775}The window contains{\*\bkmkend _Toc93489775} +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\langfenp1031\insrsid8474017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls21 +\pnrauth1\pnrdate-1500417070\pnrnot1\adjustright\rin0\lin720\itap0\pararsid8474017 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\insrsid8474017 Metadata display +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\langfenp1031\insrsid8474017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Cancel button +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\langfenp1031\insrsid8474017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Close window button (possibly two: one top right X, the other underneath input form) +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417070\langnp2057\langfenp1031\insrsid8474017 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button to publish to network archive +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416941\langnp2057\insrsid2831923 {\*\bkmkstart _Toc93489776}7}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416941\langnp2057\insrsid12474292\delrsid2831923 4}{ +\lang2057\langfe1031\langnp2057\insrsid12474292 . }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid13436755\delrsid3767246 DJ Bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 +Scratchpad}{\lang2057\langfe1031\langnp2057\insrsid13436755 window}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid13436755 +{\*\bkmkend _Toc93489776} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls23 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13270669 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid2637360 Window with resize handle and scroll bars}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\highlight7\langnp2057\insrsid15351607\charrsid12481097 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2637360 Contains a list of files and/or playlists }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 touched by}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\langnp2057\insrsid2637360 user}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid2637360 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Right mouse sens}{\lang2057\langfe1031\langnp2057\insrsid12481097 i}{\lang2057\langfe1031\langnp2057\insrsid2637360 +tive on items in list}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid2637360 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Single and multi select of items in list (C++ with STRG / Shift, HTML with checkboxes)}{ +\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 2}{\lang2057\langfe1031\langnp2057\insrsid2637360 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2637360 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Right mouse sensitive to multiple selection (different if only files or playlists from flises AND playlists)}{ +\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 2}{\lang2057\langfe1031\langnp2057\insrsid2637360 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14296232 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid14296232 {\*\bkmkstart _Toc93489777} +Window opens when}{\insrsid15869539 {\*\bkmkend _Toc93489777} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14296232 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls24 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid14486893 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid14296232 Probably always open}{\lang2057\langfe1031\langnp2057\insrsid14486893 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\langfenp1031\insrsid13790097 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls24 +\pnrauth1\pnrdate-1500416872\pnrnot1\adjustright\rin0\lin720\itap0\pararsid14486893 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 User selects }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 \lquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 Scratchpad}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 \rquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 from Master Panel +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\langfenp1031\insrsid13790097 \loch\af3\dbch\af0\hich\f3 \'b7\tab}User selects }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 \lquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 Window -> Scratchpad}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 \rquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid13790097 from menu bar +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\langfenp1031\insrsid9772727 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid9772727 User } +{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416870\langnp2057\insrsid9772727 changes}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416871\langnp2057\insrsid9772727 a playlist or file}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416869\langnp2057\insrsid9772727 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416869\langnp2057\langfenp1031\insrsid9772727 \loch\af3\dbch\af0\hich\f3 \'b7\tab}User creates a file}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416872\langnp2057\insrsid9772727 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14486893 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid14486893 {\*\bkmkstart _Toc93489778} +The window contains{\*\bkmkend _Toc93489778} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls24 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid14486893 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid14486893 List of files and or playlists}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid14486893 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Icons to separate between items and playlists}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\highlight7\langnp2057\insrsid14486893\charrsid12481097 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid14486893 Minimal metadata info}{\lang2057\langfe1031\langnp2057\insrsid12481097 1}{ +\lang2057\langfe1031\langnp2057\insrsid14486893 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Table headers on top with name of metadata category}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid14486893 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button: clear list}{\lang2057\langfe1031\langnp2057\insrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid14486893 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14486893 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button}{\lang2057\langfe1031\langnp2057\insrsid12394895 clear }{\lang2057\langfe1031\langnp2057\insrsid14486893 selected }{ +\lang2057\langfe1031\langnp2057\insrsid12394895 items }{\lang2057\langfe1031\langnp2057\insrsid14486893 from list}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{ +\lang2057\langfe1031\langnp2057\insrsid14486893 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11603768 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid11603768 Preview start and stop button}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid11603768 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid11603768 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid11603768 {\*\bkmkstart _Toc93489779} +The function of items}{\insrsid14486893 {\*\bkmkend _Toc93489779} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11603768 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls25 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid3367757 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid11603768 List of files and or playlists}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416869\langnp2057\insrsid9772727 + displayed in chronological order, with last file used on top}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid11603768 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11603768 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls25\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid3367757 { +\lang2057\langfe1031\langnp2057\insrsid11603768 Right mouse click shows list of actions for selected item(s) +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11603768 \hich\af2\dbch\af0\loch\f2 o\tab}Icons for files and playlists have no function but to indicate +\par {\listtext\pard\plain\deleted\f3\lang2057\langfe1031\revauthdel1\revdttmdel-1500416869\langnp2057\langfenp1031\insrsid11603768\delrsid9772727 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls25 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid3367757 { +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416869\langnp2057\insrsid11603768\delrsid9772727 Table headers can be clicked and will order alphanumerlically, toggling ascending and descending}{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416869\langnp2057\insrsid12481097\delrsid9772727 }{\deleted\lang2057\langfe1031\highlight7\revauthdel1\revdttmdel-1500416869\langnp2057\insrsid12481097\delrsid9772727\charrsid12481097 1}{ +\deleted\lang2057\langfe1031\highlight7\revauthdel1\revdttmdel-1500416869\langnp2057\insrsid11603768\delrsid9772727\charrsid12481097 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3367757 Clear list button removes all items from list: Confirmation pop up: are you sure...?}{ +\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid3367757 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Clear selected items from list removes selected items. Confirmation pop up: are you sure...?}{ +\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid3367757 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Preview start and stop but}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416868\langnp2057\insrsid9772727 t}{ +\lang2057\langfe1031\langnp2057\insrsid3367757 on is one button.}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid3367757 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls25\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc5\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr5\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid3367757 { +\lang2057\langfe1031\langnp2057\insrsid3367757 Default: play button and silence +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \hich\af2\dbch\af0\loch\f2 o\tab}If clicked, play button turns into stop but}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416868\langnp2057\insrsid9772727 t}{ +\lang2057\langfe1031\langnp2057\insrsid3367757 on +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \hich\af2\dbch\af0\loch\f2 o\tab}If play}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416868\langnp2057\insrsid3367757\delrsid9772727 l}{ +\lang2057\langfe1031\langnp2057\insrsid3367757 ing, file / playlist is played on the preview sound card +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3367757 \hich\af2\dbch\af0\loch\f2 o\tab}(for more precise previewing it would have to be opened in the cue window -> right mouse click)}{ +\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid3367757 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1141904 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid1141904 {\*\bkmkstart _Toc93489780} +Additional functions}{\insrsid11603768 {\*\bkmkend _Toc93489780} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls25 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc6\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr6\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid1141904 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1141904 New items are inserted at the top of the list}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid1141904 +\par {\listtext\pard\plain\deleted\f3\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\langfenp1031\insrsid1141904\delrsid3767246 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid1141904\delrsid3767246 DJ Bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{ +\lang2057\langfe1031\langnp2057\insrsid1141904 }{\lang2057\langfe1031\langnp2057\insrsid12481097 shows }{\lang2057\langfe1031\langnp2057\insrsid1141904 different }{\lang2057\langfe1031\langnp2057\insrsid12481097 content }{ +\lang2057\langfe1031\langnp2057\insrsid1141904 for individual users (length, display period -> version 1.x)}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 10}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid1141904\charrsid12481097 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1141904 List length set in system defaults (V.1.x -> user can alter the preset)}{ +\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 10}{\lang2057\langfe1031\langnp2057\insrsid1141904 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Display period set in system defaults (V.1.x -> user can alter the preset)}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 10}{\lang2057\langfe1031\langnp2057\insrsid1141904 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}If list is getting too long, bottom items are cleared from list}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 10}{\lang2057\langfe1031\langnp2057\insrsid1141904 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}If items are over their display period, they are removed from the list}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 10}{\lang2057\langfe1031\langnp2057\insrsid1141904 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Content of }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid1141904\delrsid3767246 DJ Bag}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\lang2057\langfe1031\langnp2057\insrsid1141904 is saved for each user}{\lang2057\langfe1031\langnp2057\insrsid1577794 + (item id, rank in list, added to list date)}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid1141904 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1141904 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Content of }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid1141904\delrsid3767246 DJ Bag}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\lang2057\langfe1031\langnp2057\insrsid1141904 is displayed after successful login}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 10}{\lang2057\langfe1031\highlight7\langnp2057\insrsid1141904\charrsid12481097 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15869539 {\lang2057\langfe1031\langnp2057\insrsid13436755 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416941\langnp2057\insrsid2831923 {\*\bkmkstart _Toc93489781}8}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416941\langnp2057\insrsid12474292\delrsid2831923 6}{ +\lang2057\langfe1031\langnp2057\insrsid12474292 . }{\lang2057\langfe1031\langnp2057\insrsid13436755 Scheduler}{\lang2057\langfe1031\langnp2057\insrsid15869539 window}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid13436755 {\*\bkmkend _Toc93489781} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1052329 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid1052329 {\*\bkmkstart _Toc93489782} +The window opens when}{\insrsid13436755 {\*\bkmkend _Toc93489782} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1052329 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid1052329 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid1052329 Button or pulldown in main panel is selected +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1052329 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Right mouse}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416867\langnp2057\insrsid9772727 option for }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416867\langnp2057\insrsid9772727 \lquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416867\langnp2057\insrsid9772727 Schedule}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416867\langnp2057\insrsid9772727 \rquote }{\lang2057\langfe1031\langnp2057\insrsid1052329 activated }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416867\langnp2057\insrsid9772727 in certain +context }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416866\langnp2057\insrsid9772727 menus of }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416867\langnp2057\insrsid9772727 playlist }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416867\langnp2057\insrsid1052329\delrsid9772727 from playlist}{\lang2057\langfe1031\langnp2057\insrsid1052329 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid10714125 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid8476729 {\*\bkmkstart _Toc93489783} +The window contains}{\insrsid1052329 {\*\bkmkend _Toc93489783} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc3\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr3\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid10714125 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8476729 Small calendar month}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1} +{\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Pulldown to select month}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Previous next button to change month}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Larger calendar week }{\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 4}{ +\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1582066 Previ}{\lang2057\langfe1031\langnp2057\insrsid8476729 ous next button to change week}{ +\lang2057\langfe1031\langnp2057\insrsid12481097 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 4}{\lang2057\langfe1031\highlight7\langnp2057\insrsid8476729\charrsid3896650 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid8476729 Large day with times}{\lang2057\langfe1031\langnp2057\insrsid12481097 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid12481097\charrsid12481097 1}{\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc9\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr9\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid1582066 { +\lang2057\langfe1031\langnp2057\insrsid1582066 Previous next button to change }{\lang2057\langfe1031\langnp2057\insrsid3896650 day }{\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 1}{ +\lang2057\langfe1031\langnp2057\insrsid3896650 }{\lang2057\langfe1031\langnp2057\insrsid1582066 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc10\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr10\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid10714125 { +\lang2057\langfe1031\langnp2057\insrsid8476729 Scrollbars to go up and down inside the day}{\lang2057\langfe1031\langnp2057\insrsid3896650 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 1}{ +\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8476729 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Plus and minus to zoom in and out of day view (change scale)}{\lang2057\langfe1031\langnp2057\insrsid3896650 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 4}{\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1582066 Scale bar between plus and minus}{\lang2057\langfe1031\langnp2057\insrsid3896650 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 4}{\lang2057\langfe1031\langnp2057\insrsid1582066 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714125 Button to go to \lquote today\rquote }{ +\lang2057\langfe1031\langnp2057\insrsid3896650 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 1}{\lang2057\langfe1031\langnp2057\insrsid8476729 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714125 Button Add playlist}{\lang2057\langfe1031\langnp2057\insrsid3896650 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 1}{\lang2057\langfe1031\langnp2057\insrsid10714125 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button remove playlist}{\lang2057\langfe1031\langnp2057\insrsid3896650 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 1}{\lang2057\langfe1031\langnp2057\insrsid10714125 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714125 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Button }{\lang2057\langfe1031\langnp2057\insrsid3896650 reschedule }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 1}{\lang2057\langfe1031\langnp2057\insrsid3896650 (if it\rquote s in the schedule, it\rquote s locked)}{\lang2057\langfe1031\langnp2057\insrsid10714125 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12676815 Button to stop / start scheduler}{\lang2057\langfe1031\langnp2057\insrsid3896650 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 nonexistent}{\lang2057\langfe1031\langnp2057\insrsid12676815 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3896650 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3896650 Empty placeholder schedules }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid3896650\charrsid3896650 3 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12676815 {\lang2057\langfe1031\langnp2057\insrsid12676815 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12676815 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid12676815 {\*\bkmkstart _Toc93489784} +The function of the items{\*\bkmkend _Toc93489784} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12676815 Small calendar month +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Each day can be clicked and will change the week and day display to contain the selected day +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab}The month will be displayed in lines of weeks, starting with Sunday or Monday (system preset) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Left to each week in the month overview is the calendar week as a number, this can be clicked and will change the week display to +display this calendar week +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc4\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr4\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid2520008 { +\lang2057\langfe1031\langnp2057\insrsid12676815 If something is scheduled for the calendar day, the number is bold}{\lang2057\langfe1031\langnp2057\insrsid2520008 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Days within week one or last week from previous or next month are of a greyer colour but can be clicked and are bold, if scheduled + +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc20\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr20\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Pulldown to select month will change the calendar view to this month +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Previous next button to change month}{\lang2057\langfe1031\langnp2057\insrsid2520008 + will change the month to display previous or next}{\lang2057\langfe1031\langnp2057\insrsid12676815 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid2520008 C}{\lang2057\langfe1031\langnp2057\insrsid12676815 alendar week +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc22\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr22\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid2520008 { +\lang2057\langfe1031\langnp2057\insrsid2520008 Displays each day of the week starting with Sunday or Monday (system preset) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}The display starts from midnight to midnight +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Playlists are displayed according to their start and stop time +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Minimal metadata is displayed if there is room in the display +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If the scheduled playlist is too small to display metadata it will be only a bar +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Each bar (i.e. scheduled playlist) is mouse +over sensitive and displays metadata information of the playlist and the start time, stop time and duration of the playlist. This display is attached to the mouse pointer and disappears when leaving the playlist bar +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}The day names on top of each week are clickable and change the day display to show that day +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Playlists on the week view are right mouse click sensitive +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2520008 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr23\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid2520008 Previ}{\lang2057\langfe1031\langnp2057\insrsid12676815 ous next button to change week +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr23\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid8416880 { +\lang2057\langfe1031\langnp2057\insrsid8416880 Changes the week display to show that week, if the week runs into next or prev month, the month display changes too (only if the full week is in next or prev, not if half of it is still the same month) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc24\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr24\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Large day with times +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2033356 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc24\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr24\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid2033356 { +\lang2057\langfe1031\langnp2057\insrsid2033356 Displays the date at the top +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc24\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr24\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid8416880 { +\lang2057\langfe1031\langnp2057\insrsid8416880 Displays the time of day on the left +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Displays the playlists scheduled as fields +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8416880 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc24\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc4\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr24\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr4\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid1582066 { +\lang2057\langfe1031\langnp2057\insrsid8416880 The playlist fields act as described for the week in terms of metadata display, mouse over sensitivity and right mouse click}{\lang2057\langfe1031\langnp2057\insrsid1582066 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc25\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr25\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid1582066 { +\lang2057\langfe1031\langnp2057\insrsid1582066 Previous next button to change week +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc25\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr25\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid1582066 { +\lang2057\langfe1031\langnp2057\insrsid1582066 Changes to next and previous day in the day display +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If the day is in the prev or next week, the week display changes +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If the day is in the next or prev month, the month display changes +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc26\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr26\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid2033356 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Scrollbars to go up and down inside the day}{\lang2057\langfe1031\langnp2057\insrsid2033356 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2033356 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc26\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr26\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid2033356 { +\lang2057\langfe1031\langnp2057\insrsid2033356 start with midnight on the top and finish with midnight at the bottom +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2033356 \loch\af10\dbch\af0\hich\f10 \'a7\tab}you can not scroll into previous and next days +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc27\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr27\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Plus and minus to zoom in and out of day view (change scale) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc27\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr27\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid338081 { +\lang2057\langfe1031\langnp2057\insrsid1582066 The scale works with presets, the smalles}{\lang2057\langfe1031\langnp2057\insrsid12910717 t}{\lang2057\langfe1031\langnp2057\insrsid1582066 + unit representing seconds, minutes, five minutes, ten minutes, 30 minutes (that should accommodate the whole day) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1582066 \loch\af10\dbch\af0\hich\f10 \'a7\tab}The current scale is displayed it a bar between plus and minus +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc28\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr28\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Button to go to \lquote today\rquote }{\lang2057\langfe1031\langnp2057\insrsid338081 Sets month, week and day to today +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12676815 Button Add playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc29\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr29\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid338081 { +\lang2057\langfe1031\langnp2057\insrsid338081 Opens popup window to add playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Required fields: date, time and playlist name/id +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc30\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr30\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Button remove playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc30\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr30\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid338081 { +\lang2057\langfe1031\langnp2057\insrsid338081 Only acitve if playlist selected (one mouse click on playlist in week or day overview) +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Opens popup for confirmation: sure you want to...? +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If confirmation is cancelled, return to scheduler window with playlist still selected +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc31\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr31\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Button edit selected playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid338081 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc31\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr31\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid338081 { +\lang2057\langfe1031\langnp2057\insrsid338081 Only active if playlist is selected (one mouse click on playlist in week or day view) +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12676815 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc32\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr32\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12676815 { +\lang2057\langfe1031\langnp2057\insrsid12676815 Button to stop / start scheduler +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1981424 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc32\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr32\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid1981424 { +\lang2057\langfe1031\langnp2057\insrsid1981424 Button toggles: default STOP, then START +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1981424 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If scheduler is stopped, main panel shows information: Scheduler is stopped in very alarming and vibrant letters +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3896650 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls26 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc33\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr33\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid3896650 { +\lang2057\langfe1031\langnp2057\insrsid3896650 Create placeholder +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3896650 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls26\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc33\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr33\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid3896650 { +\lang2057\langfe1031\langnp2057\insrsid3896650 Same as scheduling a playlist, but you cannot type text note +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3896650 \loch\af10\dbch\af0\hich\f10 \'a7\tab}User must enter length +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3896650 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Single text field for name +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3896650 \loch\af10\dbch\af0\hich\f10 \'a7\tab}User must be able to delete placeholder +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3896650 \loch\af10\dbch\af0\hich\f10 \'a7\tab}User must be able to edit placeholder +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15878439 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid15878439 {\*\bkmkstart _Toc93489785} +Additional functions{\*\bkmkend _Toc93489785} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls28 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid15878439 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid15878439 Playlist can be selected with single mouse click in week or day view}{\lang2057\langfe1031\langnp2057\insrsid8922850 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid8922850\charrsid8922850 1}{\lang2057\langfe1031\langnp2057\insrsid15878439 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid4920384 Multiple playlists can be selected (Strg or Shift or checkbox?)}{ +\lang2057\langfe1031\langnp2057\insrsid8922850 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid8922850\charrsid8922850 6}{\lang2057\langfe1031\langnp2057\insrsid4920384 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15878439 Display of length of playlist always with hours: minutes: seconds 00:00:00}{ +\lang2057\langfe1031\langnp2057\insrsid8922850 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid8922850\charrsid8922850 1}{\lang2057\langfe1031\langnp2057\insrsid15878439 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If playlist larger than 100 hours(-1 second), display goes to day... 00:00:00:00}{\lang2057\langfe1031\langnp2057\insrsid8922850 } +{\lang2057\langfe1031\highlight7\langnp2057\insrsid8922850\charrsid8922850 1}{\lang2057\langfe1031\langnp2057\insrsid15878439 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Gaps between playlists also show data: start, stop, length of gap}{\lang2057\langfe1031\langnp2057\insrsid8922850 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid8922850\charrsid8922850 1}{\lang2057\langfe1031\langnp2057\insrsid15878439 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}After last scheduled entry, metadata only displays start time}{\lang2057\langfe1031\langnp2057\insrsid8922850 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid8922850\charrsid8922850 1}{\lang2057\langfe1031\highlight7\langnp2057\insrsid15878439\charrsid8922850 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15878439 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15878439 +Gap display follows same rules as Playlist display of time (hh:mm:ss or dd:hh:mm:ss)}{\lang2057\langfe1031\langnp2057\insrsid8922850 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid8922850\charrsid8922850 1}{ +\lang2057\langfe1031\langnp2057\insrsid15878439 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14901303 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid14901303 Gaps can also be selected with single mouse click}{ +\lang2057\langfe1031\langnp2057\insrsid8922850 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid9393188\charrsid9393188 8}{\lang2057\langfe1031\langnp2057\insrsid14901303 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9393188 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid9393188 Gaps can be doubleclicked or}{\lang2057\langfe1031\langnp2057\insrsid14901303 + are right mouse sensitive (select playlist here) -> opens pop up with preset date and time from gap}{\lang2057\langfe1031\langnp2057\insrsid556831 (start time of gap as default value)}{\lang2057\langfe1031\langnp2057\insrsid14901303 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9393188 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid9393188 Popup looks like file browser window, but shows }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid9393188\delrsid3767246 DJ bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{ +\lang2057\langfe1031\langnp2057\insrsid9393188 contents +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3350176 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3350176 Today is marked differently in month, day and week view}{ +\lang2057\langfe1031\langnp2057\insrsid9393188 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid9393188\charrsid9393188 7}{\lang2057\langfe1031\langnp2057\insrsid3350176 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3350176 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Currently playing playlist is locked and marked differently in week and day view}{\lang2057\langfe1031\langnp2057\insrsid9393188 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid9393188\charrsid9393188 4}{\lang2057\langfe1031\langnp2057\insrsid3350176 +\par }\pard \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416862\pnrauth1\pnrdate-1500416866\pnrnot1\adjustright\rin0\lin360\itap0\pararsid9772727 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto +\pnrauth1\pnrdate-1500416866\pnrnot1\adjustright\rin0\lin0\itap0\pararsid9772727 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416866\langnp2057\insrsid9772727 An empty placeholder }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416864\langnp2057\insrsid9772727 note }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416866\langnp2057\insrsid9772727 can be created from the scheduler window. Such a }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416864\langnp2057\insrsid9772727 note is accessed from a }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416864\langnp2057\insrsid9772727 \lquote }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416864\langnp2057\insrsid9772727 Create note}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416864\langnp2057\insrsid9772727 \rquote }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416864\langnp2057\insrsid9772727 button in the scheduler window. The note contains following fields: +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416863\langnp2057\langfenp1031\insrsid9772727 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls28 +\pnrauth1\pnrdate-1500416863\pnrnot1\adjustright\rin0\lin720\itap0\pararsid15878439 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416863\langnp2057\insrsid9772727 Start +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416863\langnp2057\langfenp1031\insrsid9772727 \loch\af10\dbch\af0\hich\f10 \'a7\tab}End +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416863\langnp2057\langfenp1031\insrsid9772727 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Comments +\par {\listtext\pard\plain\f10\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416863\langnp2057\langfenp1031\insrsid9772727 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Title +\par }\pard \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416861\pnrauth1\pnrdate-1500416861\pnrnot1\adjustright\rin0\lin360\itap0\pararsid14234458 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto +\pnrauth1\pnrdate-1500416861\pnrnot1\adjustright\rin0\lin0\itap0\pararsid14234458 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416860\langnp2057\insrsid14234458 Double-clicking the note invokes the note edit window, which is the same as the }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416860\langnp2057\insrsid14234458 \lquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416860\langnp2057\insrsid14234458 add new note}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416860\langnp2057\insrsid14234458 \rquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416860\langnp2057\insrsid14234458 window}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416861\langnp2057\insrsid14234458 .}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416866\langnp2057\insrsid14234458 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4920384 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid4920384 {\*\bkmkstart _Toc93489786} +Scheduler popup window to schedule playlist{\*\bkmkend _Toc93489786} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid5202891 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls31 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid5202891 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5202891 If coming from right mouse click on playlist with : add playlist to scheduler, this playlist is added as default in the popup f +orm but can be deleted or overwritten with different playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9393188 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid9393188 Time and date are free text fields with up-and-down arrows}{ +\lang2057\langfe1031\langnp2057\insrsid9393188\charrsid5202891 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls30 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid2109254 { +\lang2057\langfe1031\langnp2057\insrsid2109254 Button OK -> assigns values and changes the display containing newly added playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button Cancel +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls30\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid2109254 { +\lang2057\langfe1031\langnp2057\insrsid2109254 If nothing selected, close popup +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid2109254 \hich\af2\dbch\af0\loch\f2 o\tab}If information typed in or selected, confirmation window Are you sure...?}{\lang2057\langfe1031\langnp2057\insrsid2109254\charrsid2109254 + +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4920384 Requires date time and playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If launched from scheduler, playlist can be entered in the following ways: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls29\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4920384 By ID of playlist}{\lang2057\langfe1031\langnp2057\insrsid9393188 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid9393188\charrsid9393188 nonexistent}{\lang2057\langfe1031\langnp2057\insrsid4920384 + +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}With additional button: Select Playlist... +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc3\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr3\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4920384 Button Select Playlist... if pressed: +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9393188 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls29\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc3\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr3\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid9393188 Enables you to select items from the }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid9393188\delrsid3767246 DJ bag}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{\lang2057\langfe1031\langnp2057\insrsid9393188 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc4\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr4\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4920384 Error checking in popup window}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{ +\lang2057\langfe1031\langnp2057\insrsid4920384 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls29\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc4\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr4\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid4920384 { +\lang2057\langfe1031\langnp2057\insrsid4920384 No playlist selected +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid4920384 \hich\af2\dbch\af0\loch\f2 o\tab}Overlap (length too big for gap, start time inside scheduled playlist) +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10714125 {\lang2057\langfe1031\langnp2057\insrsid4920384 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid15869539 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416941\langnp2057\insrsid2831923 {\*\bkmkstart _Toc93489787}9}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416941\langnp2057\insrsid12474292\delrsid2831923 5}{ +\lang2057\langfe1031\langnp2057\insrsid12474292 . }{\lang2057\langfe1031\langnp2057\insrsid13436755 Playlist }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416941\langnp2057\insrsid13436755\delrsid2831923 management}{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416941\langnp2057\insrsid15869539\delrsid2831923 }{\lang2057\langfe1031\langnp2057\insrsid15869539 window}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416919\langnp2057\insrsid13136500 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416919\highlight7\crauth1\crdate-1500416919\langnp2057\insrsid13136500\charrsid13136500 {\*\oldcprops \highlight0\crauth1\crdate-1500416919\insrsid13136500\charrsid13136500 }1}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416919\langnp2057\insrsid13136500 {\*\bkmkend _Toc93489787} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500416919\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 +\b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416919\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{ +\cf0\revised\revauth1\revdttm-1500416941\insrsid2831923 {\*\bkmkstart _Toc93489788}List view}{\deleted\revauthdel1\revdttmdel-1500416941\insrsid16215702\delrsid2831923 (simple)}{\insrsid14108688 }{\highlight7\insrsid14108688\charrsid14108688 1}{ +\insrsid13436755 {\*\bkmkend _Toc93489788} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls29 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc5\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr5\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid14952783 Resizable window}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 6}{ +\lang2057\langfe1031\langnp2057\insrsid14952783 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Contains scrollbars and resize handlers}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid14952783 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Playlist item are listed vertially with first on top}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\highlight7\langnp2057\insrsid14952783\charrsid14108688 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14952783 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid14952783 All items have the same size in the list}{ +\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid10120207 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\adjustright\rin0\lin0\itap0\pararsid13136500 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13136500 }{\insrsid16404736 {\*\bkmkstart _Toc93489789}The window opens when}{\insrsid14952783 {\*\bkmkend _Toc93489789} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16404736 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls32 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16404736 Selected from the main panel +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10120207 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls32\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid10120207 When opened from main panel, the playlist editor opens with a new playlist +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16404736 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls32 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16404736 Actived with right mouse click on playlist or file}{\lang2057\langfe1031\langnp2057\insrsid16404736\charrsid14952783 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\adjustright\rin0\lin0\itap0\pararsid13136500 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13136500 }{\insrsid10764249 {\*\bkmkstart _Toc93489790}The window contains}{\insrsid4409133 {\*\bkmkend _Toc93489790} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7757091 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid7757091 List of items in playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid4655542 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid1052817 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid1052817 Metadata for items in list}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid1052817 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7757091 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid7757091 Buttons to move items}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid7757091 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid7757091 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Buttons to change transition between items}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid7757091 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12283844 Button Add item to playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid7757091 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid12283844 Button Remove item from playlist}{ +\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid12283844 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button Save playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid12283844 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid12283844 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Button Create new playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid12283844 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3242838 Button to Delete playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid3242838 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14108688 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid14108688 Separate marking (icons?) }{\lang2057\langfe1031\langnp2057\insrsid14439181 + for files and playlists in list}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 3}{\lang2057\langfe1031\langnp2057\insrsid12283844 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3039356 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3039356 Icon for each item \'93set IN and OUT points\'94}{ +\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid3039356 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15037064 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15037064 Button to publish playlist to network archive +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\adjustright\rin0\lin0\itap0\pararsid13136500 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13136500 }{\insrsid11036725 {\*\bkmkstart _Toc93489791}The function of the items}{\insrsid14439181 {\*\bkmkend _Toc93489791} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc13\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr13\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid11036725 List of items in playlist}{\lang2057\langfe1031\langnp2057\insrsid16263532 displays }{\lang2057\langfe1031\langnp2057\insrsid14108688 relevant }{ +\lang2057\langfe1031\langnp2057\insrsid11036725 Metadata for items in list +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Buttons to move items}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid11036725 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc14\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr14\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 Inside the item info list, moving up down top and bottom +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc15\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr15\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Buttons to change transition between items}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{ +\lang2057\langfe1031\langnp2057\insrsid11036725 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc15\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr15\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 Clicking here opens the Advanced playlist editing with transitions and shows the two files active}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\langnp2057\insrsid16263532 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc16\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr16\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Add item to playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid11036725 + +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc16\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr16\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 This changes the mouse to become the \lquote select item\rquote icon and items can be selected from }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid16263532\delrsid3767246 DJ bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{ +\lang2057\langfe1031\langnp2057\insrsid16263532 with single click}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 2}{\lang2057\langfe1031\langnp2057\insrsid16263532 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}New items are added to the bottom of the list}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid16263532 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc17\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr17\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Remove item from playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{ +\lang2057\langfe1031\langnp2057\insrsid11036725 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc17\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr17\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 Active only if one or more items are selected +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}Popup confirmation \'93are you sure...?\'94 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc18\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr18\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Save playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid11036725\charrsid14108688 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc18\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr18\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 If editing existing playlist: +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li2160\ri0\widctlpar\jclisttab\tx2160\aspalpha\aspnum\faauto\ls33\ilvl2 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc18\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr18\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin2160\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 confirm popup Overwrite changes...? +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \loch\af10\dbch\af0\hich\f10 \'a7\tab}display current metadata available for editing +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc18\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr18\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 If saving new playlist, ask for name and metadata +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid11036725 Button Create new playlist}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{\lang2057\langfe1031\langnp2057\insrsid11036725 + +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc19\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr19\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid16263532 If no playlist in playlist editor, create empty playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}If playlist in editor, but not changed, create new playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid16263532 \hich\af2\dbch\af0\loch\f2 o\tab}If playlist in editor and changed but not saved, popup confirm: \'93Discard changes to current playlist?\'94 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14108688 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc20\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr20\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid14108688 Marking (i}{\lang2057\langfe1031\langnp2057\insrsid11036725 cons}{\lang2057\langfe1031\langnp2057\insrsid14108688 ?)}{\lang2057\langfe1031\langnp2057\insrsid11036725 for files and playlists in list}{ +\lang2057\langfe1031\langnp2057\insrsid16263532 show if item is a playlist or a file}{\lang2057\langfe1031\langnp2057\insrsid11036725 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid11036725 \loch\af10\dbch\af0\hich\f10 \'a7\tab}Icon for each item \'93set IN and OUT points\'94}{\lang2057\langfe1031\langnp2057\insrsid16263532 + opens Cue window to set IN and OUT points}{\lang2057\langfe1031\langnp2057\insrsid11036725 +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}{\lang2057\langfe1031\langnp2057\insrsid3242838 Button to delete playlist +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \ql \fi-360\li1440\ri0\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls33\ilvl1 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst111\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc22\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr22\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1440\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid3242838 Only active if playlist in playlist editor window}{\lang2057\langfe1031\langnp2057\insrsid13463385 (not if new playlist was created and nothing added, not if playlist editor contains no playlist)}{ +\lang2057\langfe1031\langnp2057\insrsid3242838 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}open confirmation popup \'93do you want to delete this playlist?\'94 +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}Deleted playlists are removed from the }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417018\langnp2057\insrsid3242838\delrsid3767246 DJ bag}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417018\langnp2057\insrsid3767246 Scratchpad}{ +\lang2057\langfe1031\langnp2057\insrsid3242838 and search results +\par {\listtext\pard\plain\f2\lang2057\langfe1031\langnp2057\langfenp1031\insrsid3242838 \hich\af2\dbch\af0\loch\f2 o\tab}Delete process checks if playlist is used by other playlists or inside scheduler??? +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14108688 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls33 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr23\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 { +\lang2057\langfe1031\langnp2057\insrsid14108688 Hotkeys for each function }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 6 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\adjustright\rin0\lin0\itap0\pararsid13136500 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid13136500 }{\insrsid10698856 {\*\bkmkstart _Toc93489792}Additional functions{\*\bkmkend _Toc93489792} +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10698856 \loch\af10\dbch\af0\hich\f10 \'a7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls34 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst167\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid13136500 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10698856 Version 1.x expand and close sub playlists +\par {\listtext\pard\plain\f10\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10698856 \loch\af10\dbch\af0\hich\f10 \'a7\tab}If attemtping to add playlist which is locked because played in scheduler, popup: Can not be edited, because this is cur}{ +\lang2057\langfe1031\langnp2057\insrsid2446275 r}{\lang2057\langfe1031\langnp2057\insrsid10698856 ently playing}{\lang2057\langfe1031\langnp2057\insrsid14108688 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14108688\charrsid14108688 1}{ +\lang2057\langfe1031\langnp2057\insrsid10698856 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13136500 {\lang2057\langfe1031\langnp2057\insrsid2848434 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416915\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 +\b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416915\langnp2057\insrsid524972 {\*\bkmkstart _Toc93489793}X-fader window}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416915\langnp2057\insrsid524972\charrsid13178549 +{\*\bkmkend _Toc93489793} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416915\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 }{\cf0\revised\revauth1\revdttm-1500416915\insrsid524972 The \lquote X-Fader\rquote + window allows users to set the fades\rquote values visually,and the cue window allows users to choose in and out points.}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416915\crauth1\crdate-1500416915\langnp2057\insrsid524972\charrsid524972 +{\*\oldcprops \b\i\f1\fs28\lang1031\langfe1031\crauth1\crdate-1500416915\langnp1031\insrsid524972\charrsid524972 } +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\prauth1\prdate-1500416918\adjustright\rin0\lin0\itap0\pararsid13136500 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid13136500 }{\deleted\revauthdel1\revdttmdel-1500416918\insrsid12474292\delrsid13136500 10. }{ +\deleted\revauthdel1\revdttmdel-1500417101\insrsid16215702\delrsid1654761 Playlist management window (advanced)}{\cf0\revised\revauth1\revdttm-1500417101\insrsid1654761 {\*\bkmkstart _Toc93489794}Timeline view}{\insrsid16677977 }{ +\highlight7\insrsid16677977\charrsid16677977 3}{\cf0\revised\revauth1\revauth1\revdttm-1500417101\insrsid16215702 {\*\bkmkend _Toc93489794} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417045\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417045\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417045\langnp2057\insrsid1654761 + +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417045\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 +\b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417045\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{ +\cf0\revised\revauth1\revdttm-1500417045\insrsid16326225 {\*\bkmkstart _Toc93489795}The window contains:{\*\bkmkend _Toc93489795} }{\cf0\revised\revauth1\revdttm-1500417043\insrsid16326225 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417043\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417043\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417044\crauth1\crdate-1500417043\langnp2057\insrsid16326225\charrsid16326225 {\*\oldcprops \b\i\f1\fs28\lang1031\langfe1031\crauth1\crdate-1500417043\langnp1031\insrsid16326225\charrsid16326225 } + +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417044\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 +\b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417044\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{ +\cf0\revised\revauth1\revdttm-1500417044\insrsid16326225 {\*\bkmkstart _Toc93489796}The window opens when:}{\cf0\revised\revauth1\revdttm-1500417045\insrsid16326225 {\*\bkmkend _Toc93489796} +\par }\pard \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417045\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417045\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{\cf0\revised\revauth1\revdttm-1500417044\insrsid16326225 {\*\bkmkstart _Toc93489797} +Function of the items:{\*\bkmkend _Toc93489797} +\par }\pard \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417044\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417044\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{\cf0\revised\revauth1\revdttm-1500417044\insrsid16326225 {\*\bkmkstart _Toc93489798} +Additional functions:{\*\bkmkend _Toc93489798} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417044\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417044\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417045\langnp2057\insrsid16326225 + +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416918\pnrauth1\pnrdate-1500417101\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 {\*\oldpprops \pard +\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500417101\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13136500 }{\lang2057\langfe1031\langnp2057\insrsid16326225\charrsid1654761 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416918\adjustright\rin0\lin0\itap0\pararsid13136500 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13136500 }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417101\langnp2057\insrsid12474292\delrsid1654761 ROBERT}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417101\langnp2057\insrsid16215702\delrsid1654761 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid353388 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416941\langnp2057\insrsid12474292\delrsid2831923 7}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416941\langnp2057\insrsid2831923 {\*\bkmkstart _Toc93489799}1}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416918\langnp2057\insrsid13136500 0}{\lang2057\langfe1031\langnp2057\insrsid12474292 . }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500417042\langnp2057\insrsid10714751\delrsid16326225\charrsid6300556 Library / }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Search }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid16677977\charrsid16677977 1}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 {\*\bkmkend _Toc93489799} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Current proposition of screen appearance: +\par }{\field\flddirty{\*\fldinst {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 HYPERLINK "http://a.parsons.edu/~livesupport/designs/images/library_search.jpg" }{\insrsid14187354 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000004400000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f0069006d0061006700650073002f00 +6c006900620072006100720079005f007300650061007200630068002e006a00700067000000e0c9ea79f9bace118c8200aa004ba90b8800000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f0064 +0065007300690067006e0073002f0069006d0061006700650073002f006c006900620072006100720079005f007300650061007200630068002e006a00700067000000000000}}}{\fldrslt {\cs18\ul\cf2\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +http://a.parsons.edu/~livesupport/designs/images/library_search.jpg}}}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par +\par Function : basically for searching audio files, +\par optionally , (?) for search, playlist arrang}{\lang2057\langfe1031\langnp2057\insrsid16677977 e}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 ment of files , subplaylist , mails ..etc .... +\par +\par It can be called and started from the other }{\lang2057\langfe1031\langnp2057\insrsid16677977 windows}{\lang2057\langfe1031\langnp2057\insrsid16677977\charrsid6300556 }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 or separately +\par +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751 {\*\bkmkstart _Toc93489800} +When starting the application{\*\bkmkend _Toc93489800} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751 + it will open the panel which contains the following items: +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls38 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7999091 { +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Search part , with the option of choosing the way of searching the entered item }{\lang2057\langfe1031\highlight7\langnp2057\insrsid16677977\charrsid16677977 1}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Player for preview of music tracks}{\lang2057\langfe1031\langnp2057\insrsid16677977 and}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 }{\lang2057\langfe1031\langnp2057\insrsid16677977 link to cue window }{\lang2057\langfe1031\highlight7\langnp2057\insrsid16677977\charrsid16677977 1}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Field with the results of searching files }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid16677977\charrsid16677977 1}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Field with playlist and all its }{\lang2057\langfe1031\langnp2057\insrsid16677977 metadata}{ +\lang2057\langfe1031\langnp2057\insrsid16677977\charrsid6300556 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid16677977\charrsid16677977 1}{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revauth1\revdttm-1500417140\langnp2057\langfenp1031\insrsid3214303 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls38 +\pnrauth1\pnrdate-1500417140\pnrnot1\adjustright\rin0\lin720\itap0\pararsid7999091 {\cf0\revised\lang2057\langfe1031\revauth1\revauth1\revdttm-1500417140\langnp2057\insrsid3214303 +Browse window with pulldown metadata fields and columns for metadata results}{\cf0\revised\lang2057\langfe1031\revauth1\revauth1\revdttm-1500417140\langnp2057\insrsid8669708 1}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417140\langnp2057\insrsid3214303\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par Details (function) of the items : +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12474292 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751 {\*\bkmkstart _Toc93489801}Search}{ +\insrsid12474292 form}{\insrsid7999091\charrsid12474292 {\*\bkmkend _Toc93489801} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li1080\ri0\widctlpar\jclisttab\tx1080\aspalpha\aspnum\faauto\ls39 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin1080\itap0\pararsid7999091 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 contains the form field where we enter the wanted item (name, track..) and the confirmation button GO (enter) }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid16677977\charrsid16677977 1}{\lang2057\langfe1031\highlight7\langnp2057\insrsid7999091\charrsid16677977 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Button for starting the additional more precise advanced mode}{\lang2057\langfe1031\langnp2057\insrsid16677977 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid16677977\charrsid16677977 1}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid7952295 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489802}Search - Advanced mode}{\insrsid7999091 {\*\bkmkend _Toc93489802} +\par }\pard\plain \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid16677977 +Allows users to specify search criteria for selected metadata fields. Criteria can be combined in either an \'93and\'94 or an \'93or\'94 fashion. When \'93and\'94 or \'93or\'94 + are selected, an additional line opens up with a pulldown to select the metadata field and a new text field. Options will include field relations, such as \'93less than\'94, \'93greater than\'94, prefix, exact match, etc. +\par +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par Useful link for that info +\par }\pard \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid10623485 {\field\flddirty{\*\fldinst {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 + HYPERLINK "http://www.rcsworks.com/products/selector/radio101.asp" }{\insrsid14187354 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6e00000068007400740070003a002f002f007700770077002e0072006300730077006f0072006b0073002e0063006f006d002f00700072006f00640075006300740073002f00730065006c006500630074006f007200 +2f0072006100640069006f003100300031002e006100730070000000000000}}}{\fldrslt {\cs18\ul\cf2\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 http://www.rcsworks.com/products/selector/radio101.asp}}}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid15021988 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid12477272 {\*\bkmkstart _Toc93489803}Browse +{\*\bkmkend _Toc93489803} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15021988 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid12477272 Users will be able to browse fi +les according to criteria they set, according to metadata fields they pull down. +\par +\par Four columns in the browse section will have pull-down menus above them. The pull-down menus will contain all available metadata fields, as well as \lquote All\rquote and \lquote None\rquote options. +When a field is specified, the system lists not only files that are found with the criteria selected, but also the other columns display the categories containing such files. +\par +\par An example from iTunes is enclosed below: +\par +\par +\par When a user sets certain criteria, the file browse (search results) window updates its view accordingly: +\par +\par +\par }{\insrsid12477272 +\par }{\insrsid12477272\charrsid93759 Users will be able to store their browsing field preferences with a \'93save this browse\'94 function, which will write the fields into user preferences in Alib. +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid353388 {\lang2057\langfe1031\langnp2057\insrsid12477272\charrsid353388 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid10623485 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489804}How does it work :{\*\bkmkend _Toc93489804} +\par }\pard\plain \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 We enter + the word or the phrase that we want to find in our library of audio files, into the matching field, then we choose whether it is going to search it by the whole name or by the word or a phrase that is in the file name. +\par +\par With the combination of the dropdown menus and by choosing the search options / name of the group / name of the song / energy / bpm / the publishing year of the album / description of the audio material\rquote +s content / we can get the precisely wanted or approximate results. +\par +\par I personally like when I can see also the percent of sucessfullness next to the list of the results, in some search engines. +\par }{\lang2057\langfe1031\langnp2057\insrsid16677977 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Can this be performed in this version and how would that look like in our program? This piece of information is not so important for the work , + it simply gives us the report about the sucessfullness of our result. +\par }{\lang2057\langfe1031\langnp2057\insrsid16677977 +\par Relevance will be determined by the server, and values will be passed to the gui as text. }{\lang2057\langfe1031\langnp2057\insrsid7999091 +\par }{\lang2057\langfe1031\langnp2057\insrsid16677977 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 selection button , that contains full name plus button GO +\par +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \hich\af0\dbch\af0\loch\f0 -\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls35 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst45\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc11\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr11\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid8283629 { +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 selection button , where the item is searched for, on the local net, on server, on the internet.... +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid11360489 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751 {\*\bkmkstart _Toc93489805}E}{ +\insrsid10714751\charrsid6300556 xample}{\insrsid10714751 :}{\insrsid10714751\charrsid6300556 {\*\bkmkend _Toc93489805} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Just example of screen design and precise tools for search : +\par }{\field\flddirty{\*\fldinst {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 HYPERLINK "http://www.rcsworks.com/products/selector/tour/slide_02.asp" }{\insrsid14187354 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7800000068007400740070003a002f002f007700770077002e0072006300730077006f0072006b0073002e0063006f006d002f00700072006f00640075006300740073002f00730065006c006500630074006f007200 +2f0074006f00750072002f0073006c006900640065005f00300032002e006100730070000000000000}}}{\fldrslt {\cs18\ul\cf2\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 http://www.rcsworks.com/products/selector/tour/slide_02.asp}}}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8662583 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid15037064 {\*\bkmkstart _Toc93489806}Cue window}{ +\insrsid10714751\charrsid8662583 {\*\bkmkend _Toc93489806} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls40 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7999091 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Contains file }{\lang2057\langfe1031\langnp2057\insrsid15037064 metadata }{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 we are listening (name, performer, complete time and remaining time), that means the informations from the metadata }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15037064\charrsid15037064 1}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Commands are:play button, stop/pause button, slider line with play position + that shows us on which part of the song we are. By clicking the seek cursor, we can move the listening positions forward or backward, like doing the Rew or }{\lang2057\langfe1031\langnp2057\insrsid15037064 Forward Seek }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15037064\charrsid15037064 1}{\lang2057\langfe1031\highlight7\langnp2057\insrsid10714751\charrsid15037064 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid15037064 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid15037064 The Cue window can preview both audio clips and playlists}{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid15037064\charrsid15037064 1}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }{\b\i\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Audio signal from this kind of the material searching and CUE listening on \'84off the records\'93 + way, it is important to get it on the alternative sound card that is not connected to the current broadcast audio system.}{\b\i\lang2057\langfe1031\langnp2057\insrsid15037064 }{ +\b\i\lang2057\langfe1031\highlight7\langnp2057\insrsid15037064\charrsid15037064 1}{\b\ul\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489807}Form field with the Search results{\*\bkmkend _Toc93489807} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 This field gives us the list + of the found audio files, also contains the informations from metadata. It is desirable to have the option of variable displaying of the search results possibillity of scrolling. }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14315723\charrsid14315723 1}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par This is wide and easy to be surveyed. }{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid8662583\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8662583 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 2 buttons with the functions of where to go with the found audio file +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 In list \endash when we double click on it (because of the more simple operations)}{ +\lang2057\langfe1031\langnp2057\insrsid7999091 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls41 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7999091 { +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 add to playlist or}{\lang2057\langfe1031\langnp2057\insrsid7999091 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid10714751\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 add to cue ( preview ) listening }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid10714751\charrsid14315723 . }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14315723\charrsid14315723 1}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489808}How does it work :{\*\bkmkend _Toc93489808} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +By simple clicking on the audio file in the form field with + the search results, file goes either in the playlist automatically on the last place, or right into the play mode where we start with listening. Rewinding back and forward can be done by clicking on the cursor and by its moving on the line that represen +ts the whole audio file. +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7088866 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489809}Play list{\*\bkmkend _Toc93489809} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Field that shows us the queue of the audio files in the created playlist +\par +\par Crucial question : +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid14315723 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls42 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7999091 { +\lang2057\langfe1031\langnp2057\insrsid14315723 A right click can any entry from search results to a playlist}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par Contains the functions: \'84import\'93 (open, bew), \'84export\'93 (save to...) and \'84send to\'93 (mail, hard disc, to relevant program...)}{\lang2057\langfe1031\langnp2057\insrsid14315723 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14315723\charrsid14315723 10}{\lang2057\langfe1031\langnp2057\insrsid14315723 (post 1.x)}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid353388 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489810}User\rquote s idea :{\*\bkmkend _Toc93489810} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid353388 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 I woul}{ +\lang2057\langfe1031\langnp2057\insrsid14315723 d}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 + be so happy, if this search-library engine could fill in (with its size) the screen in the Live mode - where we have (by the Master palette and the playlist) the empty space on the \'84desktop\'93 + and where we should have various tools that assist us in making radio program. More about this in the part about Live mode. }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14315723\charrsid14315723 5 }{ +\lang2057\langfe1031\highlight7\langnp2057\insrsid14315723 - }{\lang2057\langfe1031\highlight7\langnp2057\insrsid14315723\charrsid14315723 windows are resizable}{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid15021988 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid6300556 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416941\langnp2057\insrsid12474292\delrsid2831923 9}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416941\langnp2057\insrsid2831923 {\*\bkmkstart _Toc93489811}1}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416918\langnp2057\insrsid13136500 1}{\lang2057\langfe1031\langnp2057\insrsid12474292 . }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid10826198 Live Mode{\*\bkmkend _Toc93489811} +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid6300556 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489812}Description, recommendations:{\*\bkmkend _Toc93489812} +\par }\pard\plain \s29\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 +\f2\fs20\lang2074\langfe1033\cgrid\langnp2074\langfenp1033 {\f0\fs24\insrsid10714751\charrsid6705152 The main window for ma +king the radio program. Functionally, it is very sensitive because it is located on the exit and one step before going on-air. Because of this technical detail, it is very important for Live mode to be easilly surveyed and logical on the firs}{ +\f0\fs24\insrsid10714751 t}{\f0\fs24\insrsid10714751\charrsid6705152 sight, in case of an error during the broadcast. This must be clear even to the worse trained user, how to correct those errors. +\par +\par Recommendations for the design: no additional creations}{\f0\fs24\insrsid10714751 , curves, and complex parts of the screen, that can disturb the users during the work. }{\f0\fs24\insrsid10714751\charrsid6705152 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par It is very desirable for every function on the screen to have its own shortcuts on the }{\lang2057\langfe1031\langnp2057\insrsid10714751 k}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +eyboards. The selection of those functions and their disporition will be described separately. +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid6300556 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489813}Starting }{\deleted\revauthdel1\revdttmdel-1500416929\insrsid10714751\delrsid14109158\charrsid6300556 Live}{\cf0\revised\revauth1\revdttm-1500416929\insrsid14109158 Live}{\insrsid10714751\charrsid6300556 Mode +{\*\bkmkend _Toc93489813} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 When starting the Live Mode, }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416927\langnp2057\insrsid10714751\delrsid12477272\charrsid6300556 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416927\langnp2057\insrsid12477272 w}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416927\langnp2057\insrsid10714751\delrsid12477272\charrsid6300556 w}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 e get to the login screen that gives us the opportunity of presenting the user}{\lang2057\langfe1031\langnp2057\insrsid7999091 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Login name, an}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416927\langnp2057\insrsid12477272 d }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416927\langnp2057\insrsid10714751\delrsid12477272\charrsid6300556 d}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416927\langnp2057\insrsid7999091\delrsid12477272 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 password +\par +\par we also have the option of 2 live mode }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416926\langnp2057\insrsid10714751\delrsid12477272\charrsid6300556 functioning}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416926\langnp2057\insrsid12477272 functions}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 :}{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid7999091\charrsid6300556 +\par {\listtext\pard\plain\deleted\f3\lang1031\langfe1031\revauthdel1\revdttmdel-1500416926\langnp1031\langfenp1031\insrsid10714751\delrsid12477272 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls43 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid7999091 { +\deleted\revauthdel1\revdttmdel-1500416926\insrsid10714751\delrsid12477272 fully }{\cf0\revised\revauth1\revdttm-1500416926\insrsid12477272 A}{\deleted\revauthdel1\revdttmdel-1500416926\insrsid10714751\delrsid12477272 a}{\insrsid10714751 utomatic}{ +\insrsid9115585 }{\highlight7\insrsid9115585\charrsid9115585 1}{\insrsid10714751 +\par {\listtext\pard\plain\deleted\f3\lang1031\langfe1031\revauthdel1\revdttmdel-1500416926\langnp1031\langfenp1031\insrsid10714751\delrsid12477272 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{ +\deleted\revauthdel1\revdttmdel-1500416926\insrsid10714751\delrsid12477272 l}{\cf0\revised\revauth1\revdttm-1500416926\insrsid12477272 L}{\insrsid10714751 ive assist}{\deleted\revauthdel1\revdttmdel-1500416926\insrsid10714751\delrsid12477272 ant}{ +\insrsid10714751 }{\deleted\revauthdel1\revdttmdel-1500416926\insrsid10714751\delrsid12477272 mode}{\deleted\revauthdel1\revdttmdel-1500416926\insrsid9115585\delrsid12477272 }{\highlight7\insrsid9115585\charrsid9115585 1}{ +\highlight7\insrsid10714751\charrsid9115585 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8283629 {\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 There are no }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416926\langnp2057\insrsid10714751\delrsid12477272\charrsid6300556 big }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416926\langnp2057\insrsid12477272 major}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416926\langnp2057\insrsid12477272\charrsid6300556 }{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 differences between the functioning of these two modes, this is only about predefined setups and already opened ap}{\lang2057\langfe1031\langnp2057\insrsid9115585 p}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 lications connected with the specific way of work. +\par +\par }{\i\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Hardware\rquote s demand: it is necessary to have two sound cards, one with more quality for the radio program only, a +nd one regular (hmmm...?) for off-air listening of audio material. Their predefining and setup (level, balance) should be in the special system setup. }{\i\lang2057\langfe1031\highlight7\langnp2057\insrsid9115585\charrsid9115585 1}{ +\i\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 The whole idea of live mode consists of Master panel in the upper part of the screen (horisontal pos +ition) and the list of files (vertically) that are waiting to be broadcasted. The logic of functioning is up from below, and in the Master palette there is file that is currently on air. +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8262684 \b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\insrsid10714751\charrsid6300556 +{\*\bkmkstart _Toc93489814}Live assist}{\deleted\revauthdel1\revdttmdel-1500416929\insrsid10714751\delrsid14109158\charrsid6300556 ant}{\insrsid10714751\charrsid6300556 }{ +\deleted\revauthdel1\revdttmdel-1500416917\insrsid10714751\delrsid13136500\charrsid6300556 mode }{\highlight7\insrsid9115585\charrsid9115585 1}{\insrsid10714751\charrsid6300556 {\*\bkmkend _Toc93489814} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416911\adjustright\rin0\lin0\itap0\pararsid8262684 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8262684 }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 After logging and starting the program, the user loads the special arrangement\rquote +s file (file with playlist that is already set up)}{\lang2057\langfe1031\langnp2057\insrsid9115585 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid9115585\charrsid9115585 1}{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +-that he already prepared on its computer in the redaction. Files are importing by classical \'84open files\'93, or by \'84import playlist\'93 during the program }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416925\langnp2057\insrsid10714751\delrsid12477272\charrsid6300556 (this option is not yet implemented in the current screen design)}{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416925\langnp2057\insrsid9115585\delrsid12477272 }{\lang2057\langfe1031\highlight7\langnp2057\insrsid9115585\charrsid9115585 1}{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416925\langnp2057\insrsid10714751\delrsid12477272\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8262684 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par After the loading of this \'84arrangement\rquote s file for playlist\'93, we load the music, interviews, jingles, headlines, and then we visually fill the playlist below the master panel- with already predefined setups, m +ix team, telephone number eventually, calls... The user can also immediately load mini playlist, that was prepared by the marketing redaction in the special block of the commercials, and on that way he can prepare the hour of his program and calculate how + much time does he have for the live talk show. +\par +\par Playlist, although it is arranged in line, it can be broadcasted one by one or without any order.}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416926\langnp2057\insrsid10714751 +\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\prauth1\prdate-1500416911\pnrauth1\pnrdate-1500416926\pnrnot1\adjustright\rin0\lin0\itap0\pararsid8262684 +\b\f1\fs28\lang2057\langfe1031\cgrid\langnp2057\langfenp1031 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416926\pnrnot1\adjustright\rin0\lin0\itap0\pararsid8262684 }{ +\cf0\revised\revauth1\revdttm-1500416926\insrsid13136500 {\*\bkmkstart _Toc93489815}Automatic}{\cf0\revised\revauth1\revdttm-1500416917\insrsid13136500 }{ +\cf0\revised\revauth1\revdttm-1500416917\highlight7\crauth1\crdate-1500416917\insrsid13136500\charrsid13136500 {\*\oldcprops \b0\f0\fs24\lang1031\langfe1031\highlight0\crauth1\crdate-1500416917\langnp1031\insrsid13136500\charrsid13136500 }1}{ +\cf0\revised\revauth1\revdttm-1500416926\insrsid12477272 {\*\bkmkend _Toc93489815} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416926\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416925\langnp2057\insrsid12477272 In Automatic mode, LiveSupport handles cross-fades between files either on preset cues or at the file\rquote s end.}{ +\lang2057\langfe1031\langnp2057\insrsid12477272\charrsid6300556 +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416915\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 +\b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416915\langnp2057\insrsid524972 {\*\bkmkstart _Toc93489816}X-fader window}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416915\langnp2057\insrsid524972\charrsid13178549 +{\*\bkmkend _Toc93489816} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416914\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\pnrauth1\pnrdate-1500416915\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 }{\cf0\revised\revauth1\revdttm-1500416915\insrsid524972 The \lquote X-Fader\rquote + window allows users to set the fades\rquote values visually,and the cue window allows users to choose in and out points.}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416915\crauth1\crdate-1500416914\langnp2057\insrsid524972\charrsid524972 +{\*\oldcprops \b\f1\fs28\crauth1\crdate-1500416914\insrsid524972\charrsid524972 } +\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\prauth1\prdate-1500416914\adjustright\rin0\lin0\itap0\pararsid524972 \b\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid524972 }{\insrsid10714751\charrsid6300556 {\*\bkmkstart _Toc93489817}Mix Time{\*\bkmkend _Toc93489817} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +Every pressure on the play button of the audio file}{\lang2057\langfe1031\langnp2057\insrsid9115585 }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 - is making mix (fade out) of the fi +le that is already on air and starts the next audio file (from full level).}{\lang2057\langfe1031\langnp2057\insrsid9115585 }{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9115585 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls46 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid524972 { +\lang2057\langfe1031\langnp2057\insrsid9115585 Fade audio in and out on pressing \lquote play\rquote }{\lang2057\langfe1031\highlight7\langnp2057\insrsid9115585\charrsid9115585 1}{\lang2057\langfe1031\langnp2057\insrsid9115585\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 {\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par If the user that works in live assistant mode doesn\rquote t manually play the audio file, the next file is automatically played. +\par +\par }{\i\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 This + volume minimizing in time from the full level to the level of 0 db, I will call Fade out. Actuall time for the end of the song is 0,5-10 sec. The same goes for the Fade in-except it is in the opposite direction, and the actual time is about 0,1 sec. In +this version of Live Support, I wouldn\rquote t go further in the \'84fade in\'93 philosophy, that very rarely goes up to the 10 sec, deoending on the musical situation.}{\i\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }{\i\lang2057\langfe1031\langnp2057\insrsid9115585 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid9115585 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls46 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc2\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr2\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid524972 { +\i\lang2057\langfe1031\langnp2057\insrsid9115585 Default values for fades will be hard-coded in Version 1.0. Future versions will support storing these items as system preferences. +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 {\i\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par It is good to leave these values of fade- out on some default value, somewhere in the preferences of Live support, and leave the instant changes of fade-out mix to the people that are working on creative music mixing in th +e program, making their own mix time, fade-out time, or their music set. Of course, after the broadcasting this music file, everything goes back to the default values of mixing.}{\i\lang2057\langfe1031\langnp2057\insrsid13178549 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13178549 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls46 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc3\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr3\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid524972 { +\lang2057\langfe1031\langnp2057\insrsid13178549 Default fades }{\lang2057\langfe1031\highlight7\langnp2057\insrsid13178549\charrsid13178549 1}{\lang2057\langfe1031\langnp2057\insrsid13178549 +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13178549 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Custom fades }{\lang2057\langfe1031\highlight7\langnp2057\insrsid13178549\charrsid13178549 10}{ +\lang2057\langfe1031\langnp2057\insrsid13178549 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\prauth1\prdate-1500416916\pnrauth1\pnrdate-1500416930\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 +\b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\pnrauth1\pnrdate-1500416930\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 }{ +\cf0\revised\revauth1\revdttm-1500416912\insrsid8262684 {\*\bkmkstart _Toc93489818}12. }{\cf0\revised\revauth1\revdttm-1500416930\insrsid14109158 Cue }{\cf0\revised\revauth1\revdttm-1500416856\insrsid14234458 {\*\bkmkend _Toc93489818}window}{ +\cf0\revised\revauth1\revdttm-1500416930\insrsid14109158\charrsid8662583 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\langfenp1031\insrsid14109158\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\aspalpha\aspnum\faauto\ls40\pnrauth1\pnrdate-1500416916\pnrnot1\adjustright\rin0\lin720\itap0\pararsid524972 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 Contains }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416855\langnp2057\insrsid14234458 limited}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416856\langnp2057\insrsid14234458 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 file }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158 metadata }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 (}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416856\langnp2057\insrsid14234458 title}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 , com}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14234458 plete time and remaining time)}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416855\langnp2057\insrsid14234458 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\highlight7\langnp2057\insrsid14109158\charrsid15037064 1}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 +\par }\pard \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416855\pnrauth1\pnrdate-1500416916\pnrnot1\adjustright\rin0\lin360\itap0\pararsid14234458 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto +\pnrauth1\pnrdate-1500416916\pnrnot1\adjustright\rin0\lin0\itap0\pararsid14234458 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 Commands are:}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416855\highlight7\crauth1\crdate-1500416855\langnp2057\insrsid14234458\charrsid14234458 {\*\oldcprops \highlight0\crauth1\crdate-1500416855\insrsid14234458\charrsid14234458 } +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\langfenp1031\insrsid14234458 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls40 +\pnrauth1\pnrdate-1500416855\pnrnot1\adjustright\rin0\lin720\itap0\pararsid524972 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14234458 play button}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416855\highlight7\crauth1\crdate-1500416855\langnp2057\insrsid14234458\charrsid14234458 {\*\oldcprops \highlight0\crauth1\crdate-1500416855\insrsid14234458\charrsid14234458 } +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\langfenp1031\insrsid14234458 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14234458 +stop/pause button}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416855\highlight7\crauth1\crdate-1500416855\langnp2057\insrsid14234458\charrsid14234458 {\*\oldcprops \highlight0\crauth1\crdate-1500416855\insrsid14234458\charrsid14234458 } +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\langfenp1031\insrsid14109158\charrsid6300556 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 slider line with play position that shows us on which part of the song we are. By clicking the seek +cursor, we can move the listening positions forward or backward, like doing the Rew or }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158 Forward Seek }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\highlight7\langnp2057\insrsid14109158\charrsid15037064 1 +\par }\pard \ql \li360\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416855\pnrauth1\pnrdate-1500416916\pnrnot1\adjustright\rin0\lin360\itap0\pararsid14234458 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto +\pnrauth1\pnrdate-1500416916\pnrnot1\adjustright\rin0\lin0\itap0\pararsid14234458 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158 The Cue window can preview both audio clips and playlists}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\highlight7\langnp2057\insrsid14109158\charrsid15037064 1}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416930\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\langnp2057\insrsid14109158\charrsid6300556 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416855\langnp2057\insrsid14234458 Note: The a}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\crauth1\crdate-1500416855\langnp2057\insrsid14109158\charrsid14234458 {\*\oldcprops +\b\i\crauth1\crdate-1500416855\insrsid14109158\charrsid14234458 }udio signal from }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416854\langnp2057\insrsid14234458 the Cue window is played on the computer}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416854\langnp2057\insrsid14234458 \rquote }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416854\langnp2057\insrsid14234458 s second sound card, so as to not interfere with the broadcast. }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\crauth1\crdate-1500416855\langnp2057\insrsid14109158\charrsid14234458 {\*\oldcprops \b\i\crauth1\crdate-1500416855\insrsid14109158\charrsid14234458 } }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\highlight7\crauth1\crdate-1500416855\langnp2057\insrsid14109158\charrsid14234458 {\*\oldcprops \b\i\crauth1\crdate-1500416855\insrsid14109158\charrsid14234458 }1}{ +\ul\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416930\crauth1\crdate-1500416855\langnp2057\insrsid14109158\charrsid14234458 {\*\oldcprops \b\crauth1\crdate-1500416855\insrsid14109158\charrsid14234458 } +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\prauth1\prdate-1500416916\pnrauth1\pnrdate-1500416931\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 +\b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416931\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416912\langnp2057\insrsid8262684 {\*\bkmkstart _Toc93489819}13. }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416931\langnp2057\insrsid14109158 X-fader window}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416931\langnp2057\insrsid14109158\charrsid13178549 {\*\bkmkend _Toc93489819} +\par {\listtext\pard\plain\f3\lang2057\langfe1031\langnp2057\langfenp1031\insrsid13178549 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls46\prauth1\prdate-1500416916 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc5\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr5\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid524972 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls46 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc5\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr5\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid524972 }{ +\i\lang2057\langfe1031\langnp2057\insrsid13178549 The \lquote }{\i\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416931\langnp2057\insrsid13178549\delrsid14109158 Transitions\rquote }{ +\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416931\langnp2057\insrsid14109158 X-Fader\rquote }{\i\lang2057\langfe1031\langnp2057\insrsid13178549 window allows users to set the}{ +\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416858\langnp2057\insrsid14234458 sound transition between two files. The X-fader includes a visual representation of the two files (including length and volume level)}{ +\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416857\langnp2057\insrsid14234458 .}{\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416858\langnp2057\insrsid14234458 }{\i\lang2057\langfe1031\langnp2057\insrsid13178549 }{ +\i\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416857\langnp2057\insrsid13178549\delrsid14234458 fades\rquote values visually,and t}{\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416857\langnp2057\insrsid14234458 T}{ +\i\lang2057\langfe1031\langnp2057\insrsid13178549 he }{\i\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416856\langnp2057\insrsid13178549\delrsid14234458 cue }{ +\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416856\langnp2057\insrsid14234458 X-fader}{\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416856\langnp2057\insrsid14234458 }{\i\lang2057\langfe1031\langnp2057\insrsid13178549 +window allows users to choose in and out points}{\i\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416856\langnp2057\insrsid14234458 for the transitions.}{ +\i\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416930\langnp2057\insrsid13178549\delrsid14109158 }{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416930\langnp2057\insrsid10714751\delrsid14109158\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416819\langnp2057\insrsid3505407 There }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416818\langnp2057\insrsid3505407 are}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416819\langnp2057\insrsid3505407 only }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416818\langnp2057\insrsid3505407 two}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416819\langnp2057\insrsid3505407 button for previewing the fade, play}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416818\langnp2057\insrsid3505407 /pause}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416819\langnp2057\insrsid3505407 and stop.}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416916\adjustright\rin0\lin0\itap0\pararsid524972 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416929\langnp2057\insrsid10714751\delrsid14109158\charrsid6300556 Informations about the slot that contains audio file ready for broadcasting: +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416916\adjustright\rin0\lin0\itap0\pararsid524972 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 }{ +\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416929\langnp2057\insrsid10714751\delrsid14109158\charrsid6300556 Play list \endash + visually it is positioned along the right side of the screen and it should have the size of 1/3 of the whole screen length. It consists informations: audio file name, song name, performer\rquote +s name (if it is the music file), total time, and the exact time of its broadcast in case of automated mode.}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416929\langnp2057\insrsid13178549\delrsid14109158 }{ +\deleted\lang2057\langfe1031\highlight7\revauthdel1\revdttmdel-1500416929\langnp2057\insrsid13178549\delrsid14109158\charrsid13178549 1}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416929\langnp2057\insrsid10714751\delrsid14109158 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid524972 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416818\langnp2057\insrsid3505407 The X-fader will display 7 seconds}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416817\langnp2057\insrsid3505407 of the first file and 7 seconds of the second file.}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416817\langnp2057\insrsid10438290 + [A future version should store this value as a system}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416816\langnp2057\insrsid10438290 /user}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416817\langnp2057\insrsid10438290 preference.]}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416812\langnp2057\insrsid10714751 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416812\pnrnot1\adjustright\rin0\lin0\itap0\pararsid524972 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416812\langnp2057\insrsid10438290 +The X-fader will include four preset fades}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416810\langnp2057\insrsid10438290 : two for fade in and two for fade out}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416812\langnp2057\insrsid10438290 .}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416810\langnp2057\insrsid10438290 Right-clicking on the volume line at the }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416808\langnp2057\insrsid10438290 playback head }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416810\langnp2057\insrsid10438290 position brings up preset fade in options}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416808\langnp2057\insrsid10438290 .}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416803\langnp2057\insrsid10438290 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416803\langnp2057\insrsid2837605 +\par Pressing the transition button between items in the }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416802\langnp2057\insrsid2837605 Live Mode playlist}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416803\langnp2057\insrsid2837605 + brings up the X-fader window}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416802\langnp2057\insrsid2837605 . Users can also navigate between fades by using the PageUp and PageDn keys; when they move to the next fade, the next transitio +n button is shown as active}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416801\langnp2057\insrsid2837605 /mousedown}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416802\langnp2057\insrsid2837605 .}{ +\lang2057\langfe1031\langnp2057\insrsid2837605\charrsid6300556 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\prauth1\prdate-1500416928\adjustright\rin0\lin0\itap0\pararsid12477272 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard +\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12477272 }{\insrsid10714751 {\*\bkmkstart _Toc93489820}Commands:{\*\bkmkend _Toc93489820} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12477272 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid7999091 +\par {\listtext\pard\plain\f3\lang1031\langfe1031\langnp1031\langfenp1031\insrsid10714751 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls44 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst183\pnrxst240\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc1\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr1\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid12477272 { +\insrsid10714751 Play/ Pause button +\par {\listtext\pard\plain\f3\lang1031\langfe1031\langnp1031\langfenp1031\insrsid10714751 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Stop button +\par {\listtext\pard\plain\f3\lang1031\langfe1031\langnp1031\langfenp1031\insrsid10714751 \loch\af3\dbch\af0\hich\f3 \'b7\tab}CUE button +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12477272 {\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid8283629 Play/ Pause button has two function}{\deleted\lang2057\langfe1031\revauthdel1\revdttmdel-1500416803\langnp2057\insrsid10714751\delrsid2837605\charrsid8283629 e}{ +\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid8283629 s, first click is Play, second click is Pause. +\par CUE button is starting the CUE function (with the popup window, or maybe it should be some special module...it is on you to decide... functionally, popup window is quite enough) +\par Recommended disposition starting from the left:}{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid8283629 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 Play button / CUE button / audio file info (name, time, program time), and on the right side of the slot is Stop button!}{\lang2057\langfe1031\langnp2057\insrsid10714751 +\par }{\lang2057\langfe1031\langnp2057\insrsid10714751\charrsid6300556 +\par As you can see, CUE button and Stop button changed their places. I think this is the better solution to avoid the accidentally pressing the stop button in the middle of the program. +\par It would be good for the functions to be connected with shortcuts on the keyboard. This is more convenient then using the mouse, if we don\rquote t have option of touch screen. +\par On that way, we move through the playlist with the arrows on the keyboard up and down, and we erase the audio file from the playlist with the delete button- with always necessary popup \'84are you sure you want to delete?\'93 yes / no .....:) +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid11555562 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid13436755 {\*\bkmkstart _Toc93489821}General issues}{\lang2057\langfe1031\langnp2057\insrsid11555562\charrsid11555562 {\*\bkmkend _Toc93489821} }{\lang2057\langfe1031\langnp2057\insrsid11555562 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid4204924 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\insrsid11555562 {\*\bkmkstart _Toc93489822} +General link of our design so far}{\insrsid11555562\charrsid3621462 :{\*\bkmkend _Toc93489822} +\par }\pard\plain \s29\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11555562 +\f2\fs20\lang2074\langfe1033\cgrid\langnp2074\langfenp1033 {\field\flddirty{\*\fldinst {\f0\fs22\insrsid11555562\charrsid3621462 HYPERLINK "http://a.parsons.edu/~livesupport/designs/" }{\f0\fs22\insrsid14187354\charrsid3621462 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000002b00000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f000000e0c9ea79f9bace118c8200aa +004ba90b5600000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f0000000000f5}}}{\fldrslt { +\cs18\f0\fs22\ul\cf2\insrsid11555562\charrsid3621462 http://a.parsons.edu/~livesupport/designs/}}}{\f0\fs22\insrsid11555562\charrsid3621462 +\par 7. Library/Search (Robert) +\par }{\field\flddirty{\*\fldinst {\f0\fs22\insrsid11555562\charrsid3621462 HYPERLINK "http://a.parsons.edu/~livesupport/designs/images/library_search.jpg" }{\f0\fs22\insrsid14187354\charrsid3621462 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000004400000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f00640065007300690067006e0073002f0069006d0061006700650073002f00 +6c006900620072006100720079005f007300650061007200630068002e006a00700067000000e0c9ea79f9bace118c8200aa004ba90b8800000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f007e006c0069007600650073007500700070006f00720074002f0064 +0065007300690067006e0073002f0069006d0061006700650073002f006c006900620072006100720079005f007300650061007200630068002e006a00700067000000000011}}}{\fldrslt {\cs18\f0\fs22\ul\cf2\insrsid11555562\charrsid3621462 http://a.parsons.edu/~live +support/designs/images/library_search.jpg}}}{\f0\fs22\insrsid11555562\charrsid3621462 +\par 9. Live Mode (Robert) +\par }{\field\fldedit{\*\fldinst {\f0\fs22\insrsid11555562\charrsid3621462 HYPERLINK "http://a.parsons.edu/%7Elivesupport/designs/images/livemode.gif" }{\f0\fs22\insrsid14187354\charrsid15533137 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b8000000068007400740070003a002f002f0061002e0070006100720073006f006e0073002e006500640075002f002500370045006c0069007600650073007500700070006f00720074002f0064006500730069006700 +6e0073002f0069006d0061006700650073002f006c006900760065006d006f00640065002e006700690066000000008b}}}{\fldrslt {\cs18\f0\fs22\ul\cf2\insrsid11555562\charrsid3621462 http://a.parsons.edu/~livesupport/designs/images/livemode.gif}}}{\f0\fs22\insrsid11555562 + +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid4204924 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid4204924\charrsid15341335 {\*\bkmkstart _Toc93489823}On-Air Off-air definition{\*\bkmkend _Toc93489823} +\par }\pard\plain \s29\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11555562 +\f2\fs20\lang2074\langfe1033\cgrid\langnp2074\langfenp1033 {\f0\fs22\insrsid4204924 The system is on-air when either the server or the client or both soundcards are playing}{\f0\fs22\insrsid4204924\charrsid3621462 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid15993845 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid13436755 {\*\bkmkstart _Toc93489824}Right mouse sensitive for files and playlists{\*\bkmkend _Toc93489824} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5606 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5606 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid5606 \b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 { +\lang1036\langfe1031\langnp1036\insrsid5606\charrsid5606 {\*\bkmkstart _Toc93489825}Information formats (date, names, etc.){\*\bkmkend _Toc93489825} +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid9842054 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\lang2057\langfe1031\langnp2057\insrsid5606\charrsid84972 {\*\bkmkstart _Toc93489826}Date format}{\lang2057\langfe1031\langnp2057\insrsid9842054 {\*\bkmkend _Toc93489826} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5606 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid5606\charrsid84972 \~}{ +\lang2057\langfe1031\langnp2057\insrsid13178549 Users will be able to define their date and time preferences at the time of installation. +\par For version 1.x this should be written to the user profile, along with \'93week starts on Monday, week starts on Sunday\'94 +\par +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid8068550 \b\i\f1\fs28\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8068550 +{\*\bkmkstart _Toc93489827}Station information{\*\bkmkend _Toc93489827} +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls35 +\pnrauth1\pnrdate-1500417183\pnrstart0\pnrxst1\pnrxst0\pnrxst45\pnrxst0\pnrstop4\pnrstart1\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrrgb0\pnrstop9\pnrstart2\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23\pnrnfc23 +\pnrnfc23\pnrnfc23\pnrnfc0\pnrnfc0\pnrnfc12\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrnfc0\pnrstop18\pnrstart3\pnrpnbr12\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0 +\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrpnbr0\pnrstop36\adjustright\rin0\lin720\itap0\pararsid8068550 +\fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\lang2057\langfe1031\langnp2057\insrsid8068550 will be added at install procedure +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}station name is a text Unicode string +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}additional information can be added +\par {\listtext\pard\plain\lang2057\langfe1031\langnp2057\langfenp1031\insrsid8068550 \hich\af0\dbch\af0\loch\f0 -\tab}a station logo can be uploaded as JPEG or PNG file +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500417067\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13004469 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417067\langnp2057\insrsid13004469 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\prauth1\prdate-1500417065\pnrauth1\pnrdate-1500417067\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13004469 +\b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500417067\pnrnot1\adjustright\rin0\lin0\itap0\pararsid13004469 }{ +\cf0\revised\revauth1\revdttm-1500417067\insrsid13004469 {\*\bkmkstart _Toc93489828}About window{\*\bkmkend _Toc93489828} +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417067\langnp2057\langfenp1031\insrsid13004469 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls47 +\pnrauth1\pnrdate-1500417065\pnrnot1\adjustright\rin0\lin720\itap0\pararsid13004469 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417067\langnp2057\insrsid13004469 +Invoked by clicking the LiveSupport logo in the Master Panel +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417067\langnp2057\langfenp1031\insrsid13004469 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Includes version number}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417066\langnp2057\insrsid13004469 , Helix version number, dependencies credits, team members\rquote names}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417065\langnp2057\insrsid13004469 + +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417065\langnp2057\langfenp1031\insrsid13004469 \loch\af3\dbch\af0\hich\f3 \'b7\tab}GNU/GPL information}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417066\langnp2057\insrsid13004469 +\par {\listtext\pard\plain\f3\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417066\langnp2057\langfenp1031\insrsid13004469 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li720\ri0\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls47 +\pnrauth1\pnrdate-1500416972\pnrnot1\adjustright\rin0\lin720\itap0\pararsid4204924 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417066\langnp2057\insrsid13004469 Link}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417065\langnp2057\insrsid13004469 /URL of}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500417066\langnp2057\insrsid13004469 LiveSupport webpage}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416853\langnp2057\insrsid4204924 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\prauth1\prdate-1500416853\pnrauth1\pnrdate-1500416853\pnrnot1\adjustright\rin0\lin0\itap0\pararsid12085996 +\b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416853\pnrnot1\adjustright\rin0\lin0\itap0\pararsid12085996 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416853\langnp2057\insrsid12085996 Shortcut Keys}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416852\langnp2057\insrsid12085996 +\par }\pard\plain \ql \li0\ri0\widctlpar\tx4770\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416806\pnrnot1\adjustright\rin0\lin0\itap0\pararsid591721 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\revauth1\revdttm-1500416806\insrsid591721 Live panel }{\cf0\revised\revauth1\revdttm-1500416806\insrsid12256603 }{\cf0\revised\revauth1\revdttm-1500416806\insrsid591721 Shortcut + +\par +\par Play/Stop \tab ENTER +\par Play/pause\tab SPACE +\par Delete\tab DEL +\par Scroll up one page through playlist\tab Page Up +\par Scroll down one page through playlist\tab Page Down +\par Scroll to start of playlist\tab HOME +\par Scroll to end of playlist\tab END +\par Highlight previous item on the list\tab Up Arrow +\par Highlight next item on playlist\tab Arrow down +\par }\pard \ql \fi-720\li720\ri0\widctlpar\tx4770\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416806\pnrnot1\adjustright\rin0\lin720\itap0\pararsid591721 {\cf0\revised\revauth1\revdttm-1500416806\insrsid591721 Move item up in playlist by one line\tab +Ctrl +Arrow up +\par }\pard \ql \li0\ri0\widctlpar\tx4770\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416806\pnrnot1\adjustright\rin0\lin0\itap0\pararsid591721 {\cf0\revised\revauth1\revdttm-1500416806\insrsid591721 Move file down in playlist by one line \tab Ctrl+ Arrow Down + +\par +\par +\par F1\tab Live Assist mode +\par F2\tab Automatic mode +\par F3 +\par F4\tab Line in (option) [DISABLED IN 1.0] +\par F5\tab Play list menu +\par F6\tab Scratch Pad +\par F7\tab Schedule +\par F8\tab Search +\par F9\tab History +\par Alt + \tab Cue window +\par Alt + F\tab X-fader +\par +\par Numeric keys +\par Short jingles definition shortcut }{\cf0\revised\revauth1\revdttm-1500416806\insrsid12256603 \tab }{\cf0\revised\revauth1\revdttm-1500416806\insrsid591721 numeric key 0-9 +\par +\par +\par +\par CUE Panel active : +\par +\par Play/Stop\tab ENTER +\par Play/Pause\tab SPACE +\par Delete\tab DEL +\par Scroll up one page in playlist\tab Page Up +\par Scroll down one page in playlist\tab Page Down +\par Scroll up to start of playlist\tab HOME +\par Scroll down to end of playlist\tab END +\par Zoom in\tab Arrow up +\par Zoom out\tab Arrow down +\par Shuttle left: >, >>, >>>\tab 1x left arrow, 2x left arrow, 3x left arrow +\par Shuttle right <, <<, <<<\tab 1x right arrow, 2x right arrow, 3x right arrow, etc. +\par (Shuttle means precise moving of audio listening position 1x = real time, 2x = 2x time, etc.) +\par Set in point \tab CTRL-I +\par Set out point\tab CTRL-O +\par +\par +\par +\par +\par X \endash Fader : ( transitions between audio clips ) +\par +\par Play\tab ENTER +\par Stop\tab SPACE +\par Delete\tab DEL +\par Move to previous fade position\tab PageUp +\par Move to next fade position\tab PageDn +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\prauth1\prdate-1500416853\pnrauth1\pnrdate-1500416852\pnrnot1\adjustright\rin0\lin0\itap0\pararsid12085996 +\b\f1\fs32\lang1031\langfe1031\kerning32\cgrid\langnp1031\langfenp1031 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416852\pnrnot1\adjustright\rin0\lin0\itap0\pararsid12085996 }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid12085996 +\par }\pard \s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\prauth1\prdate-1500416956\adjustright\rin0\lin0\itap0\pararsid16131165 {\*\oldpprops \pard +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16131165 }{\cf0\revised\revauth1\revdttm-1500416972\insrsid2493485 {\*\bkmkstart _Toc93489829}Menu Bar{\*\bkmkend _Toc93489829} +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416972\pnrnot1\adjustright\rin0\lin0\itap0\pararsid4204924 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 { +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid2493485 +\par File}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416971\langnp2057\insrsid2493485 +\par \tab }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416957\langnp2057\insrsid4536429 Add to playlist}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416957\langnp2057\insrsid2493485 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416957\langnp2057\insrsid4536429 \tab }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid4536429 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid2493485 Edit}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416971\langnp2057\insrsid2493485 +\par \tab }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416957\langnp2057\insrsid4536429 Undo?}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416968\langnp2057\insrsid2493485 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid4536429 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416957\langnp2057\insrsid4536429 Window}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid2493485 +\par \tab }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416971\langnp2057\insrsid2493485 Close }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416957\langnp2057\insrsid4536429 window}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416971\langnp2057\insrsid2493485 +\par \tab ----------------- +\par }\pard \ql \fi708\li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416970\pnrauth1\pnrdate-1500416970\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2493485 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto +\pnrauth1\pnrdate-1500416970\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2493485 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid2493485 Playlist}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416970\langnp2057\insrsid2493485 \tab -> Timeline +\par }\pard \ql \fi708\li0\ri0\widctlpar\aspalpha\aspnum\faauto\prauth1\prdate-1500416970\pnrauth1\pnrdate-1500416970\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2493485 {\*\oldpprops \pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto +\pnrauth1\pnrdate-1500416970\pnrnot1\adjustright\rin0\lin0\itap0\pararsid2493485 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416970\langnp2057\insrsid2493485 \tab \tab -> List\tab \tab }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid2493485 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\pnrauth1\pnrdate-1500416972\pnrnot1\adjustright\rin0\lin0\itap0\pararsid4204924 {\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid2493485 \tab Scheduler +\par \tab Search}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416971\langnp2057\insrsid2493485 +\par \tab Scratchpad +\par \tab History\tab +\par \tab Live Mode}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416970\langnp2057\insrsid2493485 }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416969\langnp2057\insrsid4536429 \tab }{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416970\langnp2057\insrsid2493485 -> Fader}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416969\langnp2057\insrsid2493485 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416969\langnp2057\insrsid4536429 \tab \tab \tab -> Cu}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416968\langnp2057\insrsid4536429 e}{ +\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416972\langnp2057\insrsid2493485 +\par \tab +\par Help}{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416968\langnp2057\insrsid2493485 +\par }{\cf0\revised\lang2057\langfe1031\revauth1\revdttm-1500416968\langnp2057\insrsid4536429 \tab Online Help +\par \tab About}{\lang2057\langfe1031\langnp2057\insrsid4536429 +\par }\pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4204924 {\lang2057\langfe1031\langnp2057\insrsid4204924\charrsid84972 +\par }} \ No newline at end of file diff --git a/campcaster/doc/index.html b/campcaster/doc/index.html new file mode 100644 index 000000000..784b148ad --- /dev/null +++ b/campcaster/doc/index.html @@ -0,0 +1,61 @@ + + + + + LiveSupport developer documentation + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document collects LiveSupport developer documentation, both +generated and handwritten.
+

Introduction

+The links below provide useful documentation for the LiveSupport +developer.
+

Static documentation
+

+

User documentation

+ +

Developer documentation

+ +

Generated documentation

+ +
+ + diff --git a/campcaster/doc/install.html b/campcaster/doc/install.html new file mode 100644 index 000000000..75f277bfe --- /dev/null +++ b/campcaster/doc/install.html @@ -0,0 +1,229 @@ + + + + + LiveSupport installation documentation + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes how to compile and install LiveSupport on your +system.
+

Introduction

+LiveSupport has an installation procedure to make sure LiveSupport will +work properly on your system. This procedure consists of the following +steps:
+
    +
  • installing required compilation tools
  • +
  • installing and configuring required external services
  • +
  • obtaining LiveSupport sources
  • +
  • compiling LiveSupport
  • +
  • installing LiveSupport
  • +
  • try it out
  • +
+

For the impatient

+Those who think they know everything, the quick steps to install +LiveSupport are the following. (To run make, you need write +permissions in the prefix directory; to run +make install and postInstallStation.sh, +you need to be root.) + +

+wget http://switch.dl.sourceforge.net/sourceforge/livesupport/livesupport-<version>.tar.bz2
+wget http://switch.dl.sourceforge.net/sourceforge/livesupport/livesupport-libraries-<version>.tar.bz2
+tar xfj livesupport-<version>.tar.bz2
+tar xfj livesupport-libraries-<version>.tar.bz2
+cd livesupport-<version>
+./configure --prefix=/usr/local/livesupport --with-apache-group=apache --with-www-docroot=/var/www
+make
+make install
+./bin/postInstallStation.sh -d /usr/local/livesupport -g apache -r /var/www
+/usr/local/livesupport/bin/scheduler.sh start
+
+ +Then try the URL http://localhost/livesupport/ +and log in using username: root, password: q.
+
+Everyone else, please read the lines below carefully.
+

Installing required compilation tools

+Make sure that all the required compilation +tools and libraries are installed. You can either install pre-packaged +versions, if they are provided for your distribution; or you can download +them from the URLs listed, and compile them yourself (follow the instructions +included with each tool and library).
+ +

Installing and configuring required external services

+LiveSupport depends on some external services to be able to run, most +importantly a PHP-capable web server (we assume apache), and a database +server (we assume PostgreSQL).
+

Database

+LiveSupport expects a PostgreSQL +database, version 7.4 or later, to be installed on your system. You will +also need a postgresql driver for unixODBC; this may be in the unixODBC +package, or may need to be installed separately.
+
+The database will be accessed through TCP/IP, usually via the localhost +interface. To achieve this, make sure to make the following changes to +the PostgreSQL configuration files.
+
+Edit postgresql.conf +(usually /var/lib/postgres/data/postgresql.conf), to have +to following line:
+
+
tcpip_socket = true
+
+and also edit pg_hba.conf (usually /var/lib/postgres/data/pg_hba.conf) +to include the following line, before any other lines starting with "host":
+
+
host    all         all         127.0.0.1         255.255.255.255   password

+These changes will make sure that the PostgreSQL database is accessible +via TCP/IP from localhost.
+

Web server

+LiveSupport expects an apache web server with PHP and some additional +PHP modules installed. In particular: +
    +
  • Apache httpd server, +either version 1.x or 2.x
    +
  • +
  • PHP interpreter
  • +
  • PHP apache module
  • +
  • DOMXML PHP extension - an +XMLv2 module for PHP
    +
  • +
  • PostgreSQL support in PHP
  • +
  • PEAR
  • +
+ +Check php.ini file if "upload_max_filesize" fits the needs of an radio-station. On our experience, soundfiles can be up to 100MB. +If you changed this setting, increase "post_max_size" to something bigger than "upload_max_filesize". +

+Please note the user group your apache daemon is running as (usually apache +or www-data), you will need this information later. Later +on in this document, this group will be referred to as <apache-group>. For the automatic install scripts to work, the user +running them must either be root, or belong to +<apache-group>.
+
+Also note the document root directory for your apache installation +(usually /var/www or /var/www/htdocs +or /var/www/<yourhost>/htdocs). Later on in this +document, this directory will be referred to as <www-root>.
+ +

ALSA

+Please check if ALSA is installed and configured properly. +File /proc/asound/cards should contain entry(s) for your soundcard(s). +
+If not, maybe you do not have suitable ALSA module for your soundcard on the system. Search you package manager for "alsa-modules" and figure out which are suitable for your kernel version and architecture. +or one other from http://packages.debian.org/cgi-bin/search_packages.pl.... +
+Then run "alsaconf" and check /proc/asound/cards again. + + +

Obtaining LiveSupport sources

+LiveSupport sources come in two different tarballs:
+
    +
  • livesupport-<version>.tar.bz2 - the +LiveSupport source files
    +
  • +
  • livesupport-libraries-<version>.tar.bz2 - +external libraries used by LiveSupport
    +
  • +
+Both files can be downloaded from http://sourceforge.net/projects/livesupport/. +
+
+After downloading the files, untar them in the same directory:
+
+
tar xfj livesupport-<version>.tar.bz2
tar xfj livesupport-libraries-<version>.tar.bz2
+
+which will create a livesupport-<version> +directory, with all the required files to compile and install +LiveSupport.
+

Compiling LiveSupport

+To compile LiveSupport, enter the LiveSupport directory, and execute +the following commands:
+
+
cd livesupport-<version>
./configure
--prefix=/usr/local/livesupport --with-apache-group=apache --with-www-docroot=/var/www
make
+
+Note that you need to have write permissions in the prefix directory +when you run make. +The configure options used above are the options most probably used:
+
+
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
+The installation directory. Supply the previously +decided LiveSupport installation directory here, <ls-installdir> +(as mentioned above). A sensible value to use here is /usr/local/livesupport.
+

--with-apache-group use apache running in the specified group (apache)

+The user group the apache web server daemon runs at (see the section +above on installing apache). Supply the <apache-group> +value here, as mentioned above, which is usually either apache +or www-data.
+
+
  --with-www-docroot      deploy LiveSupport under the specified docroot
(/var/www)

+The document root of your apache installation (see the section above on +installing apache). Supply the <www-root> +value here, as mentioned above, which is usually /var/www +or /var/www/htdocs +or /var/www/<yourhost>/htdocs. +
+
+
Compilation will take quite a while, so go have a tea, watch a +movie, relax, +etc.
+
+If you want the installation script to create the database tables used +by LiveSupport, consider using the following configure options:
+
+
  --with-create-database  specify whether the LiveSupport database and database
user should be created (no)
--with-create-odbc-data-source
specify whether the ODBC data source for LiveSupport
should be created (no)
--with-init-database specify whether the LiveSupport database tables
should be initialized (no)
--with-configure-apache specify whether apache should be configured for
LiveSupport through its conf.d directory (no)


+For a full list of options, see ./configure --help
+

Installing LiveSupport
+

+After a successful compilation, to install LiveSupport, you can install +LiveSupport by typing:
+
+
make install
+
+This will install LiveSupport into the directory specified to the +configure script. It will also create necessary database tables, +depending on the invocation of the configure script. You need to run +make install as root.
+
+

Try it out

+After a successful installation, the LiveSupport scheduler has to be +started. The scheduler has a System V runlevel-style startup script, +under <ls-installdir>/bin/scheduler.sh. To start the scheduler, +simply invoke:
+
+
<ls-installdir>/bin/scheduler.sh start
+
+The only thing left to do is to try out the LiveSupport web interface +or the GUI application.
+
+For the web interface, point your browser to the following URL: http://<yourhost>/livesupport/ +.
+
+The GUI application can be started by issuing the following command:
+
+
<ls-installdir>/bin/gLiveSupport.sh
+
+For your first login, use the following values:
+
    +
  • username: root
  • +
  • password: q
  • +
+Have fun!
+
+
+
+ + diff --git a/campcaster/doc/ls_pref.html b/campcaster/doc/ls_pref.html new file mode 100755 index 000000000..f312f2ed3 --- /dev/null +++ b/campcaster/doc/ls_pref.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key nameTypeFormatComment/Example
Station Preferences:

Stored for group „StationPrefs“
stationMaxfilesizeInt
Size in bytes
stationFrequencyString
String because comma, minus
stationNameString

stationLogoPathString
Valid path and filename. Relative/absolute?
stationURLString
Valid URL




User Preferences:


scratchPadContentsString$gunid:YYYY-MM-DD $gunid2:YYYY-MM-DD [...]7517812295906073177:2005-02-02 5680267281985233061:2005-01-15
playlistTokenString$playlistId:$token23:28f641eb921c2cb5
TimeFormatInt12 | 24
+ + + + diff --git a/campcaster/doc/manual/LiveSupport Studio manual.sxw b/campcaster/doc/manual/LiveSupport Studio manual.sxw new file mode 100644 index 000000000..18adcc3c9 Binary files /dev/null and b/campcaster/doc/manual/LiveSupport Studio manual.sxw differ diff --git a/campcaster/doc/manual/index.html b/campcaster/doc/manual/index.html new file mode 100644 index 000000000..b1944acd5 --- /dev/null +++ b/campcaster/doc/manual/index.html @@ -0,0 +1,1184 @@ + + + + + Live support Studio … + + + + + + + +

1.0 LS +Studio: A live radio show assistant

+

Live Support Studio is +the part of LiveSupport that completely does the on air playback +function inside a radio station's live studio but also includes all +known automation elements.

+


+

+

LS Studio can be +installed on the user’s machine placed inside the broadcast +studio and connected with the audio mixing board that distributes an +audio signal to the transmitter or live stream system. From there, +the user can manage the content to be broadcast live on-air. Users +also have the option of searching and browsing the audio library of +the radio station or the system it belongs to - starting from general +search criteria to the smallest search details.

+


+

+


+

+

Note: +LiveSupport Studio is not software for dynamic reduction +equalization or audio signal post processing - it doesn’t make +any major dynamic signal improvement.

+


+

+

If +you want to edit and do additional processing of radio signals +afterwards, we recommend (before any distribution of audio signal +towards the transmitter) to use a known standalone dynamic reduction +tool (dynamic compression, DeEsser, level maximizing) for pseudo +acoustic improvements of the sound spectrum and listening impression.

+


+

+

LiveSupport Studio is +intended to be used on an independent playback machine that has two +working modes:

+
    +
  • Live Automatic + mode - which broadcasts a radio program without studio crew with + a system of permanent automation and outside programming

    +
  • Live Assist + mode - that does the live programming, and works as a live + assistant machine. Users can manage the contents to be broadcast + live on-air. In addition, by searching and browsing the audio + archive on the LS Storage component, the user can line up and set + files and playlists to be ready for broadcast.

    +
+

Live +Support Studio, whether in Automatic or Live Assist mode, has almost +the same appearance.

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

1.0.1 Live Automatic mode

+


+

+

In Live Automatic mode, +a radio program is broadcast without studio personnel. Files in +playlists in this mode are snapped together automatically one after +another (clean snap), together with all user-predefined functions +and settings determined in the playlist editor.

+


+

+

Basically, the +broadcast process looks like this: song – mix - next +song.

+


+

+

Note: +Live Automatic mode is currently the only mode LS Studio has. Changes +take place frequently, so +check the LiveSupport homepage at http://livesupport.campware.org +often. +

+


+

+
    +
      +
        +
      1. Live Assist mode

        +
      +
    +
+


+

+

Live Assist mode can be +considered as a live jingle machine with the function of adding audio +material by users, whether they are program moderators, audio +technicians, announcers, DJs or MCs (depending on your radio +station’s orientation).

+


+

+

As a live jingle +machine, Live Assist mode broadcasts audio files one by one (song by +song), according to the broadcast scheduler and previously-created +playlists. After the audio file is played, the list stops, waiting +for the user’s next start command. +

+

+

+

So that the broadcast +process looks like: song – stop – manual play - +next song.

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

1.1 +Accessing LiveSupport Studio

+


+

+

When starting the +computer with LiveSupport installed from the demo/install CD - you +will find the LS Studio icon on the desktop. +

+


+

+

After starting the +LiveSupport application on your studio machine, the Master Panel will +appear, allowing you to login into the system and giving you +essential information about the station time and logo as well as what +is currently in the program.

+


+

+

1.2 + Master Panel

+


+

+

When starting +LiveSupport Studio, the Master Panel appears in the upper part of the +screen, remaining on the screen as your friendly assistant the whole +time you work on your computer. +

+


+

+

No matter in what mode +of LS Studio you are working in, the Master Panel displays:

+


+

+
    +
  • time field + - displaying the time at your radio station

    +
  • play/pause + button - with the function of playing/pausing the item directly + on air

    +
  • stop button + - with the function of stopping the item directly in the on-air + program

    +
  • Now Playing + field – displaying the name of the file that is in the + broadcast, together with the additional information such as elapsed + time and remaining time of the audio file.

    +
  • Next Playing + field - displays the next file in line for broadcast, + also with additional information about length and the exact + starting time of the file, with already calculated mix time between + audio slots

    +
  • VU meter + field - for measuring the audio signal + level in program (as a standard). This is the first indicator + showing the user if something is wrong with the sound, if there are + system blocking errors, if audio file plays with no sound…

    +
+

+Note: The content of the +Next Playing and VU meter fields is currently neither available nor +visible. This is only a short description what these fields will +indicate in an upcoming version of LiveSupport.

+
    +
  • + logo of your radio station - this can + be set from a separate administration panel

    +
  • log in’ + button - you need to click 'log in' if you want to enter the + Live Support Studio environment. When you are logged in, the button + changes to ‘log out’;

    +
  • Exit button, + which you need to click if you want to exit the whole application. + The popup window will then appear asking you to confirm if you are + sure in this action. +

    +
+


+

+


+

+


+

+


+

+


+

+


+

+

1.3 + Login/Logout

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

Clicking the ‘log +in’ button on the Master Panel, you get to the login palette, +which displays the following :

+
    +
  • Login field + - where you need to enter your personal user name assigned to you by + your system administrator (the default user name is root)

    +
  • Password field + - where you enter your password as assigned by your system + administrator (the default password is q)

    +
  • The Language + drop-down menu – + where you can select one of the available user interface + localizations of LiveSupport Studio from the list. The default + language is English, but you can use one of the other localized + versions we supply.

    +
+

The +selected language will last as long as you are logged into the LS +Studio application. When you log out and then log in for a second +time, you won’t have to choose the interface language again, as +it will be remembered. You will only need to choose the language +again if you quit LS Studio completely and start the program again.

+
    +
  • Cancel + and OK buttons - which allow you to confirm the + login or cancel the operation.

    +
+

After +successfully presenting on the system and logging in into LiveSupport +Studio, you will be able to see the following:

+
    +
  • + The Master Panel - with basic information of your + radio station (time and logo), the track currently being played out + by the scheduler and play/stop functions of the audio slot.

    +
  • The Navigation + Menu – buttons for all the main functions you need + for operating LiveSupport Studio, depending on your user rights and + permissions (previously determined by administrator)

    +
+

+

+

+

Recommendation:

+

We +recommend that you, as an user, logout after every session, when +finishing your part of the radio program. The reason for this is +special settings and user rights that are connected only to you and +nobody else.

+

If +you are using Live mode after another user, you can simply logout +your colleague and login yourself – in order to start the new +session that logs you as an author with your personal specified +rights and saved settings, and all audio files and playlists you left +in the ScratchPad the last time.

+



+

+



+

+

1.4 + Navigation Menu

+

The +Navigation Menu contains all the main functions you need for +operating Live Support Studio. It is located in the lower part of the +Master Panel, and is visible there throughout the whole user’s +session. +

+

The +Navigation Menu consists of the following functions:

+
    +
  • + Live Mode button – for quick change of your working + mode during the broadcast

    +
  • Upload file + button - for uploading sound files into either the playlist or + the ScratchPad

    +
  • ScratchPad + button – opens the palette containing all recent files and + playlists uploaded and created by currently logged-in user

    +
  • Playlists + button – for creating and editing simple playlists + (changing file place in the list, changing fades...)

    +
  • Scheduler + button – for playlist scheduling and reviewing of daily + broadcast schedule

    +
  • Search + button – search and browse audio clips available in the + LiveSupport storage server using the search criteria you set

    +
+


+

+
    +
      +
    1. Live + Mode

      +
    +
+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

Clicking on the ‘Live +Mode’ button in the Navigation Menu opens up a new palette on +the screen below the Master Panel. +

+


+

+

The Live Mode palette +contains:

+
    +
  • play button + (large in size)– plays the selected files immediately, + interrupting whatever is currently playing

    +
  • preview + (cue) buttons – play/pause and stop button – + gives users the option of pre-listening to audio files before + playing them on air. +

    +
  • Space under the + preview and play buttons is set to contain the list of audio + slots (playlists, single files…) created by the user . +

    +
+


+

+

When the Live mode +palette opens, the space below the play and preview buttons is blank. +User can create there the list of audio files (if he or she works in +Live mode), that are going to be broadcasted by the determined order. +Playlist cannot be saved in this palette, but from the other function +palettes that user access on some other way.

+


+

+

Note: Live Mode +currently works ‘automatically’ (files are played +automatically one after another). An upcoming version will also +include working as ‘live assistant’ (that means +that user plays one song after another). +

+


+

+

The list of files in +Live Mode represents your temporary playlist that will be broadcast +either song by song or automatically, depending on how you set it.

+


+

+

Inserted audio files +display as rows, one after another. Each row contains:

+
    +
  • each + file's number in the playout order (a file in the master panel is + always #1)

    +
  • the + file's title, its creator, and duration +

    +
+

Right-clicking your +mouse on an audio file inserted into Live Mode will bring up a +context menu offering you the following options:

+
    +
  • Preview + (has the same role as the preview buttons in the upper part of the + Live Mode palette, allowing the user to pre-listen to an audio file + before playing it)

    +
  • Move + up (gives the user the option to move the file up in the live + mode playback order)

    +
  • Move + down (gives the user the option to move the file down in the + live mode playback order )

    +
  • Remove + (gives the user the option to remove a file from the live mode list)

    +
  • Play + (has the same function as the play button above the list. When the + 'play' option is selected, the already-scheduled playlist in the + Master Panel's 'Now Playing' window automatically interrupts and + plays the selected file from Live mode)

    +
+


+

+


+

+


+

+

Note: +A playlist is the physical list of audio files that will be +broadcast in the order the user determines. A created playlist, when +saved in the system, appears as a single file and not as the whole +list. When playing, a playlist will appear as a single audio file +with the total duration of its parts. +

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

Creating +mini-playlists is usually very important and highly recommendable. In +practice, the sales department can create a playlist of commercials +that lasts from 2-4 minutes and contains up to 10 short audio +commercial spots. These mini-playlists are saved in the system as +advertising blocks and have a pre-determined time for broadcast.

+

The program creator +than can simply upload the complete advert playlist from the sales +department, instead of inserting ads file by file. +

+

1.6 +Upload file

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

The 'upload file' +option allows you to upload files from your local computer, +LiveSupport server or any other available source into the system. It +then appears in the ScratchPad.

+

Browsing the audio +archive or any other source or disc, user can find the audio file +they wanted, add or edit its metadata information (the descriptions +that help others to find the file) and upload it to the ScratchPad, +where the uploaded file becomes the topmost item in the ScratchPad +list.

+


+

+


+

+

The 'upload file' +palette consists of the following elements:

+


+

+
    +
  • Browse + button – gives you the option of browsing all available + sources from your local computer and LS server and selecting the + desired file

    +
  • File name + tab - where the selected file path will appear

    +
  • Main, Music + and Talk tabs – where metadata information (such as the + information stored in an MP3 file's ID3 tags) can be added or + edited. +

    +
  • The + Main tab is the default + active tab which stores basic metadata for any sound file. Main tab + contains the following metadata fields:

    +
+
    +
  • Title + (lets you specify the title of the clip)

    +
  • Creator + (lets you specify the author of the clip)

    +
  • Genre + (lets you specify the genre of the clip)

    +
  • Description + (lets you create a short description for the audioclip)

    +
  • Duration + (is automatically detected and cannot be altered)

    +
+

+
+

+

Note: +If an MP3 file is uploaded, LiveSupport will automatically use the +information stored in its ID3 tags, if there is any.

+
    +
  • + The Music tab allows + you to view, add and store metadata that is specific to music files. + A large number of description fields available for users to input, + such as: Album, Year, BPM, Rating, Mood, and so on.

    +
  • The Talk tab + allows you to specify metadata that is relevant for voice recordings + (e.g. news reports, interviews, soundbites, etc.). It allows + reporters to input time and date of the reported voice file is about + (which is likely to be different than the time it is uploaded), the + location of the item being covered and the organization being + covered, as well as to input short info about its content and theme.

    +
  • Cancel button + – cancels the whole operation and exits the palette

    +
  • Upload + button – which you need to click to upload the selected + file and complete the uploading process

    +
+

Once +you finish with uploading and creating the file's metadata, the +selected file will be transferred to the ScratchPad (you can see that +it appears at the top of the ScratchPad list). + +

+
    +
      +
    1. ScratchPad

      +
    +
+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

As in LiveSupport +Station, the ScratchPad represents your workspace during your entire +session. It can be used for loading all the materials (audio files, +playlists…) you find necessary for creating your program. The +ScratchPad also displays a list of all files you have worked with +recently, and could be described as a cross between a web browser's +history window and the clipboard.

+

Clicking on the +ScratchPad button on the Navigation menu opens the ScratchPad +palette. It consists of the following elements:

+
    +
  • Preview + buttons – play/pause and stop button - gives you the + option of pre-listening and quick-checking audio files before using + them in Live Mode or a playlist.

    +
  • The Type column – + contains icons indicating the type of item you are working with. An + icon's appearance is the same as in LiveSupport Station – + audioclips are marked with a green note, playlists with a red note, + and webstreams with a blue transmission symbol.

    +
  • The Title column – + displays the title of the items (audioclips, playlists, webstreams)

    +
  • Add to playlist button - + allows you to insert the selected file into a playlist by opening + the Playlist palette and placing the selected file into it. +

    +
  • Clear list button – + deletes all items from the ScratchPad

    +
  • Remove item(s) button – + deletes one or more files from the ScratchPad

    +
+

In +order to perform operations with individual files, you can click the +right mouse button on an individual item in the ScratchPad. A popup +menu will appear, offering you the following options (referring to +the audioclips and playlists):

+
    +
  • + Add to Playlist ( where + you can add the selected item into a new playlist)

    +
  • Move + up (lets you move the file up in the ScratchPad list)

    +
  • Move + down (lets you move the file down in the ScratchPad list)

    +
  • Remove + (gives you the option of removing the file from the ScratchPad list)

    +
  • Preview + (for pre-listening and quick-checking audio clips in the + ScratchPad)

    +
  • Add + to Live Mode (for adding the selected file into the Live Mode + list, waiting for the user's command to be played, or to be played + automatically)

    +
+

The ScratchPad +has additional options for playlists only. If you right-click on a +playlist, additional actions offered will include: +

+
    +
  • Edit + playlist (redirects you to the simple playlist editor in the + Playlist palette, for adding or removing files from the playlists, + additional playlist editing, changing transitions or file order)

    +
  • Schedule + (redirects you to the Scheduler palette, for scheduling and + programming the whole playlist by selecting the exact date and time + for its broadcast)

    +
+

+
    +
      +
    1. Playlists + / Simple playlist editor

      +
    +
+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+


+

+

Playlists +can be edited and created in the Playlists palette, which, at the +same time, works as a simple playlist editor. +

+

This +function allows you to execute various operations such as:

+
    +
  • + Creating a new playlist ,

    +
  • Adding and + removing files from the ScratchPad to a playlist, which may includes + adding playlists inside playlists (such as commercial breaks or mini + playlists inside a larger show)

    +
  • Editing – + simple edit functions, such as changing file order, changing + transitions and other features

    +
+

You +can add a file (sound file or playlist file) from the ScratchPad +to the active or new empty playlist by:

+
    +
  • + right- clicking on the item (either a sound file or playlist) in the + ScratchPad and +

    +
  • selecting Add + to playlist. +

    +
+



+

+

You +can also edit the existing playlist in the Playlists palette +by:

+
    +
  • + right-clicking on the playlist in the ScratchPad and

    +
  • selecting Edit + from the popup menu +

    +
+

The +Playlists palette will then appear, displaying:

+
    +
  • + The Name field in + the upper part of the palette, where you have to enter the title of + your playlist

    +
  • The first column + on the left displays the start time of the playlist, file by + file, starting from zero. Start time for the next item is + calculated automatically.

    +
  • The Title + column displays names of the files, playlists or streams. +

    +
  • The Length + column lists the duration of each item +

    +
  • The Fade in and + Fade out column displays the increasing/decreasing curve + transition value during the item's enter/exit, from zero to full + level (for fade in) and from full level to zero (for fade out). The + transition value for fade in or fade out is measured in milliseconds + (1/1000 of a second), and the default transition is set to zero.

    +
  • Under the table + there is a checkbox , offering you the option to lock a fade out to + follow the previous fade in, so that there is a mix between items – + like a crossfade.

    +
+

+Note: As of version 1.0.2, fade in and fade out options are +currently unavailable, as well as the checkbox field.

+

If +there are no items entered in the playlist, the space below the Name +field remains blank.

+
    +
  • + The Save button + enables you to save all your changes and your work. +

    +
+

+The saved playlist will now be visible in the ScratchPad, and the +text in the lower left part of the palette will inform you that your +playlist have been saved. This includes saving all actions (moving +files, adding or removing, changing fades) that will be visible in +the playlist the next time you open it.

+
    +
  • + The close button + will close the current playlist, cancel the whole operation and exit + the Playlists palette. Before exiting, popup window will appear + offering you to previously save the playlist.

    +
+

Right-clicking +on the items in the playlist gives you additional options for +playlist editing:

+
    +
  • Move + Up – lets you move the file up in the opened playlist and + change its file order

    +
  • Move + Down – lets you move the file down in the opened playlist

    +
  • Remove + – lets you remove a file from the playlist. The file still + remains in the system, however.)

    +
+


+

+

1.9 + Scheduler

+


+

+

The Scheduler +palette allows you to automate (schedule) your playlist for broadcast +at a predefined date and time.

+

Clicking on the +Scheduler button in the Navigation menu opens up a palette similar to +the Scheduler Navigator from LiveSupport Station. The palette appears +as a monthly calendar and contains the following elements:

+
    +
  • Monthly + calendar, with selected date marked in blue. Above the calendar + is a row where you can select the month and year you want to review. + Changes will then alter the calendar below according to the selected + month and year.

    +
  • A + table displaying precisely scheduled playlists (‘to + the second’) on the selected date from the calendar.

    +
  • The first column displays the + exact date and time for the playlist start

    +
  • The second column displays the + title of the playlist

    +
  • The third column displays the + exact date and time for the playlist end

    +
+

1.9.1 Adding playlists to the Scheduler

+

After +you have created and edited a playlist in the Playlists palette, it +will be available in the ScratchPad and can be added to the Scheduler +by:

+
    +
  • + right- clicking on the saved playlist in the ScratchPad and +

    +
  • selecting + Schedule option from the popup menu. +

    +
+

That +action opens a new Schedule palette, similar to the previous one, +allowing you to determine the exact date and time for the selected +playlist to start and to enter it into the scheduler table. The +default date will be your current date. Besides the monthly calendar, +this Schedule palette contains:

+
    +
  • + hour and minute field – where you have the option to + enter the exact time for the selected playlist to start, consistent + with existing scheduled playlists.

    +
  • Schedule button + - accepts all entered information for scheduling date and time. + Clicking on the Schedule button automatically closes the palette and + enters the playlist into the scheduler at the specified date and + time. You can now see it’s title, start and end time, in the + table under the calendar with already scheduled playlists.

    +
  • Close + button closes the palette and cancels the whole operation

    +
+

1.9.2 Removing playlists from the Scheduler

+

You +can remove a playlist from the Scheduler by right clicking on a +scheduled playlist in the table and selecting Delete. This +removes the playlist from the Scheduler , but does not remove it +completely from the system. The playlist and the items inside it +stays in the ScratchPad for the next use.

+

1.10 +Search

+

The +search palette allows you to search (on either a simple or advanced +level) and browse the archive of available files in LiveSupport's +storage server, in order to use them for creating playlists, +scheduling or creating Live Mode lists. You can start looking for +audioclips not only by title, but also by general searching metadata +criteria down even to the smallest search details. +

+

The +main part of the Search palette are tabs that gives you the option to +choose what type of searching and browsing you want to use:

+
    +
      +
        +
      1. + Search - that works as a simple search engine

        +
      2. Advanced + Search – lets you set + multiple criteria for searching

        +
      3. Browse

        +
      +
    +
+

All +functions allow you to search for sound files as well as playlists +and webstreams.

+

+

+

+

1.10.1 Simple search

+


+

+



+

+



+

+



+

+



+

+



+

+



+

+



+

+

The +Search (simple search) option works as a basic simple search engine. +The user types a keyword into the search field, and then presses the +Search button. +

+

In +the simple search option, the search process is based on keywords +that you enter, and can represent complete words, phrases, or only a +part. Keywords must refer to the information stored in either the +title or creator fields; these are the only metadata +criteria enabled in the simple search mode.

+

1.10.2 +Advanced Search

+



+

+



+

+


+

+


+

+


+

+


+

+


+

+


+

+

Advanced Search also +works as a regular search engine. As in simple search mode, you can +search the metadata that you and other LiveSupport users have input +during the upload process. The main difference is that Advanced +Search allows you to select as much metadata criteria as you find +relevant to make your search successful. All the search results will +appear at the bottom of the search palette.

+

The +Advanced Search tab contains the following elements:

+
    +
  • + Search field with three types of criteria in one row; +

    +
  • The left pulldown + menu allows you to select one metadata criterium you find relevant + for the search. You can choose any metadata that LiveSupport offers + and users have input to describe audio content (title, genre, + length, album, mood, bitrate). +

    +
  • The middle + pulldown menu enables you to refine your search by selecting + whether the word you enter will represent + a value exactly equal to the metadata value + (title, composer, etc.), a part of the metadata value, or the + beginning of the metadata value.

    +
  • In the third + blank field, you should enter the keyword you are searching for.

    +
  • The + sign + located on the right allows you to add extra sets of criteria by + clicking on the + sign located on the right of the search terms. + You can add as many rows you need to refine your search. Clicking on + the X sign removes a row. +

    +
+

+By selecting more categories in the pulldown menu, and adding +additional search rows, you can set your search process to be more +precise and narrow your search results.

+
    +
  • + Clicking on the Search button starts the searching + process.

    +
+

1.10.3 Browse

+

+

+

+



+

+



+

+


+

+



+

+



+

+

Like +in LiveSupport Station, the Browse function in LiveSupport Studio +allows you to browse all files from the server according to general +criteria you specify. In order to narrow search results as much as +possible, the browse function gives you the opportunity to choose +between similar files that are in the same subcategory. +

+

The +browsing process is divided into three columns with the same list of +offered criteria.

+
    +
  • + The pulldown menu in the first column lets you choose the metadata + category to browse from. You can choose any metadata that + users have input to describe the files.

    +
  • Under that + category, the pulldown menu of the second column allows you to + choose one of the options that appear in the chosen category, which + refines the number of displayed + files. +

    +
  • The third + column works the same way and lets you continue refining + and narrowing your results by entering first the category, and then + selecting the option or an item displayed in the field below.

    +
+

Note: + It is in your best interest to choose as many categories as you +need, in order to refine and narrow search results and to find the +file quickly among the thousands of files in the server.

+

Whether +you choose simple Search, Advanced search or Browse option, the +search results will appear at the bottom of the palette in the table +containing Type, Title, Creator and Length of the resulting +file. +

+

By +right clicking on an item (audio file, playlist or a webstream) in +the search result table, a menu appears offering operations:

+
    +
  • + Add to ScratchPad

    +
  • Add + to Live Mode

    +
+


+

+

2. Additional information

+

2.1 Where to go for more help

+

You +can visit LiveSupport's discussion forums online at +http://livesupport.campware.org. +There you will also find program updates and other useful +information.

+


+

+

2.2 How to report bugs

+

LiveSupport +needs your input to constantly improve. If the software doesn't +behave as it should, please let us know about it by entering a +trouble ticket at http://code.campware.org/projects/livesupport. +That way, the LiveSupport team can keep track of your problem and you +can check to see whether it has been fixed.

+ + \ No newline at end of file diff --git a/campcaster/doc/manual/manual_htm_159b8718.jpg b/campcaster/doc/manual/manual_htm_159b8718.jpg new file mode 100644 index 000000000..2a7577b3c Binary files /dev/null and b/campcaster/doc/manual/manual_htm_159b8718.jpg differ diff --git a/campcaster/doc/manual/manual_htm_3098a412.jpg b/campcaster/doc/manual/manual_htm_3098a412.jpg new file mode 100644 index 000000000..396ff6ff2 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_3098a412.jpg differ diff --git a/campcaster/doc/manual/manual_htm_4d262ba6.png b/campcaster/doc/manual/manual_htm_4d262ba6.png new file mode 100644 index 000000000..4567143e3 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_4d262ba6.png differ diff --git a/campcaster/doc/manual/manual_htm_59ef6c7.jpg b/campcaster/doc/manual/manual_htm_59ef6c7.jpg new file mode 100644 index 000000000..b22c04b12 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_59ef6c7.jpg differ diff --git a/campcaster/doc/manual/manual_htm_5f12d0a5.jpg b/campcaster/doc/manual/manual_htm_5f12d0a5.jpg new file mode 100644 index 000000000..b467df77c Binary files /dev/null and b/campcaster/doc/manual/manual_htm_5f12d0a5.jpg differ diff --git a/campcaster/doc/manual/manual_htm_6e566889.png b/campcaster/doc/manual/manual_htm_6e566889.png new file mode 100644 index 000000000..faa4268a7 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_6e566889.png differ diff --git a/campcaster/doc/manual/manual_htm_7c768cd8.png b/campcaster/doc/manual/manual_htm_7c768cd8.png new file mode 100644 index 000000000..d1a61a1c4 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_7c768cd8.png differ diff --git a/campcaster/doc/manual/manual_htm_b09f4d5.jpg b/campcaster/doc/manual/manual_htm_b09f4d5.jpg new file mode 100644 index 000000000..5b62ae835 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_b09f4d5.jpg differ diff --git a/campcaster/doc/manual/manual_htm_m3d23fe65.png b/campcaster/doc/manual/manual_htm_m3d23fe65.png new file mode 100644 index 000000000..6a9bb84c1 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_m3d23fe65.png differ diff --git a/campcaster/doc/manual/manual_htm_m59d803c0.jpg b/campcaster/doc/manual/manual_htm_m59d803c0.jpg new file mode 100644 index 000000000..88fef2386 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_m59d803c0.jpg differ diff --git a/campcaster/doc/manual/manual_htm_m6e4aac82.jpg b/campcaster/doc/manual/manual_htm_m6e4aac82.jpg new file mode 100644 index 000000000..18fc12686 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_m6e4aac82.jpg differ diff --git a/campcaster/doc/manual/manual_htm_m75ba079b.png b/campcaster/doc/manual/manual_htm_m75ba079b.png new file mode 100644 index 000000000..5db6edf67 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_m75ba079b.png differ diff --git a/campcaster/doc/manual/manual_htm_m79fcafa8.jpg b/campcaster/doc/manual/manual_htm_m79fcafa8.jpg new file mode 100644 index 000000000..cb33ed118 Binary files /dev/null and b/campcaster/doc/manual/manual_htm_m79fcafa8.jpg differ diff --git a/campcaster/doc/model/Architecture.svg b/campcaster/doc/model/Architecture.svg new file mode 100644 index 000000000..9bacf14e6 --- /dev/null +++ b/campcaster/doc/model/Architecture.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Scheduler + + + + + + + + + + + Local storage + + + + + + + + + + + Media archive + + + + + + + + + + + Authentication + + + + + + + + + + + Playlist editor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/campcaster/doc/model/Authentication/Authenticateuser_SequenceDiagram.svg b/campcaster/doc/model/Authentication/Authenticateuser_SequenceDiagram.svg new file mode 100644 index 000000000..f0749190e --- /dev/null +++ b/campcaster/doc/model/Authentication/Authenticateuser_SequenceDiagram.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + user + + + + : + + + + User + + + + + + + + + + system + + + + : + + + + Authentication + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + diff --git a/campcaster/doc/model/Authentication/Concepts.svg b/campcaster/doc/model/Authentication/Concepts.svg new file mode 100644 index 000000000..40419681f --- /dev/null +++ b/campcaster/doc/model/Authentication/Concepts.svg @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Authentication + + + + + + + AuthenticationInfo + + + + + + + + + + + + + + + AuthenticationInterface + + + + + + + AuthenticationDatabase + + + + + + + + + + + + + + + Authentication + + + + + + + + + + + + + + + + + + + + + + + + + + + * + + + Stores + + + + + + + + + + + + Checks authentication info in + + + + + + + User + + + + + + + + + + + + + + + + + + + + Authenticates by + + + + + + + + + + + + Contains + + + diff --git a/campcaster/doc/model/Authentication/EssentialUseCases.svg b/campcaster/doc/model/Authentication/EssentialUseCases.svg new file mode 100644 index 000000000..e9d9969d2 --- /dev/null +++ b/campcaster/doc/model/Authentication/EssentialUseCases.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Authentication + + + + + + + + + UC-1 Authenticate user + + + + + + + User + + + + + + diff --git a/campcaster/doc/model/Authentication/Systembehaviour.svg b/campcaster/doc/model/Authentication/Systembehaviour.svg new file mode 100644 index 000000000..db94174e9 --- /dev/null +++ b/campcaster/doc/model/Authentication/Systembehaviour.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Authentication + + + + + + + + + + + + + + + AuthenticationInterface + + + + + + + + + + + authenticate + + + ( + + + authInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + << + + + realize + + + >> + + + + + + + + + diff --git a/campcaster/doc/model/Authentication/index.html b/campcaster/doc/model/Authentication/index.html new file mode 100644 index 000000000..421ebf15f --- /dev/null +++ b/campcaster/doc/model/Authentication/index.html @@ -0,0 +1,500 @@ + + + + + LiveSupport Authentication specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document contains the specification of the LiveSupport +Authentication component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Authentication component is to provide +authentication services by receiving authentication information and +checking these against an authentication database. +

Goals

+The authentication component is a re-usable component, which provides +both local and remote interfaces. Different authentication methods may +be supported, with username / password authentication being the most +trivial.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Authenticate users
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
local interface
+
locally callable API
+
must
+
A1.3
+
remote interface
+
remote interface via some RPC method like +XML-RPC or SOAP
+
want
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Authenticate user
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Authenticate user
type primary, essential
actors User
purpose Authenticate a user
overview The user contacts the Authentication module with +the intention of verifying his integrity.
references F1.1
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. User connects to the authentication component +with the intention of authenticating
+

+

+
2. The User provides authentication +information 3. The system checks the authentication information +againts its internal database, and informs the user if the provided +information was correct.

+

+

+

+
+
+

Alternate courses

+none
+
+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Authentication database
+
A database containing authentication +information, against which user-sent authentication information can be +checked.
+
Authentication
+
Component responsible for doing the +authentications
+
Authentication info
+
The information a user sends during +authentication, provides the basis for authentication
+
User
+
The party that wants to authenticate
+
Authentication interface
+
The local or remote interface for authentications
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
Authentication
+
Checks authentication info in
+
Authentication database
+

+
Authentication database
+
Stores
+
Authentication info
+

+
User
+
Contains
+
Authentication info
+

+
User
+
Authenticates by
+
Authentication interface
+

+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Authenticate user
+

+ +
+

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for AuthenticationInterface : authenticate

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
authenticate
+(authInfo : AuthenticationInfo)
+: boolean
+
Responsibilities
+
Check if the the +provided authentication info is recognized.
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+

+
Exceptions
+
none
Output
+
true if the provided +authentication is recognized, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+
+ + diff --git a/campcaster/doc/model/LiveSupport.zuml b/campcaster/doc/model/LiveSupport.zuml new file mode 100644 index 000000000..4114136bc Binary files /dev/null and b/campcaster/doc/model/LiveSupport.zuml differ diff --git a/campcaster/doc/model/LocalStorage/Accessplaylist_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Accessplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..482bf1425 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Accessplaylist_SequenceDiagram.svg @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + audio player + + + + : + + + + Audio player + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + : + + + releasePlaylist + + + ( + + + playlist + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + accessPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authinfo + + + ) + + + + + + + diff --git a/campcaster/doc/model/LocalStorage/Accessrawaudiodata_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Accessrawaudiodata_SequenceDiagram.svg new file mode 100644 index 000000000..22cd1d9c3 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Accessrawaudiodata_SequenceDiagram.svg @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + audio player + + + + : + + + + Audio player + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + accessRawAudioData + + + ( + + + audioClipId + + + ) + + + + + + + : + + + releaseRawAudioData + + + ( + + + rawAudioData + + + ) + + + + + + + diff --git a/campcaster/doc/model/LocalStorage/Concepts.svg b/campcaster/doc/model/LocalStorage/Concepts.svg new file mode 100644 index 000000000..3a02c7323 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Concepts.svg @@ -0,0 +1,633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Local storage + + + + + + + AudioClip + + + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + + + Authentication + + + + + + + + + + + + + + + + + + + RawAudioData + + + + + + + + + - + + + currentlyAccessing + + + : + + + int + + + + + + + + + + + + + isAccessed + + + ( + + + ) + + + : + + + boolean + + + + + + + MetaData + + + + + + + + + + + + + + + + + + + + + + Contains + + + + + + + + + + Is described by + + + + + + + UniqueId + + + + + + + + + + + + + + + + + + + + + + Is identified by + + + + + + + SearchCriteria + + + + + + + + + + + + + + + + + + + Playlist + + + + + + + + + + + + + + + + + + + + + + is identified by + + + + + + + Audio player + + + + + + + + + + + + + + + + + + + Storage maintainer + + + + + + + + + + + + + + + + + + + + + + Is authenticated by + + + + + + + + + + Is authenticated by + + + + + + + + + + Manages + + + + + + + + + + Accesses + + + + + + + + + + Searches in + + + + + + + + + + Searches by + + + + + + + + + + Accesses + + + + + + + + + + Manages + + + diff --git a/campcaster/doc/model/LocalStorage/Createplaylist_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Createplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..c1c231672 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Createplaylist_SequenceDiagram.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authinfo + + + ) + + + + + + + + + + + : + + + createPlaylist + + + ( + + + playlistId + + + ) + + + + + + + diff --git a/campcaster/doc/model/LocalStorage/Deleteaudioclip_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Deleteaudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..a959af855 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Deleteaudioclip_SequenceDiagram.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudioClip + + + ( + + + audioClipId + + + ) + + + diff --git a/campcaster/doc/model/LocalStorage/Deleteplaylist_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Deleteplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..ad5445b34 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Deleteplaylist_SequenceDiagram.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authinfo + + + ) + + + + + + + + + + + : + + + deletePlaylist + + + ( + + + playlistId + + + ) + + + + + + + diff --git a/campcaster/doc/model/LocalStorage/Editplaylist_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Editplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..cf3fa116c --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Editplaylist_SequenceDiagram.svg @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authinfo + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + editPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + : + + + savePlaylist + + + ( + + + playlist + + + ) + + + + + + + diff --git a/campcaster/doc/model/LocalStorage/EssentialUseCases.svg b/campcaster/doc/model/LocalStorage/EssentialUseCases.svg new file mode 100644 index 000000000..fe182a4ed --- /dev/null +++ b/campcaster/doc/model/LocalStorage/EssentialUseCases.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + + + + + + + + + + + UC-1 Store or update + Audio clip + + + + + + + UC-2 Delete Audio clip + + + + + + + UC-3 Update Audio clip + metadata + + + + + + + UC-4 Access raw audio data + + + + + + + UC-5 Search in metadata + + + + + + + UC-6 Create playlist + + + + + + + UC-7 Edit playlist + + + + + + + UC-8 Delete playlist + + + + + + + UC-9 Access playlist + + + + + + + Storage maintainer + + + + + + + Audio player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/campcaster/doc/model/LocalStorage/Searchinmetadata_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Searchinmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..787e602c0 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Searchinmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + matchingUniqueIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + diff --git a/campcaster/doc/model/LocalStorage/Storeorupdateaudioclip_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/Storeorupdateaudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..f83d68b99 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Storeorupdateaudioclip_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/campcaster/doc/model/LocalStorage/Systembehaviour.svg b/campcaster/doc/model/LocalStorage/Systembehaviour.svg new file mode 100644 index 000000000..42a5ea681 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/Systembehaviour.svg @@ -0,0 +1,911 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + + + + + + + + + + + + + + + + + authenticate + + + ( + + + authenticationInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + + + + existsAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + boolean + + + + + + + storeAudioClip + + + ( + + + audioClip + + + : + + + AudioClip + + + ) + + + : + + + UniqueId + + + + + + + deleteAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + newMetadata + + + : + + + MetaData + + + ) + + + : + + + void + + + + + + + accessRawAudioData + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + RawAudioData + + + + + + + releaseRawAudioData + + + ( + + + rawAudioData + + + : + + + RawAudioData + + + ) + + + : + + + void + + + + + + + searchMetadata + + + ( + + + criteria + + + : + + + SearchCriteria + + + ) + + + : + + + UniqueId + + + + + + + getAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + AudioClip + + + + + + + createPlaylist + + + ( + + + playlistId + + + : + + + UniqueId + + + ) + + + : + + + + + + + existsPlaylist + + + ( + + + playlistId + + + : + + + UniqueId + + + ) + + + : + + + boolean + + + + + + + editPlaylist + + + ( + + + playlistId + + + : + + + UniqueId + + + ) + + + : + + + Playlist + + + + + + + savePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + + + + + deletePlaylist + + + ( + + + playlistId + + + : + + + UniqueId + + + ) + + + : + + + + + + + accessPlaylist + + + ( + + + playlistId + + + : + + + UniqueId + + + ) + + + : + + + Playlist + + + + + + + releasePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + diff --git a/campcaster/doc/model/LocalStorage/UpdateAudioclipmetadata_SequenceDiagram.svg b/campcaster/doc/model/LocalStorage/UpdateAudioclipmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..9e1e07c15 --- /dev/null +++ b/campcaster/doc/model/LocalStorage/UpdateAudioclipmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + , + + + newMetadata + + + ) + + + diff --git a/campcaster/doc/model/LocalStorage/index.html b/campcaster/doc/model/LocalStorage/index.html new file mode 100644 index 000000000..61f53c4bf --- /dev/null +++ b/campcaster/doc/model/LocalStorage/index.html @@ -0,0 +1,3429 @@ + + + + + LiveSupport Local storage specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document contains the specification of the LiveSupport Local +storage component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Local storage component is to store Audio Clips +locally.
+

Goals

+The goal of the local storage system is to store Audio Clips locally. +Audio Clips contain audio data bundled with metadata describing it. +Storing locally means that the binary audio data is available not just +as a stream, but also as random seekable file.
+The local storage contains Playlists also. These are metadata +files containing a list of Audio Clip IDs with extra (fade in / fade out) +information.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Store audio clips
+
evident
+
F1.2
+
Provide seekable access to audio data
+
evident
+
F1.3
+
Delete stored clips
+
evident
+
F1.4
+
Update stored clips
+
evident
+
F1.5
+
Search Audio clips by querying metadata
+
evident
+
F2.1
+
Create new playlists
+
evident
+
F2.2
+
Access playlists for editing
+
evident
+
F2.3
+
Delete playlists
+
evident
+
F2.4
+
Access playlists for execution
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
local interface
+
locally callable API
+
must
+
A1.4
+
supported audio formats
+
Ogg Vorbis, MP3, wav
+
must
+
A1.5
+
file system level interface
+
adding, updated and delete from the local +storage can be done by moving files within the file system by legacy +tools
+
frill
+
A1.6
+
uniquely identifiable Audio clips
+
all audio clips should be uniquely identifiable, +even when moved among Local storage systems
+
must
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.2
+
Provide seekable access to audio data
+
A1.3
+
provide file handle
+
provide randomly seekable file level access to +raw +audio data
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Store or update Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Store or update Audio clip
+
type primary, essential
actors Storage maintainer
purpose To store a new Audio clip in the local storage, +or update (replace) an already stored Audio clip
+
overview The Storage maintainer contacts the Local +storage with the aim +of uploading and storing a new Audio Clip. If the uploaded Audio clip +is already stored in Local storage (with respect of having the same +unique id), the stored one is replaced with the uploaded one.
+
references F1.1, F1.4, A1.6
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of storing an Audio clip
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+
4.
+
The Storage maintainer presents the new Audio +clip data, +including raw audio data and metadata
+
5.
+
The system verifies the received data
+

+

+
6.1
+
If the presented Audio clip does not contain a +unique id, one is generated.
+

+

+
6.2
+
If the presented Audio clip contains a unique +id, and there already is an Audio clip stored with the same id, the +stored one is replaced with the uploaded Audio clip.
+

+

+
7.
+
The system stores the received Audio clip and +notifies the Storage maintainer of the actions taken and the unique id +of the stored clip.
+
8.
+
The Storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 6.2: if the raw audio data of the Audio clip is +currently +being accessed (see UC-4), it can not be deleted. the user is notified +and the use case ends.
  • +
+
+

UC-2 Delete Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-2
use case Delete Audio clip
+
type primary, essential
actors Storage maintainer
purpose To delete an existing Audio clip in the local +storage
+
overview The Storage maintainer contacts the Local +storage with the aim +of deleting an existing Audio Clip
+
references F1.3
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of deleting an Audio clip
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+
4.
+
The Storage maintainer presents the unique id of +an Audio clip stored in Local storage for deletion
+
5.
+
The system deletes the Audio clip corresponding +to the presented unique id.
+
6.
+
The Storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Storage maintainer is notified. the use case ends.
  • +
  • action 5: if the raw audio data of the Audio clip is +currently being accessed (see UC-4), it can not be deleted. the user is +notified and the use case ends.
    +
  • +
+
+

UC-3 Update Audio clip metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-3
use case Update Audio clip metadata
+
type primary, essential
actors Storage maintainer
purpose To update the metadata of an Audio clip, without +uploading raw audio data again.
+
overview The Storage maintainer contacts the Local +storage with the aim +of updating the metadata for an already stored Audio clip
+
references F1.4
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of updating the metadata for an Audio clip
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+
4.
+
The Storage maintainer presents the unique id of +an Audio clip stored in Local storage and the new metadata for that +Audio clip
+
5.
+
The system verifies the clip id and the metadata
+

+

+
6.
+
The system replaces the metadata of the Audio +clip with the presented one
+
7.
+
The Storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Storage maintainer is notified. the use case ends.
    +
  • +
+
+

UC-4 Access raw audio data
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Access raw audio data
+
type primary, essential
actors Audio player
+
purpose To access raw audio of Audio clips stored in the +Local storage.
+
overview The Audio player accesses the raw audio data +with the ability of randomly seeking in it.
+
references F1.2, A1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Audio player connects to the Local storage with +the +intention of accessing raw audio data
+

+

+
2. The Audio player provides authentication +information 3. The system authenticates the Audio player and +grants +access.
+
4.
+
The Audio player presents the unique id of an +Audio clip stored in Local storage that he wants to access
+
5.
+
The systems looks up the Audio clip, and +provides a seekable handle to the Audio player
+
6.
+
The Audio player accesses the raw audio data, +including seeking in it.
+

+

+
7.
+
The Audio player closes it's access and +disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Audio player can not be authenticated, he +is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Audio player is notified. the use case ends.
  • +
+
+

UC-5 Search in metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Search in metadata
+
type primary, essential
actors Storage maintainer
+
purpose To search in the metadata of audio clips
+
overview The Storage maintainer searches through the +stored Audio clips by specifying search criteria for the metadata of +the clips
+
references F1.5
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of searching.
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+

+

+
4.
+
The system provides a way of specifying search +criteria with respect to the existing metadata structures
+
5.
+
The Storage maintainer specifies a search +criteria
+
6.
+
The system searches through the metadata of +contained Audio clips, and presents a list of matches
+
7.
+
The Storage maintainer refines his search and +searches again
+
8.
+
The system does a new search according to the +refined criteria, and presents the results to the Storage maintainer
+
9.
+
The storage maintainer reviews the results
+

+

+
10.
+
The storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
+
+ +

UC-6 Create playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-6
use case Create playlist
+
type primary, essential
actors Storage maintainer
purpose To store a new Playlist in the local storage
+
overview The Storage maintainer contacts the Local +storage with the aim of uploading a new Playlist. The Local +storage stores the new metafile under the new ID.
+
references F2.1
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the intention of uploading a new Playlist
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants access.
+
4.
+
The Storage maintainer presents the new Playlist +ID and the new Playlist metafile
+
5.
+
The system verifies that there is no Playlist yet +in the Local storage with the given ID
+

+

+
6.
+
The system stores the received Playlist metafile +and notifies the Storage maintainer of the action taken.
+
7.
+
The Storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, she is notified, and the use case ends.
  • +
  • action 5: if there is already a Playlist in the Local storage +with the given ID, the user is notified and the use case ends.
  • +
+
+ +

UC-7 Edit playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-7
use case Edit playlist
+
type primary, essential
actors Storage maintainer
purpose To modify an existing Playlist in the local +storage
+
overview The Storage maintainer contacts the Local +storage with the aim of editing an existing Playlist. The Local +storage retrieves the Playlist and marks it as being edited. The Storage +maintainer modifies the Playlist. The Storage maintainer saves the +modified Playlist, the Local storage stores it in place of the old +Playlist and marks it as no longer being edited.
+
references F2.2
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the intention of editing a Playlist
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants access
+
4.
+
The Storage maintainer presents a Playlist ID
+
5.
+
The system verifies that there is a Playlist +in the Local storage with the given ID, and it is not currently +being edited
+

+

+
6.
+
The system marks the Playlist with the given ID +as being edited
+

+

+
7.
+
The system returns the Playlist metafile with +the given ID and notifies the Storage maintainer of the actions taken
+
8.
+
The Storage maintainer modifies the Playlist
+

+

+
9.
+
The Storage maintainer presents the new Playlist +metafile for saving
+
10.
+
The system verifies that the user had opened this +Playlist earlier
+

+

+
11.
+
The system stores the new Playlist metafile in +place of the old one, marks it as no longer being edited, +and notifies the Storage maintainer of the actions taken
+
12.
+
The Storage maintainer disconnects.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, she is notified, and the use case ends.
  • +
  • action 5: if there is no Playlist in the Local storage +with the given ID, or if the Playlist is already being edited, +the user is notified and the use case ends.
  • +
  • action 10: if the user cannot be identified as the same +that opened the Playlist for editing, the user is notified, and the +use case continues at point 8.
+
+ +

UC-8 Delete playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-8
use case Delete playlist
+
type primary, essential
actors Storage maintainer
purpose To delete a Playlist from the local storage
+
overview The Storage maintainer contacts the Local +storage with the aim of deleting a Playlist. The system deletes the +Playlist with the given ID from the Local storage.
+
references F2.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the intention of deleting a Playlist
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants access
+
4.
+
The Storage maintainer presents the ID of the +Playlist to be deleted
+
5.
+
The system verifies that there is a Playlist +in the Local storage with the given ID, and it is not currently being +edited
+

+

+
6.
+
The system deletes the given Playlist from +the Local storage +and notifies the Storage maintainer of the action taken
+
7.
+
The Storage maintainer disconnects.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, she is notified, and the use case ends.
  • +
  • action 5: if there is no Playlist in the Local storage +with the given ID, or if the Playlist is currently being edited, +the user is notified and the use case ends.
  • +
+
+ +

UC-9 Access playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-9
use case Access playlist
+
type primary, essential
actors Audio player
purpose To access a Playlist metafile in order to +execute (play) it
+
overview The Audio player contacts the Local +storage with the aim of accessing a Playlist. The Local storage +returns the requested Playlist metafile.
+
references F2.4
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Audio player connects to the Local storage +with the intention of accessing a Playlist
+

+

+
2. The Audio player provides authentication +information 3. The system authenticates the Audio player +and grants access
+
4.
+
The Audio player presents a Playlist ID
+
5.
+
The system verifies that there is a Playlist +in the Local storage with the given ID
+

+

+
6.
+
The system returns the requested Playlist metafile +and notifies the Audio player of the action taken
+
7.
+
The Audio player reads the Playlist, and saves +a private copy
+

+

+
8.
+
The Audio player notifies the Local storage that +it no longer needs the Playlist, and disconnects.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Audio player can not be +authenticated, she is notified, and the use case ends.
  • +
  • action 5: if there is no Playlist in the Local storage +with the given ID, the user is notified and the use case ends.
  • +
+
+ +

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Authentication
+
Component responsible for doing the +authentications
+
Session ID
+
An identifier issued by Authentication, to be +used by subsequent operations.
+
Unique ID
+
A globally unique identifier used to to +differentiate between objects that might even be created on different +systems. Even though the whole space of Id is not known, the Ids must +be unique.
+
MetaData
+
Data about the AudioClip
+
SearchCriteria
+
Describes the search parameters when doing a +search on the MetaData
+
AudioClip
+
The basic unit of audio handled by Local storage
+
RawAudioData
+
The binary audio data contained in an Audio clip
+
Storage maintainer
+
The actor that maintains the contents of the +Local storage
+
Audio player
+
The actor that accesses the raw audio contained +in the Local storage
+
Playlist
+
A metafile containing AudioClip IDs and some +extra (fade in / fade out) information
+
URL
+
The location of a metafile (in the local filesystem)
+
Token
+
An identifier used to match the parts of two-part +operations, e.g., access--release or edit--save
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
AudioClip
+
Is identified by
+
UniqueId
+
This is a globally unique id for each Audio clip
+
AudioClip
+
Is described by
+
MetaData
+

+
AudioClip
+
Contains
+
RawAudioData
+

+
Storage maintainer
+
Is Authenticated by
+
Authentication
+

+
Storage maintainer
+
Searches in
+
MetaData
+

+
Storage maintainer
+
Searches by
+
SearchCriteria
+
The storage maintainer specifies such a +SearchCriteria when doing a search on MetaData
+
Storage maintainer
+
Manages
+
AudioClip
+
This includes uploading, updating and deleting +AudioClips
+
Audio player
+
Is Authenticated by
+
Authentication
+

+
Audio player
+
Accesses
+
RawAudioData
+
This is a seekable access to raw audio data.
+
Playlist
+
Is identified by
+
UniqueId
+
This is a globally unique id for each Playlist
+
Storage maintainer
+
Manages
+
Playlist
+
This includes creating, editing, deleting and +accessing Playlists
+
Playlist
+
Is associated with
+
URL
+
The path of (a copy of) the playlist metafile
+
Playlist
+
Is associated with
+
Token
+
An identifier issued by access operations, to be +used for identification by release operations
+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Store or update Audio clip

+ +
+

UC-2 Delete Audio clip

+ +
+

UC-3 Update Audio clip metadata

+ +
+

UC-4 Access raw audio data

+ +
+

UC-5 Search in metadata

+ +
+

UC-6 Create playlist

+ +
+

UC-7 Edit playlist

+ +
+

UC-8 Delete playlist

+ +
+

UC-9 Access playlist

+ +
+

System objects

+The following figure shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Local storage : authenticate

+see Authentication : Authenticate
+

Contract for Local storage : existsAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
existsAudioClip
+(sessionId : SessionId,
+audioClipId : UniqueId)
+: boolean
+
Responsibilities
+
Check if an Audio clip +with the specified id is stored in local storage
+
Type
+
system
+
Cross-reference
+
none
+
Notes
+
none
+
Exceptions
+
none
Output
+
true if an Audio clip +with the specified id is stored in Local storage, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : storeAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
storeAudioClip
+(sessionId : SessionId,
+audioClip : AudioClip)
+: UniqueId
+
Responsibilities
+
Store a new audio clip +or replace an existing one.
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+
none
+
Exceptions
+
if this is an AudioClip +update, and the RawAudioData of the already existing AudioClip is is +being accessed (see UC-4), report as an error.
+
Output
+
the unique id of the +stored audio clip
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
if this is a new audio clip:an AudioClip object is createdinstance creation
+

+
a UniqueId is generated for the new clip
+
instance creation
+

+
the UniqueId is associated with the AudioClip
+
association formed
+

+
a MetaData object is created and filled with the +presented contents
+
instance creation
+

+
the MetaData is associated with the AudioClip
+
association formed
+

+
a RawAudioData object is created and filled with +the presented contents
+
instance creation
+

+
the RawAudioData is associated with the AudioClip
+
association formed
+
if the clip already existed:
+
the contents of MetaData for the AudioClip are +replaced by the presented contents
+
attribute modification
+

+
the contents of RawAudioData for the AudioClip +are replaced by the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : deleteAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteAudioClip
+(sessionId : SessionId,
+audioClipId : UniqueId)
+: void
+
Responsibilities
+
Delete an existing Audio +clip
+
Type
+
system
+
Cross-reference
+
UC-2
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+if the RawAudioData for AudioClip is being accessed (see UC-4), report +as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the UniqueId for the AudioClip is deleted
+
instance deletion
+

+
the MetaData for the AudioClip is deleted
+
instance deletion
+

+
the RawAudioData for the AudioClip is deleted
+
instance deletion
+

+
the AudioClip is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Local storage : updateAudioClipMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipMetadata
+(sessionId : SessionId,
+audioClipId : UniqueId,
+newMetadata : MetaData)
+: void
+
Responsibilities
+
Update the metadata of +an Audio clip stored in Local storage
+
Type
+
system
+
Cross-reference
+
UC-3
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the contents of MetaData for the AudioClip are +replaced with the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : accessRawAudioData
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
accessRawAudioData
+(sessionId : SessionId,
+audioClipId : UniqueId)
+: RawAudioData
+
Responsibilities
+
Get access to raw audio +data of an AudioClip
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
the RawAudioData for the +AudioClip identified with the supplied UniqueId
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the currentlyAccessing attribute for +RawAudioData for AudioClip is increased by one
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : releaseRawAudioData
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
releaseRawAudioData
+(sessionId : SessionId,
+rawAudioData : RawAudioData)
+: void
+
Responsibilities
+
Release access for raw +audio data
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if the specified +RrawAudioData is not stored in Local storage, indicate as an error
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the currentlyAccessing attribute for +RawAudioData for AudioClip is decreased by one
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : searchMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
searchMetadata
+(sessionId : SessionId,
+criteria : SearchCriteria)
+: UniqueId
+
Responsibilities
+
Search through the +metadata of stored AudioClips, and return all matching clip ids
+
Type
+
system
+
Cross-reference
+
UC-5
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
A range of Audio clip +ids, for which MetaData matches the supplied search criteria
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : getAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
getAudioClip
+(sessionId : SessionId,
+audioClipId : UniqueId)
+: AudioClip
+
Responsibilities
+
Return the contents of +an Audio clip.
+
Type
+
system
+
Cross-reference
+
see Playlist editor
+
Notes
+
none
+
Exceptions
+
if no Audio clip by the +specified id exists, report as an error.
+
Output
+
The Audio clip, +specified by the supplied id.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : createPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
createPlaylist
+(sessionId : SessionId,
+playlistId : UniqueId)
+: void
+
Responsibilities
+
Create a new Playlist +metafile.
+
Type
+
system
+
Cross-reference
+
UC-6
+
Notes
+
none
+
Exceptions
+
if a Playlist with the +given playlistId already exists, report as an error
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
a Playlist object is createdinstance creation
+

+
the new Playlist is marked as currently +not being edited
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : editPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
editPlaylist
+(sessionId : SessionId,
+playlistId : UniqueId)
+: { playlistURL : URL, playlistToken: Token }
+
Responsibilities
+
Open a Playlist metafile +for editing.
+
Type
+
system
+
Cross-reference
+
UC-7
+
Notes
+
none
+
Exceptions
+
if no Playlist with the +given playlistId exists, or if the Playlist has already been marked as +being edited, report as an error
+
Output
+
a URL of a Playlist +metafile, and a token identifying it
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the Playlist is marked as currently +being edited
+
attribute modification
+

the Playlist metafile and the URL returned are +associated with the token returned
+
association formed
+

+

+

+
+
+

Contract for Local storage : savePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
savePlaylist
+(sessionId : SessionId,
+playlistToken : Token,
+newPlaylist : Playlist)
+: void
+
Responsibilities
+
Store a new Playlist +metafile in place of the old one.
+
Type
+
system
+
Cross-reference
+
UC-7
+
Notes
+
TODO: decide exactly what +the newPlaylist argument looks like
+
Exceptions
+
if the playlistToken argument +does not match a token generated earlier in this session by editPlaylist(), +report as an error
+
Output
+
none
+
Pre-conditions
+
the Playlist has been marked +as being edited in the same session
Post-conditions
+
condition
+
type
+

+
the Playlist is marked as currently +not being edited
+
attribute modification
+
the playlistToken token and the URL returned earlier +by editPlaylist() together with it are no longer validassociation broken
+

+

+

+
+
+

Contract for Local storage : deletePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deletePlaylist
+(sessionId : SessionId,
+playlistId : UniqueId)
+: void
+
Responsibilities
+
Delete a Playlist +metafile.
+
Type
+
system
+
Cross-reference
+
UC-8
+
Notes
+
none
+
Exceptions
+
if no Playlist with the +given playlistId exists, or if the Playlist is marked as currently +being edited, report as an error
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
a Playlist object is deletedinstance deletion
+

+

+

+
+
+

Contract for Local storage : accessPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
accessPlaylist
+(sessionId : SessionId,
+playlistId : UniqueId)
+: { playlistURL : URL, playlistToken : Token }
+
Responsibilities
+
Access (read) a Playlist +metafile.
+
Type
+
system
+
Cross-reference
+
UC-9
+
Notes
+
for this method, it does +not matter whether the Playlist is being edited or not -- the latest +saved state of the Playlist should be returned
+
Exceptions
+
if no Playlist with the +given playlistId exists, report as an error
+
Output
+
a URL of a Playlist +metafile, and a token identifying it
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the Playlist and the URL returned are +associated with the token returned
+
association formed
+

+

+

+
+
+

Contract for Local storage : releasePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
releasePlaylist
+(sessionId : SessionId,
+playlistToken : Token)
+: void
+
Responsibilities
+
Release the resources +obtained earlier by accessPlaylist().
+
Type
+
system
+
Cross-reference
+
UC-9
+
Notes
+
none
+
Exceptions
+
if the playlistToken argument +does not match a token generated earlier in this session by accessPlaylist(), +report as an error
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
the playlistToken token and the URL returned earlier +by accessPlaylist() together with it are no longer validassociation broken
+

+

+

+
+
+

Contract for Local storage : existsPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
existsPlaylist
+(sessionId : SessionId,
+playlistId : UniqueId)
+: bool
+
Responsibilities
+
Check whether a Playlist +metafile with the given playlist ID exists.
+
Type
+
system
+
Cross-reference
+
UC-6, UC-7, UC-8, UC-9
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
true or false
+
Pre-conditions
+
none
Post-conditions
+
none

+

+

+
+
+

Contract for Local storage : playlistIsAvailable
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
playlistIsAvailable
+(sessionId : SessionId,
+playlistId : UniqueId)
+: bool
+
Responsibilities
+
Check whether a Playlist +metafile with the given playlist ID is available for editing, i.e., exists +and has not been opened for editing yet.
+
Type
+
system
+
Cross-reference
+
UC-7
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
true if the playlist exists +and is available; false if either condition fails
+
Pre-conditions
+
none
Post-conditions
+
none

+

+

+
+
+

Contract for Local storage : accessAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
accessAudioClip
+(sessionId : SessionId,
+audioClipId : UniqueId)
+: { audioClipURL : URL, audioClipToken : Token }
+
Responsibilities
+
Access (read) an Audio +Clip metafile.
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if no AudioClip with the +given audioClipId exists, report as an error
+
Output
+
a URL of an AudioClip +metafile, and a token identifying it
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the AudioClip and the URL returned are +associated with the token returned
+
association formed
+

+

+

+
+
+

Contract for Local storage : releaseAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
releaseAudioClip
+(sessionId : SessionId,
+audioClipToken : Token)
+: void
+
Responsibilities
+
Release the resources +obtained earlier by accessAudioClip().
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if the audioClipToken argument +does not match a token generated earlier in this session by accessAudioClip(), +report as an error
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
the audioClipToken token and the URL returned earlier +by accessAudioClip() together with it are no longer validassociation broken
+

+

+

+
+
+
+ + diff --git a/campcaster/doc/model/MediaArchive/Concepts.svg b/campcaster/doc/model/MediaArchive/Concepts.svg new file mode 100644 index 000000000..ecdc23162 --- /dev/null +++ b/campcaster/doc/model/MediaArchive/Concepts.svg @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Media archive + + + + + + + Authentication + + + + + + + + + + + + + + + AudioClip + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + MetaData + + + + + + + + + + + + + + + SearchCriteria + + + + + + + + + + + + + + + RawAudioData + + + + + + + + + + + + + + + + + + + + Is described by + + + + + + + + + + + + Contains + + + + + + + UniqueId + + + + + + + + + + + + + + + + + + + + Is identified by + + + + + + + Archive maintainer + + + + + + + + + + + + + + + Archive client + + + + + + + + + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Searches in + + + + + + + + + + + + Searches by + + + + + + + + + + + + Downloads + + + + + + + + + + + + Manages + + + diff --git a/campcaster/doc/model/MediaArchive/DeleteAudioclip_SequenceDiagram.svg b/campcaster/doc/model/MediaArchive/DeleteAudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..cb21fd1aa --- /dev/null +++ b/campcaster/doc/model/MediaArchive/DeleteAudioclip_SequenceDiagram.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + archive maintainer + + + + : + + + + Archive maintainer + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudioClip + + + ( + + + audioClipId + + + ) + + + diff --git a/campcaster/doc/model/MediaArchive/Downloadrawaudiodata_SequenceDiagram.svg b/campcaster/doc/model/MediaArchive/Downloadrawaudiodata_SequenceDiagram.svg new file mode 100644 index 000000000..f5009664d --- /dev/null +++ b/campcaster/doc/model/MediaArchive/Downloadrawaudiodata_SequenceDiagram.svg @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + archive client + + + + : + + + + Archive client + + + + + + + + + + + + : + + + authneticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + downloadAudioData + + + ( + + + audioClipId + + + , + + + offset + + + ) + + + diff --git a/campcaster/doc/model/MediaArchive/EssentialUseCases.svg b/campcaster/doc/model/MediaArchive/EssentialUseCases.svg new file mode 100644 index 000000000..fd67a1ed1 --- /dev/null +++ b/campcaster/doc/model/MediaArchive/EssentialUseCases.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Archive maintainer + + + + + + + LiveSupport Media archive + + + + + + + + + UC-3 Update Audio + clip metadata + + + + + + + UC-5 Search in metadata + + + + + + + UC-2 Delete Audio clip + + + + + + + UC-4 Download raw + audio data + + + + + + + UC-1 Store or update + Audio clip + + + + + + + + + + + + + + + + Archive client + + + + + + + + + diff --git a/campcaster/doc/model/MediaArchive/Searchinmetadata_SequenceDiagram.svg b/campcaster/doc/model/MediaArchive/Searchinmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..3b2e45569 --- /dev/null +++ b/campcaster/doc/model/MediaArchive/Searchinmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + archive client + + + + : + + + + Archive client + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + diff --git a/campcaster/doc/model/MediaArchive/StoreorupdateAudioclip_SequenceDiagram.svg b/campcaster/doc/model/MediaArchive/StoreorupdateAudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..ac0c96dc5 --- /dev/null +++ b/campcaster/doc/model/MediaArchive/StoreorupdateAudioclip_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + archive maintainer + + + + : + + + + Archive maintainer + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/campcaster/doc/model/MediaArchive/Systembehaviour.svg b/campcaster/doc/model/MediaArchive/Systembehaviour.svg new file mode 100644 index 000000000..97cf502bb --- /dev/null +++ b/campcaster/doc/model/MediaArchive/Systembehaviour.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Media archive + + + + + + + + + + + + + + + authenticate + + + ( + + + authenticationInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + + + + retrieveAudioClip + + + ( + + + audioClipId + + + : + + + + + + ) + + + : + + + + + + + + + + storeAudioClip + + + ( + + + audioClip + + + : + + + AudioClip + + + ) + + + : + + + UniqueId + + + + + + + deleteAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + newMetadata + + + : + + + MetaData + + + ) + + + : + + + void + + + + + + + downloadAudioData + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + offset + + + : + + + int + + + ) + + + : + + + RawAudioData + + + + + + + searchMetadata + + + ( + + + criteria + + + : + + + SearchCriteria + + + ) + + + : + + + UniqueId + + + diff --git a/campcaster/doc/model/MediaArchive/UpdateAudioclipmetadata_SequenceDiagram.svg b/campcaster/doc/model/MediaArchive/UpdateAudioclipmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..6b07cb22c --- /dev/null +++ b/campcaster/doc/model/MediaArchive/UpdateAudioclipmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + archive maintainer + + + + : + + + + Archive maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + AuthInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + , + + + newMetadata + + + ) + + + diff --git a/campcaster/doc/model/MediaArchive/index.html b/campcaster/doc/model/MediaArchive/index.html new file mode 100644 index 000000000..eed29fc80 --- /dev/null +++ b/campcaster/doc/model/MediaArchive/index.html @@ -0,0 +1,1678 @@ + + + + + LiveSupport Media archive specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document contains the specification of the LiveSupport Media +archive component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Media archive is to store Audio clips with metadata +information, and offer remote access to these clips.
+

Goals

+The goal of the Media storage system is to store Audio Clips and share +them over the network. Another aim is to provide extensive search +possibilities based on the metadata bundled with the audio clips.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Store audio clips
+
evident
+
F1.2
+
Provide remote access to audio data
+
evident
+
F1.3
+
Delete stored clips
+
evident
+
F1.4
+
Update stored clips
+
evident
+
F1.5
+
Search Audio clips by querying metadata
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
remote interface
+
the Media archive is remotely accessible
+
must
+
A1.3
+
supported audio formats
+
Ogg Vorbis, MP3, wav
+
must
+
A1.4
+
uniquely identifiable Audio clips
+
all audio clips should be uniquely identifiable, +even when moved among Media archive systems
+
must
+
A1.6
+
consistent downloads during updates
+
when an audio clip is being updated while also +being downloaded, make sure that the downloads can continue with the +original content
+
frill
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.2
+
Provide remote access to audio data A1.5
+
partial downloads
+
provide the possibility of interrupted (partial) +downloads of raw audio data
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Store or update Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Store or update Audio clip
+
type primary, essential
actors Archive maintainer
purpose To store a new Audio clip in the media archive, +or update (replace) an already stored Audio clip
+
overview The Archive maintainer contacts the Media +archive with the aim +of uploading and storing a new Audio Clip. If the uploaded Audio clip +is already stored in Media archive (with respect of having the same +unique id), the stored one is replaced with the uploaded one.
+
references F1.1, F1.4, A1.4
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive maintainer connects to the Media archive +with the +intention of storing an Audio clip
+

+

+
2. The Archive maintainer provides authentication +information 3. The system authenticates the Archive maintainer +and grants +access.
+
4.
+
The Archive maintainer presents the new Audio +clip data, +including raw audio data and metadata
+
5.
+
The system verifies the received data
+

+

+
6.1
+
If the presented Audio clip does not contain a +unique id, one is generated.
+

+

+
6.2
+
If the presented Audio clip contains a unique +id, and there already is an Audio clip stored with the same id, the +stored one is replaced with the uploaded Audio clip.
+

+

+
7.
+
The system stores the received Audio clip and +notifies the Archive maintainer of the actions taken and the unique id +of the stored clip.
+
8.
+
The Archive maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 6.2: TODO: handle the case of the raw audio data of +the Audio clip is +currently +being downloaded (see UC-4, A1.6)
    +
  • +
+
+

UC-2 Delete Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-2
use case Delete Audio clip
+
type primary, essential
actors Archive maintainer
purpose To delete an existing Audio clip in the media +archive
+
overview The Archive maintainer contacts the Media +archive with the aim +of deleting an existing Audio Clip
+
references F1.3
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive maintainer connects to the Media archive +with the +intention of deleting an Audio clip
+

+

+
2. The Archive maintainer provides authentication +information 3. The system authenticates the Archive maintainer +and grants +access.
+
4.
+
The Archive maintainer presents the unique id of +an Audio clip stored in Media archive for deletion
+
5.
+
The system deletes the Audio clip corresponding +to the presented unique id.
+
6.
+
The Archive maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Archive maintainer is notified. the use case ends.
  • +
  • action 5: TODO: handle the case of the raw audio data of +the Audio clip is +currently +being downloaded (see UC-4, A1.6)
    +
  • +
+
+

UC-3 Update Audio clip metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-3
use case Update Audio clip metadata
+
type primary, essential
actors Archive maintainer
purpose To update the metadata of an Audio clip, without +uploading raw audio data again.
+
overview The Archive maintainer contacts the Media +archive with the aim +of updating the metadata for an already stored Audio clip
+
references F1.4
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive maintainer connects to the Media archive +with the +intention of updating the metadata for an Audio clip
+

+

+
2. The Archive maintainer provides authentication +information 3. The system authenticates the Archive maintainer +and grants +access.
+
4.
+
The Archive maintainer presents the unique id of +an Audio clip stored in Media archive and the new metadata for that +Audio clip
+
5.
+
The system verifies the clip id and the metadata
+

+

+
6.
+
The system replaces the metadata of the Audio +clip with the presented one
+
7.
+
The Archive maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Archive maintainer is notified. the use case ends.
    +
  • +
+
+

UC-4 Download raw audio data
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Download audio data
+
type primary, essential
actors Archive client
+
purpose To download raw audio data stored in the Media +archive
+
overview The Archive client downloads the raw audio data.
+
references F1.2, A1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive client connects to the Media archive +with +the +intention of downloading raw audio data
+

+

+
2. The Archive client provides authentication +information 3. The system authenticates the Archive client and +grants +access.
+
4.
+
The Archive client presents the unique id of an +Audio clip stored in Media archive that he wants to download
+
5.
+
The systems looks up the Audio clip, and starts +to send the raw audio content as a stream
+
6.
+
The Archive client receives the stream of raw +audio data and saves it.
+

+

+
7.
+
The Archive client closes it's access and +disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive client can not be authenticated, +he +is notified, and the use case ends.
  • +
  • action 4: the Archive client specifies an offset from +which he wants to start a partial download. the system starts to send +raw audio data from this offset in action 5.
    +
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Archive client is notified. the use case ends.
  • +
+
+

UC-5 Search in metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Search in metadata
+
type primary, essential
actors Archive client
+
purpose To search in the metadata of audio clips
+
overview The Archive client searches through the +stored Audio clips by specifying search criteria for the metadata of +the clips
+
references F1.5
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive client connects to the Media archive +with the +intention of searching.
+

+

+
2. The Archive cleint provides authentication +information 3. The system authenticates the Archive client +and grants +access.
+

+

+
4.
+
The system provides a way of specifying search +criteria with respect to the existing metadata structures
+
5.
+
The Archive client specifies a search +criteria
+
6.
+
The system searches through the metadata of +contained Audio clips, and presents a list of matches
+
7.
+
The Archive client refines his search and +searches again
+
8.
+
The system does a new search according to the +refined criteria, and presents the results to the Archive client
+
9.
+
The Archive client reviews the results
+

+

+
10.
+
The Archive client disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive client can not be +authenticated, he is notified, and the use case ends.
  • +
+

+

+
+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Authentication
+
Component responsible for doing the +authentications
+
Unique Id
+
A globally unique identifier used to to +differentiate between objects that might even be created on different +systems. Even though the whole space of Id is not known, the Ids must +be unique.
+
MetaData
+
Data about the AudioClip
+
SearchCriteria
+
Describes the search parameters when doing a +search on the MetaData
+
AudioClip
+
The basic unit of audio handled by Media archive
+
RawAudioData
+
The binary audio data contained in an Audio clip
+
Archive maintainer
+
The actor that maintains the contents of the +Media archive
+
Archive client
+
The actor that accesses the data stored in the +Media archive
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
AudioClip
+
Is identified by
+
UniqueId
+
This is a globally unique id for each Audio clip
+
AudioClip
+
Is described by
+
MetaData
+

+
AudioClip
+
Contains
+
RawAudioData
+

+
Archive maintainer
+
Is Authenticated by
+
Authentication
+

+
Archive client
+
Searches in
+
MetaData
+

+
Archive client
+
Searches by
+
SearchCriteria
+
The Archive client specifies such a +SearchCriteria when doing a search on MetaData
+
Archive maintainer
+
Manages
+
AudioClip
+
This includes uploading, updating and deleting +AudioClips
+
Archive client
+
Is Authenticated by
+
Authentication
+

+
Archice client
+
Downloads
+
RawAudioData
+
Download RawAudioData as a binary stream.
+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Store or update Audio clip

+ +
+

UC-2 Delete Audio clip

+ +
+

UC-3 Update Audio clip metadata

+ +
+

UC-4 Download raw audio data

+ +
+

UC-5 Search in metadata

+ +

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Media archive : authenticate

+see Authentication : Authenticate
+

Contract for Media archive : storeAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
storeAudioClip
+(audioClip : AudioClip)
+: UniqueId
+
Responsibilities
+
Store a new audio clip +or replace an existing one.
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+
none
+
Exceptions
+
if this is an AudioClip +update, and the RawAudioData of the already existing TODO: handle the +case of the raw audio data of the Audio clip is +currently +being downloaded (see UC-4, A1.6)
Output
+
the unique id of the +stored audio clip
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
if this is a new audio clip:an AudioClip object is createdinstance creation
+

+
a UniqueId is generated for the new clip
+
instance creation
+

+
the UniqueId is associated with the AudioClip
+
association formed
+

+
a MetaData object is created and filled with the +presented contents
+
instance creation
+

+
the MetaData is associated with the AudioClip
+
association formed
+

+
a RawAudioData object is created and filled with +the presented contents
+
instance creation
+

+
the RawAudioData is associated with the AudioClip
+
association formed
+
if the clip already existed:
+
the contents of MetaData for the AudioClip are +replaced by the presented contents
+
attribute modification
+

+
the contents of RawAudioData for the AudioClip +are replaced by the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Media archive : deleteAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteAudioClip
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
Delete an existing Audio +clip
+
Type
+
system
+
Cross-reference
+
UC-2
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+TODO: handle the case of the raw audio data of the Audio clip is +currently +being downloaded (see UC-4, A1.6)
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the UniqueId for the AudioClip is deleted
+
instance deletion
+

+
the MetaData for the AudioClip is deleted
+
instance deletion
+

+
the RawAudioData for the AudioClip is deleted
+
instance deletion
+

+
the AudioClip is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Media archive : updateAudioClipMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipMetadata
+(audioClipId : UniqueId,
+newMetadata : MetaData)
+: void
+
Responsibilities
+
Update the metadata of +an Audio clip stored in Media archive
+
Type
+
system
+
Cross-reference
+
UC-3
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the contents of MetaData for the AudioClip are +replaced with the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Media archive : accessRawAudioData
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
downloadRawAudioData
+(audioClipId : UniqueId,
+offset : int)
+: RawAudioData
+
Responsibilities
+
Get access to raw audio +data of an AudioClip as a data stream.
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
the RawAudioData as a +stream for the +AudioClip identified with the supplied UniqueId, started at the +specified offset.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Media archive : searchMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
searchMetadata
+(criteria : SearchCriteria)
+: UniqueId
+
Responsibilities
+
Search through the +metadata of stored AudioClips, and return all matching clip ids
+
Type
+
system
+
Cross-reference
+
UC-5
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
A range of Audio clip +ids, for which MetaData matches the supplied search criteria
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+
+ + diff --git a/campcaster/doc/model/PlaylistEditor/AddanAudiocliptoLocalstorage_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/AddanAudiocliptoLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..473c2a24e --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/AddanAudiocliptoLocalstorage_SequenceDiagram.svg @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + + : + + + retrun audioClipId + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + addAudioClip + + + ( + + + rawAudioData + + + , + + + metaData + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/AddanAudiocliptoaPlaylist_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/AddanAudiocliptoaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..1990d6b18 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/AddanAudiocliptoaPlaylist_SequenceDiagram.svg @@ -0,0 +1,444 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + addAudioClipToPlaylist + + + ( + + + playlist + + + , + + + audioClipId + + + , + + + offset + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + [if requested] + + + : + + + mirrorAudioClipInLocalStorage + + + ( + + + audioClipId + + + ) + + + + + + + diff --git a/campcaster/doc/model/PlaylistEditor/AddorupdateanAudiocliptoMediaarchive_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/AddorupdateanAudiocliptoMediaarchive_SequenceDiagram.svg new file mode 100644 index 000000000..fd1151849 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/AddorupdateanAudiocliptoMediaarchive_SequenceDiagram.svg @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + addAudioClipToMediaArchive + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClip + + + := + + + getAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/Concepts.svg b/campcaster/doc/model/PlaylistEditor/Concepts.svg new file mode 100644 index 000000000..159cdea14 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/Concepts.svg @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + (from + + + Local storage + + + ) + + + + + + + Scheduler + + + (from + + + Scheduler + + + ) + + + + + + + Media archive + + + (from + + + Media archive + + + ) + + + + + + + Playlist maintainer + + + + + + + + + + + + + + + << + + + component + + + >> + + + Playlist editor + + + + + + + Authentication + + + + + + + + + + + + + + + MetaData + + + + + + + + + + + + + + + SearchCriteria + + + + + + + + + + + + + + + Audio layer + + + + + + + + + + + + + + + FadeInfo + + + + + + + + + + + + + + + Configuration + + + + + + + + + + + + + + + AudioClip + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + Playlist player + + + + + + + + + + + + + + + Playlist uploader + + + + + + + + + + + + + + + Clip retriever + + + + + + + Playlist + + + + + + + - + + + duration + + + : + + + Time + + + - + + + lockedForEditing + + + : + + + boolean + + + + + + + + + + + isValid + + + ( + + + ) + + + : + + + boolean + + + + + + + + + + + + Is described by + + + + + + + + + + PlaylistElement + + + + + + + - + + + relativeOffset + + + : + + + Time + + + + + + + + + + + + + + + + + + + Plays + + + + + + + + + + + + Uploads + + + + + + + + + + + + Fades out with + + + + + + + + + + + + * + + + Contains + + + + + + + + + + + + References + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Searches by + + + + + + + + + + + + Edits + + + + + + + + + + + + Maintains + + + + + + + + + + + + * + + + Contains + + + + + + + + + + + + * + + + Contains + + + + + + + + + + + + Accesses audio data from + + + + + + + + + + + + Uploads to + + + + + + + + + + + + Retrieves clips from + + + + + + + + + + + + Stores clips in + + + + + + + + + + + + Stores clips in + + + + + + + + + + + + Creates and edits + + + + + + + + + + + + Listens to + + + + + + + + + + + + Fades in with + + + diff --git a/campcaster/doc/model/PlaylistEditor/CreateaPlaylist_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/CreateaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..45c0ce55e --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/CreateaPlaylist_SequenceDiagram.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + createPlaylist + + + ( + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/DeleteanAudioclipfromLocalstorage_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/DeleteanAudioclipfromLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..647d9cef2 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/DeleteanAudioclipfromLocalstorage_SequenceDiagram.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudiClipFromLocalStorage + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudioClip + + + ( + + + audioClipId + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/EditthetransitionofanAudioclip_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/EditthetransitionofanAudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..d48aabac1 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/EditthetransitionofanAudioclip_SequenceDiagram.svg @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateFadeParameters + + + ( + + + playlistElement + + + , + + + newFadeInInfo + + + , + + + newFadeOutInfo + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/EssentialUseCases.svg b/campcaster/doc/model/PlaylistEditor/EssentialUseCases.svg new file mode 100644 index 000000000..48e5b9567 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/EssentialUseCases.svg @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Playlist editor + + + + + + + + + UC-1 Create a Playlist + + + + + + + UC-10 Edit the transition + of an Audio clip + + + + + + + UC-12 Upload a Playlist + to a Scheduler daemon + + + + + + + UC-13 Maintain + configuration information + + + + + + + UC-2 Add an Audio clip + to Local storage + + + + + + + UC-3 Delete an Audio clip + from Local storage + + + + + + + UC-4 Update an Audio clip + in Local storage + + + + + + + UC-11 Listen to a Playlist + + + + + + + UC-8 Add an Audio clip + to a Playlist + + + + + + + UC-6 Search for Audio clips + + + + + + + UC-7 Mirror an Audio clip + from a remote Media archive + in Local storage + + + + + + + UC-5 Add or update an Audio clip + to Media archive + + + + + + + UC-9 Move the position + of an Audio clip in a Playlist + + + + + + + Playlist maintainer + + + + + + + Local storage + + + + + + + Media archive + + + + + + + Scheduler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/campcaster/doc/model/PlaylistEditor/ListentoaPlaylist_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/ListentoaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..19e5b45db --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/ListentoaPlaylist_SequenceDiagram.svg @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playPlaylist + + + ( + + + playlist + + + , + + + 0 + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + accessRawAudioData + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + playPlaylist + + + ( + + + playlist + + + , + + + seekOffset + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + accessRawAudioData + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + stopPlaying + + + ( + + + ) + + + + + + + + + + + : + + + releaseRawAudioData + + + ( + + + rawAudioData + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/Maintainconfigurationinformation_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/Maintainconfigurationinformation_SequenceDiagram.svg new file mode 100644 index 000000000..f03e85462 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/Maintainconfigurationinformation_SequenceDiagram.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + addConfiguration + + + ( + + + configuration + + + ) + + + + + + + + + + + : + + + updateConfiguration + + + ( + + + configuration + + + ) + + + + + + + + + + + : + + + deleteConfiguration + + + ( + + + configuration + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/MirroranAudioclipfromaremoteMediaarchiveinLocalstorage_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/MirroranAudioclipfromaremoteMediaarchiveinLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..5b0609e73 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/MirroranAudioclipfromaremoteMediaarchiveinLocalstorage_SequenceDiagram.svg @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + mirrorAudioClipInLocalStorage + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClip + + + := + + + retrieveAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/MovethepositionofanAudioclipinaPlaylist_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/MovethepositionofanAudioclipinaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..c8f964c9c --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/MovethepositionofanAudioclipinaPlaylist_SequenceDiagram.svg @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipPositionInPlaylist + + + ( + + + playlist + + + , + + + playlistElement + + + , + + + newOffset + + + ) + + + + + + + + + + + : + + + moveAudioClipToOtherLayer + + + ( + + + playlist + + + , + + + playlistElement + + + , + + + newLayer + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/SearchforAudioclips_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/SearchforAudioclips_SequenceDiagram.svg new file mode 100644 index 000000000..79bf08cdf --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/SearchforAudioclips_SequenceDiagram.svg @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + + + + + : + + + return matching AudioClipIds + + + + + + diff --git a/campcaster/doc/model/PlaylistEditor/Systembehaviour.svg b/campcaster/doc/model/PlaylistEditor/Systembehaviour.svg new file mode 100644 index 000000000..17a9deb0f --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/Systembehaviour.svg @@ -0,0 +1,1291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Playlist editor + + + + + + + + + + + + + + + authenticate + + + ( + + + authInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + + + + createPlaylist + + + ( + + + ) + + + : + + + Playlist + + + + + + + addAudioClip + + + ( + + + rawAudioData + + + : + + + RawAudioData + + + , + + + metaData + + + : + + + MetaData + + + ) + + + : + + + UniqueId + + + + + + + deleteAudiClipFromLocalStorage + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + updateAudioClipInLocalStorage + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + rawAudioData + + + : + + + RawAudioData + + + , + + + metaData + + + : + + + MetaData + + + ) + + + : + + + void + + + + + + + addAudioClipToMediaArchive + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + searchMetadata + + + ( + + + criteria + + + : + + + SearchCriteria + + + ) + + + : + + + UniqueId + + + + + + + mirrorAudioClipInLocalStorage + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + addAudioClipToPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClipId + + + : + + + UniqueId + + + , + + + offset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + updateAudioClipPositionInPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + playlistElement + + + : + + + PlaylistElement + + + , + + + newOffset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + moveAudioClipToOtherLayer + + + ( + + + playlist + + + : + + + Playlist + + + , + + + playlistElement + + + : + + + PlaylistElement + + + , + + + newLayer + + + : + + + Audio layer + + + ) + + + : + + + void + + + + + + + updateFadeParameters + + + ( + + + playlistElement + + + : + + + PlaylistElement + + + , + + + newFadeInInfo + + + : + + + FadeInfo + + + , + + + newFadeOutInfo + + + : + + + FadeInfo + + + ) + + + : + + + void + + + + + + + playPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + offset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + stopPlaying + + + ( + + + ) + + + : + + + void + + + + + + + schedulePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + schedule + + + : + + + Schedule + + + ) + + + : + + + void + + + + + + + addConfiguration + + + ( + + + configuration + + + : + + + Configuration + + + ) + + + : + + + void + + + + + + + updateConfiguration + + + ( + + + configuration + + + : + + + Configuration + + + ) + + + : + + + void + + + + + + + deleteConfiguration + + + ( + + + configuration + + + : + + + Configuration + + + ) + + + : + + + void + + + diff --git a/campcaster/doc/model/PlaylistEditor/UpdateanAudioclipinLocalstorage_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/UpdateanAudioclipinLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..2818a3789 --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/UpdateanAudioclipinLocalstorage_SequenceDiagram.svg @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipInLocalStorage + + + ( + + + audioClipId + + + , + + + rawAudioData + + + , + + + metaData + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/UploadaPlaylisttoaSchedulerdaemon_SequenceDiagram.svg b/campcaster/doc/model/PlaylistEditor/UploadaPlaylisttoaSchedulerdaemon_SequenceDiagram.svg new file mode 100644 index 000000000..040fa803c --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/UploadaPlaylisttoaSchedulerdaemon_SequenceDiagram.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + scheduler + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + schedulePlaylist + + + ( + + + playlist + + + , + + + schedule + + + ) + + + + + + + + + + + : + + + authInfo + + + := + + + authenticate + + + ( + + + authenticated + + + ) + + + + + + + + + + + : + + + uploadPlaylist + + + ( + + + playlist + + + , + + + schedule + + + ) + + + diff --git a/campcaster/doc/model/PlaylistEditor/index.html b/campcaster/doc/model/PlaylistEditor/index.html new file mode 100644 index 000000000..ec563381e --- /dev/null +++ b/campcaster/doc/model/PlaylistEditor/index.html @@ -0,0 +1,4277 @@ + + + + + LiveSupport Playlist editor specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document contains the specification of the LiveSupport Playlist +editor component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Playlist editor component is to provide a user +interface enabling creation, editing and publishing playlists.
+

Goals

+The playlist editor is an easy to use user interface tool. It provides +the possibility to create and edit playlists, made up of a sequence of +audio clips store in Local storage or in a remote Media archive. The +created playlist then can be uploaded to a Scheduler daemon for +execution.
+
+The transition between audio clips can be visually specified though the +user interface. The playlist editor provides an easy to use user +interface to search the audio clips stored in Local storage or a remote +Media archive, based on metadata criteria. The playlist editor provides +the possibility to listen to the whole or any part of the created +playlist.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Create and edit playlists
+
evident
+
F1.2
+
Access to Local storage
+
hidden
+
F1.3
+
Access to Media archive
+
hidden
+
F1.4
+
Search in Local storage or Media archive
+
evident
+
F1.5
+
Upload playlist to Scheduler daemon
+
evident
+
F1.6
+
Smooth transitions between Audio clips
+
evident
+
F1.7
+
Play back created playlist
+
evident
+
F1.8
+
Maintain configuration information
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
easy to use user interface
+
intuitive user interface
+
must
+
A1.3
+
supported audio formats
+
Ogg Vorbis, wav, possibly MP3
+
must
+
A1.4
+
Playlist support for Audio clips from Local +storage Created playlists may include audio sources from +Local storage must
+
A1.5
+
Playlist support for Audio clips from Media +archive
+
Created playlists may include audio sources from +a remote Media archive
+
must
+
A1.6
+
Playlist support for remotely accessible audio +files
+
Created playlists may include remotely +accessible audio sources, e.g. audio files downloadable via HTTP
+
must
+
A1.7
+
Playlist support for audio streams
+
Created playlists may include remotely +accessible audio streams, e.g. icecast or shoutcast streams
+
must
+
A1.12
+
Playlist format
+
SMIL 2.0
+
frill
+
A1.13
+
Standalone GUI application
+
The Playlist editor is a standalone graphical +user interface application
+
must
+
A1.14
+
Supported audio interfaces
+
ALSA (maybe also OSS?)
+
must
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.6
+
Smooth transitions between Audio clips
+
A1.8
+
Fade-in / fade-out support
+
Support for fade-in / fade-out as a transitions, +with customizable fade curve
+
must
+
F1.2
+
Access to Local storage
+
A1.9
+
Full access to Local storage
+
The Playlist editor is a user interface to Local +storage, enabling uploading, deletion and updating of Audio clips in +Local storage
+
must
+
F1.3
+
Access to Media archive
+
A1.10
+
Full access to Media archive
+
The Playlist editor is a user interface to Media +archive, enabling +uploading, deletion and updating of Audio clips in Media archive
+
must
+
F1.7
+
Play back created playlist
+
A1.11
+
Complete and partial playback
+
The Playlist editor provides the possibility of +complete playback, and random seeks for the whole of the playlist +duration
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Create a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Create a Playlist
+
type primary, essential
actors Playlist maintainer
+
purpose To create a new, empty Playlist
+
overview The Playlist maintainer accesses the Playlist +editor application with the purpose of creating a new, empty Playlist.
+
references F1.1
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer creates a new, empty +playlist
+
5.
+
The system creates a new, empty playlist.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
    +
  • +
+
+

UC-2 Add an Audio clip to Local storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-2
use case Add an Audio clip to Local storage
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To add a new Audio clip to local storage.
+
overview The Playlist maintainer accesses the Playlist +editor application with the purpose of adding a new audio file to the +Local storage associated with the Playlist editor.
+
references F1.2, A1.9
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer provides an audio file +and corresponding metadata description.
+
5.
+
The system receives the data, and contacts +Local storage with the purpose of storing it.
+

+

+
6.
+
The system provides authentication information +to Local storage
+
7.
+
The Local storage checks for the provided +authentication information, and grants access.
+
8.
+
The system presents the audio data and metadata +to the Local storage
+
9.
+
The Local storage receives the provided audio +file and metadata, and stores it, returning the unique id for the +newly created Audio clip
+
10.
+
The system receives the new unique id from Local +storage, and presents it to the Playlist maintainer.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 7: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 10: if the system receives an error indication from +the Local storage, it displays the error to the Playlist maintainer, +and the use case ends.
    +
  • +
+
+

UC-3 Delete an Audio clip from Local storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-3
use case Delete an Audio clip from Local storage
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To delete an Audio clip from local storage.
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of deleting an Audio clip stored in Local storage
+
references F1.2, A1.9
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to Local storage
+
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+

+
6.
+
The Playlist maintainer selects an Audio clip +from the Local storage through the Playlist manager
+

+

+
7.
+
The Playlist maintainer indicates the selected +Audio clip to be deleted.
+
8.
+
The system contacts Local storage with the +selected Audio clip to be deleted.
+
9.
+
Local storage deletes the specified Audio clip
+
10.
+
The system notifies the Playlist maintainer of +the deletion of the selected Audio clip
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 9: if the Audio clip is being accessed, Local +storage indicates an error. The system presents this error to the +Playlist maintainer, and the use case ends.
    +
  • +
+
+

UC-4 Update an Audio clip in Local storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Update an Audio clip in Local storage
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To update an already existing Audio clip in +local storage.
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of replacing the data for an Audio clip in Local storage
+
references F1.2, A1.9
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to Local storage
+
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+

+
6.
+
The Playlist maintainer selects an Audio clip +from the Local storage through the Playlist editor.
+

+

+
7.
+
The Playlist maintainer presents the new audio +data and metadata for the selected Audio clip.
+
8.
+
The system receives the audio data and metadata +for the new Audio clip.
+

+

+
9.
+
The system presents the new audio data and +metadata for the specified Audio Clip to Local storage.
+
10.
+
The Local storage updates the specified Audio +clips contents with the presented content, and notifies the system of +this.
+
11.
+
The system notifies the Playlist maintainer of +the changes made.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 10: if the system receives an error indication from +the Local storage, it displays the error to the Playlist maintainer, +and the use case ends.
    +
  • +
+
+

UC-5 Add or update an Audio clip to Media archive
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Add or update an Audio clip to Media archive
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To add or update an Audio clip to Media archive
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of adding or updating an Audio clip already in Local storage to +the remote Media archive
+
references F1.2, F1.3, A1.9, A1.10
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Local storage
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+
6.
+
The Playlist maintainer selects an Audio clip +from Local storage through the Playlist editor.
+

+

+
7.
+
The Playlist maintainer indicates the selected +Audio clip to be added to the Media archive.
+
8.
+
The system provides authentication information +to the Media archive
9.
+
The Media archive checks for the provided +authentication information, and grants access. 10.
+
The system transfers the Audio clip from Local +storage to the Media archive, adding it to the Media archive
+
11.
+
The Local storage provides the contents of the +requested Audio clip to the system.
+

+

+
12.
+
Media archive receives the Audio clip
+

+
13.1
+
If no Audio clip with the unique id of the +supplied clip exists in Media archive, it is stored as a new Audio +clip. The Media archive notifies the system of the acceptance of the +Audio clip.
+

+

+
13.2
+
If an Audio clip with the unique id of the +supplied clip already exists in +Media archive, its contens are updated with that of the supplied Audio +clip. The Media archive +notifies the system of the acceptance of the Audio clip.
+

+

+

+
14.
+
The system notifies the Playlist maintainer +about the result of adding the Audio clip to the Media archive
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 9: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 11: if the specified Audio clip does not exist, the +Playlist maintainer is notified.
  • +
+
+

UC-6 Search for Audio clips
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-6
use case Search for Audio clips
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To search for Audio clips by metadata search +criteria in both Local storage and Media archive
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of searching for Audio clips based on some metadata search +criteria. The list if matching Audio clips is presented, both from +Local storage and Media archive.
+
references F1.2, F1.3, F1.4, A1.9, A1.10
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Local storage
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+

+

+
6.
+
The system provides authentication information +to the Media archive
7.
+
The Media archive checks for the provided +authentication information, and grants access. 8.
+
The system provides an interface to enter search +criteria
+
9.
+
The Playlist maintainer enters a search criteria.
+
10.
+
The system executes a search with the search +criteria on Local storage
+
11.
+
Local storage returns a list of marching Audio +clips.
+
12.
+
If the Media archive is accessible, the system +executes a search on it with the search criteria
+
13.
+
The Media archive returns a list of matching +Audio clips.
+
14.
+
The system displays the list of matching Audio +clips to the Playlist maintainer.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 7: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-7 Mirror an Audio clip from a remote Media archive in Local +storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-7
use case Mirror an Audio clip from a remote Media archive +in Local storage
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To mirror an Audio clip stored in Media archive +in Local storage
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of downloading and mirroring an Audio clip from the Media +archive into Local storage.
+
references F1.1, F1.2, F1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Media archive
+
5.
+
The Media archive checks that the provided +authentication information is correct, and grants access.
+
6.
+
The system provides authentication information +to Local storage
+
7.
+
Local storage checks that the provided +authentication information is correct, and grants access.
+

+
8.
+
The Playlist maintainer selects an Audio clip +from the Media archive, via the Playlist editor, for mirroring.
+
9.
+
The system accesses the Media archive, +downloading the requested Audio clip.
+
10.
+
The Media archive presents the requested Audio +clip
+
11.
+
The system stores the downloaded Audio clip in +Local storage
+
12.
+
Local storage stores the Audio clip
+
13.
+
The system notifies the Playlist maintainer of +the success of the operation.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 7: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-8 Add an Audio clip to a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-8
use case Add an Audio clip to a Playlist
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To add an Audio clip to a Playlist, either from +Local storage or the Media archive
+
overview The Playlist maintainer accesses the Playlist +editor application with the purpose of adding an Audio clip to a +Playlist. The Audio clip may reside in Local storage or a Media archive.
+The details of the added Audio clip are stored locally, even if it's +from a remote Media archive. When adding a remote Audio clip (from +Media archive), the possibility is given to mirror the clip in Local +storage (see UC-7).
+
references F1.1, F1.2, F1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects a Playlist.
+

+

+

+

+
5.
+
The system provides authentication information +to Local storage
+
6.
+
Local storage checks that the provided +authentication information is correct, and grants access.7.
+
The system provides authentication information +to the Media archive
8.
+
The Media archive checks that the provided +authentication information is correct, and grants access.
+

+
9.
+
The Playlist maintainer selects an Audio clip, +to be added to the Playlist. The Playlist manager also provides an +offset in the playlist where he wants the Audio clip to be.
+
10.
+
The system adds the selected Audio clip at the +specified offset to the playlist. If this is overlapping with existing +clips on all audio layers, the clip is added to an additional audio +layer.
+

+

+
11.
+
If the added clip is from a remote Media +archive, the Playlist editor is presented with a choice of downloading +it to Local storage.
+
12.
+
The Playlist editor specifies if he wants the +clip to be downloaded to Local storage.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 6: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 8: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-9 Move the position of an Audio clip in a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-9
use case Move the position of an Audio clip in a Playlist
+
type primary, essential
actors Playlist maintainer
+
purpose To change the offset of when an Audio clip is +played in a Playlist
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of changing the offset of an Audio clip in a Playlist.
+
references F1.1
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects a Playlist.
+

+

+
5.
+
The Playlist maintainer selects an Audio clip in +the Playlist
+

+

+
6.
+
The Playlist maintainer moves the selected Audio +clip to a new offset.
+
7.
+
The system updates the offset information for +the selected Audio clip.
+
8.
+
The Playlist maintainer moves the Audio clip to +another layer.
+
9.
+
The system moves the Audio clip to the new layer.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 9: if the Audio clip is overlapping with other +clips on the new layer, the clip is not moved..
  • +
+
+

UC-10 Edit the transition of an Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-10
use case Edit the transition of an Audio clip
+
type primary, essential
actors Playlist maintainer
+
purpose To change the fade-in / fade-out of an Audio clip
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of changing the fade-in / fade-out of an Audio clip
+
references F1.1
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects a Playlist.
+

+

+
5.
+
The Playlist maintainer selects an Audio clip in +the Playlist
+

+

+
6.
+
The Playlist maintainer edits the fade-in +parameters of the Audio clip
+
7.
+
The system updates the fade-in parameters of the +Audio clip.
+
8.
+
The Playlist maintainer edits the fade-out +parameters of the Audio clip
+
9.
+
The system updated the fade-out parameters of +the Audio clip.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
+
+

UC-11 Listen to a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-11
use case Listen to a Playlist
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To preview a Playlist
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of listening to a Playlist, to verify that when it is played, +it will have the desired effect.
+
references F1.7, A1.11, A1.14
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to Local storage
+
5.
+
Local storage checks that the provided +authentication information is correct, and grants access.
+

+

+
6.
+
The Playlist maintainer selects a Playlist.
+

+

+
7.
+
The Playlist maintainer starts to play the +Playlist.
+
8.
+
The system looks up the Audio clips to be played +in the immediate future, and accesses them from Local storage.
+
9.1
+
If the requested Audio clip is contained in +Local storage, seekable access to the raw audio data of the requested +Audio clips is provided
+

+

+
9.2
+
If the requested Audio clip is not in Local +storage, the system is notified.
+

+

+

+

+
10.
+
The system plays the raw audio data on the local +audio interface if available, silence otherwise.
+
11.
+
The Playlist maintainer seeks into the Playlist
+
12.
+
The system updates the offset where the audio +clips are to be played from, and continues playing from there.
+
13.
+
The Playlist maintainer ends playing
+
14.
+
The system release access to all accessed Audio +clips from Local storage
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-12 Upload a Playlist to a Scheduler daemon
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-12
use case Upload a Playlist to a Scheduler daemon
+
type primary, essential
actors Playlist maintainer, Scheduler
+
purpose To publish a Playlist
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of uploading a Playlist to a Scheduler daemon, so that it would +be executed at a specified time.
+
references F1.5
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Scheduler
+
5.
+
The Scheduler checks that the provided +authentication information is correct, and grants access.
+

+

+
6.
+
The Playlist maintainer selects a Playlist.
+

+

+
7.
+
The Playlist maintainer indicates the selected +Playlist to be uploaded to a Scheduler daemon, to be played at a +specified time.
+
8.
+
The system connects to the Scheduler with the +specified Audio clip and time, and uploads the Playlist.
+
9.
+
The Scheduler receives the playlist, and +schedules it for playing. The system is notified of this.
+
10.
+
The system notifies the Playlist maintainer of +the success of the operation.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-13 Maintain configuration information
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-13
use case Maintain configuration information
+
type primary, essential
actors Playlist maintainer
+
purpose To add, update or delete the systems that the +Playlist editor knows about.
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of reviewing and possibly changing the registered system the +Playlist editor connects to. These include Local storage, Media archive +and Scheduler, but also other details, like the local audio interface.
+
references F1.8
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects to to view the +configuration information
+
5.
+
The system displays the configuration +information to the Playlist maintainer
+
6.
+
The Playlist maintainer selects to add a new +registered external system.
+
7.
+
The system verifies the new registry entry, and +adds it to the configuration
+
8.
+
The Playlist maintainer selects to update a +registered external system.
+
9.
+
The system verifies the new values for the +registry entry, and updates the configuration
+
10.
+
The Playlist maintainer deletes a registered +external system.
+
11.
+
The system deletes the external system, if there +remain a minimum required of such system.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
+
+

+

+

+

+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Scheduler
+
The Scheduler daemon, executing playlists.
+
Local storage
+
The Local storage, holding Audio clips locally.
+
Media archive
+
The remote Media archive, holding Audio clips +remotely
+
Playlist uploader
+
The component responsible for uploading +Playlists to the Scheduler
+
Playlist player
+
Plays Playlists for preview locally.
+
Clip retriever
+
Responsible for the transfer of Audio clips to +and from Local storage and Media archive
+
Playlist
+
A series of Audio clips, and information on how +they come one after the other.
+
Playlist element
+
A connection object about a specific appearance +of an Audio clip in a Playlist
+
Audio clip
+
The basic unit of audio data handled by the +system.
+
Audio layer
+
An audio layer in the playlist, a sequence of +non-overlapping Audio clips
+
FadeInfo
+
The details of the transition of the specific +instance of the Audio clip on a Playlist. Basically a fade-in and +fade-out info
+
MetaData
+
The metadata associated with an Audio clip
+
SearchCriteria
+
Criteria for searching Metadata
+
Configuration
+
The configuration parameters of the Playlist +editor
+
Authentication
+
Component providing authentication services
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
Playlist uploader
+
Uploads to
+
Scheduler
+
The Playlist uploader uploads Playlists to the +Scheduler
+
Playlist player
+
Accesses audio data from
+
Local storage
+
For playing on the local audio interface
+
Clip retriever
+
Stores clips in
+
Local storage
+

+
Clip retriever
+
Stores clips in
+
Media archive
+

+
Clip retriever
+
Retrievers clips from
+
Media archive
+

+
Local storage
+
Contains
+
Audio clip
+

+
Media archive
+
Contains
+
Audio clip
+

+
Playlist uploader
+
Uploads
+
Playlist
+

+
Playlist player
+
Plays
+
Playlist
+

+
Playlist
+
Contains
+
Audio layer
+

+
Playlist element
+
References
+
Audio layer
+
Shows which layer the given Audio clip is on
+
Playlist element
+
Fades in with
+
FadeInfo
+

+
Playlist element
+
Fades out with
+
FadeInfo
+

+
Audio clip
+
Is described by
+
MetaData
+

+
Playlist maintainer
+
Searches by
+
SearchCriteria
+

+
Playlist maintainerCreates and edits
+
Playlist
+

+
Playlist maintainerListens to
+
Playlist
+

+
Playlist maintainerEdits
+
FadeInfo
+

+
Playlist maintainerMaintains
+
Configuration
+

+
Playlist maintainerIs authenticated by
+
Authentication
+

+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Create a Playlist

+ +
+

UC-2 Add an Audio clip to Local storage

+ +
+

UC-3 Delete an Audio clip from Local storage

+ +
+

UC-4 Update an Audio clip in Local storage

+ +
+

UC-5 Add or update an Audio clip to Media archive

+ +
+

UC-6 Search for Audio clips

+ +
+

UC-7 Mirror an Audio clip from a remote Media archive in Local +storage

+ +
+

UC-8 Add an Audio clip to a Playlist

+ +
+

UC-9 Move the position of an Audio clip in a Playlist

+ +
+

UC-10 Edit the transition of an Audio clip

+ +
+

UC-11 Listen to a Playlist

+ +
+

UC-12 Upload a Playlist to a Scheduler daemon

+ +
+

UC-13 Maintain configuration information

+ +
+

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +
+
+

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Playlist editor : authenticate

+See Authentication : authenticate
+

Contract for Playlist editor : createPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
createPlaylist
+()
+: Playlist
+
Responsibilities
+
Create a new, empty +Playlist
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+
none
+
Exceptions
+
none
Output
+
a new, empty Playlist
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
a Playlist is created
+
instance creation
+

+

+

+
+
+

Contract for Playlist editor : addAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAudioClip
+(rawAudioData : RawAudioData,
+metaData : MetaData)
+: UniqueId
+
Responsibilities
+
add an Audio Clip to +Local storage through the Playlist editor
+
Type
+
system
+
Cross-reference
+
UC-2
+
Notes
+
All the relevant work is +done in Local storage
+
Exceptions
+
none
Output
+
the unique id of the +added audio clip
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : deleteAudioClipFromLocalStorage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteAudioClipFromLocalStorage
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
delete an Audio Clip +from Local storage through the Playlist editor
+
Type
+
system
+
Cross-reference
+
UC-3
+
Notes
+
All the relevant work is +done in Local storage
+
Exceptions
+
if no Audio clip exists +in Local storage with the specified id, indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : updateAudioClipInLocalStorage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipInLocalStorage
+(audioClipId : UniqueId,
+rawAudioData : RawAudioData,
+metaData : MetaData)
+: void
+
Responsibilities
+
update the contents of +an Audio Clip in Local storage through the Playlist editor
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
All the relevant work is +done in Local storage
+
Exceptions
+
if no Audio clip exists +in Local storage with the specified id, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : addAudioClipToMediaArchive
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAudioClipToMediaArchive
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
add an Audio clip stored +in Local storage to the Media archive
+
Type
+
system
+
Cross-reference
+
UC-5
+
Notes
+
All the relevant work is +done in Local storage and Media archive.
+
Exceptions
+
if no Audio clip exists +in Local storage with the specified id, indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : searchMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
searchMetadata
+(criteria : SearchCriteria)
+: audioClipIds
+
Responsibilities
+
to search the Local +storage and remote Media archive accessible through the Playlist editor.
+
Type
+
system
+
Cross-reference
+
UC-6
+
Notes
+
All the relevant work is +done in Local storage and Media archive.
+
Exceptions
+
none
Output
+
a list of Audio clip +ids, which have metadata matching the search criteria.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : mirrorAudioClipInLocalStorage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
mirrorAudioClipInLocalStorage
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
to download and store an +Audio clip in Local storage, which is available in the remote Media +archive.
+
Type
+
system
+
Cross-reference
+
UC-7
+
Notes
+
All the relevant work is +done in Local storage and Media archive.
+
Exceptions
+
if no Audio clip exists +in Media archive with the specified id, indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : addAudioClipToPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAudioClipToPlaylist
+(playlist : Playlist,
+audioClipId : UniqueId,
+offset : Time)
+: void
+
Responsibilities
+
to add an Audio clip to +a Playlist, with the specified offset
+
Type
+
system
+
Cross-reference
+
UC-8
+
Notes
+
none
+
Exceptions
+
if no Audio clip exists +in either Local storage or Media archive with the specified id, +indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
create a new PlaylistElement instance
+
instance creation
+

+
associate the PlaylistElement with the specified +Playlist
+
association formed
+

+
associate the PlaylistElement with the specified +Audio clip
+
association formed
+

+
set the relativeOffset value of PlaylistElement +to the supplied offset
+
attribute modification
+
find an Audio layer in the Playlist in which the +new clip at specified offset does not overlap other clips
+
associate the found Audio layer with the created +PlaylistElement
+
association formed
+
if the Audio clip is overlapping other clips in +all Audio layers in the Playlist
+
create a new Audio layer
+
instance creation
+

+
associate the Audio layer with the Playlist
+
association formed
+

+
associate the Audio layer with the +PlaylistElement
+
association formed
+

+

+

+
+
+

Contract for Playlist editor : updateAudioClipPositionInPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipPositionInPlaylist
+(playlist : Playlist,
+playlistElement : PlaylistElement,
+newOffset : Time)
+: void
+
Responsibilities
+
to move an Audio clip +within a playlist to an other offset
+
Type
+
system
+
Cross-reference
+
UC-9
+
Notes
+
none
+
Exceptions
+
if the new position of +the Audio clip in its present Audio layer overlaps with other clips, +indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
set the relativeOffset value of PlaylistElement +to the supplied offset
+
attribute modification
+

+

+

+
+
+

Contract for Playlist editor : moveAudioClipToOtherLayer
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
moveAudioClipToOtherLayer
+(playlist : Playlist,
+playlistElement : PlaylistElement,
+newLayer : Audio layer)
+: void
+
Responsibilities
+
to move an Audio clip +within a playlist to another Audio layer
+
Type
+
system
+
Cross-reference
+
UC-9
+
Notes
+
none
+
Exceptions
+
if the specified Audio +layer is not associated with the specified Playlist, indicate as an +error.
+if the Audio clip overlaps other clips in the new Audio layer, indicate +as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
remove association between the PlaylistElement +and its current Audio layer
+
association broken
+

+
associate PlaylistElement with the supplied +Audio layer
+
association formed
+

+

+

+
+
+

Contract for Playlist editor : updateFadeParameters
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateFadeParameters
+(playlistElement : PlaylistElement,
+newFadeInInfo : fadeInfo,
+newFadeOutInfo : fadeInfo)
+: void
+
Responsibilities
+
to update the fade-in +and fade-out of an Audio clip in a Playlist
+
Type
+
system
+
Cross-reference
+
UC-10
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
replace the contents of the fadeInInfo +associated with the playlistElement with that of the supplied fadeInInfo
+
attribute modification
+

+
replace the contents of the fadeOutInfo +associated with the playlistElement with that of the supplied +fadeOutInfo attribute modification

+

+

+
+
+

Contract for Playlist editor : playPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
playPlaylist
+(playlist : Playlist,
+offset : Time)
+: void
+
Responsibilities
+
to play a playlist on +the local audio interface
+
Type
+
system
+
Cross-reference
+
UC-11
+
Notes
+
none
+
Exceptions
+
if offset points outside +of playlist, report as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : stopPlaying
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
stopPlaying
+()
+: void
+
Responsibilities
+
to stop playing whatever +is played.
+
Type
+
system
+
Cross-reference
+
UC-11
+
Notes
+
none
+
Exceptions
+
if there is no Playlist +currently playing, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : schedulePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
schedulePlaylist
+(playlist : Playlist,
+schedule : Schedule)
+: void
+
Responsibilities
+
to upload a Playlist to +a Scheduler daemon for later execution
+
Type
+
system
+
Cross-reference
+
UC-12
+
Notes
+
All the relevant work is +done in the Scheduler daemon.
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : addConfiguration
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addConfiguration
+(configuration : Configuration)
+: void
+
Responsibilities
+
to add a new +Configuration item
+
Type
+
system
+
Cross-reference
+
UC-13
+
Notes
+
none
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
create a new Configuration instance
+
instance creation
+

+
fill the created configuration instance with the +supplied information
+
attribute modification
+

+

+

+
+
+

Contract for Playlist editor : updateConfiguration
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateConfiguration
+(configuration : Configuration)
+: void
Responsibilities
+
to update a +Configuration item
+
Type
+
system
+
Cross-reference
+
UC-13
+
Notes
+
none
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
fill the corresponding configuration instance +with the supplied information
+
attribute modification
+

+

+

+
+
+

Contract for Playlist editor : deleteConfiguration
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteConfiguration
+(configuration : Configuration)
+: void
Responsibilities
+
to delete a +Configuration item
+
Type
+
system
+
Cross-reference
+
UC-13
+
Notes
+
none
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
delete the corresponding configuration item
+
instance deletion
+

+

+

+
+
+
+ + diff --git a/campcaster/doc/model/Scheduler/Concepts.svg b/campcaster/doc/model/Scheduler/Concepts.svg new file mode 100644 index 000000000..b6f2b73d7 --- /dev/null +++ b/campcaster/doc/model/Scheduler/Concepts.svg @@ -0,0 +1,1438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Scheduler + + + + + + + Authentication + + + + + + + + + + + + + + + + + + + FadeInfo + + + + + + + + + + + + + + + + + + + AudioClip + + + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + + + Media archive + + + (from + + + Media archive + + + ) + + + + + + + + + + Retrieves clips from + + + + + + + + + + * + + + Contains + + + + + + + Broadcast auditor + + + + + + + + + - + + + authenticationInfo + + + : + + + AuthenticationInfo + + + + + + + + + + + + + + + + Browses entries from + + + + + + + + + + Is authentitcated by + + + + + + + Playlist editor + + + + + + + + + - + + + authenticationInfo + + + : + + + AuthenticationInfo + + + + + + + + + + + + + + + + Uploads playlists to + + + + + + + + + + Manages schedule in + + + + + + + + + + Is authenticated by + + + + + + + + + + Requests + + + + + + + Local storage + + + (from + + + Local storage + + + ) + + + + + + + + + + * + + + Contains + + + + + + + + + + Stores clips in + + + + + + + Scheduler daemon + + + + + + + + + + + + + + + + + + + start + + + ( + + + ) + + + : + + + void + + + + + + + stop + + + ( + + + ) + + + : + + + void + + + + + + + isRunning + + + ( + + + ) + + + : + + + boolean + + + + + + + Play log entry + + + + + + + + + - + + + time + + + : + + + TimeStamp + + + + + + + + + + + + + Playlist store + + + + + + + + + + + + + + + + + + + Schedule entry + + + + + + + + + - + + + time + + + : + + + TimeStamp + + + + + + + + + + + + + Playlist + + + + + + + + + - + + + duration + + + : + + + Time + + + - + + + lockedForEditing + + + : + + + boolean + + + + + + + + + + + + + isValid + + + ( + + + ) + + + : + + + boolean + + + + + + + Play log + + + + + + + + + + + + + + + + + + + Play report + + + + + + + + + - + + + from + + + : + + + TimeStamp + + + - + + + to + + + : + + + TimeStamp + + + + + + + + + + + + + Schedule + + + + + + + + + + + + + + + + + + + Clip retriever + + + + + + + + + - + + + authenticationInfo + + + : + + + + + + + + + + + + + + + + * + + + Contains + + + + * + + + + + + + References + + + + + + + + + + Executes + + + + + + + + + + Logs into + + + + + + + + + + References + + + + + + + + + + * + + + Contains + + + + + + + + + + Generates + + + + + + + + + + * + + + Contains + + + + + + + + + + PlaylistElement + + + + + + + + + - + + + relativeOffset + + + : + + + Time + + + + + + + + + + + + + + + + + + + Fades in with + + + + + + + + + + Fades out with + + + + + + + + + + Stores clips in + + + + + + + Administrator + + + + + + + + + + + + + + + + + + + + + + Manages + + + diff --git a/campcaster/doc/model/Scheduler/Createplaylist_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Createplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..131eba7f2 --- /dev/null +++ b/campcaster/doc/model/Scheduler/Createplaylist_SequenceDiagram.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + createPlaylist + + + ( + + + ) + + + + + + + For editing the playlist see UC-7 Edit playlist + + + diff --git a/campcaster/doc/model/Scheduler/Editplaylist_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Editplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..c22ae16c6 --- /dev/null +++ b/campcaster/doc/model/Scheduler/Editplaylist_SequenceDiagram.svg @@ -0,0 +1,779 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + These three constitute + selecting and adding an + audio clip to the playlist, + use case actions 7-12 + + + + + + + Selecting and removing + an aduio clip from the + playlist, actions 13-14 + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlists + + + := + + + displayPlaylists + + + ( + + + ) + + + + + + + + + + + : + + + openPlaylistForEditing + + + ( + + + playlist + + + ) + + + + + + + + + + + + + + : + + + addAudioClipToPlaylist + + + ( + + + audioClip + + + , + + + playlist + + + , + + + relativeOffset + + + ) + + + + + + + + + + + : + + + audioClips + + + := + + + displayAudioClips + + + ( + + + ) + + + + + + + + + + + + + + : + + + audioClip + + + := + + + displayAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + + + + : + + + playlist + + + := + + + displayPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + + + + : + + + removeAudioClipFromPlaylist + + + ( + + + playlist + + + , + + + audioClip + + + ) + + + + + + + + + + + + + + : + + + updateFadeInOut + + + ( + + + playlist + + + , + + + audioClip + + + ) + + + + [save playlist] + + + : + + + playlistValid + + + := + + + validatePlaylist + + + ( + + + playlist + + + ) + + + + + + + + + + + + + + + : + + + savePlaylist + + + ( + + + playlist + + + ) + + + + [revert to old version] + + + : + + + revertEditedPlaylist + + + ( + + + playlist + + + ) + + + + + + + + + + + either + save, or + revert to + the old + version + + + + + + + + + diff --git a/campcaster/doc/model/Scheduler/EssentialUseCases.svg b/campcaster/doc/model/Scheduler/EssentialUseCases.svg new file mode 100644 index 000000000..4ab353d17 --- /dev/null +++ b/campcaster/doc/model/Scheduler/EssentialUseCases.svg @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LiveSupport Scheduler + + + + + + + + + + + + + UC-5 Review play log + + + + + + + UC-4 Retrieve remote files + + + + + + + UC-3 Manage playlists + + + + + + + UC-1 Upload playlist + + + + + + + UC-2 Manage schedule + + + + + + + UC-6 Create playlist + + + + + + + UC-7 Edit playlist + + + + + + + UC-8 Start/stop scheduler + + + + + + + Playlist editor + + + + + + + Broadcast auditor + + + + + + + + + + + + + Local storage + + + + + + + + + + + + + + + + + + + + + + Administrator + + + + + + diff --git a/campcaster/doc/model/Scheduler/Manageplaylists_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Manageplaylists_SequenceDiagram.svg new file mode 100644 index 000000000..5351b1e96 --- /dev/null +++ b/campcaster/doc/model/Scheduler/Manageplaylists_SequenceDiagram.svg @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlists + + + := + + + displayPlaylists + + + ( + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + displayPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + : + + + deletePlaylist + + + ( + + + playlist + + + ) + + + diff --git a/campcaster/doc/model/Scheduler/Manageschedule_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Manageschedule_SequenceDiagram.svg new file mode 100644 index 000000000..5db746afc --- /dev/null +++ b/campcaster/doc/model/Scheduler/Manageschedule_SequenceDiagram.svg @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + scheduleEntries + + + := + + + displaySchedule + + + ( + + + from + + + , + + + to + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + displayPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + : + + + isRemoved + + + := + + + removeFromSchedule + + + ( + + + scheduleEntry + + + ) + + + + + + + + + + + : + + + reschedule + + + ( + + + scheduleEntry + + + , + + + newPlaytime + + + ) + + + + + + + + + + + : + + + scheduleEntries + + + := + + + displaySchedule + + + ( + + + from + + + , + + + to + + + ) + + + diff --git a/campcaster/doc/model/Scheduler/Retrieveremotefiles_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Retrieveremotefiles_SequenceDiagram.svg new file mode 100644 index 000000000..27649a6cd --- /dev/null +++ b/campcaster/doc/model/Scheduler/Retrieveremotefiles_SequenceDiagram.svg @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + localStorage + + + + : + + + + Local storage + + + + + + + + + + + + + + mediaArchive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + clipExists + + + := + + + existsAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + audioClip + + + := + + + retrieveAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/campcaster/doc/model/Scheduler/Reviewplaylog_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Reviewplaylog_SequenceDiagram.svg new file mode 100644 index 000000000..f50bc15cc --- /dev/null +++ b/campcaster/doc/model/Scheduler/Reviewplaylog_SequenceDiagram.svg @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + broadcastAuditor + + + + : + + + + Broadcast auditor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playLog + + + := + + + displayPlayLog + + + ( + + + ) + + + + + + + + + + + : + + + report + + + := + + + generatePlayReport + + + ( + + + from + + + , + + + to + + + ) + + + diff --git a/campcaster/doc/model/Scheduler/Startstopscheduler_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Startstopscheduler_SequenceDiagram.svg new file mode 100644 index 000000000..59800118a --- /dev/null +++ b/campcaster/doc/model/Scheduler/Startstopscheduler_SequenceDiagram.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + + + + + administrator + + + + : + + + + Administrator + + + + + + + + : + + + start + + + ( + + + ) + + + + + + + + + + + : + + + stop + + + ( + + + ) + + + + + + + + + + + + + + + : + + + isRunning + + + := + + + isRunning + + + ( + + + ) + + + diff --git a/campcaster/doc/model/Scheduler/Systembehaviour.svg b/campcaster/doc/model/Scheduler/Systembehaviour.svg new file mode 100644 index 000000000..5f88cb4b9 --- /dev/null +++ b/campcaster/doc/model/Scheduler/Systembehaviour.svg @@ -0,0 +1,1307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Scheduler + + + + + + + + + + + + + + + + + + + authenticate + + + ( + + + authenticationInfo + + + : + + + ) + + + : + + + boolean + + + + + + + uploadPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + playtime + + + : + + + Schedule + + + ) + + + : + + + UniqueId + + + + + + + displaySchedule + + + ( + + + from + + + : + + + TimeStamp + + + , + + + to + + + : + + + TimeStamp + + + ) + + + : + + + Schedule entry + + + + + + + displayPlaylist + + + ( + + + playlistId + + + : + + + ) + + + : + + + Playlist + + + + + + + deletePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + removeFromSchedule + + + ( + + + scheduleEntryId + + + : + + + UniqueId + + + ) + + + : + + + boolean + + + + + + + reschedule + + + ( + + + scheduleEntryId + + + : + + + UniqueId + + + , + + + playtime + + + : + + + TimeStamp + + + ) + + + : + + + void + + + + + + + displayPlaylists + + + ( + + + ) + + + : + + + Playlist + + + + + + + displayPlayLog + + + ( + + + ) + + + : + + + Play log + + + + + + + generatePlayReport + + + ( + + + from + + + : + + + TimeStamp + + + , + + + to + + + : + + + TimeStamp + + + ) + + + : + + + Play report + + + + + + + createPlaylist + + + ( + + + ) + + + : + + + Playlist + + + + + + + openPlaylistForEditing + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + addAudioClipToPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClip + + + : + + + , + + + relativeOffset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + displayAudioClips + + + ( + + + ) + + + : + + + + + + + displayAudioClip + + + ( + + + audioClipId + + + : + + + ) + + + : + + + + + + + removeAudioClipFromPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClip + + + : + + + ) + + + : + + + void + + + + + + + updateFadeInOut + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClip + + + : + + + ) + + + : + + + void + + + + + + + validatePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + boolean + + + + + + + savePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + revertEditedPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + start + + + ( + + + ) + + + : + + + void + + + + + + + isRunning + + + ( + + + ) + + + : + + + boolean + + + + + + + stop + + + ( + + + ) + + + : + + + void + + + diff --git a/campcaster/doc/model/Scheduler/Uploadplaylists_SequenceDiagram.svg b/campcaster/doc/model/Scheduler/Uploadplaylists_SequenceDiagram.svg new file mode 100644 index 000000000..de1a57982 --- /dev/null +++ b/campcaster/doc/model/Scheduler/Uploadplaylists_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + uploadPlaylist + + + ( + + + playlist + + + , + + + playtime + + + ) + + + diff --git a/campcaster/doc/model/Scheduler/index.html b/campcaster/doc/model/Scheduler/index.html new file mode 100644 index 000000000..08bcd855d --- /dev/null +++ b/campcaster/doc/model/Scheduler/index.html @@ -0,0 +1,4214 @@ + + + + + LiveSupport Scheduler specifications + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document contains the specification of the LiveSupport Scheduler +daemon.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the LiveSupport Scheduler daemon is to execute +playlists.
+

Goals
+

+The scheduler daemon is a remotely accessible service accepting +playlists on a local audio interface. Specific goals include:
+
    +
  • remote manageability
  • +
  • handling remote audio clips referenced by playlists
  • +
  • low-latency playback
  • +
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Accept uploaded playlists
+
evident
+
F1.2
+
Retrieve remote files referenced by playlists
+
hidden
+
F1.3
+
Access local files
+
hidden
+
F1.4
+
Provide status information
+
evident
+
F1.5
+
Log playlist execution for proof of broadcast +reasons
+
evident
+
F1.6
+
Purge local file storage of unused audio clips
+
hidden
+
F1.7
+
Execute playlists
+
evident
+
F1.8
+
Play live streams as part of the playlist
+
hidden
+
F1.9
+
Remove playists from the schedule
+
evident
+
F1.10
+
Re-schedule playlsits
+
evident
+
F1.11
+
Delete playlists
+
evident
+
F1.12
+
Create playlists
+
evident
+
F1.13
+
Edit playlists
+
evident
+
F1.14
+
Start the scheduler daemon
+
evident
+
F1.15
+
Stop the scheduler daemon
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
supported audio interfaces
+
ALSA (maybe also OSS?)
+
must
+
A1.3
+
supported playlist format
+
SMIL 2.0. only partial support is required, +which focuses only on audio aspects of SMIL.
+
must
+
A1.4
+
supported audio clip formats
+
Ogg Vorbis, mp3, wav
+
must
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.7
+
Execute playlists
+
A1.5
+
low latency
+
when executing playlists, very low latency +should be achieved
+
must
+

+

+
A1.6
+
handle time skew
+
the +daemon has to take into account that the system's clock is not +accurate. the clock is synchronized to an external regularly, but the +resulting time-jump must be handled.
+
must
+
F1.8
+
Play live streams as part of the playlist A1.7
+
supported audio stream formats
+
Ogg Vorbis via HTTP, mp3 via HTTP
+
must
+
F1.14
+F1.15
+
Start / stop the scheduler daemon
+
A1.8
+
provide System V init style services
+
Provide a System V init interface to starting +and stopping the scheduler daemon
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Upload playlist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Upload playlist
type primary, essential
actors Playlist editor
purpose Upload a playlist
overview The Playlist editor uploads a new playlist.
references F1.1
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler daemon +with the intent of uploading a new playlist.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.
4. The Playlist editor presents the new playlist +and the intended schedule for the playlist.
+
5. The system validates the new playlist, and sees +that it does not conflict with existing schedule.

+

+
6. The system stores the new playlist, adds it to +the schedule, and sends confirmation to the Playlist editor.
7. The Playlist editor receives confirmation and +disconnects.
+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
    +
  • +
  • action 5: the system finds that the uploaded playlist is +invalid, or it conflicts the existing schedule. the user is +notified and the use case ends.
    +
    +
  • +
+

UC-2 Manage schedule
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
UC-2
use case Manage schedule
type
+
primary, essential
actors
+
Playlist editor
purpose
+
View the schedule and remove or re-schedule +playlists
+
overview
+
The Playlist editor reviews the schedule. If he +decides to, he might remove or re-schedule some of these playlists.
references
+
F1.4, F1.9, F1.10
+
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler daemon +with the intent of viewing and editing the schedule.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.

+

+
4.
+
The system shows the Schedule to the Playlist +editor
+
5.
+
The Playlist editor browses the Schedule, +selects a playlist for detailed viewing.
+
6.
+
The system shows the details of the selected +Playlist.
+
7.
+
The playlist editor removes a playlist from the +schedule.
+
8.
+
The system removes the playlist from the +schedule, than re-displays the updated schedle.
+
9.
+
The Playlist editor re-schedules a playlist
+
10.
+
The system removes the selected playlist from +the schedule, and re-enters it at a new timepoint
+
11.
+
The Playlist editor browses the Schedule
+
12.
+
The system shows the Schedule to the playlist +editor
+
13.
+
The Playlist editor disconnects.
+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
  • action 8: +the user tries to remove a non-existent playlist from the schedule. the +user is notified, and the schedule is displayed to the user.
  • +
  • action 10: +the new playtime for the schedule conflicts with already scheduled +playlist playtimes. the user is notified, and the schedule is displayed +again
    +
  • +
+

UC-3 Manage playlists
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
UC-3
use case Manage playlists
type
+
primary, essential
actors
+
Playlist editor
purpose
+
View and delete playlists
overview
+
The Playlist editor reviews the uploaded +playlists. If he decides so, he might delete some of these playlists.
references
+
F1.4, F1.11
+
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler daemon +with the intent of viewing and deleting playlists.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.

+

+
4.
+
The system lists the available Playlists
+
5.
+
The Playlist editor browses the playlists, and +selects one for detailed viewing.
+
6.
+
The system shows the details of the selected +Playlist.
+
7.
+
The playlist editor deletes a playlist.
+
8.
+
The system deletes the playlist, than +re-displays the list of available Playlists.
+
9.
+
The Playlist editor disconnects.
+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
  • action 8: +the user tries to delete a non-existent or a scheduled playlist. the +user is notified, and the list of playlists is displayed to the user.
    +
  • +
+

UC-4 Retrieve remote files
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Retrieve remote files
type
+
primary, essential
actors
+
(internal actor, initiator), Media archive, +Local storage
+
purpose
+
Retrieve remote files referenced by active +playlists and store them in the local storage
+
overview
+
The +daemon contacts the remote media archive and retrieves audio clips +referenced by active playlists. The clips are stored locally for +playing.
references
+
F1.2
+
+Note that this use case is somewhat reversed, as it is initiated by the +system (not an actor), and the main tasks are done by an external actor +(the Media archive).
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. An Internal actor triggers the retrieval of some +remote files.
+
2. The system looks up the URN of the remote file, +and determines the Media archive to contact regarding the file.

+

+
3.
+
The system contacts the Local storage and sends +authorization information
+
4.
+
Local storage authenticates the system and +grants access
+
5.
+
The system iniquires the local storage about the +availability of the file to download in the Local storage by presenting +its unique ID
+
6.
+
Local storage tells if the required file is +already stored or not.
+
7.
+
If the file is available in the local storage, +the use case ends. Otherwise, it continues.
+

+

+
8.
+
The system contacts the Media archive and sends +authorization information
9. Media archive authenticates the system and +grants access 10. The system requests an audio clip by presenting +its unique ID
11. Media archive looks up the file, and presents it +to the system 12. The system retrieves the file and closes the +connection to the Media archive
+

+

+
13.
+
The system presents the file to Local storage
+
14.
+
Local storage stores the file under the +specified unique ID
+
15.
+
The system closes the connection to Local +storage.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 4: the Local storage finds that the system can not +be authenticated. the system is notified and the use case ends.
  • +
  • action 9: the Media archive finds that the system can not +be authenticated. the system is notified and the use case ends.
  • +
  • action 11: the Media archive does not hold the requested +audio clip. the system is notified and the use case ends.
    +
    +
  • +
+

UC-5 Review play log
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Review play log
type secondary, essential
actors Broadcast auditor
purpose Review what has been played
overview The +Broadcast auditor reviews the audio clips that have been played in a +selected time interval. He may generate reports for proof of broadcast +reasons.
references F1.4
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Broadcast auditor connects to the scheduler +daemon with the intent of reviewing what has been played.
+

+

+
2. The Broadcast auditor provides authentication +information 3. The system authenticates the Broadcast auditor +and grants access.
3.
+
The Broadcast auditor browses through the play +log in a time-ordered manner.
+
4.
+
The system displays the play log entries.
+
5.
+
The Broadcast auditor requests a play report for +a given time period.
+
6.
+
The system displays the requested report.
+
7.
+
The Broadcast auditor disconnects.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
+
+

UC-6 Create playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-6
use case Create playlist
+
type secondary, essential
actors Playlist editor
+
purpose Create a new playlist, and then edit it.
+
overview The Playlist editor connects to the Scheduler +with the aim of creating a new playlist. A basic user interface is +provided, which allows professionals to create and edit the playlsits +on the system.
+
references F1.12, F1.13
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler with +the intent of creating a new playlist.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.
4.
+
The Playlist editor signals that he whishes for +a new playlist
+
5.
+
The system creates a new, empty playlist, and +opens it for editing.
+
6.
+
The Playlist editor edits the new playlist. See +UC-7 actions 7-15 for details.
+

+

+
7.
+
The Playlist editor disconnects.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
+
+

UC-7 Edit playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-7
use case Edit playlist
+
type secondary, essential
actors Playlist editor
+
purpose Edit a previoulsy uploaded playlist
+
overview The Playlist editor connects to the +Scheduler with the aim of either editing an existing playlist. A basic +user interface is provided, which allows +professionals to edit the playlsits on the system.
+
references F1.12
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler with +the intent of editing a playlist.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.

+

+
4.
+
The system lists the available playlists.
+
5.
+
The Playlist editor selects a playlist for +editing.
+
6.
+
The system opens the playlist in editing mode.
+
7.
+
The Playlist editor browses the available Audio +clips
+
8.
+
The system shows the list of available audio +clips
+
9.
+
The Playlist editor selects an Audio clip
+
10.
+
The system displays details on the audio clip.
+
11.
+
The Playlist editor ads a new audio clip to the +playlist, at a certain timepoint in the playlist.
+
12.
+
The new audio clip is added to the playlist.
+
13.
+
The Playlist editor removes an audio clip from +the playlist.
+
14.
+
The audio clip is removed from the playlist.
+
15.
+
The Playlist editor edits the fade-in or +fade-out of a clip in the playlist.
+
16.
+
The fade-in or fade-out is edited.
+
17.
+
The Playlist editor saves the playlist.
+
18.
+
The playlist is validated.
+

+

+
19.
+
The playlist is saved.
+
20.
+
The Playlist editor disconnects.
+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
  • action 6: the selected playlist is currently being +executed. the user is notified that executing playlists can not be +edited and the use case ends.
  • +
  • action 17: the user decides not to save the playlist, but +to revert to the version prior to editing. the playlist is reverted, +and is shown to the user in non-edit mode.
    +
  • +
  • action 18: the playlist turns out not be valid. the user +is notified that such a playlist can not be saved, and is given an +opportunity to further edit the playlist. validation errors are also +shown.
  • +
+
+

UC-8 Start/stop scheduler
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-8
use case Start/stop scheduler
+
type primary, essential
actors Administrator
+
purpose Start and stop the scheduler daemon
+
overview The adminisitrator starts the scheduler deamon +by invoking a System V init-style startup script. He may also stop the +deamon with the same script.
+
references F1.14, F1.15, A1.8
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. The Administrator invokes the scheduler's System +V init script with the start parameter
+

+

+

+

+
2. The scheduler daemon starts up.
+
3.
+
The Administrator checks to see if the scheduler +daemon is running
+
4.
+
The scheduler daemon reports that it is running.
+
5.
+
The Administrator stops the scheduler deamon.
+
6.
+
The scheduler daemon stops.
+
+
+

Alternate courses

+
    +
  • action 2: if the scheduler is already running, indicate +the starting attempt as an error.
    +
  • +
  • action 4: if the scheduler daemon is not running, it is +reported that it is not running.
    +
  • +
  • action 6: if the scheduler daemon is not running, it is +not stopped.
    +
  • +
+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Media archive
+
An archive external to the system, which holds +Audio clips. The archive offers its clips for download by requesting +clips based on their unique ids.
+
Clip retriever
+
Retrieves Audio clips from the Media archive and +stores them in local storage.
+
Local storage
+
A local store of Audio clips. Provides access to +each clip based on the clips' unique id. Allows random access to the +clip files.
+
Audio clip
+
A uniquely identified audio file.
+
Playlist
+
A metafile, containing references to Audio +clips, and information on how the clips should be played.
+
PlaylistElement
+
An association class describing the specifics of +an instance of an Audio clip in a playlist.
+
FadeInfo
+
A class describing fade in or fade out +characteristics for an Audio clip in a Playlist
+
Playlist store
+
A container holding a range of playlists.
+
Schedule
+
Contains Schedule entries
+
Schedule entry
+
Contains the time and details of when a playlist +should be played.
+
Scheduler daemon
+
Executes playlists at timepoints specified by +the schedule.
+
Play log
+
A logging facility, holding Play log entries.
+
Play log entry
+
A record of when an Audio clip was played.
+
Play report
+
An audit report of what Audio clips have been +played in a certain time period
+
Authentication
+
Provides authentication services
+
Playlist editor
+
An external editor, managing playlists.
+
Broadcast auditor
+
An external auditor, browsing the Play log.
+
Administrator
+
The administrator responsible for starting and +stopping the scheduler daemon.
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
Clip retriever
+
Retrieves clips from
+
Media archive
+

+
Media archive
+
Contains
+
Audio clip
+

+
Clip retriever
+
Stores clips in
+
Local storage
+

+
Local storage
+
Contains
+
Audio clip
+

+
Playlist
+
References by PlaylistElement
+
Audio clip
+

+
PlaylistElement
+
Fades in with
+
FadeInfo
+

+
PlaylistElement
+
Fades out with
+
FadeInfo
+

+
Playlist store
+
Contains
+
Play list
+

+
Playlist editor
+
Uploads playlist to
+
Playlist store
+

+
Playlist editor
+
Manages schedule in
+
Schedule
+
The Playlist editor schedules playlists.
+
Schedule
+
Contains
+
Schedule entry
+

+
Schedule entry
+
References
+
Playlist
+

+
Scheduler daemon
+
Executes
+
Schedule
+
The Scheduler daemon plays the scheduled +playlists.
+
Scheduler daemon
+
Logs into
+
Play log
+
The Scheduler daemon logs all the played audio +clips into the Play log for proof of broadcast purposes.
+
Play log
+
Contains
+
Play log entry
+

+
Play log
+
Generated
+
Play report
+
The play log generates reports based on Play log +entries.
+
Play log entry
+
References
+
Audio clip
+

+
Broadcast auditor
+
Browses entries from
+
Play log
+

+
Broadcast auditor
+
Requests
+
Play report
+

+
Playlist editor
+
Is authenticated by
+
Authentication
+

+
Broadcast auditor
+
Is authenticated by
+
Authentication
+

+
Administrator
+
Manages
+
Scheduler daemon
+

+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Upload playlists

+ +
+

UC-2 Manage schedule

+ +
+

UC-3 Manage playlists

+ +
+

UC-4 Retrieve remote files
+

+ +
+

UC-5 Review play log

+ +

UC-6 Create playlist

+ +

UC-7 Edit playlist
+ +

+

UC-8 Start/stop scheduler

+ +
+
+

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Scheduler : authenticate

+See Authentication : authenticate
+
+

Contract for Scheduler : uploadPlaylist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
uploadPlaylist
+(playlist : Playlist,
+playtime: Schedule)
+: UniqueId
+
Responsibilities
+
Upload a playlist and +put it into the schedule.
+
Type
+
system
+
Cross-reference
+
F1.1, UC-1
+
Notes
+

+
Exceptions
+
If the uploaded playlist +is not valid, indicate as an error
+If the proposed schedule conflicts with existing schedules, indicate as +an error
+
Output
+
the unique id of the +ScheduleEntry created with this upload
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
A new Playlist is created, storing the uploaded +playlist
+
instance creation

+
Playlist is entered into the Playlist store
+
association formed
+

+
A new Schedule is created, according to the +supplied schedule
+
instance creation
+

+
Schedule is associated with the Playlist
+
association formed
+

+

+

+
+
+

Contract for Scheduler : displaySchedule

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displaySchedule
+(from : TimeStamp,
+to : TimeStamp)
+: Schedule
+
Responsibilities
+
Display Schedule entries +for a time period.
+
Type
+
system
+
Cross-reference
+
F1.4, UC-2
+
Notes
+

+
Exceptions
+
none
+
Output
+
The Schedule entries for +the specified time period.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : displayPlaylist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlaylist
+(playlistId : UniqueId)
+: Playlist
+
Responsibilities
+
Display a specific +playlist
+
Type
+
system
+
Cross-reference
+
F1.4, UC-3
+
Notes
+

+
Exceptions
+
If no playlist exists +for the specified playlistId, indicate as an error.
+
Output
+
The requested playlist.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : deletePlaylist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlaylist
+(playlist : Playlist)
+: void
+
Responsibilities
+
Delete a specific +playlist
+
Type
+
system
+
Cross-reference
+
F1.11, UC-3
+
Notes
+

+
Exceptions
+
If no playlist exists +for the specified playlistId, indicate as an error.
+If the playlist is referenced by any Schedule entry, indicate as an +error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
The playlist is removed from the Playlist store.
+
association broken
+

+
References by the playlist to Audio clips removed
+
association broken
+

+
The playlist is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Scheduler : removeFromSchedule
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
removeFromSchedule
+(scheduleEntryId : UniqueId)
+: bool
+
Responsibilities
+
Remove a specific +playlist from a schedule entry
+
Type
+
system
+
Cross-reference
+
F1.9, UC-2
+
Notes
+

+
Exceptions
+
If no ScheduleEntry by +the specified +scheduleEntryId exist, indicate as an error.
+
Output
+
true if the specified +entry was removed, false if it did not exist.
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
Reference to the playlist by the scheduleEntry +is removed.
+
association broken
+

+
The ScheduleEntry specified by the +scheduleEntryId is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Scheduler : reschedule
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
reschedule
+(scheduleEntryId : UniqueId,
+playtime : TimeStamp)
+: bool
+
Responsibilities
+
Change when a certain +playlist is scheduled to play.
+
Type
+
system
+
Cross-reference
+
F1.10, UC-2
+
Notes
+

+
Exceptions
+
If no ScheduleEntry by +the specified +scheduleEntryId exist, indicate as an error.
+If the new playtime conflicts with other schedule entries, indicate as +an error.
+
Output
+
false on errors
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
The time attribute of scheduleEntry is updated +to the supplied playtime.
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : displayPlaylists

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlaylists
+()
+: Playlist
+
Responsibilities
+
Display Playlists +contained in the Playlist store
+
Type
+
system
+
Cross-reference
+
F1.4, UC-3
+
Notes
+

+
Exceptions
+
none
+
Output
+
The playlists contained +in the Playlist store.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : displayPlayLog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlayLog
+()
+: Play log
+
Responsibilities
+
Display Play log entries +contained in the Play log
+
Type
+
system
+
Cross-reference
+
F1.4, UC-5
+
Notes
+

+
Exceptions
+
none
+
Output
+
The play log entries +contained in the Play log.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : generatePlayReport
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
generatePlayReport
+(from : TimeStamp,
+to : TimeStamp)
+: Play report
+
Responsibilities
+
Present a report on what +Audio clips have been played to the Broadcast auditor.
+
Type
+
system
+
Cross-reference
+
F1.4, UC-5
+
Notes
+

+
Exceptions
+
none
+
Output
+
A report on the played +Audio clips played in the specified time period.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : createPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
createPlaylist
+()
+: Playlist
+
Responsibilities
+
Create a new playlist
+
Type
+
system
+
Cross-reference
+
F1.12, UC-6
+
Notes
+
A new playlist is +created, and is immediately locked for editing.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
A new Playlist is created
+
instance creation
+

+
The lockedForEditing attribute is set to true +for the playlist
+
attribute modification
+

+
The playlist is added to the Playlist store
+
association formed
+

+

+

+
+
+

Contract for Scheduler : openPlaylistForEditing
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
openPlaylistForEditing
+(playlist : Playlist)
+: void
+
Responsibilities
+
Open a playlist for +editing
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
A playlist is opened for +editing. Active (currently executing) playlists may not be opened for +editing. The playlist may start executing while being edited: in this case, +editing is suspended while the playlist is executing and resumed afterwards. +This is in effect a lock, which is released by saving the playlist.
+
Exceptions
+
if the playlist is +currently being executed, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
The current version of the playlist is stored, +in case the user wants to revert to the last saved version (see +revertEditedPlaylist)
+
instance creation
+

+
The lockedForEditing attribute is set to true +for the playlist
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : addAudioClipToPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAutioClipToPlaylist
+(playlist : Playlist,
+audioClip : AudioClip,
+relativeOffset : Time)
+: void
+
Responsibilities
+
Add an Audio clip to a +Playlist
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The Audio clip is added +to the playlist with the specified relativeOffset from the beginning of +the Playlist.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The new PlaylistElement is created associating +the playlist with the audio clip, with the specified relativeOffset
+
association formed, instnace creation
+

+

+

+
+
+

Contract for Scheduler : displayAudioClips
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayAudioClips
+()
+: AudioClip
+
Responsibilities
+
Display the audio clips +known to the Scheduler
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
The Audio clips kown to +the Scheduler
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : displayAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayAudioClip
+(audioClipId : UniqueId)
+: AudioClip
+
Responsibilities
+
Display the audio clip +specified by the audioClipId
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
if no audio clip by the +specified id exists, indicate as an error
+
Output
+
The Audio clip specified +by the audioClipId
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : removeAudioClipFromPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
removeAutioClipFromPlaylist
+(playlist : Playlist,
+relativeOffset: Time)
+: void
+
Responsibilities
+
Remove an Audio clip +from a Playlist
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The Audio clip is +removed from the Playlist.
+
Exceptions
+
If the Audio clip is not +in the playlist, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The PlaylistElement associating the AudioClip +with the Playlist is removed, with the related FadeInfo instances
+
instance deletion, association broken
+

+

+

+
+
+

Contract for Scheduler : updateFadeInFadeOut
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateFadeInFadeOut
+(playlist : Playlist,
+ relativeOffset: Time,
+ fadeInfo: FadeInfo)
+: void
+
Responsibilities
+
Update the fade-in and +fade-out parameters for an audio clip in a playlist, the start time of which +is at a given relative offset.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
If there is no Audio clip +with a start time at the given relative offset in the playlist, indicate +as an error.
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The fade-in and fade-out parameters for the +audio clip in the playlist are updated
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : validatePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
validatePlaylist
+(playlist : Playlist)
+: boolean
+
Responsibilities
+
Validate a playlist for +being complete.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The playlist is checked +for being complete (not containing silence) and other sanity criteria.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : savePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
savePlaylist
+(playlist : Playlist)
+: void
+
Responsibilities
+
The playlist is saved.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
If the playlist is not +valid, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The lockedForEditing attriubute is set to false +for the playlist
+
attribute modification
+

+
The old version of the Playlist that could have +been used for reverting is deleted (see revertEditedPlaylist)
+
instance deletion
+

+

+

+
+
+

Contract for Scheduler : revertEditedPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
revertEditedPlaylist
+(playlist : Playlist)
+: void
+
Responsibilities
+
Changes are discarded +for a Playlist that is being edited.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The contents of the +playlist are reverted to the state prior to when editing began on it.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The contents of the Playlist are reverted to the +last saved version. This includes deleting all created PlaylistElement +and FadeInfo instances.
+
attribute modification, instance deletion
+

+
The lockedForEditing attriubute is set to false +for the playlist
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : start
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
start
+()
+: void
+
Responsibilities
+
Starts the scheduler +daemon
+
Type
+
system
+
Cross-reference
+
F1.14, UC-8
+
Notes
+
A System V init-style +daemon starting entry point
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
The scheduler daemon is +currently not running
+
Post-conditions
+
condition
+
type
+

+
The scheduler daemon object is created
+
instance creation
+

+
All the necessary structures are created for the +deamon to run
+
instance creation
+

+

+

+
+
+

Contract for Scheduler : isRunning
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
isRunning
+()
+: boolean
+
Responsibilities
+
Tells if the scheduler +daemon is running
+
Type
+
system
+
Cross-reference
+
UC-8
+
Notes
+
A System V init-style +daemon status entry point
+
Exceptions
+
none
+
Output
+
true of the daemon is +running, false otherwise
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : stop
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
stop
+()
+: void
+
Responsibilities
+
Stops the scheduler +daemon
+
Type
+
system
+
Cross-reference
+
F1.15, UC-8
+
Notes
+
A System V init-style +daemon stopping entry point
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
The scheduler daemon is +currently running
+
Post-conditions
+
condition
+
type
+

+
The scheduler daemon object is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Media archive : authenticate

+TODO: move to Media archive spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
authenticate
+(authenticationInfo : AuthenticationInfo)
+: boolean
+
Responsibilities
+
Check if the provided +authentication info is recognized.
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
true if the provided +authentication is recognized, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Media archive : retrieveAudioClip

+TODO: move to Media archive spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
retrieveAudioClip
+(clipId : UniqueId)
+: AudioClip
+
Responsibilities
+
Retrieve an AudioClip +specified by the supplied audio clip id.
+
Type
+
interface
+
Cross-reference
+
F1.2, UC-4
+
Notes
+

+
Exceptions
+
if no audio clip exists +with the supplied id, indicate as an error
+
Output
+
the requested audio clip
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
A new Audio clip is created and filled with the +contents of the retrieved audio clip
+
instance creation

+
Audio clip is entered into Local storage
+
association formed
+

+

+

+
+
+

Contract for Local storage : authenticate

+TODO: move to Local storage spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
authenticate
+(authenticationInfo : AuthenticationInfo)
+: boolean
+
Responsibilities
+
Check if the provided +authentication info is recognized.
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
true if the provided +authentication is recognized, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : existsAudioClip

+TODO: move to Local storage spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
existsAudioClip
+(audioClipId : UniqueId)
+: boolean
+
Responsibilities
+
Tell if an audio clip by +the provided unique id is stored in the Local storage
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
true if an audio clip +with the provided id exists, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : storeAudioClip

+TODO: move to Local storage spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
storeAudioClip
+(audioClip : AudioClip)
+: void
+
Responsibilities
+
Store an audio clip.
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
The supplied audio clip is stored in the storage.
+

+

+

+

+
+
+

Glossary

+playlist
+The playlist is a metafile, containing references to audio clips that +should be played, and details on how they should be played.
+
+ + diff --git a/campcaster/doc/model/SoftwareArchitecture/PlaylistEditorArchitecture.svg b/campcaster/doc/model/SoftwareArchitecture/PlaylistEditorArchitecture.svg new file mode 100644 index 000000000..dc612e579 --- /dev/null +++ b/campcaster/doc/model/SoftwareArchitecture/PlaylistEditorArchitecture.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OSS + + + + + + + ALSA + + + + + + + Helix Client Library + + + + + + + Playlist editor + + + + + + + GTK+ + + + + + + + + + + + Local storage + + + + + + + + + + + + + Media Archive + + + + + + + + + + + + Scheduler + + + + + + diff --git a/campcaster/doc/model/SoftwareArchitecture/SchedulerArchitecture.svg b/campcaster/doc/model/SoftwareArchitecture/SchedulerArchitecture.svg new file mode 100644 index 000000000..349806bd9 --- /dev/null +++ b/campcaster/doc/model/SoftwareArchitecture/SchedulerArchitecture.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + + + + + Helix Client Library + + + + + + + OSS + + + + + + + ALSA + + + SMIL, MP3, Ogg Vorbis + + + + + + + Media Archive + + + + + + + Scheduler + + + + + + + + + + + + + + + + + + Playlist editor + + + + + + diff --git a/campcaster/doc/model/SoftwareArchitecture/SoftwareArchitecture.zuml b/campcaster/doc/model/SoftwareArchitecture/SoftwareArchitecture.zuml new file mode 100644 index 000000000..bccf75488 Binary files /dev/null and b/campcaster/doc/model/SoftwareArchitecture/SoftwareArchitecture.zuml differ diff --git a/campcaster/doc/model/SoftwareArchitecture/index.html b/campcaster/doc/model/SoftwareArchitecture/index.html new file mode 100644 index 000000000..f0eb18e16 --- /dev/null +++ b/campcaster/doc/model/SoftwareArchitecture/index.html @@ -0,0 +1,104 @@ + + + + + LiveSupport Software Architecture + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the software architecture of LiveSupport.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Software Architecture

+The software architecture is contained +in Poseidon +2 format.
+

Scheduler

+The software architecture for the Scheduler component:
+ +
+

Playlist editor

+The software architecture for the Playlist Editor:
+ +
+

Components

+A brief summary of the software components appearing in the figures +above:
+

Scheduler

+The LiveSupport Scheduler, responsible for executing playlists.
+

Playlist editor

+The LiveSupport Playlist editor, a graphical user interface component.
+

Media Archive

+The LiveSupport Media Archive component.
+

Local storage

+The LiveSupport Local Storage component.
+

Helix Client Library

+A media library developed by the Helix +Community and Real Networks. +This library provides support for the SMIL playlist format and Ogg Vorbis and MP3 audio +formats.
+

OSS

+Open Sound System, a +cross-platform low level audio API for accessing analog audio devices. +This is the de-facto standard audio API for Linux until kernel 2.4.
+

ALSA

+Advanced Linux Sound Architecture, +a more advanced low level audio API. This is the de-facto standard +audio API for Linux since kernel 2.6.
+

GTK+

+The GIMP Toolkit, a cross-platform +graphical user interface API.
+

Discussion
+

+Among the software components listed above, OSS, ALSA and GTK+ are +industry standard, and are straightforward to use. But the Helix Client +Library is a special library, the open sourced version of Real +Network's streaming libraries.
+
+Tests were made to make sure Helix indeed compiles and runs fine on the +target platform. All libraries where successfully compiled and SMIL +playlists were successfully played. For this, the splay command line +sample program was used, which is part of the Helix codebase. For +compiling helix client libraries, refer to the Getting +Started with the Helix Sources pages. The settings used for +successful compilation:
+
+[0] Set BIF branch (hxclient_1_3_0_neptunex)
+[1] Set Target(s) (splay)
+[2] Set Profile (helix-client-all-defines)
+[3] run: build
+[4] Toggle make depend & makefiles (-e -n)
+[5] Toggle release (-trelease)
+[6] Toggle 'make clean'  (-c)
+[7] Toggle clobber (Dangerous!) (-C)
+[8] Toggle halt-on-error (-p green)
+[9] Toggle verbose mode (-v)
+[10] Toggle static build (-tnodll)
+[11] Checkout source for selected target now
+[12] Set Tag/Branch/Timestamp
+[13] Help Page (full help in build/doc/index.html)
+[14] run history: build
+[Q] Quit

+
+ + diff --git a/campcaster/doc/model/index.html b/campcaster/doc/model/index.html new file mode 100644 index 000000000..9fb3cae83 --- /dev/null +++ b/campcaster/doc/model/index.html @@ -0,0 +1,200 @@ + + + + + LiveSupport Architecture + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the architecture of LiveSupport.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Architecture

+
+ +
+UML diagrams in Poseidon +2 format are available in a Poseidon +project file.
+
+The Software architecture is discribed on a different page.
+

Scheduler

+The scheduler is responsible to +execute playlists.
+

Local storage

+The local storage holds locally +available audio clips
+

Media archive

+The media archive is a +centralized media archive holding audio clips +and storing metadata.
+

Authentication

+The authentication component +provides basic authentication functionality.
+

Playlist editor

+The Playlist editor component +is the user interface tool to create playlists.
+

Feature - component mapping

+This section contains a mapping from the features listed in section 3.3 +the original LiveSupport proposal to the components that fulfill these +features.
+

LiveSupport Feature List

+For convenience the features listed in section 3.3 of the LiveSupport +proposal are quoted below, with their original section numbers.
+

3.3.1 Intuitive User Interface

+

LiveSupport will feature an +easily-localizable and intuitive user interface that draws on the +applicants’ extensive previous project experience.

+

3.3.2 Storing Metadata

+

Most audio formats allow the storage of +some information inside the media file itself. However, this feature +was developed primarily to handle music tracks, storing information +on artist, title, record, genre, track number and so on. It is +impossible to store essential information like the language of an +audio file – essential for spoken word productions, such as +educational or news material.

+

LiveSupport will use existing open +standards, such as RSS feed standards in XML format, to store all +information needed to describe a file sufficiently. Additionally, +this metadata information will fully support the Unicode format, +making the database of metadata available to all character sets and +fully searchable.

+

3.3.3 Automation and Scheduling

+

LiveSupport will provide a scheduler, +allowing stations to fill parts of the radio schedule with automated +broadcasts. Throughout automated broadcasting times, the station will +still be able to deliver advertisement, generating income while +minimizing the running costs. Longer times of daily broadcasts via +automation also help the station to make its frequency known in the +community.

+

3.3.4 Playlist Management

+

Small radio stations in the developing +world mainly use playlists generated by audio player software such as +MusicMatch, Windows MediaPlayer or WinAMP. Such simple playlists +provide no more information than a list of file names, and are +inaccessible for full text search. As mentioned above, LiveSupport +will use the potential of XML metadata in Unicode to manage and +archive playlists.

+

3.3.5 Proof of Broadcast

+

Proof of broadcast is essential to +establish serious business relationships with advertisers. +LiveSupport will provide accurate and detailed log files stating the +precise time each item was broadcast over the system. In a +radio-network context, the proof of broadcast tool developed by MDLF +in conjunction with Radio 68H in Indonesia will be used to aggregate +and analyze logs created by individual LiveSupport installations.

+

3.3.6 Mixing Local Audio Sources

+

A producer running LiveSupport in a +studio will be able to mix audio files (e.g. reports, music, +jingles), phone calls and the microphone into a live broadcast.

+

3.3.7 Mixing Local and Remote Sources

+

If connected to the Internet, and given +enough available bandwidth, LiveSupport will be able to play local +files (stored on the system’s hard disk), remote files (stored +anywhere on the Internet) or include audio streams from the Internet +as part of the local transmission – all of which could also become +part of a playlist.

+

3.3.8 Remote Control of Transmitter Locations

+

A radio reporter/producer will be able +to remotely access all of LiveSupport’s scheduling features over +the Internet using a standard web browser. She will be able to upload +audio programs as well as create playlists and schedule transmission.

+

Feature - component mapping

+The following table associates features with components.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
feature
+
component
+
3.3.1
+
Intuitive User Interface
+
Playlist editor
+
3.3.2
+
Storing Metadata
+
Media archive
+
3.3.3
+
Automation and Scheduling
+
Scheduler
+
3.3.4
+
Playlist Management
+
Scheduler, Playlist editor
+
3.3.5
+
Proof of Broadcast
+
Scheduler
+
3.3.6
+
Mixing Local Audio Sources
+

+
3.3.7
+
Mixing Local and Remote Sources
+
Local storage, Media archive, Scheduler, +Playlist editor
+
3.3.8
+
Remote Control of Transmitter Locations
+
Scheduler, Playlist editor
+
+
+
+ + diff --git a/campcaster/doc/preferences.html b/campcaster/doc/preferences.html new file mode 100644 index 000000000..3a7c938a3 --- /dev/null +++ b/campcaster/doc/preferences.html @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key + nameTypeFormatComment/Example
Station Preferences:Stored for group StationPrefs
StationDefaultLang + (maybee)
stationFrequencyStringString because comma, minus
stationNameString
stationLogoPathStringValid path and filename. Relative/absolute?
stationURLStringValid URL
schedulerStartupScriptStringpath for startup script (start/stop parameter will added + automatically)
User Preferences:
scratchPadContentsString$gunid $gunid2 [...]7517812295906073177:2005-02-02 + 5680267281985233061:2005-01-15
playlistTokenString$playlistId:$token23:28f641eb921c2cb5
TimeFormatInt12 | 24
+ +
+ + + + + + + + diff --git a/campcaster/doc/quickstart/index.html b/campcaster/doc/quickstart/index.html new file mode 100644 index 000000000..2a7ef8908 --- /dev/null +++ b/campcaster/doc/quickstart/index.html @@ -0,0 +1,62 @@ + + + +Untitled Document + + + + +

+
+ + + + + + + + + + + + + + + + +
  

LiveSupport 1.0
+
Demo and Install CD +

+
 

This + CD is a bootable version of Linux for PCs that includes a demo version + of LiveSupport preinstalled.

+

To start, + insert this CD into your CD-ROM drive and restart your computer.
+ You will be prompted for a boot option. Type ‘knoppix’ and the + enter key and the startup procedure will continue.

The K + Desktop environment (KDE), which is very similar to Windows, will appear. To + start the LiveSupport Studio application, click on its desktop icon.

+

For both + LiveSupport Studio and web access, The username is ‘root,’ and + the password is ‘q’ for the demo.

+

You may + also access LiveSupport Station on this demo through a web browser. + Click the globe icon in the task bar to start the Mozilla Firefox browser.

+

In the + URL field, type: http://localhost/livesupport.

+

You + may also choose to install the operating system and LiveSupport to + your + hard disk. Note: Installation to the hard disk is intended for experienced + users, and is intended for new computers.

+

As with + most open source software, LiveSupport is undergoing frequent updates. + For more information, including news about program updates, check our + website + frequently + at http://livesupport.campware.org

+
+

 

+

 

+ + diff --git a/campcaster/doc/quickstart/livesupport_logo_blends.png b/campcaster/doc/quickstart/livesupport_logo_blends.png new file mode 100644 index 000000000..13f48ae03 Binary files /dev/null and b/campcaster/doc/quickstart/livesupport_logo_blends.png differ diff --git a/campcaster/doc/quickstart/outline_clouds.jpg b/campcaster/doc/quickstart/outline_clouds.jpg new file mode 100644 index 000000000..64527e734 Binary files /dev/null and b/campcaster/doc/quickstart/outline_clouds.jpg differ diff --git a/campcaster/doc/release.html b/campcaster/doc/release.html new file mode 100644 index 000000000..dc201fc01 --- /dev/null +++ b/campcaster/doc/release.html @@ -0,0 +1,191 @@ + + + + + LiveSupport release process documentation + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+

Scope

+This document describes the process of releasing a new version of +LiveSupport. Obviously this document is only relevant to people who +have the rights and permissions to make such a release.
+

Introduction

+For all the releases of LiveSupport to remain consistent, it is +preferable to have a repeatable release process, which will be followed +when creating releases. This ensures that no matter who creates the +releases, they will remain similar.
+
+The release process boils down to the following steps:
+
    +
  • getting LiveSupport sources
  • +
  • checking the distribution script
  • +
  • updating release version and changelog
    +
  • +
  • creating release tarballs
  • +
  • testing the tarballs
  • +
  • creating Debian packages
    +
  • +
  • tagging the sources
  • +
  • publishing the tarballs
  • +
  • announcing the release
    +
  • +
+

Getting LiveSupport sources

+It is assumed that the person doing the release has a read/write access +to the LiveSupport version control system. As a first step of the +release process, a fresh copy of the version control repository is +exported, so as to insure that:
+
    +
  • the release contains exactly the files that are in the version +control system
  • +
  • there are no generated files in the release
  • +
+To get a fresh copy of the LiveSupport repository, execute the +following in an empty directory:
+
+
svn export svn+ssh://<username>@code.campware.org/home/svn/repo/livesupport/trunk/livesupport
+
+Where <username> is the user name for accessing the +repository of the person making the release.
+

Checking the distribution script

+It is advisable to check the installation script bin/dist.sh, +to make sure it refers to up-to-date information from the development +environment.
+
+The most important aspect to check is that the specific versions of +tools mentioned in the distribution script are in sync with the tools +compiled by the master Makefile under the target tools_setup. +To check this, compare tool version variables in the two files, e.g. BOOST_VERSION +from Makefile with boost_version from bin/dist.sh. +Make sure to check the versions for all the tools mentioned in these +files. Also check that there are no tools missing from the distribution +script that are mentioned in the master Makefile.
+

Updating release version and changelog

+Updating the release version and maintining a changelog helps people +track the progress of the project. Also, building binary packages rely +on this information, in particular debian packages won't build if there +is a mismatch between the release version and the topmost entry in the +debian changelog file.
+
+Curently, only the debian changelog keeps track of the changes and the +version of LiveSupport. To update the changelog, edit etc/debian/changelog, +by inserting a section onto the top of the file:
+
+
livesupport (<ls-version>-1) unstable; urgency=low

* Changes listed here

-- Package Maintainer <maintainer@foo.bar> <timestamp>

+The timestamp above must be preceeded by two spaces, and must be an RFC +2822 compliant date string, which is most easily produced by issuing +the date -R command. Please note that the debian package +manager is quite picky on the format of the changelog file. See section +4.4 of the Debian Policy Manual for more details.
+
+Don't forget to commit the changes made to the changelog into Subversion +before proceeding.
+

Creating release tarballs
+

+To create the release tarballs, invoke the distribution script bin/dist.sh, +with the release version as its single parameter:
+
+
./bin/dist.sh --version <ls-version>
+
+This will create two tarballs in the current directory:
+
    +
  • livesupport-<ls-version>.tar.bz2
  • +
  • livesupport-libraries-<ls-version>.tar.bz2
  • +
+

Testing the tarballs

+Having broken releases is very annoying, thus it is highly recommended +that the release tarballs are tested on a plain vanilla system. To test +the tarballs, follow the procedure described in the LiveSupport installation document.
+
+Do not publish tarballs that have not been tested, or are known to be +broken.
+

Creating Debian packages

+After the source tarballs have been tested, Debian source and binary +packages can be created. To do so, upload the source tarballs to a +Debian system, and do the following:
+
+
tar xfj livesupport-<ls-version>.tar.bz2
tar xfj livesupport-libraries-<ls-version>.tar.bz2
cd livesupport-<ls-version>
./bin/createDebianPackages.sh -d .. -v <ls-version> -m "Package Maintainer <maintainer@foo.bar>" -o ..
cd ..
+
+The above command will create the Debain source package files next to +the original source tarballs. The script will generate the following +files, making up the Debian source package:
+
+
livesupport_<ls-version>-1.dsc
livesupport_<ls-version>-1.diff.gz
livesupport_<ls-version>.orig.tar.gz

+Based on the source packages, the Debian package management system can +build the binaries for the current target platform, provided all the +necessary packages required to build are installed on the system. For a +list of the necessary packages, please consult the debian/control file +in extracted debianized source tree generated below.
+Building is best done +in an empty directory as follows:
+
+
rm -rf /opt/livesupport
rm -rf debian_build
mkdir debian_build
cd debian_build
dpkg-source -x ../livesupport_<ls_version>-1.dsc
cd livesupport-<ls-version>
dpkg-buildpackage -rfakeroot
cd ../..

+The above commands will result in the following debian packages:
+
+
livesupport-libs_<ls-version>-1_<arch>.deb
livesupport-station_<ls-version>-1_<arch>.deb
livesupport-studio_<ls-version>-1_<arch>.deb
+
+ +

Tagging the sources

+After the tarballs have been tested, the release can be finalized. As a +first step, the current state of the LiveSupport version control +repository has to be tagged, so that the the very versions in the +release can be retrieved at any later date. To tag the repository, +issue the following command:
+
+
svn copy svn+ssh://<username>@code.campware.org/home/svn/repo/livesupport/trunk/ \
+         svn+ssh://<username>@code.campware.org/home/svn/repo/livesupport/tags/livesupport-<ls-version>
+
+This will tag the current state of the repository with the tag livesupport-<ls-version>, +enabling later retrieval of this specific state.
+ +

Updating Trac

+Add the new version number to the Version pull-down menu in Trac by +executing +
trac-admin /usr/local/trac-projects/livesupport version add <ls-version>
+on code.campware.org. + +

Publishing the tarballs

+To make the release available to the public, the created tarballs have +to be published. This is done by making the files accessible under the +LiveSupport project page on SourceForge: http://sourceforge.net/projects/livesupport. Currently, only +MDLF support staff have access to publish into this +space, so after creating the tarballs, one should contact them +personally to publish the files.
+

Announcing the release

+For the public to be aware of the new release, it has to be announced. +This is primarily done on the Campware site, but also on other +meta-sites, like freshmeat. In particular, the following announcements +are made:
+
    +
  • Campware.org site.
  • +
  • Freshmeat.net.
  • +
  • Press releases/announcements go to:
  • +
      +
    • NewsForge (http://www.newsforge.com)
    • +
    • PRweb (http://www.prweb.com)
    • +
    • MDLF's press person
    • +
    • LiveSupport developers' list, urging everyone to send it to +friends and contacts
    • +
    • Other Campware developers' lists on major releases
    • +
    • Other mailing lists and friendly/relevant organizations
    • +
    +
+
+ + diff --git a/campcaster/doc/studioLocalization.html b/campcaster/doc/studioLocalization.html new file mode 100644 index 000000000..4db95dc3d --- /dev/null +++ b/campcaster/doc/studioLocalization.html @@ -0,0 +1,88 @@ + + + + + LiveSupport documentation for LS Studio localization + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+ +

Scope

+This document describes the process of adding a new language to the +LiveSupport Studio localization. It is written for developers.
+ +

Introduction

+LiveSupport Studio (a.k.a. the C++ GUI) uses IBM's +ICU +library for localization. This library supports a fallback mechanism: +if the locale is set to es_GT (Guatemalan Spanish), it first tries to +read the es_GT table for localized strings; if there is no such table, +it tries the es table; and if that is missing, too, it reads the +root table.
+These tables are stored as UTF-8 text files (with Unix line breaks, i.e., a +single 0x0A character at the end of each line) in the +products/gLiveSupport/var directory with a txt +extension: e.g., es_GT.txt. +Before these files can be used by the program, they need to be converted into +binary resource bundle files using ICU's genrb program +(which is in usr/bin, and is called by the Makefile). + +

Modifying an existing language

+
    +
  • Edit the text file (e.g., + products/gLiveSupport/var/es_GT.txt).
  • +
  • Run make in products/gLiveSupport.
  • +
+ +

Adding a new language

+
    +
  • Add the new text file to products/gLiveSupport/var. + (See the +ICU + user guide for the format of this file.)
    + The first row of the file should be the locale name, followed by + ":table". The locale name is of the form +<language-code>[[_<country-code>]_<variant>], + where +
      +
    • <language-code> is the +ISO 639-1 + 2-letter language code in lowercase,
    • +
    • the optional <country-code> is the +ISO 3166-1 + 2-letter country code in uppercase, and
    • +
    • the optional <variant> is the variant + (usually EURO or CYRILLIC) in uppercase.
    • +
    + Note that this is slightly different from the normal ISO standard: + ICU uses it_IT_EURO where the standard would be it_IT@euro.
    + Make sure the file is in UTF-8 encoding, has Unix line breaks, + and does not have a + BOM + character at the beginning.
    + The file name should be the locale name, followed by ".txt". +
  • Add a new line for the new language in each of the files +
      +
    • gLiveSupport.xml
    • +
    • gLiveSupport.xml.template
    • +
    • gLiveSupport.xml.user-template
    • +
    • Makefile.in
    • +
    + in the products/gLiveSupport/etc directory.
  • +
  • Run configure --prefix=... and then + make clean all + in the products/gLiveSupport directory. +
+
+ + diff --git a/campcaster/doc/userLocalizationInstructions.html b/campcaster/doc/userLocalizationInstructions.html new file mode 100644 index 000000000..c52618e4f --- /dev/null +++ b/campcaster/doc/userLocalizationInstructions.html @@ -0,0 +1,77 @@ + + + + + LiveSupport user localization instructions + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author$
  • +
  • Version: $Revision$
  • +
  • Location: $URL$
  • +
+ +

Scope

+This document is written to help non-developers translate the LiveSupport +software into new languages.
+ +

Introduction

+LiveSupport has two user interfaces: a web interface, intended mainly for +radio station administrators (Station), and a stand-alone graphical user +interface, for disk jockeys and such (Studio).
+ +

Localization of LiveSupport Station

+Please do the localization at +

http://ls-dev.campware.org/~sebastian/htmlUI/var/localizer/

+

(user name is "root", and the password is "q"). When done, send a notice to +the developers' mailing +list.

+ + +

If you must do the localization offline for some reason, please +

    +
  • check out the latest files from CVS
  • +
  • log on to the local localizer at + http://YOURSERVER/livesupport/localizer
  • +
  • send the changed locals.??_??.xml file(s) from the folders +
      +
    • /modules/htmlUI/var/ and
    • +
    • /modules/htmlUI/var/localizer/
    • +
    + to the developers' + mailing list.
  • +
+

+
+ +

Localization of LiveSupport Studio

+

+

    +
  • If editing an existing language: download the latest version of the + language file ??.txt or ??_??.txt from + this directory (click on the file + name, scroll down to the bottom, right-click on Plain Text and choose + Save Target As or Save Link As, depending on your browser); +

    if adding a new language: download the latest version of root.txt;

  • +
  • edit the texts between the "..."s;
  • +
  • save it as a plain text file in UTF-8 encoding. + Please do not send Word documents or files in other encodings.
  • +
  • Finally, send it to the developers' mailing list.
  • +
+

+ +

Notes on the file format: +

    +
  • The symbol {0} means that some variable data (usually audio clip or playlist title) goes there. For example: "I could not find ''{0}''." becomes "Ich habe ''{0}'' nicht gefunden." in German.
  • +
  • The underscore characters show hotkeys: e.g., "_Open" means that Alt-O is a hotkey for the Open menu item. These need to be unique within each group, i.e., you can't have "M_ove" in the same menu.
  • +
+

+ + + diff --git a/campcaster/etc/Makefile.in b/campcaster/etc/Makefile.in new file mode 100644 index 000000000..a3403b5ca --- /dev/null +++ b/campcaster/etc/Makefile.in @@ -0,0 +1,510 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +DOXYTAG = doxytag +XSLTPROC = xsltproc +ECHO = @echo +FLAWFINDER = flawfinder +CP = cp -f + + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +BASE_DIR = . +BIN_DIR = ${BASE_DIR}/bin +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +COVERAGE_DIR = ${DOC_DIR}/coverage +ETC_DIR = ${BASE_DIR}/etc +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_BIN_DIR = ${USR_DIR}/bin +USR_DOC_DIR = ${USR_DIR}/doc +USR_ETC_DIR = ${USR_DIR}/etc +USR_LIB_DIR = ${USR_DIR}/lib +USR_VAR_DIR = ${USR_DIR}/var + +HOSTNAME = @HOSTNAME@ +APACHE_GROUP = @APACHE_GROUP@ +WWW_DOCROOT = @WWW_DOCROOT@ +WWW_PORT = @WWW_PORT@ +SCHEDULER_PORT = @SCHEDULER_PORT@ +DB_SERVER = @DB_SERVER@ +DATABASE = @DATABASE@ +DB_USER = @DB_USER@ +DB_PASSWORD = @DB_PASSWORD@ +CREATE_LS_DATABASE = @CREATE_LS_DATABASE@ +INIT_LS_DATABASE = @INIT_LS_DATABASE@ +CREATE_ODBC_DATA_SOURCE = @CREATE_ODBC_DATA_SOURCE@ +CONFIGURE_APACHE = @CONFIGURE_APACHE@ +STATION_AUDIO_OUT = "@STATION_AUDIO_OUT@" +STUDIO_AUDIO_OUT = "@STUDIO_AUDIO_OUT@" +STUDIO_AUDIO_CUE = "@STUDIO_AUDIO_CUE@" + + +export LD_LIBRARY_PATH:=${prefix}/lib:${LD_LIBRARY_PATH} +export PKG_CONFIG_PATH=${prefix}/lib/pkgconfig + +DEBUG = @DEBUG@ + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config +XMLRPC-DOXYGEN_CONFIG = ${ETC_DIR}/xmlrpc-doxygen.config + +XMLRPCXX_DOC_DIR = ${BASE_DIR}/usr/share/doc/xmlrpc++ +EXTERNAL_DOC_PAGES = ${XMLRPCXX_DOC_DIR}/XmlRpcServerMethod_8h-source.html \ + ${XMLRPCXX_DOC_DIR}/classXmlRpc_1_1XmlRpcServerMethod.html \ + ${XMLRPCXX_DOC_DIR}/classXmlRpc_1_1XmlRpcServerMethod-members.html +TAGFILE = ${DOXYGEN_DIR}/xmlrpc++.tag + +TESTRESULTS_XSLT = ${ETC_DIR}/testResultsToHtml.xsl +TESTRESULTS_IN = ${ETC_DIR}/testResults.xml +TESTRESULTS_FILE = ${DOC_DIR}/testResults.html + +FLAWFINDER_FILE = ${DOC_DIR}/flawfinderReport.html + +TOOLS_DIR = ${SRC_DIR}/tools + +BOOST_DIR = ${TOOLS_DIR}/boost +BOOST_VERSION = boost-1.33.1 +LIBXMLXX_DIR = ${TOOLS_DIR}/libxml++ +LIBXMLXX_VERSION = libxml++-2.8.1 +CXXUNIT_DIR = ${TOOLS_DIR}/cppunit +CXXUNIT_VERSION = cppunit-1.10.2 +LIBODBCXX_DIR = ${TOOLS_DIR}/libodbc++ +LIBODBCXX_VERSION = libodbc++-0.2.3-20050404 +XMLRPCXX_DIR = ${TOOLS_DIR}/xmlrpc++ +XMLRPCXX_VERSION = xmlrpc++-20040713 +LCOV_DIR = ${TOOLS_DIR}/lcov +LCOV_VERSION = lcov-1.3 +GTK_DIR = ${TOOLS_DIR}/gtk+ +GTK_VERSION = gtk+-2.6.10 +GTKMM_DIR = ${TOOLS_DIR}/gtkmm +GTKMM_VERSION = gtkmm-2.6.5 +GSTREAMER_DIR = ${TOOLS_DIR}/gstreamer +GSTREAMER_VERSION = gstreamer-0.8.12 +ICU_DIR = ${TOOLS_DIR}/icu +ICU_VERSION = icu-3.0 +CURL_DIR = ${TOOLS_DIR}/curl +CURL_VERSION = curl-7.12.3 +TAGLIB_DIR = ${TOOLS_DIR}/taglib +TAGLIB_VERSION = taglib-1.4 +PEAR_DIR = ${TOOLS_DIR}/pear + +MODULES_DIR = ${SRC_DIR}/modules +CORE_DIR = ${MODULES_DIR}/core +AUTHENTICATION_DIR = ${MODULES_DIR}/authentication +DB_DIR = ${MODULES_DIR}/db +STORAGE_CLIENT_DIR = ${MODULES_DIR}/storageClient +GSTREAMER_ELEMENTS_DIR = ${MODULES_DIR}/gstreamerElements +PLAYLIST_EXECUTOR_DIR = ${MODULES_DIR}/playlistExecutor +EVENT_SCHEDULER_DIR = ${MODULES_DIR}/eventScheduler +SCHEDULER_CLIENT_DIR = ${MODULES_DIR}/schedulerClient +WIDGETS_DIR = ${MODULES_DIR}/widgets +ALIB_DIR = ${MODULES_DIR}/alib +ARCHIVE_SERVER_DIR = ${MODULES_DIR}/archiveServer +GETID3_DIR = ${MODULES_DIR}/getid3 +HTML_UI_DIR = ${MODULES_DIR}/htmlUI +STORAGE_ADMIN_DIR = ${MODULES_DIR}/storageAdmin +STORAGE_SERVER_DIR = ${MODULES_DIR}/storageServer + +PRODUCTS_DIR = ${SRC_DIR}/products +SCHEDULER_DIR = ${PRODUCTS_DIR}/scheduler +GLIVESUPPORT_DIR = ${PRODUCTS_DIR}/gLiveSupport + +SCHEDULER_EXE = ${SCHEDULER_DIR}/tmp/scheduler +GLIVESUPPORT_EXE = ${GLIVESUPPORT_DIR}/tmp/campcaster-studio + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all doc clean docclean depclean distclean doxygen testresults +.PHONY: setup tools_setup doxytag_setup modules_setup products_setup +.PHONY: start stop status run + +all: setup compile + +help: + ${ECHO} "Campcaster project main Makefile" + ${ECHO} "http://campcaster.campware.org/" + ${ECHO} "Copyright (c) 2004 Media Development Loan Fund under the GNU GPL" + ${ECHO} "" + ${ECHO} "Useful targets for this makefile:" + ${ECHO} " all - set up and compile everthing" + ${ECHO} " install - install everything" + ${ECHO} " doc - build autogenerated documentation" + ${ECHO} " clean - clean all modules" + ${ECHO} " check - check all modules" + ${ECHO} "" + ${ECHO} "Some less frequently used targets:" + ${ECHO} " setup - set up the development environment" + ${ECHO} " doxygen - build autogenerated doxygen documentation only" + ${ECHO} " compile - compile all modules" + ${ECHO} " recompile - recompile all modules" + +doc: doxygen testresults flawfinder + +doxygen: + ${DOXYGEN} ${DOXYGEN_CONFIG} + ${DOXYGEN} ${XMLRPC-DOXYGEN_CONFIG} + +testresults: + ${XSLTPROC} ${TESTRESULT_XSLT} ${TESTRESULTS_IN} > ${TESTRESULTS_FILE} + +flawfinder: + ${FLAWFINDER} -c --immediate --html \ + ${CORE_DIR}/include ${CORE_DIR}/src \ + ${AUTHENTICATION_DIR}/include ${AUTHENTICATION_DIR}/src \ + ${DB_DIR}/include ${DB_DIR}/src \ + ${STORAGE_CLIENT_DIR}/include ${STORAGE_CLIENT_DIR}/src \ + ${GSTREAMER_ELEMENTS_DIR}/include \ + ${GSTREAMER_ELEMENTS_DIR}/src \ + ${PLAYLIST_EXECUTOR_DIR}/include \ + ${PLAYLIST_EXECUTOR_DIR}/src \ + ${EVENT_SCHEDULER_DIR}/include ${EVENT_SCHEDULER_DIR}/src \ + ${SCHEDULER_CLIENT_DIR}/include ${SCHEDULER_CLIENT_DIR}/src \ + ${WIDGETS_DIR}/include ${WIDGETS_DIR}/src \ + ${SCHEDULER_DIR}/src > ${FLAWFINDER_FILE} \ + ${GLIVESUPPORT_DIR}/src > ${FLAWFINDER_FILE} \ + +clean: + ${RMDIR} ${DOXYGEN_DIR}/html + ${RMDIR} ${COVERAGE_DIR}/* + ${RM} ${TMP_DIR}/*.stamp + ${RM} ${TMP_DIR}/ac* ${TMP_DIR}/config* ${TMP_DIR}/install-sh + ${RMDIR} ${TMP_DIR}/auto* + +setup: ${TMP_DIR}/setup.stamp +${TMP_DIR}/setup.stamp: tools_setup doxytag_setup modules_setup products_setup + touch ${TMP_DIR}/setup.stamp + +recompile: modprod_distclean modules_setup products_setup compile + +tools_setup: ${TMP_DIR}/tools_setup.stamp +${TMP_DIR}/tools_setup.stamp: + cd ${CXXUNIT_DIR}/${CXXUNIT_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${CXXUNIT_DIR}/${CXXUNIT_VERSION} install + +ifeq ("@COMPILE_BOOST@","yes") + cd ${BOOST_DIR}/${BOOST_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${BOOST_DIR}/${BOOST_VERSION} install +endif + + cd ${LIBODBCXX_DIR}/${LIBODBCXX_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${LIBODBCXX_DIR}/${LIBODBCXX_VERSION} install + + cd ${XMLRPCXX_DIR}/${XMLRPCXX_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${XMLRPCXX_DIR}/${XMLRPCXX_VERSION} install + + cd ${LCOV_DIR}/${LCOV_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${LCOV_DIR}/${LCOV_VERSION} install + +ifeq ("@COMPILE_GTK@","yes") + cd ${GTK_DIR}/${GTK_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${GTK_DIR}/${GTK_VERSION} install +endif + +ifeq ("@COMPILE_GTKMM@","yes") + cd ${GTKMM_DIR}/${GTKMM_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${GTKMM_DIR}/${GTKMM_VERSION} install +endif + + cd ${GSTREAMER_DIR}/${GSTREAMER_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${GSTREAMER_DIR}/${GSTREAMER_VERSION} install + +ifeq ("@COMPILE_LIBXMLPP@","yes") + cd ${LIBXMLXX_DIR}/${LIBXMLXX_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${LIBXMLXX_DIR}/${LIBXMLXX_VERSION} install +endif + +ifeq ("@COMPILE_ICU@","yes") + cd ${ICU_DIR}/${ICU_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${ICU_DIR}/${ICU_VERSION} install +endif + + cd ${CURL_DIR}/${CURL_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${CURL_DIR}/${CURL_VERSION} install + + cd ${TAGLIB_DIR}/${TAGLIB_VERSION} && ./configure --prefix=${prefix} + ${MAKE} -C ${TAGLIB_DIR}/${TAGLIB_VERSION} install + + cd ${PEAR_DIR} && ./configure --prefix=${prefix} + ${MAKE} -C ${PEAR_DIR} install + + touch ${TMP_DIR}/tools_setup.stamp + +tools_distclean: + -${MAKE} -C ${CXXUNIT_DIR}/${CXXUNIT_VERSION} distclean +ifeq ("@COMPILE_BOOST@","yes") + -${MAKE} -C ${BOOST_DIR}/${BOOST_VERSION} distclean +endif + -${MAKE} -C ${CXXUNIT_DIR}/${CXXUNIT_VERSION} distclean + -${MAKE} -C ${LIBODBCXX_DIR}/${LIBODBCXX_VERSION} distclean + -${MAKE} -C ${XMLRPCXX_DIR}/${XMLRPCXX_VERSION} distclean + -${MAKE} -C ${LCOV_DIR}/${LCOV_VERSION} distclean +ifeq ("@COMPILE_GTK@","yes") + -${MAKE} -C ${GTK_DIR}/${GTK_VERSION} distclean +endif +ifeq ("@COMPILE_GTKMM@","yes") + -${MAKE} -C ${GTKMM_DIR}/${GTKMM_VERSION} distclean +endif + -${MAKE} -C ${GSTREAMER_DIR}/${GSTREAMER_VERSION} distclean +ifeq ("@COMPILE_LIBXMLPP@","yes") + -${MAKE} -C ${LIBXMLXX_DIR}/${LIBXMLXX_VERSION} distclean +endif +ifeq ("@COMPILE_ICU@","yes") + -${MAKE} -C ${ICU_DIR}/${ICU_VERSION} distclean +endif + -${MAKE} -C ${CURL_DIR}/${CURL_VERSION} distclean + -${MAKE} -C ${TAGLIB_DIR}/${TAGLIB_VERSION} distclean + ${RM} ${TMP_DIR}/tools_setup.stamp + +doxytag_setup: ${TMP_DIR}/doxytag_setup.stamp +${TMP_DIR}/doxytag_setup.stamp: + ${DOXYTAG} -t ${TAGFILE} ${EXTERNAL_DOC_PAGES} + touch ${TMP_DIR}/doxytag_setup.stamp + +modules_setup: ${TMP_DIR}/modules_setup.stamp +${TMP_DIR}/modules_setup.stamp: + cd ${ALIB_DIR} && ./configure --prefix=${prefix} + cd ${ARCHIVE_SERVER_DIR} && \ + ./configure --prefix=${prefix} \ + --with-hostname=${HOSTNAME} \ + --with-www-port=${WWW_PORT} \ + --with-database-server=${DB_SERVER} \ + --with-database=${DATABASE} \ + --with-database-user=${DB_USER} \ + --with-database-password=${DB_PASSWORD} + cd ${GETID3_DIR} && ./configure --prefix=${prefix} + cd ${HTML_UI_DIR} && ./configure --prefix=${prefix} \ + --with-apache-group=${APACHE_GROUP} \ + --with-www-docroot=${WWW_DOCROOT} \ + --with-configure-apache=${CONFIGURE_APACHE} \ + --with-storage-server=${prefix}/var/Campcaster/storageServer + cd ${STORAGE_ADMIN_DIR} && ./configure --prefix=${prefix} \ + --with-storage-server=${prefix}/var/Campcaster/storageServer \ + --with-phppart-dir=${prefix}/var/Campcaster/storageAdmin + cd ${STORAGE_SERVER_DIR} && \ + ./configure --prefix=${prefix} \ + --with-apache-group=${APACHE_GROUP} \ + --with-hostname=${HOSTNAME} \ + --with-www-docroot=${WWW_DOCROOT} \ + --with-www-port=${WWW_PORT} \ + --with-scheduler-port=${SCHEDULER_PORT} \ + --with-database-server=${DB_SERVER} \ + --with-database=${DATABASE} \ + --with-database-user=${DB_USER} \ + --with-database-password=${DB_PASSWORD} \ + --with-init-database=${INIT_LS_DATABASE} + cd ${CORE_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${AUTHENTICATION_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${DB_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${STORAGE_CLIENT_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${GSTREAMER_ELEMENTS_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${PLAYLIST_EXECUTOR_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${EVENT_SCHEDULER_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${SCHEDULER_CLIENT_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + cd ${WIDGETS_DIR} && \ + ./configure --prefix=${prefix} --enable-debug=${DEBUG} + touch ${TMP_DIR}/modules_setup.stamp + +products_setup: ${TMP_DIR}/products_setup.stamp +${TMP_DIR}/products_setup.stamp: + cd ${SCHEDULER_DIR} && \ + ./configure --prefix=${prefix} \ + --enable-debug=${DEBUG} \ + --with-hostname=${HOSTNAME} \ + --with-www-port=${WWW_PORT} \ + --with-scheduler-port=${SCHEDULER_PORT} \ + --with-database-server=${DB_SERVER} \ + --with-database=${DATABASE} \ + --with-database-user=${DB_USER} \ + --with-database-password=${DB_PASSWORD} \ + --with-audio-out=${STATION_AUDIO_OUT} \ + --with-create-odbc-data-source=${CREATE_ODBC_DATA_SOURCE} \ + --with-init-database=${INIT_LS_DATABASE} + cd ${GLIVESUPPORT_DIR} && \ + ./configure --prefix=${prefix} \ + --enable-debug=${DEBUG} \ + --with-hostname=${HOSTNAME} \ + --with-www-port=${WWW_PORT} \ + --with-scheduler-port=${SCHEDULER_PORT} \ + --with-database-server=${DB_SERVER} \ + --with-database=${DATABASE} \ + --with-database-user=${DB_USER} \ + --with-database-password=${DB_PASSWORD} \ + --with-audio-out=${STUDIO_AUDIO_OUT} \ + --with-audio-cue=${STUDIO_AUDIO_CUE} + touch ${TMP_DIR}/products_setup.stamp + +distclean: clean tools_distclean modprod_distclean + +modprod_distclean: + ${MAKE} -C ${CORE_DIR} distclean + ${MAKE} -C ${AUTHENTICATION_DIR} distclean + ${MAKE} -C ${DB_DIR} distclean + ${MAKE} -C ${STORAGE_CLIENT_DIR} distclean + ${MAKE} -C ${GSTREAMER_ELEMENTS_DIR} distclean + ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} distclean + ${MAKE} -C ${EVENT_SCHEDULER_DIR} distclean + ${MAKE} -C ${SCHEDULER_CLIENT_DIR} distclean + ${MAKE} -C ${WIDGETS_DIR} distclean + ${MAKE} -C ${SCHEDULER_DIR} distclean + ${MAKE} -C ${GLIVESUPPORT_DIR} distclean + ${RM} ${TMP_DIR}/compile.stamp + ${RM} ${TMP_DIR}/modules_setup.stamp + ${RM} ${TMP_DIR}/products_setup.stamp + +depclean: + ${MAKE} -C ${CORE_DIR} depclean + ${MAKE} -C ${AUTHENTICATION_DIR} depclean + ${MAKE} -C ${DB_DIR} depclean + ${MAKE} -C ${STORAGE_CLIENT_DIR} depclean + ${MAKE} -C ${GSTREAMER_ELEMENTS_DIR} depclean + ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} depclean + ${MAKE} -C ${EVENT_SCHEDULER_DIR} depclean + ${MAKE} -C ${SCHEDULER_CLIENT_DIR} depclean + ${MAKE} -C ${WIDGETS_DIR} depclean + ${MAKE} -C ${SCHEDULER_DIR} depclean + ${MAKE} -C ${GLIVESUPPORT_DIR} depclean + -${MAKE} -C ${ARCHIVE_SERVER_DIR} depclean + -${MAKE} -C ${STORAGE_SERVER_DIR} depclean + +compile: ${TMP_DIR}/compile.stamp +${TMP_DIR}/compile.stamp: + ${MAKE} -C ${CORE_DIR} all + ${MAKE} -C ${AUTHENTICATION_DIR} all + ${MAKE} -C ${DB_DIR} all + ${MAKE} -C ${STORAGE_CLIENT_DIR} all + ${MAKE} -C ${GSTREAMER_ELEMENTS_DIR} all + ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} all + ${MAKE} -C ${EVENT_SCHEDULER_DIR} all + ${MAKE} -C ${SCHEDULER_CLIENT_DIR} all + ${MAKE} -C ${WIDGETS_DIR} all + ${MAKE} -C ${SCHEDULER_DIR} all + ${MAKE} -C ${GLIVESUPPORT_DIR} all + touch ${TMP_DIR}/compile.stamp + +check: + -${MAKE} -C ${CORE_DIR} check + -${MAKE} -C ${AUTHENTICATION_DIR} check + -${MAKE} -C ${DB_DIR} check + -${MAKE} -C ${STORAGE_CLIENT_DIR} check + -${MAKE} -C ${GSTREAMER_ELEMENTS_DIR} check + -${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} check + -${MAKE} -C ${EVENT_SCHEDULER_DIR} check + -${MAKE} -C ${SCHEDULER_CLIENT_DIR} check + -${MAKE} -C ${WIDGETS_DIR} check + -${MAKE} -C ${SCHEDULER_DIR} check +# -${MAKE} -C ${GLIVESUPPORT_DIR} check +# -${MAKE} -C ${ARCHIVE_SERVER_DIR} check +# -${MAKE} -C ${STORAGE_SERVER_DIR} check + + +start: ${SCHEDULER_EXE} + ${MAKE} -C ${SCHEDULER_DIR} start + +stop: ${SCHEDULER_EXE} + ${MAKE} -C ${SCHEDULER_DIR} stop + +status: ${SCHEDULER_EXE} + ${MAKE} -C ${SCHEDULER_DIR} status + +run: ${GLIVESUPPORT_EXE} + ${MAKE} -C ${GLIVESUPPORT_DIR} run + + +#------------------------------------------------------------------------------- +# Installation related targets +#------------------------------------------------------------------------------- +.PHONY: install create_database setup_install_dirs +.PHONY: install_modules install_products + +install: setup compile setup_install_dirs create_database install_modules install_products + ${MKDIR} ${USR_ETC_DIR}/apache + ${CP} ${ETC_DIR}/apache/*.conf ${USR_ETC_DIR}/apache + ${MKDIR} ${USR_BIN_DIR} + ${CP} ${BIN_DIR}/postInstallStation.sh ${USR_BIN_DIR} + ${CP} ${BIN_DIR}/campcaster-station ${USR_BIN_DIR} + ${CP} ${ETC_DIR}/pg_hba.conf ${USR_ETC_DIR} + +create_database: +ifeq (@CREATE_LS_DATABASE@,yes) + ${SCHEDULER_DIR}/bin/createDatabase.sh --database=${DATABASE} \ + --dbserver=${DB_SERVER} \ + --dbuser=${DB_USER} \ + --dbpassword=${DB_PASSWORD} +endif + +setup_install_dirs: + ${MKDIR} ${USR_BIN_DIR} + ${MKDIR} ${USR_DOC_DIR} + ${MKDIR} ${USR_ETC_DIR} + ${MKDIR} ${USR_LIB_DIR} + ${MKDIR} ${USR_VAR_DIR} + +install_modules: + ${MAKE} -C ${ALIB_DIR} install + ${MAKE} -C ${ARCHIVE_SERVER_DIR} install + ${MAKE} -C ${GETID3_DIR} install + ${MAKE} -C ${HTML_UI_DIR} install + ${MAKE} -C ${STORAGE_ADMIN_DIR} install + ${MAKE} -C ${STORAGE_SERVER_DIR} install + ${MAKE} -C ${CORE_DIR} install + ${MAKE} -C ${AUTHENTICATION_DIR} install + ${MAKE} -C ${DB_DIR} install + ${MAKE} -C ${STORAGE_CLIENT_DIR} install + ${MAKE} -C ${GSTREAMER_ELEMENTS_DIR} install + ${MAKE} -C ${PLAYLIST_EXECUTOR_DIR} install + ${MAKE} -C ${EVENT_SCHEDULER_DIR} install + ${MAKE} -C ${SCHEDULER_CLIENT_DIR} install + ${MAKE} -C ${WIDGETS_DIR} install + +install_products: + ${MAKE} -C ${SCHEDULER_DIR} install + ${MAKE} -C ${GLIVESUPPORT_DIR} install + + diff --git a/campcaster/etc/acinclude.m4 b/campcaster/etc/acinclude.m4 new file mode 100644 index 000000000..f3053cac3 --- /dev/null +++ b/campcaster/etc/acinclude.m4 @@ -0,0 +1,204 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +dnl----------------------------------------------------------------------------- + +dnl----------------------------------------------------------------------------- +dnl Macro to check for available modules using pkg-conf +dnl +dnl usage: +dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) +dnl +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +dnl +dnl This function was taken from the glade-- project +dnl----------------------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for a specific version of the ICU library +dnl +dnl usage: +dnl AC_CHECK_ICU(3.0, action-if-found, action-if-not-found) +dnl +dnl defines ICU_CFLAGS, ICU_CXXFLAGS and ICU_LIBS, see icu-config man page +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CHECK_ICU], +[ + AC_PATH_PROG(ICU_CONFIG, icu-config, no) + + AC_MSG_CHECKING(for ICU library >= $1) + + if test "$ICU_CONFIG" = "no" ; then + FAILED="true" + else + ICU_VERSION=`$ICU_CONFIG --version` + VERSION_CHECK=`expr $ICU_VERSION \\>\\= $1` + + if test "$VERSION_CHECK" = "1" ; then + AC_MSG_RESULT([ICU version ICU_VERSION >= $1 found]) + ICU_CFLAGS=`$ICU_CONFIG --cflags` + ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` + ICU_LDFLAGS=`$ICU_CONFIG --ldflags` + + AC_SUBST(ICU_CFLAGS) + AC_SUBST(ICU_CXXFLAGS) + AC_SUBST(ICU_LDFLAGS) + + dnl execute action-if-found + ifelse([$2], , :, [$2]) + else + FAILED="true" + fi + fi + + if test "$FAILED" = "true" ; then + dnl execute action-if-not-found + ifelse([$3], , AC_MSG_ERROR([only insufficient version $ICU_VERSION < $1 of ICU library found]), [$3]) + fi +]) + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for C++ namespaces +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +dnl +dnl usage: +dnl If the compiler can prevent names clashes using namespaces, +dnl define HAVE_NAMESPACES. +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CXX_NAMESPACES], +[AC_CACHE_CHECK(whether the compiler implements namespaces, +ac_cv_cxx_namespaces, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], + [using namespace Outer::Inner; return i;], + ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) + AC_LANG_RESTORE +]) +if test "$ac_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) +fi +]) + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for the boost datetime library. +dnl for more information on boost, see http://www.boost.org/ +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ax_boost_date-time.html +dnl +dnl usage: +dnl This macro checks to see if the Boost.DateTime library is installed. +dnl It also attempts to guess the currect library name using several attempts. +dnl It tries to build the library name using a user supplied name or suffix +dnl and then just the raw library. +dnl +dnl If the library is found, HAVE_BOOST_DATE_TIME is defined and +dnl BOOST_DATE_TIME_LIB is set to the name of the library. +dnl +dnl This macro calls AC_SUBST(BOOST_DATE_TIME_LIB). +dnl----------------------------------------------------------------------------- +AC_DEFUN([AX_BOOST_DATE_TIME], +[AC_REQUIRE([AC_CXX_NAMESPACES])dnl +AC_CACHE_CHECK(whether the Boost::DateTime library is available, +ax_cv_boost_date_time, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include ]], + [[using namespace boost::gregorian; date d(2002,Jan,10); return 0;]]), + ax_cv_boost_date_time=yes, ax_cv_boost_date_time=no) + AC_LANG_RESTORE +]) +if test "$ax_cv_boost_date_time" = yes; then + AC_DEFINE(HAVE_BOOST_DATE_TIME,,[define if the Boost::DateTime library is available]) + dnl Now determine the appropriate file names + AC_ARG_WITH([boost-date-time],AS_HELP_STRING([--with-boost-date-time], + [specify the boost date-time library or suffix to use]), + [if test "x$with_boost_date_time" != "xno"; then + ax_date_time_lib=$with_boost_date_time + ax_boost_date_time_lib=boost_date_time-$with_boost_date_time + fi]) + for ax_lib in $ax_date_time_lib $ax_boost_date_time_lib boost_date_time; do + AC_CHECK_LIB($ax_lib, main, [BOOST_DATE_TIME_LIB=$ax_lib break]) + done + AC_SUBST(BOOST_DATE_TIME_LIB) +fi +])dnl + diff --git a/campcaster/etc/apache/90_php_campcaster.conf b/campcaster/etc/apache/90_php_campcaster.conf new file mode 100644 index 000000000..eeb358852 --- /dev/null +++ b/campcaster/etc/apache/90_php_campcaster.conf @@ -0,0 +1,2 @@ +php_value upload_max_filesize 32M +php_value post_max_size 36M diff --git a/campcaster/etc/configure.ac b/campcaster/etc/configure.ac new file mode 100644 index 000000000..61038f961 --- /dev/null +++ b/campcaster/etc/configure.ac @@ -0,0 +1,553 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(Campcaster, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../src/products/scheduler/src/main.cxx) + +AC_PROG_CC() +AC_PROG_CXX() + + +dnl----------------------------------------------------------------------------- +dnl specify whether debug info should be compiled into the executable +dnl----------------------------------------------------------------------------- +AC_SUBST(DEBUG) + +AC_ARG_ENABLE([debug], + AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), + [DEBUG=${enable_debug}], + [DEBUG=no]) + +AC_MSG_RESULT([compiling with debug info: ${DEBUG}]) + + +dnl----------------------------------------------------------------------------- +dnl specify whether the Campcaster database and user should be created +dnl----------------------------------------------------------------------------- +AC_SUBST(CREATE_LS_DATABASE) + +AC_ARG_WITH([create-database], + AC_HELP_STRING([--with-create-database], + [specify whether the Campcaster database and database user + should be created (no)]), + [CREATE_LS_DATABASE=${withval}], + [CREATE_LS_DATABASE=no]) + +AC_MSG_RESULT([creating Campcaster database: ${CREATE_LS_DATABASE}]) + + +dnl----------------------------------------------------------------------------- +dnl specify whether the ODBC data source should be created +dnl----------------------------------------------------------------------------- +AC_SUBST(CREATE_ODBC_DATA_SOURCE) + +AC_ARG_WITH([create-odbc-data-source], + AC_HELP_STRING([--with-create-odbc-data-source], + [specify whether the ODBC data source for Campcaster should be + created (no)]), + [CREATE_ODBC_DATA_SOURCE=${withval}], + [CREATE_ODBC_DATA_SOURCE=no]) + +AC_MSG_RESULT([creating ODBC data source: ${CREATE_ODBC_DATA_SOURCE}]) + + +dnl----------------------------------------------------------------------------- +dnl specify whether the Campcaster database tables should be initialized +dnl----------------------------------------------------------------------------- +AC_SUBST(INIT_LS_DATABASE) + +AC_ARG_WITH([init-database], + AC_HELP_STRING([--with-init-database], + [specify whether the Campcaster database tables should be + initialized (no)]), + [INIT_LS_DATABASE=${withval}], + [INIT_LS_DATABASE=no]) + +AC_MSG_RESULT([initializing Campcaster database: ${INIT_LS_DATABASE}]) + + +dnl----------------------------------------------------------------------------- +dnl specify whether apache should be configured through it's conf.d directory +dnl----------------------------------------------------------------------------- +AC_SUBST(CONFIGURE_APACHE) + +AC_ARG_WITH([configure-apache], + AC_HELP_STRING([--with-configure-apache], + [specify whether apache should be configured for Campcaster + through its conf.d directory (no)]), + [CONFIGURE_APACHE=${withval}], + [CONFIGURE_APACHE=no]) + +AC_MSG_RESULT([configure apache: ${CONFIGURE_APACHE}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the FQDN +dnl----------------------------------------------------------------------------- +AC_SUBST(HOSTNAME) + +AC_ARG_WITH([hostname], + AC_HELP_STRING([--with-hostname], + [use the specified hostname (guess)]), + [HOSTNAME=${withval}], [HOSTNAME=`hostname -f`]) + +AC_MSG_RESULT([using hostname: ${HOSTNAME}]) + + +dnl----------------------------------------------------------------------------- +dnl specify group in which apache is running +dnl----------------------------------------------------------------------------- +AC_SUBST(APACHE_GROUP) + +AC_ARG_WITH([apache-group], + AC_HELP_STRING([--with-apache-group], + [use apache running in the specified group (apache)]), + [APACHE_GROUP=${withval}], [APACHE_GROUP=apache]) + +AC_MSG_RESULT([using apache group: ${APACHE_GROUP}]) + + +dnl----------------------------------------------------------------------------- +dnl specify web document root +dnl----------------------------------------------------------------------------- +AC_SUBST(WWW_DOCROOT) + +AC_ARG_WITH([www-docroot], + AC_HELP_STRING([--with-www-docroot], + [deploy Campcaster under the specified docroot (/var/www)]), + [WWW_DOCROOT=${withval}], [WWW_DOCROOT=/var/www]) + +AC_MSG_RESULT([using www document root: ${WWW_DOCROOT}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the web server port +dnl----------------------------------------------------------------------------- +AC_SUBST(WWW_PORT) + +AC_ARG_WITH([www-port], + AC_HELP_STRING([--with-www-port], + [use the specified www port (80)]), + [WWW_PORT=${withval}], [WWW_PORT=80]) + +AC_MSG_RESULT([using www port: ${WWW_PORT}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the scheduler server port +dnl----------------------------------------------------------------------------- +AC_SUBST(SCHEDULER_PORT) + +AC_ARG_WITH([scheduler-port], + AC_HELP_STRING([--with-scheduler-port], + [use the specified scheduler port (3344)]), + [SCHEDULER_PORT=${withval}], [SCHEDULER_PORT=3344]) + +AC_MSG_RESULT([using scheduler port: ${SCHEDULER_PORT}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the database server name +dnl----------------------------------------------------------------------------- +AC_SUBST(DB_SERVER) + +AC_ARG_WITH([database-server], + AC_HELP_STRING([--with-database-server], + [use the specified database server (localhost)]), + [DB_SERVER=${withval}], [DB_SERVER=localhost]) + +AC_MSG_RESULT([using database server: ${DB_SERVER}]) + + +dnl----------------------------------------------------------------------------- +dnl get the name of the Campcaster database +dnl----------------------------------------------------------------------------- +AC_SUBST(DATABASE) + +AC_ARG_WITH([database], + AC_HELP_STRING([--with-database], + [the name of the postgresql database to use (Campcaster)]), + [DATABASE=${withval}], [DATABASE=Campcaster]) + +AC_MSG_RESULT([using database: ${DATABASE}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the database server user +dnl----------------------------------------------------------------------------- +AC_SUBST(DB_USER) + +AC_ARG_WITH([database-user], + AC_HELP_STRING([--with-database-user], + [use the specified database server user (campcaster)]), + [DB_USER=${withval}], [DB_USER=campcaster]) + +AC_MSG_RESULT([using database server user: ${DB_USER}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the database server user password +dnl----------------------------------------------------------------------------- +AC_SUBST(DB_PASSWORD) + +AC_ARG_WITH([database-password], + AC_HELP_STRING([--with-database-password], + [use the specified database server user password (campcaster)]), + [DB_PASSWORD=${withval}], [DB_PASSWORD=campcaster]) + +AC_MSG_RESULT([using database server user password: ${DB_PASSWORD}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the audio output device for the scheduler +dnl----------------------------------------------------------------------------- +AC_SUBST(STATION_AUDIO_OUT) + +AC_ARG_WITH([station-audio-out], + AC_HELP_STRING([--with-station-audio-out], + [use the specified audio output device for the station, + either ALSA or OSS (default)]), + [STATION_AUDIO_OUT=${withval}], [STATION_AUDIO_OUT=default]) + +AC_MSG_RESULT([using audio output device for the station: ${STATION_AUDIO_OUT}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the audio output device for the studio +dnl----------------------------------------------------------------------------- +AC_SUBST(STUDIO_AUDIO_OUT) + +AC_ARG_WITH([studio-audio-out], + AC_HELP_STRING([--with-studio-audio-out], + [use the specified audio output device for the studio, + either ALSA or OSS (default)]), + [STUDIO_AUDIO_OUT=${withval}], [STUDIO_AUDIO_OUT=default]) + +AC_MSG_RESULT([using audio output device for studio: ${STUDIO_AUDIO_OUT}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the audio output device for the studio for cueing +dnl----------------------------------------------------------------------------- +AC_SUBST(STUDIO_AUDIO_CUE) + +AC_ARG_WITH([studio-audio-cue], + AC_HELP_STRING([--with-studio-audio-cue], + [use the specified audio cue device for the studio, + either ALSA or OSS (default)]), + [STUDIO_AUDIO_CUE=${withval}], [STUDIO_AUDIO_CUE=default]) + +AC_MSG_RESULT([using audio cue device for studio: ${STUDIO_AUDIO_CUE}]) + + + +dnl unfortunately for both AC_CONFIG_COMMANDS and AC_CONFIG_SUBDIRS, the +dnl directories have to be literally included, so we can't use any +dnl fancy variables to avoid duplication of hard-coded values :( + + +dnl----------------------------------------------------------------------------- +dnl specify if boost library should be looked for on the system +dnl----------------------------------------------------------------------------- + +AC_ARG_WITH([check-boost], + AC_HELP_STRING([--with-check-boost], + [check for the availability of the boost library on the + system, and use it if available (no)]), + [CHECK_BOOST_LIB=${withval}], [CHECK_BOOST_LIB=yes]) + +AC_MSG_RESULT([checking for boost library on system: ${CHECK_BOOST_LIB}]) + +dnl----------------------------------------------------------------------------- +dnl specify if gtk+ library should be looked for on the system +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([check-gtk], + AC_HELP_STRING([--with-check-gtk], + [check for the availability of the gtk+ library on the + system, and use it if available (yes)]), + [CHECK_GTK_LIB=${withval}], [CHECK_GTK_LIB=yes]) + +AC_MSG_RESULT([checking for gtk+ library on system: ${CHECK_GTK_LIB}]) + + +dnl----------------------------------------------------------------------------- +dnl specify if gtk-- library should be looked for on the system +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([check-gtkmm], + AC_HELP_STRING([--with-check-gtkmm], + [check for the availability of the gtk-- library on the + system, and use it if available (yes)]), + [CHECK_GTKMM_LIB=${withval}], [CHECK_GTKMM_LIB=yes]) + +AC_MSG_RESULT([checking for gtk-- library on system: ${CHECK_GTKMM_LIB}]) + + +dnl----------------------------------------------------------------------------- +dnl specify if icu library should be looked for on the system +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([check-icu], + AC_HELP_STRING([--with-check-icu], + [check for the availability of the icu library on the + system, and use it if available (no)]), + [CHECK_ICU_LIB=${withval}], [CHECK_ICU_LIB=yes]) + +AC_MSG_RESULT([checking for icu library on system: ${CHECK_ICU_LIB}]) + + +dnl----------------------------------------------------------------------------- +dnl specify if libxml++ library should be looked for on the system +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([check-libxmlpp], + AC_HELP_STRING([--with-check-libxmlpp], + [check for the availability of the xml++ library on the + system, and use it if available (yes)]), + [CHECK_XMLPP_LIB=${withval}], [CHECK_XMLPP_LIB=yes]) + +AC_MSG_RESULT([checking for xml++ library on system: ${CHECK_XMLPP_LIB}]) + + +dnl----------------------------------------------------------------------------- +dnl determine which optional packages will be compiled +dnl----------------------------------------------------------------------------- + +AC_SUBST(COMPILE_BOOST) + +dnl check for the boost library +AX_BOOST_DATE_TIME() + +if test "$CHECK_BOOST_LIB" = "yes" ; then + if test "$BOOST_DATE_TIME_LIB" = "" ; then + AC_MSG_RESULT([not found boost library of sufficient version, will compile from our own]) + COMPILE_BOOST="yes" + else + COMPILE_BOOST="no" + fi +else + COMPILE_BOOST="yes" +fi + + +AC_SUBST(COMPILE_GTK) + +if test "$CHECK_GTK_LIB" = "yes" ; then + dnl check for gtk+ 2.6.10 or more recent + PKG_CHECK_MODULES(GTK,[gtk+-2.0 >= 2.6.10], + [ + AC_MSG_RESULT([using gtk+ found on the system]) + COMPILE_GTK="no" + ], + [ + AC_MSG_RESULT([not found gtk+ of sufficient version, will compile from our own]) + COMPILE_GTK="yes" + ]) +else + COMPILE_GTK="yes" +fi + + +AC_SUBST(COMPILE_GTKMM) + +if test "$CHECK_GTKMM_LIB" = "yes" ; then + dnl check for gtk-- 2.6.5 or more recent + PKG_CHECK_MODULES(GTKMM,[gtkmm-2.4 >= 2.6.5], + [ + AC_MSG_RESULT([using gtk-- found on the system]) + COMPILE_GTKMM="no" + ], + [ + AC_MSG_RESULT([not found gtk-- of sufficient version, will compile from our own]) + COMPILE_GTKMM="yes" + ]) +else + COMPILE_GTKMM="yes" +fi + + +AC_SUBST(COMPILE_ICU) + +if test "$CHECK_ICU_LIB" = "yes" ; then + dnl check for ICU 3.0 or more recent + AC_CHECK_ICU(3.0, + [ + AC_MSG_RESULT([using ICU found on the system]) + COMPILE_ICU="no" + ], + [ + AC_MSG_RESULT([not found ICU of sufficient version, will compile from our own]) + COMPILE_ICU="yes" + ]) +else + COMPILE_ICU="yes" +fi + + +AC_SUBST(COMPILE_LIBXMLPP) + +if test "$CHECK_XMLPP_LIB" = "yes" ; then + dnl check for libxml++ 2.8.1 or more recent + PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1], + [ + AC_MSG_RESULT([using libxml++ found on the system]) + COMPILE_LIBXMLPP="no" + ], + [ + AC_MSG_RESULT([not found libxml++ of sufficient version, will compile from our own]) + COMPILE_LIBXMLPP="yes" + ]) +else + COMPILE_LIBXMLPP="yes" +fi + + +dnl set up the alib module +AC_CONFIG_COMMANDS([../src/modules/alib/tmp/configure], + [../src/modules/alib/bin/autogen.sh]) + +dnl set up the archive server module +AC_CONFIG_COMMANDS([../src/modules/archiveServer/tmp/configure], + [../src/modules/archiveServer/bin/autogen.sh]) + +dnl set up the getid3 module +AC_CONFIG_COMMANDS([../src/modules/getid3/tmp/configure], + [../src/modules/getid3/bin/autogen.sh]) + +dnl set up the htmlUI module +AC_CONFIG_COMMANDS([../src/modules/htmlUI/tmp/configure], + [../src/modules/htmlUI/bin/autogen.sh]) + +dnl set up the storage admin module +AC_CONFIG_COMMANDS([../src/modules/storageAdmin/tmp/configure], + [../src/modules/storageAdmin/bin/autogen.sh]) + +dnl set up the storage server module +AC_CONFIG_COMMANDS([../src/modules/storageServer/tmp/configure], + [../src/modules/storageServer/bin/autogen.sh]) + +dnl set up the core module +AC_CONFIG_COMMANDS([../src/modules/core/tmp/configure], + [../src/modules/core/bin/autogen.sh]) + +dnl set up the authentication module +AC_CONFIG_COMMANDS([../src/modules/authentication/tmp/configure], + [../src/modules/authentication/bin/autogen.sh]) + +dnl set up the db module +AC_CONFIG_COMMANDS([../src/modules/db/tmp/configure], + [../src/modules/db/bin/autogen.sh]) + +dnl set up the storage client module +AC_CONFIG_COMMANDS([../src/modules/storageClient/tmp/configure], + [../src/modules/storageClient/bin/autogen.sh]) + +dnl set up the gstreamer elements module +AC_CONFIG_COMMANDS([../src/modules/gstreamerElements/tmp/configure], + [../src/modules/gstreamerElements/bin/autogen.sh]) + +dnl set up the playlist executor module +AC_CONFIG_COMMANDS([../src/modules/playlistExecutor/tmp/configure], + [../src/modules/playlistExecutor/bin/autogen.sh]) + +dnl set up the event scheduler module +AC_CONFIG_COMMANDS([../src/modules/eventScheduler/tmp/configure], + [../src/modules/eventScheduler/bin/autogen.sh]) + +dnl set up the scheduler client module +AC_CONFIG_COMMANDS([../src/modules/schedulerClient/tmp/configure], + [../src/modules/schedulerClient/bin/autogen.sh]) + +dnl set up the widgets module +AC_CONFIG_COMMANDS([../src/modules/widgets/tmp/configure], + [../src/modules/widgets/bin/autogen.sh]) + +dnl set up the scheduler product +AC_CONFIG_COMMANDS([../src/products/scheduler/tmp/configure], + [../src/products/scheduler/bin/autogen.sh]) + +dnl set up the gLiveSupport product +AC_CONFIG_COMMANDS([../src/products/gLiveSupport/tmp/configure], + [../src/products/gLiveSupport/bin/autogen.sh]) + + + +dnl display status info on what libraries will get compiled + +AC_MSG_NOTICE( +[compiling the following external libraries that are needed +by Campcaster: + + boost 1.33.1 ${COMPILE_BOOST} + cppunit 1.10.2 yes + curl 7.12.3 yes + gstreamer 0.8.12 yes + gtk+ 2.6.10 ${COMPILE_GTK} + gtk-- 2.6.5 ${COMPILE_GTKMM} + icu 3.0 ${COMPILE_ICU} + lcov 1.3 yes + libodbc++ 0.2.3 yes + libxml++ 2.8.1 ${COMPILE_LIBXMLPP} + taglib 1.4 yes + xmlrpc++ 2004-07-13 yes + + +using the following configuration settings: + + hostname: ${HOSTNAME} + apache group: ${APACHE_GROUP} + www document root: ${WWW_DOCROOT} + www port: ${WWW_PORT} + scheduler port: ${SCHEDULER_PORT} + database server: ${DB_SERVER} + database name: ${DATABASE} + database user: ${DB_USER} + database user password: ${DB_PASSWORD} + station audio output device: ${STATION_AUDIO_OUT} + studio audio output device: ${STUDIO_AUDIO_OUT} + studio audio cue device: ${STUDIO_AUDIO_CUE} + creating Campcaster database: ${CREATE_LS_DATABASE} + creating ODBC data source: ${CREATE_ODBC_DATA_SOURCE} + initialize Campcaster database: ${INIT_LS_DATABASE} + configuring apache: ${CONFIGURE_APACHE} + +]) + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + + +AC_OUTPUT() + diff --git a/campcaster/etc/debian/README.Debian b/campcaster/etc/debian/README.Debian new file mode 100644 index 000000000..a73d3a01c --- /dev/null +++ b/campcaster/etc/debian/README.Debian @@ -0,0 +1,7 @@ +livesupport for Debian +---------------------- + +First debian package of LiveSupport. + + -- Akos Maroy , Wed, 03 Aug 2005 08:17:25 -0400 + diff --git a/campcaster/etc/debian/changelog b/campcaster/etc/debian/changelog new file mode 100644 index 000000000..5310b7a92 --- /dev/null +++ b/campcaster/etc/debian/changelog @@ -0,0 +1,48 @@ +livesupport (1.1b1-1) unstable; urgency=low + + * 1.1 beta release + + -- Ferenc Gerlits Mon, 04 Sep 2006 13:50:24 +0200 + + +livesupport (1.0.2-1) unstable; urgency=low + + * 1.0.2 bugfix release + + -- Akos Maroy Sun, 13 Nov 2005 15:10:09 +0200 + + +livesupport (1.0.1-1) unstable; urgency=low + + * 1.0.1 bugfix release + + -- Akos Maroy Sat, 01 Oct 2005 17:19:29 +0200 + + +livesupport (1.0-1) unstable; urgency=low + + * 1.0 final release + + -- Akos Maroy Fri, 09 Sep 2005 15:04:13 +0200 + + +livesupport (1.0rc2-1) unstable; urgency=low + + * second release candidate + + -- Akos Maroy Wed, 03 Aug 2005 08:17:25 -0400 + + +livesupport (1.0rc1-1) unstable; urgency=low + + * first release candidate + + -- Akos Maroy Mon, 04 Jul 2005 14:39:11 +0200 + + +livesupport (0.9.1-1) unstable; urgency=low + + * Initial Release. + + -- Akos Maroy Tue, 19 Apr 2005 07:40:13 -0400 + diff --git a/campcaster/etc/debian/compat b/campcaster/etc/debian/compat new file mode 100644 index 000000000..b8626c4cf --- /dev/null +++ b/campcaster/etc/debian/compat @@ -0,0 +1 @@ +4 diff --git a/campcaster/etc/debian/control b/campcaster/etc/debian/control new file mode 100644 index 000000000..6d7483530 --- /dev/null +++ b/campcaster/etc/debian/control @@ -0,0 +1,83 @@ +Source: livesupport +Section: sound +Priority: optional +Maintainer: ls_maintainer +Build-Depends: debhelper (>= 4.0.0), + binutils (>= 2.13), + gcc (>= 3.3), + g++ (>= 3.3), + make (>= 3.80). + automake1.7, + autoconf (>= 2.59), + libtool, + pkgconfig (>= 0.15), + patch (>= 2.5.9), + doxygen, + tar, + gzip, + bzip2, + curl, + unixodbc-dev (>= 2.2), + xlibs-dev (>= 4.1.0), + libfontconfig1-dev, + libpng12-dev, + libjpeg62-dev, + libssl-dev, + libxml2-dev, + libpopt-dev, + libasound2-dev, + libid3tag0-dev, + libmad0-dev, + libogg-dev, + libvorbis-dev, + libboost-dev (>= 1.33.1), + libboost-date-time-dev (>= 1.33.1), + bison (>= 1.35), + flex +Standards-Version: 3.6.1 + +Package: livesupport-libs +Architecture: any +Depends: ${shlibs:Depends}, + unixodbc (>= 2.2), + xlibs (>= 4.1.0), + libfontconfig1, + libpng12-0, + libjpeg62, + libssl0.9.7, + libxml2, + libpopt0, + libasound2, + libid3tag0, + libmad0, + libogg0, + libvorbis0a, + libboost-date-time1.33.0 | libboost-date-time1.33.1 +Description: A radio program automation and support tool. + This package contains the libraries used by LiveSupport. + +Package: livesupport-station +Architecture: any +Depends: ${shlibs:Depends}, + livesupport-libs (>= ${dpkg:Version}), + sed, + odbc-postgresql, + apache | apache2, + php4, + php4-domxml, + php4-pear, + php4-pgsql, + libapache-mod-php4 | libapache2-mod-php4, + postgresql (>= 7.4), + postgresql-client (>=7.4) +Description: A radio program automation and support tool. + This package contains the server components of LiveSupport. + This includes a scheluer deamon, and web-based server components. + +Package: livesupport-studio +Architecture: any +Depends: ${shlibs:Depends}, + livesupport-station (>= ${dpkg:Version}), + sed +Description: A radio program automation and support tool. + This package contains the GUI client components of LiveSupport. diff --git a/campcaster/etc/debian/copyright b/campcaster/etc/debian/copyright new file mode 100644 index 000000000..83720e9bc --- /dev/null +++ b/campcaster/etc/debian/copyright @@ -0,0 +1,25 @@ +This package was debianized by Akos Maroy on +Wed, 03 Aug 2005 08:17:25 -0400 + +It was downloaded from http://campcaster.campware.org/ + +Copyright: + +Upstream Author(s): Media Developmnet Loan Fund, http://www.mdlf.org/ + +License: + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + diff --git a/campcaster/etc/debian/dirs b/campcaster/etc/debian/dirs new file mode 100644 index 000000000..b67467194 --- /dev/null +++ b/campcaster/etc/debian/dirs @@ -0,0 +1 @@ +opt/livesupport diff --git a/campcaster/etc/debian/livesupport-station.conffiles b/campcaster/etc/debian/livesupport-station.conffiles new file mode 100644 index 000000000..752f1d996 --- /dev/null +++ b/campcaster/etc/debian/livesupport-station.conffiles @@ -0,0 +1,3 @@ +/opt/livesupport/var/LiveSupport/storageServer/var/conf.php +/opt/livesupport/var/LiveSupport/archiveServer/var/conf.php +/opt/livesupport/etc/scheduler.xml diff --git a/campcaster/etc/debian/livesupport-station.postinst b/campcaster/etc/debian/livesupport-station.postinst new file mode 100644 index 000000000..48f03b9c7 --- /dev/null +++ b/campcaster/etc/debian/livesupport-station.postinst @@ -0,0 +1,50 @@ +#! /bin/sh +# postinst script for livesupport +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package +# + +installdir=/opt/livesupport + +case "$1" in + configure) + # do post-installation configuration + $installdir/bin/postInstallStation.sh --directory $installdir + + # register and start the livesupport scheduler daemon + cp -f $installdir/bin/livesupport-station /etc/init.d + update-rc.d livesupport-station defaults 92 || true + /etc/init.d/livesupport-station start || true + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/campcaster/etc/debian/livesupport-station.postrm b/campcaster/etc/debian/livesupport-station.postrm new file mode 100644 index 000000000..b89b2c766 --- /dev/null +++ b/campcaster/etc/debian/livesupport-station.postrm @@ -0,0 +1,137 @@ +#! /bin/sh +# postrm script for campcaster +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' overwrit>r> +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +installdir=/opt/campcaster +apache_docroot=/var/www + +postgres_user=postgres + +ls_dbserver=localhost +ls_database=Campcaster +ls_dbuser=campcaster + + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Exectuable $1 found..."; + return 0; + else + echo "Exectuable $1 not found..."; + return 1; + fi +} + + +case "$1" in + remove|upgrade|failed-upgrade|abort-install|abort-upgrade) + # remove the init script + rm -f /etc/init.d/campcaster-station + update-rc.d campcaster-station remove + + # remove the symlink to the campcaster web pages + rm -f $apache_docroot/campcaster + + # restore the old pg_hba.conf file + if [ -f /etc/postgresql/pg_hba.conf ] \ + && [ -f /etc/postgresql/pg_hba.conf.before-campcaster ] ; then + mv -f /etc/postgresql/pg_hba.conf \ + /etc/postgresql/pg_hba.conf.campcaster ; + mv -f /etc/postgresql/pg_hba.conf.before-campcaster \ + /etc/postgresql/pg_hba.conf ; + fi + ;; + + purge|disappear) + echo "Checking for required tools..." + + check_exe "psql" || exit 1; + check_exe "odbcinst" || exit 1; + + + echo "Deleting data files..."; + + rm -rf $installdir/etc/scheduler.xml + rm -rf $installdir/etc/gst-registry.xml + rm -rf $installdir/etc/pear.conf + rm -rf $installdir/var/Campcaster/htmlUI/var/html/img/* + rm -rf $installdir/var/Campcaster/htmlUI/var/templates_c/* + rm -rf $installdir/var/Campcaster/storageServer/var/stor/* + rm -rf $installdir/var/Campcaster/storageServer/var/access/* + rm -rf $installdir/var/Campcaster/storageServer/var/trans/* + rm -rf $installdir/var/Campcaster/archiveServer/var/stor/* + rm -rf $installdir/var/Campcaster/archiveServer/var/access/* + rm -rf $installdir/var/Campcaster/archiveServer/var/trans/* + + + echo "Removing ODBC data source and driver..."; + + # kill active connections to LiveSuport database + /etc/init.d/postgresql restart + + echo "Removing Campcaster ODBC data source..."; + odbcinst -u -s -l -n $ls_database || exit 1; + + echo "De-registering ODBC PostgreSQL driver..."; + odbcinst -u -d -v -n PostgreSQL || exit 1; + + + echo "Removing database and database user..."; + + if [ "x$ls_dbserver" == "xlocalhost" ]; then + su - $postgres_user -c \ + "echo \"DROP DATABASE \\\"$ls_database\\\" \"\ + | psql template1" \ + || echo "Couldn't drop database $ls_database."; + + su - $postgres_user -c "echo \"DROP USER $ls_dbuser \"\ + | psql template1" \ + || echo "Couldn't drop database user $ls_dbuser."; + + else + echo "Unable to automatically drop database user and table for"; + echo "remote database $ls_dbserver."; + echo "Make sure to drop database user $ls_dbuser on database"; + echo "server at $ls_dbserver."; + echo "Also drop the database called $ld_database."; + echo ""; + echo "The easiest way to achieve this is by issuing the"; + echo "following SQL commands to PostgreSQL:"; + echo "DROP DATABASE \"$ls_database\";"; + echo "DROP USER $ls_dbuser;"; + fi + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/campcaster/etc/debian/livesupport-station.preinst b/campcaster/etc/debian/livesupport-station.preinst new file mode 100644 index 000000000..08d0b4758 --- /dev/null +++ b/campcaster/etc/debian/livesupport-station.preinst @@ -0,0 +1,116 @@ +#! /bin/sh +# preinst script for livesupport +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +#------------------------------------------------------------------------------- +# Function to check for a group to be available, and the ability +# to set files to belong into that group +# +# @param $1 the group to check +# @return 0 if the groups id OK, non-0 otherwise +#------------------------------------------------------------------------------- +check_group_permission() { + group_tmp_file=/tmp/ls_group_check.$$ + touch $group_tmp_file + test_result=`chgrp $1 $group_tmp_file 2> /dev/null` + if [ $? != 0 ]; then + rm -f $group_tmp_file; + echo "Unable to use apache deamon group $1."; + echo "Please check if $1 is a correct user group."; + return 1; + fi + rm -f $group_tmp_file; + echo "Apache daemon group $1 OK."; + + return 0; +} + +#------------------------------------------------------------------------------- +# Function to check for the existence of an executable on the PATH +# +# @param $1 the name of the exectuable +# @return 0 if the executable exists on the PATH, non-0 otherwise +#------------------------------------------------------------------------------- +check_exe() { + if [ -x "`which $1 2> /dev/null`" ]; then + echo "Exectuable $1 found..."; + return 0; + else + echo "Exectuable $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Function to check for a PEAR module +# +# @param $1 the name of the PEAR module +# @return 0 if the module is available, non-0 otherwise +#------------------------------------------------------------------------------- +check_pear_module() { + test_result=`pear info $1` + if [ $? = 0 ]; then + echo "PEAR module $1 found..."; + return 0; + else + echo "PEAR module $1 not found..."; + return 1; + fi +} + + +#------------------------------------------------------------------------------- +# Variables +#------------------------------------------------------------------------------- +apache_group=www-data + + +case "$1" in + install|upgrade) + echo "Checking for required tools..." + + check_exe "sed" || exit 1; + check_exe "psql" || exit 1; + check_exe "php" || exit 1; + check_exe "pear" || exit 1; + check_exe "odbcinst" || exit 1; + + echo "Checking for validity of apache daemon group $apache_group..."; + check_group_permission $apache_group || exit 1; + + if [ "$1" = "upgrade" ]; then + /etc/init.d/livesupport-station stop || true + /etc/init.d/livesupport-station kill || true + fi + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/campcaster/etc/debian/livesupport-station.prerm b/campcaster/etc/debian/livesupport-station.prerm new file mode 100644 index 000000000..7387047cb --- /dev/null +++ b/campcaster/etc/debian/livesupport-station.prerm @@ -0,0 +1,43 @@ +#! /bin/sh +# prerm script for livesupport +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) + # stop the livesupport scheduler daemon + /etc/init.d/livesupport-station stop || true + /etc/init.d/livesupport-station kill || true + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/campcaster/etc/debian/livesupport-studio.conffiles b/campcaster/etc/debian/livesupport-studio.conffiles new file mode 100644 index 000000000..0ba6221d4 --- /dev/null +++ b/campcaster/etc/debian/livesupport-studio.conffiles @@ -0,0 +1 @@ +/opt/livesupport/etc/gLiveSupport.xml diff --git a/campcaster/etc/debian/livesupport-studio.desktop b/campcaster/etc/debian/livesupport-studio.desktop new file mode 100644 index 000000000..c19f65a97 --- /dev/null +++ b/campcaster/etc/debian/livesupport-studio.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Encoding=UTF-8 + +Name=LiveSupport-Studio +GenericName=LiveSupport Studio GUI Client +Comment= +Icon=/opt/livesupport/var/LiveSupport/livesupport.png + +Type=Application +Categories=Application;AudioVideo;Audio; + +Exec=/opt/livesupport/bin/gLiveSupport.sh +Terminal=false + diff --git a/campcaster/etc/debian/livesupport-studio.menu b/campcaster/etc/debian/livesupport-studio.menu new file mode 100644 index 000000000..d811b8af4 --- /dev/null +++ b/campcaster/etc/debian/livesupport-studio.menu @@ -0,0 +1,3 @@ +?package(livesupport-studio):needs="X11" section="Apps/Sound" \ + title="LiveSupport-Studio" command="/opt/livesupport/bin/gLiveSupport.sh" \ + icon="/opt/livesupport/var/LiveSupport/livesupport.png" diff --git a/campcaster/etc/debian/livesupport-studio.postinst b/campcaster/etc/debian/livesupport-studio.postinst new file mode 100644 index 000000000..4ce3a5550 --- /dev/null +++ b/campcaster/etc/debian/livesupport-studio.postinst @@ -0,0 +1,46 @@ +#! /bin/sh +# postinst script for livesupport +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package +# + +installdir=/opt/livesupport +apache_group=www-data +apache_docroot=/var/www + +case "$1" in + configure) + + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/campcaster/etc/debian/rules b/campcaster/etc/debian/rules new file mode 100755 index 000000000..8fbaa23e1 --- /dev/null +++ b/campcaster/etc/debian/rules @@ -0,0 +1,189 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +config.status: configure + dh_testdir + CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --prefix=/opt/livesupport \ + --with-www-docroot=/var/www \ + --with-apache-group=www-data \ + --with-station-audio-out=/dev/dsp \ + --with-studio-audio-out=/dev/dsp1 \ + --with-studio-audio-cue=/dev/dsp2 \ + --with-hostname=localhost + +build: build-arch + +build-arch: build-arch-stamp +build-arch-stamp: config.status + + $(MAKE) setup compile + touch build-arch-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-arch-stamp #CONFIGURE-STAMP# + + -$(MAKE) distclean clean + + dh_clean + +install: install-arch + +install-arch: + dh_testdir + dh_testroot + dh_clean -k -s + dh_installdirs -s + + # this will install everything into /opt/livesupport/usr + $(MAKE) install + + # move the installation to debian/livesupport + mkdir -p $(CURDIR)/debian/livesupport/opt + mv /opt/livesupport $(CURDIR)/debian/livesupport/opt + + # now separate the libraries into debian/livesupport-libs + mkdir -p $(CURDIR)/debian/livesupport-libs + mkdir -p $(CURDIR)/debian/livesupport-libs/opt/livesupport + mkdir -p $(CURDIR)/debian/livesupport-libs/opt/livesupport/bin + mkdir -p $(CURDIR)/debian/livesupport-libs/opt/livesupport/etc/pango + mkdir -p $(CURDIR)/debian/livesupport-libs/opt/livesupport/tmp + mkdir -p $(CURDIR)/debian/livesupport-libs/opt/livesupport/usr/lib + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/lib \ + $(CURDIR)/debian/livesupport-libs/opt/livesupport + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/bin/gst-* \ + $(CURDIR)/debian/livesupport-libs/opt/livesupport/bin + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/usr/lib/pear \ + $(CURDIR)/debian/livesupport-libs/opt/livesupport/usr/lib + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/etc/pango/* \ + $(CURDIR)/debian/livesupport-libs/opt/livesupport/etc/pango + + # now separate the station (server) files into debian/livesupport-station + mkdir -p $(CURDIR)/debian/livesupport-station + mkdir -p $(CURDIR)/debian/livesupport-station/opt/livesupport + mkdir -p $(CURDIR)/debian/livesupport-station/opt/livesupport/bin + mkdir -p $(CURDIR)/debian/livesupport-station/opt/livesupport/etc + mkdir -p $(CURDIR)/debian/livesupport-station/opt/livesupport/tmp + mkdir -p $(CURDIR)/debian/livesupport-station/opt/livesupport/var/LiveSupport + mkdir -p $(CURDIR)/debian/livesupport-station/opt/livesupport/usr/lib + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/bin/scheduler \ + $(CURDIR)/debian/livesupport/opt/livesupport/bin/scheduler.sh \ + $(CURDIR)/debian/livesupport/opt/livesupport/bin/postInstallStation.sh \ + $(CURDIR)/debian/livesupport/opt/livesupport/bin/livesupport-station \ + $(CURDIR)/debian/livesupport-station/opt/livesupport/bin + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/etc/scheduler.xml* \ + $(CURDIR)/debian/livesupport/opt/livesupport/etc/odbc* \ + $(CURDIR)/debian/livesupport/opt/livesupport/etc/gtk* \ + $(CURDIR)/debian/livesupport-station/opt/livesupport/etc + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/alib \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/archiveServer \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/getid3 \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/index.php \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/htmlUI \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/storageServer \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/storageAdmin \ + $(CURDIR)/debian/livesupport-station/opt/livesupport/var/LiveSupport + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/bin/backup.sh \ + $(CURDIR)/debian/livesupport/opt/livesupport/bin/dumpDbSchema.sh \ + $(CURDIR)/debian/livesupport/opt/livesupport/bin/import.sh \ + $(CURDIR)/debian/livesupport/opt/livesupport/bin/restore.sh \ + $(CURDIR)/debian/livesupport-station/opt/livesupport/bin + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/var/cache \ + $(CURDIR)/debian/livesupport-station/opt/livesupport/var + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/etc/apache \ + $(CURDIR)/debian/livesupport/opt/livesupport/etc/pg_hba.conf \ + $(CURDIR)/debian/livesupport-station/opt/livesupport/etc + + # now separate the studio (client) files into debian/livesupport-studio + mkdir -p $(CURDIR)/debian/livesupport-studio + mkdir -p $(CURDIR)/debian/livesupport-studio/opt/livesupport + mkdir -p $(CURDIR)/debian/livesupport-studio/opt/livesupport/bin + mkdir -p $(CURDIR)/debian/livesupport-studio/opt/livesupport/etc + mkdir -p $(CURDIR)/debian/livesupport-studio/opt/livesupport/tmp + mkdir -p $(CURDIR)/debian/livesupport-studio/opt/livesupport/var/LiveSupport + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/bin/gLiveSupport \ + $(CURDIR)/debian/livesupport/opt/livesupport/bin/gLiveSupport.sh \ + $(CURDIR)/debian/livesupport-studio/opt/livesupport/bin + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/etc/gLiveSupport.xml* \ + $(CURDIR)/debian/livesupport-studio/opt/livesupport/etc + mv -f $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/Widgets \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/gLiveSupport*.res \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/livesupport.png \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/icon*.png \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/stationLogo.png \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/testAudio.ogg \ + $(CURDIR)/debian/livesupport/opt/livesupport/var/LiveSupport/testAudio.ogg.license \ + $(CURDIR)/debian/livesupport-studio/opt/livesupport/var/LiveSupport + mkdir -p $(CURDIR)/debian/livesupport-studio/usr/share/applications + cp -a $(CURDIR)/debian/livesupport-studio.desktop \ + $(CURDIR)/debian/livesupport-studio/usr/share/applications/ + dh_desktop -plivesupport-studio + dh_installmenu + + dh_install -s + +binary-common: + dh_testdir + dh_testroot +# dh_installchangelogs +# dh_installdocs +# dh_installexamples + dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# Replaced dh_installinit with manual init script installation +# because invoke.rc-d is linked to /bin/true in the knoppix hdd install. +# Should be changed back when/if knoppix is fixed. +# dh_installinit --update-rcd-params="defaults 92" +# dh_installcron +# dh_installinfo +# dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms + dh_makeshlibs + dh_installdeb + dh_shlibdeps -l${CURDIR}/debian/livesupport-libs/opt/livesupport/lib + dh_gencontrol + dh_md5sums + dh_builddeb + +# Build architecture dependant packages using the common target. +binary-arch: build-arch install-arch + $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common + +binary: binary-arch +.PHONY: build clean binary-arch binary install install-arch diff --git a/campcaster/etc/doxygen.config b/campcaster/etc/doxygen.config new file mode 100644 index 000000000..9972e6e2d --- /dev/null +++ b/campcaster/etc/doxygen.config @@ -0,0 +1,1167 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Campcaster + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES # needed by storageServer docs + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src/modules/core/include src/modules/core/src \ + src/modules/authentication/include \ + src/modules/authentication/src \ + src/modules/db/include src/modules/db/src \ + src/modules/storageClient/include \ + src/modules/storageClient/src \ + src/modules/playlistExecutor/include \ + src/modules/playlistExecutor/src \ + src/modules/eventScheduler/include \ + src/modules/eventScheduler/src \ + src/modules/schedulerClient/include \ + src/modules/schedulerClient/src \ + src/modules/widgets/include \ + src/modules/widgets/src \ + src/products/scheduler/src \ + src/products/gLiveSupport/src \ + src/modules/alib/var \ + src/modules/alib/var/xmlrpc \ + src/modules/getid3/var \ + src/modules/archiveServer/var \ + src/modules/storageServer/var \ + src/modules/storageServer/var/xmlrpc \ + src/modules/storageAdmin/var + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = *Test.h *Test.cxx + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = \ +./doc/doxygen/xmlrpc++.tag=../../../usr/share/doc/xmlrpc++ + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = ./doc/doxygen/campcaster.tag + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/etc/pg_hba.conf b/campcaster/etc/pg_hba.conf new file mode 100644 index 000000000..c186cb375 --- /dev/null +++ b/campcaster/etc/pg_hba.conf @@ -0,0 +1,101 @@ +# PostgreSQL Client Authentication Configuration File +# =================================================== +# +# Refer to the PostgreSQL Administrator's Guide, chapter "Client +# Authentication" for a complete description. A short synopsis +# follows. +# +# This file controls: which hosts are allowed to connect, how clients +# are authenticated, which PostgreSQL user names they can use, which +# databases they can access. Records take one of seven forms: +# +# local DATABASE USER METHOD [OPTION] +# host DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] +# hostssl DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] +# hostnossl DATABASE USER IP-ADDRESS IP-MASK METHOD [OPTION] +# host DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION] +# hostssl DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION] +# hostnossl DATABASE USER IP-ADDRESS/CIDR-MASK METHOD [OPTION] +# +# (The uppercase quantities should be replaced by actual values.) +# The first field is the connection type: "local" is a Unix-domain socket, +# "host" is either a plain or SSL-encrypted TCP/IP socket, "hostssl" is an +# SSL-encrypted TCP/IP socket, and "hostnossl" is a plain TCP/IP socket. +# DATABASE can be "all", "sameuser", "samegroup", a database name (or +# a comma-separated list thereof), or a file name prefixed with "@". +# USER can be "all", an actual user name or a group name prefixed with +# "+", an include file prefixed with "@" or a list containing either. +# IP-ADDRESS and IP-MASK specify the set of hosts the record matches. +# CIDR-MASK is an integer between 0 and 32 (IPv6) or 128(IPv6) +# inclusive, that specifies the number of significant bits in the +# mask, so an IPv4 CIDR-MASK of 8 is equivalent to an IP-MASK of +# 255.0.0.0, and an IPv6 CIDR-MASK of 64 is equivalent to an IP-MASK +# of ffff:ffff:ffff:ffff::. METHOD can be "trust", "reject", "md5", +# "crypt", "password", "krb5", "ident", or "pam". Note that +# "password" uses clear-text passwords; "md5" is preferred for +# encrypted passwords. OPTION is the ident map or the name of the PAM +# service. +# +# INCLUDE FILES: +# If you use include files for users and/or databases (see PostgreSQL +# documentation, section 19.1), these files must be placed in the +# database directory. Usually this is /var/lib/postgres/data/, but +# that can be changed in /etc/postgresql/postmaster.conf with the +# POSTGRES_DATA variable. Putting them in /etc/postgresql/ will NOT +# work since the configuration files are only symlinked from +# POSTGRES_DATA. +# +# This file is read on server startup and when the postmaster receives +# a SIGHUP signal. If you edit the file on a running system, you have +# to SIGHUP the postmaster for the changes to take effect, or use +# "pg_ctl reload". +# +# Upstream default configuration +# +# The following configuration is the upstream default, which allows +# unrestricted access to amy database by any user on the local machine. +# +# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD +# +#local all all trust +# IPv4-style local connections: +#host all all 127.0.0.1 255.255.255.255 trust +# IPv6-style local connections: +# +# Put your actual configuration here +# ---------------------------------- +# +# This default configuration allows any local user to connect as himself +# without a password, either through a Unix socket or through TCP/IP; users +# on other machines are denied access. +# +# If you want to allow non-local connections, you need to add more +# "host" records before the final line that rejects all TCP/IP connections. +# Also, remember TCP/IP connections are only enabled if you enable +# "tcpip_socket" in /etc/postgresql/postgresql.conf. +# +# DO NOT DISABLE! +# If you change this first entry you will need to make sure the postgres user +# can access the database using some other method. The postgres user needs +# non-interactive access to all databases during automatic maintenance +# (see the vacuum command and the /usr/lib/postgresql/bin/do.maintenance +# script). +# +# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD +# Database administrative login by UNIX sockets +local all postgres ident sameuser +# +# All IPv4 connections from localhost +# The following line was inserted by the campcaster-station package installer +# the original pg_hba.conf file is saved under pg_hba.conf.before-campcaster +host all all 127.0.0.1 255.255.255.255 password +#host all all 127.0.0.1 255.255.255.255 ident sameuser +# +# All other connections by UNIX sockets +local all all password +# +# All IPv6 localhost connections +# +# reject all other connection attempts +host all all 0.0.0.0 0.0.0.0 reject + diff --git a/campcaster/etc/portage/dev-db/libodbc++/Manifest b/campcaster/etc/portage/dev-db/libodbc++/Manifest new file mode 100644 index 000000000..d01a40bfe --- /dev/null +++ b/campcaster/etc/portage/dev-db/libodbc++/Manifest @@ -0,0 +1,6 @@ +MD5 9dd6a3434f7eaef06fb2956937bbfe2c libodbc++-0.2.3-r2.ebuild 2335 +MD5 178bef12f773384d7586dd35c1ec0125 files/libodbc++-no-thread-dmaccess-mutex-fix.patch 498 +MD5 fe58a608d688d22afe285174f283a89e files/libodbc++-no-namespace-closing-colon.patch 4840 +MD5 398c2a40f5ea13cadbb9c297488ef43f files/libodbc++-0.2.3-to-cvs-20050404.patch 3249529 +MD5 0aab8e76fcf033af346511bb1fef5f90 files/libodbc++-dont-install-some-docs.patch 6037 +MD5 76859551271b481b467298625eca2fbf files/digest-libodbc++-0.2.3-r2 67 diff --git a/campcaster/etc/portage/dev-db/libodbc++/files/digest-libodbc++-0.2.3-r2 b/campcaster/etc/portage/dev-db/libodbc++/files/digest-libodbc++-0.2.3-r2 new file mode 100644 index 000000000..424216231 --- /dev/null +++ b/campcaster/etc/portage/dev-db/libodbc++/files/digest-libodbc++-0.2.3-r2 @@ -0,0 +1 @@ +MD5 92cb6171e5235324c710d89cd271eff9 libodbc++-0.2.3.tar.gz 450097 diff --git a/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-0.2.3-to-cvs-20050404.patch b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-0.2.3-to-cvs-20050404.patch new file mode 100644 index 000000000..eb1722815 --- /dev/null +++ b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-0.2.3-to-cvs-20050404.patch @@ -0,0 +1,72067 @@ +diff -Naur libodbc++-0.2.3/acinclude.m4 libodbc++-0.2.3-20050404/acinclude.m4 +--- libodbc++-0.2.3/acinclude.m4 2003-04-06 12:42:36.000000000 +0200 ++++ libodbc++-0.2.3-20050404/acinclude.m4 2003-12-05 11:16:41.000000000 +0100 +@@ -165,6 +165,14 @@ + + if test "x$pthreads_ok" != xyes + then ++# hpux 11 uses macros for pthread_create so test another function ++AC_CHECK_LIB(pthread,pthread_join, ++ pthreads_ok=yes ++ THREAD_LIBS="-lpthread",pthreads_ok=no) ++fi ++ ++if test "x$pthreads_ok" != xyes ++then + + # try libc_r (*BSD) + AC_CHECK_LIB(c_r,pthread_create, +diff -Naur libodbc++-0.2.3/aclocal.m4 libodbc++-0.2.3-20050404/aclocal.m4 +--- libodbc++-0.2.3/aclocal.m4 2003-06-17 12:20:47.000000000 +0200 ++++ libodbc++-0.2.3-20050404/aclocal.m4 2005-04-04 18:21:06.000000000 +0200 +@@ -1,6 +1,6 @@ +-# aclocal.m4 generated automatically by aclocal 1.6.3 -*- Autoconf -*- ++# generated automatically by aclocal 1.7.9 -*- Autoconf -*- + +-# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 + # Free Software Foundation, Inc. + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -178,6 +178,14 @@ + + if test "x$pthreads_ok" != xyes + then ++# hpux 11 uses macros for pthread_create so test another function ++AC_CHECK_LIB(pthread,pthread_join, ++ pthreads_ok=yes ++ THREAD_LIBS="-lpthread",pthreads_ok=no) ++fi ++ ++if test "x$pthreads_ok" != xyes ++then + + # try libc_r (*BSD) + AC_CHECK_LIB(c_r,pthread_create, +@@ -313,7 +321,7 @@ + # This macro actually does too much some checks are only needed if + # your package does certain things. But this isn't really a big deal. + +-# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify +@@ -331,16 +339,9 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + # 02111-1307, USA. + +-# serial 8 +- +-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +-# written in clear, in which case automake, when reading aclocal.m4, +-# will think it sees a *use*, and therefore will trigger all it's +-# C support machinery. Also note that it means that autoscan, seeing +-# CC etc. in the Makefile, will ask for an AC_PROG_CC use... +- ++# serial 10 + +-AC_PREREQ([2.52]) ++AC_PREREQ([2.54]) + + # Autoconf 2.50 wants to disallow AM_ names. We explicitly allow + # the ones we care about. +@@ -366,6 +367,16 @@ + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi + ++# test whether we have cygpath ++if test -z "$CYGPATH_W"; then ++ if (cygpath --version) >/dev/null 2>/dev/null; then ++ CYGPATH_W='cygpath -w' ++ else ++ CYGPATH_W=echo ++ fi ++fi ++AC_SUBST([CYGPATH_W]) ++ + # Define the identity of the package. + dnl Distinguish between old-style and new-style calls. + m4_ifval([$2], +@@ -373,8 +384,8 @@ + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], + [_AM_SET_OPTIONS([$1])dnl +- AC_SUBST([PACKAGE], [AC_PACKAGE_TARNAME])dnl +- AC_SUBST([VERSION], [AC_PACKAGE_VERSION])])dnl ++ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl ++ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + + _AM_IF_OPTION([no-define],, + [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +@@ -395,19 +406,41 @@ + # some platforms. + AC_REQUIRE([AC_PROG_AWK])dnl + AC_REQUIRE([AC_PROG_MAKE_SET])dnl ++AC_REQUIRE([AM_SET_LEADING_DOT])dnl + + _AM_IF_OPTION([no-dependencies],, +-[AC_PROVIDE_IFELSE([AC_PROG_][CC], ++[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], +- [define([AC_PROG_][CC], +- defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl +-AC_PROVIDE_IFELSE([AC_PROG_][CXX], ++ [define([AC_PROG_CC], ++ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl ++AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], +- [define([AC_PROG_][CXX], +- defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl ++ [define([AC_PROG_CXX], ++ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + ]) + ]) + ++ ++# When config.status generates a header, we must update the stamp-h file. ++# This file resides in the same directory as the config header ++# that is generated. The stamp files are numbered to have different names. ++ ++# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the ++# loop where config.status creates the headers, so we can generate ++# our stamp files there. ++AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], ++[# Compute $1's index in $config_headers. ++_am_stamp_count=1 ++for _am_header in $config_headers :; do ++ case $_am_header in ++ $1 | $1:* ) ++ break ;; ++ * ) ++ _am_stamp_count=`expr $_am_stamp_count + 1` ;; ++ esac ++done ++echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) ++ + # Copyright 2002 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify +@@ -428,14 +461,14 @@ + # ---------------------------- + # Automake X.Y traces this macro to ensure aclocal.m4 has been + # generated from the m4 files accompanying Automake X.Y. +-AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.6"]) ++AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) + + # AM_SET_CURRENT_AUTOMAKE_VERSION + # ------------------------------- + # Call AM_AUTOMAKE_VERSION so it can be traced. + # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. + AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +- [AM_AUTOMAKE_VERSION([1.6.3])]) ++ [AM_AUTOMAKE_VERSION([1.7.9])]) + + # Helper functions for option handling. -*- Autoconf -*- + +@@ -721,9 +754,42 @@ + INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +-# serial 4 -*- Autoconf -*- ++# -*- Autoconf -*- ++# Copyright (C) 2003 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2, or (at your option) ++# any later version. ++ ++# This program 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 this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# serial 1 ++ ++# Check whether the underlying file-system supports filenames ++# with a leading dot. For instance MS-DOS doesn't. ++AC_DEFUN([AM_SET_LEADING_DOT], ++[rm -rf .tst 2>/dev/null ++mkdir .tst 2>/dev/null ++if test -d .tst; then ++ am__leading_dot=. ++else ++ am__leading_dot=_ ++fi ++rmdir .tst 2>/dev/null ++AC_SUBST([am__leading_dot])]) ++ ++# serial 5 -*- Autoconf -*- + +-# Copyright 1999, 2000, 2001 Free Software Foundation, Inc. ++# Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by +@@ -784,18 +850,32 @@ + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir ++ # We will build objects and dependencies in a subdirectory because ++ # it helps to detect inapplicable dependency modes. For instance ++ # both Tru64's cc and ICC support -MD to output dependencies as a ++ # side effect of compilation, but ICC will put the dependencies in ++ # the current directory while Tru64 will put them in the object ++ # directory. ++ mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do ++ # Setup a source with many dependencies, because some compilers ++ # like to wrap large dependency lists on column 80 (with \), and ++ # we should not choose a depcomp mode which is confused by this. ++ # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. +- echo '#include "conftest.h"' > conftest.c +- echo 'int i;' > conftest.h +- echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf ++ : > sub/conftest.c ++ for i in 1 2 3 4 5 6; do ++ echo '#include "conftst'$i'.h"' >> sub/conftest.c ++ : > sub/conftst$i.h ++ done ++ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) +@@ -813,13 +893,20 @@ + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ +- source=conftest.c object=conftest.o \ +- depfile=conftest.Po tmpdepfile=conftest.TPo \ +- $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && +- grep conftest.h conftest.Po > /dev/null 2>&1 && ++ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ ++ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ ++ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ ++ >/dev/null 2>conftest.err && ++ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && ++ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then +- am_cv_$1_dependencies_compiler_type=$depmode +- break ++ # icc doesn't choke on unknown options, it will just issue warnings ++ # (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored. ++ if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else ++ am_cv_$1_dependencies_compiler_type=$depmode ++ break ++ fi + fi + done + +@@ -830,6 +917,9 @@ + fi + ]) + AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) ++AM_CONDITIONAL([am__fastdep$1], [ ++ test "x$enable_dependency_tracking" != xno \ ++ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) + ]) + + +@@ -838,16 +928,8 @@ + # Choose a directory name for dependency files. + # This macro is AC_REQUIREd in _AM_DEPENDENCIES + AC_DEFUN([AM_SET_DEPDIR], +-[rm -f .deps 2>/dev/null +-mkdir .deps 2>/dev/null +-if test -d .deps; then +- DEPDIR=.deps +-else +- # MS-DOS does not allow filenames that begin with a dot. +- DEPDIR=_deps +-fi +-rmdir .deps 2>/dev/null +-AC_SUBST([DEPDIR]) ++[AC_REQUIRE([AM_SET_LEADING_DOT])dnl ++AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl + ]) + + +@@ -949,7 +1031,9 @@ + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) + ]) + +-# Copyright 2001 Free Software Foundation, Inc. -*- Autoconf -*- ++# Check to see how 'make' treats includes. -*- Autoconf -*- ++ ++# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by +@@ -974,8 +1058,9 @@ + AC_DEFUN([AM_MAKE_INCLUDE], + [am_make=${MAKE-make} + cat > confinc << 'END' +-doit: ++am__doit: + @echo done ++.PHONY: am__doit + END + # If we don't find an include directive, just comment out the code. + AC_MSG_CHECKING([for style of include used by $am_make]) +@@ -989,7 +1074,7 @@ + # In particular we don't look at `^make:' because GNU make might + # be invoked under some other name (usually "gmake"), in which + # case it prints its new name instead of `make'. +-if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then ++if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +@@ -1003,9 +1088,9 @@ + _am_result=BSD + fi + fi +-AC_SUBST(am__include) +-AC_SUBST(am__quote) +-AC_MSG_RESULT($_am_result) ++AC_SUBST([am__include]) ++AC_SUBST([am__quote]) ++AC_MSG_RESULT([$_am_result]) + rm -f confinc confmf + ]) + +@@ -1049,7 +1134,7 @@ + fi + AC_CONFIG_COMMANDS_PRE( + [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then +- AC_MSG_ERROR([conditional \"$1\" was never defined. ++ AC_MSG_ERROR([conditional "$1" was never defined. + Usually this means the macro was only invoked conditionally.]) + fi])]) + +@@ -1076,67 +1161,66 @@ + + # serial 6 + +-# When config.status generates a header, we must update the stamp-h file. +-# This file resides in the same directory as the config header +-# that is generated. We must strip everything past the first ":", +-# and everything past the last "/". +- +-# _AM_DIRNAME(PATH) +-# ----------------- +-# Like AS_DIRNAME, only do it during macro expansion +-AC_DEFUN([_AM_DIRNAME], +- [m4_if(regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1, +- m4_if(regexp([$1], [^//\([^/]\|$\)]), -1, +- m4_if(regexp([$1], [^/.*]), -1, +- [.], +- patsubst([$1], [^\(/\).*], [\1])), +- patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])), +- patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl +-])# _AM_DIRNAME +- +- +-# The stamp files are numbered to have different names. +-# We could number them on a directory basis, but that's additional +-# complications, let's have a unique counter. +-m4_define([_AM_STAMP_Count], [0]) +- ++# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. ++AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +-# _AM_STAMP(HEADER) +-# ----------------- +-# The name of the stamp file for HEADER. +-AC_DEFUN([_AM_STAMP], +-[m4_define([_AM_STAMP_Count], m4_incr(_AM_STAMP_Count))dnl +-AS_ESCAPE(_AM_DIRNAME(patsubst([$1], +- [:.*])))/stamp-h[]_AM_STAMP_Count]) ++# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + ++# serial 47 AC_PROG_LIBTOOL + +-# _AM_CONFIG_HEADER(HEADER[:SOURCES], COMMANDS, INIT-COMMANDS) +-# ------------------------------------------------------------ +-# We used to try to get a real timestamp in stamp-h. But the fear is that +-# that will cause unnecessary cvs conflicts. +-AC_DEFUN([_AM_CONFIG_HEADER], +-[# Add the stamp file to the list of files AC keeps track of, +-# along with our hook. +-AC_CONFIG_HEADERS([$1], +- [# update the timestamp +-echo 'timestamp for $1' >"_AM_STAMP([$1])" +-$2], +- [$3]) +-])# _AM_CONFIG_HEADER +- +- +-# AM_CONFIG_HEADER(HEADER[:SOURCES]..., COMMANDS, INIT-COMMANDS) +-# -------------------------------------------------------------- +-AC_DEFUN([AM_CONFIG_HEADER], +-[AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])]) +-])# AM_CONFIG_HEADER + +-# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- ++# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) ++# ----------------------------------------------------------- ++# If this macro is not defined by Autoconf, define it here. ++m4_ifdef([AC_PROVIDE_IFELSE], ++ [], ++ [m4_define([AC_PROVIDE_IFELSE], ++ [m4_ifdef([AC_PROVIDE_$1], ++ [$2], [$3])])]) + +-# serial 46 AC_PROG_LIBTOOL + ++# AC_PROG_LIBTOOL ++# --------------- + AC_DEFUN([AC_PROG_LIBTOOL], ++[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl ++dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX ++dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. ++ AC_PROVIDE_IFELSE([AC_PROG_CXX], ++ [AC_LIBTOOL_CXX], ++ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ++ ])]) ++dnl And a similar setup for Fortran 77 support ++ AC_PROVIDE_IFELSE([AC_PROG_F77], ++ [AC_LIBTOOL_F77], ++ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ++])]) ++ ++dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. ++dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run ++dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. ++ AC_PROVIDE_IFELSE([AC_PROG_GCJ], ++ [AC_LIBTOOL_GCJ], ++ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], ++ [AC_LIBTOOL_GCJ], ++ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], ++ [AC_LIBTOOL_GCJ], ++ [ifdef([AC_PROG_GCJ], ++ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ++ ifdef([A][M_PROG_GCJ], ++ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ++ ifdef([LT_AC_PROG_GCJ], ++ [define([LT_AC_PROG_GCJ], ++ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ++])])# AC_PROG_LIBTOOL ++ ++ ++# _AC_PROG_LIBTOOL ++# ---------------- ++AC_DEFUN([_AC_PROG_LIBTOOL], + [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl ++AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl ++AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl ++AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + + # This can be used to rebuild libtool when needed + LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" +@@ -1147,10 +1231,13 @@ + + # Prevent multiple expansion + define([AC_PROG_LIBTOOL], []) +-]) ++])# _AC_PROG_LIBTOOL + ++ ++# AC_LIBTOOL_SETUP ++# ---------------- + AC_DEFUN([AC_LIBTOOL_SETUP], +-[AC_PREREQ(2.13)dnl ++[AC_PREREQ(2.50)dnl + AC_REQUIRE([AC_ENABLE_SHARED])dnl + AC_REQUIRE([AC_ENABLE_STATIC])dnl + AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +@@ -1160,340 +1247,229 @@ + AC_REQUIRE([AC_PROG_LD])dnl + AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl + AC_REQUIRE([AC_PROG_NM])dnl ++ + AC_REQUIRE([AC_PROG_LN_S])dnl + AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl ++# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + AC_REQUIRE([AC_OBJEXT])dnl + AC_REQUIRE([AC_EXEEXT])dnl + dnl + ++AC_LIBTOOL_SYS_MAX_CMD_LEN ++AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE ++AC_LIBTOOL_OBJDIR ++ ++AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + _LT_AC_PROG_ECHO_BACKSLASH +-# Only perform the check for file, if the check method requires it +-case $deplibs_check_method in +-file_magic*) +- if test "$file_magic_cmd" = '$MAGIC_CMD'; then +- AC_PATH_MAGIC ++ ++case $host_os in ++aix3*) ++ # AIX sometimes has problems with the GCC collect2 program. For some ++ # reason, if we set the COLLECT_NAMES environment variable, the problems ++ # vanish in a puff of smoke. ++ if test "X${COLLECT_NAMES+set}" != Xset; then ++ COLLECT_NAMES= ++ export COLLECT_NAMES + fi + ;; + esac + ++# Sed substitution that helps us do robust quoting. It backslashifies ++# metacharacters that are still active within double-quoted strings. ++Xsed='sed -e s/^X//' ++[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] ++ ++# Same as above, but do not quote variable references. ++[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] ++ ++# Sed substitution to delay expansion of an escaped shell variable in a ++# double_quote_subst'ed string. ++delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' ++ ++# Sed substitution to avoid accidental globbing in evaled expressions ++no_glob_subst='s/\*/\\\*/g' ++ ++# Constants: ++rm="rm -f" ++ ++# Global variables: ++default_ofile=libtool ++can_build_shared=yes ++ ++# All known linkers require a `.a' archive for static linking (except M$VC, ++# which needs '.lib'). ++libext=a ++ltmain="$ac_aux_dir/ltmain.sh" ++ofile="$default_ofile" ++with_gnu_ld="$lt_cv_prog_gnu_ld" ++ ++AC_CHECK_TOOL(AR, ar, false) + AC_CHECK_TOOL(RANLIB, ranlib, :) + AC_CHECK_TOOL(STRIP, strip, :) + +-ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +-ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +-enable_win32_dll=yes, enable_win32_dll=no) ++old_CC="$CC" ++old_CFLAGS="$CFLAGS" + +-AC_ARG_ENABLE(libtool-lock, +- [ --disable-libtool-lock avoid locking (might break parallel builds)]) +-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes ++# Set sane defaults for various variables ++test -z "$AR" && AR=ar ++test -z "$AR_FLAGS" && AR_FLAGS=cru ++test -z "$AS" && AS=as ++test -z "$CC" && CC=cc ++test -z "$LTCC" && LTCC=$CC ++test -z "$DLLTOOL" && DLLTOOL=dlltool ++test -z "$LD" && LD=ld ++test -z "$LN_S" && LN_S="ln -s" ++test -z "$MAGIC_CMD" && MAGIC_CMD=file ++test -z "$NM" && NM=nm ++test -z "$SED" && SED=sed ++test -z "$OBJDUMP" && OBJDUMP=objdump ++test -z "$RANLIB" && RANLIB=: ++test -z "$STRIP" && STRIP=: ++test -z "$ac_objext" && ac_objext=o + +-# Some flags need to be propagated to the compiler or linker for good +-# libtool support. +-case $host in +-*-*-irix6*) +- # Find out which ABI we are using. +- echo '[#]line __oline__ "configure"' > conftest.$ac_ext +- if AC_TRY_EVAL(ac_compile); then +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -32" +- ;; +- *N32*) +- LD="${LD-ld} -n32" +- ;; +- *64-bit*) +- LD="${LD-ld} -64" +- ;; +- esac +- fi +- rm -rf conftest* +- ;; ++# Determine commands to create old-style static archives. ++old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' ++old_postinstall_cmds='chmod 644 $oldlib' ++old_postuninstall_cmds= + +-*-*-sco3.2v5*) +- # On SCO OpenServer 5, we need -belf to get full-featured binaries. +- SAVE_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -belf" +- AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, +- [AC_LANG_SAVE +- AC_LANG_C +- AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) +- AC_LANG_RESTORE]) +- if test x"$lt_cv_cc_needs_belf" != x"yes"; then +- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf +- CFLAGS="$SAVE_CFLAGS" +- fi +- ;; ++if test -n "$RANLIB"; then ++ case $host_os in ++ openbsd*) ++ old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ++ ;; ++ *) ++ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ++ ;; ++ esac ++ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" ++fi + +-ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +-[*-*-cygwin* | *-*-mingw* | *-*-pw32*) +- AC_CHECK_TOOL(DLLTOOL, dlltool, false) +- AC_CHECK_TOOL(AS, as, false) +- AC_CHECK_TOOL(OBJDUMP, objdump, false) ++cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +- # recent cygwin and mingw systems supply a stub DllMain which the user +- # can override, but on older systems we have to supply one +- AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, +- [AC_TRY_LINK([], +- [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); +- DllMain (0, 0, 0);], +- [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) +- +- case $host/$CC in +- *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) +- # old mingw systems require "-dll" to link a DLL, while more recent ones +- # require "-mdll" +- SAVE_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -mdll" +- AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, +- [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) +- CFLAGS="$SAVE_CFLAGS" ;; +- *-*-cygwin* | *-*-pw32*) +- # cygwin systems need to pass --dll to the linker, and not link +- # crt.o which will require a WinMain@16 definition. +- lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; +- esac ++# Only perform the check for file, if the check method requires it ++case $deplibs_check_method in ++file_magic*) ++ if test "$file_magic_cmd" = '$MAGIC_CMD'; then ++ AC_PATH_MAGIC ++ fi + ;; +- ]) + esac + +-_LT_AC_LTCONFIG_HACK +- +-]) ++AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) ++AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], ++enable_win32_dll=yes, enable_win32_dll=no) + +-# AC_LIBTOOL_HEADER_ASSERT +-# ------------------------ +-AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT], +-[AC_CACHE_CHECK([whether $CC supports assert without backlinking], +- [lt_cv_func_assert_works], +- [case $host in +- *-*-solaris*) +- if test "$GCC" = yes && test "$with_gnu_ld" != yes; then +- case `$CC --version 2>/dev/null` in +- [[12]].*) lt_cv_func_assert_works=no ;; +- *) lt_cv_func_assert_works=yes ;; +- esac +- fi +- ;; +- esac]) ++AC_ARG_ENABLE([libtool-lock], ++ [AC_HELP_STRING([--disable-libtool-lock], ++ [avoid locking (might break parallel builds)])]) ++test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +-if test "x$lt_cv_func_assert_works" = xyes; then +- AC_CHECK_HEADERS(assert.h) +-fi +-])# AC_LIBTOOL_HEADER_ASSERT ++AC_ARG_WITH([pic], ++ [AC_HELP_STRING([--with-pic], ++ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], ++ [pic_mode="$withval"], ++ [pic_mode=default]) ++test -z "$pic_mode" && pic_mode=default + +-# _LT_AC_CHECK_DLFCN +-# -------------------- +-AC_DEFUN([_LT_AC_CHECK_DLFCN], +-[AC_CHECK_HEADERS(dlfcn.h) +-])# _LT_AC_CHECK_DLFCN ++# Check if we have a version mismatch between libtool.m4 and ltmain.sh. ++# ++# Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. ++# We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually ++# calls AC_LIBTOOL_CONFIG and creates libtool. ++# ++_LT_VERSION_CHECK + +-# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +-# --------------------------------- +-AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +-[AC_REQUIRE([AC_CANONICAL_HOST]) +-AC_REQUIRE([AC_PROG_NM]) +-AC_REQUIRE([AC_OBJEXT]) +-# Check for command to grab the raw symbol name followed by C symbol from nm. +-AC_MSG_CHECKING([command to parse $NM output]) +-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl ++# Use C for the default configuration in the libtool script ++tagname= ++AC_LIBTOOL_LANG_C_CONFIG ++_LT_AC_TAGCONFIG ++])# AC_LIBTOOL_SETUP + +-# These are sane defaults that work on at least a few old systems. +-# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +-# Character class describing NM global symbol codes. +-symcode='[[BCDEGRST]]' ++# _LT_VERSION_CHECK ++# ----------------- ++AC_DEFUN([_LT_VERSION_CHECK], ++[AC_MSG_CHECKING([for correct ltmain.sh version]) ++if test -z "$ltmain"; then ++ AC_MSG_RESULT(no) ++ echo ++ echo "*** [Gentoo] sanity check failed! ***" ++ echo "*** \$ltmain is not defined, please check the patch for consistency! ***" ++ echo ++ exit 1 ++fi ++gentoo_lt_version="1.5.10" ++gentoo_ltmain_version=`grep '^[[:space:]]*VERSION=' $ltmain | sed -e 's|^[[:space:]]*VERSION=||'` ++if test "$gentoo_lt_version" != "$gentoo_ltmain_version"; then ++ AC_MSG_RESULT(no) ++ echo ++ echo "*** [Gentoo] sanity check failed! ***" ++ echo "*** libtool.m4 and ltmain.sh have a version mismatch! ***" ++ echo "*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) ***" ++ echo ++ echo "Please run:" ++ echo ++ echo " libtoolize --copy --force" ++ echo ++ echo "if appropriate, please contact the maintainer of this" ++ echo "package (or your distribution) for help." ++ echo ++ exit 1 ++else ++ AC_MSG_RESULT(yes) ++fi ++])# _LT_VERSION_CHECK + +-# Regexp to match symbols that can be accessed directly from C. +-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +-# Transform the above into a raw symbol and a C symbol. +-symxfrm='\1 \2\3 \3' ++# _LT_AC_SYS_COMPILER ++# ------------------- ++AC_DEFUN([_LT_AC_SYS_COMPILER], ++[AC_REQUIRE([AC_PROG_CC])dnl + +-# Transform an extracted symbol line into a proper C declaration +-lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" ++# If no C compiler was specified, use CC. ++LTCC=${LTCC-"$CC"} + +-# Transform an extracted symbol line into symbol name and symbol address +-lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++# Allow CC to be a program name with arguments. ++compiler=$CC ++])# _LT_AC_SYS_COMPILER + +-# Define system-specific variables. +-case $host_os in +-aix*) +- symcode='[[BCDT]]' +- ;; +-cygwin* | mingw* | pw32*) +- symcode='[[ABCDGISTW]]' +- ;; +-hpux*) # Its linker distinguishes data from code symbols +- lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +- lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" +- ;; +-irix*) +- symcode='[[BCDEGRST]]' +- ;; +-solaris* | sysv5*) +- symcode='[[BDT]]' +- ;; +-sysv4) +- symcode='[[DFNSTU]]' +- ;; +-esac + +-# Handle CRLF in mingw tool chain +-opt_cr= +-case $host_os in +-mingw*) +- opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp +- ;; +-esac ++# _LT_AC_SYS_LIBPATH_AIX ++# ---------------------- ++# Links a minimal program and checks the executable ++# for the system default hardcoded library path. In most cases, ++# this is /usr/lib:/lib, but when the MPI compilers are used ++# the location of the communication and MPI libs are included too. ++# If we don't find anything, use the default library path according ++# to the aix ld manual. ++AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], ++[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi],[]) ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++])# _LT_AC_SYS_LIBPATH_AIX + +-# If we're using GNU nm, then use its standard symbol codes. +-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then +- symcode='[[ABCDGISTW]]' +-fi + +-# Try without a prefix undercore, then with it. +-for ac_symprfx in "" "_"; do ++# _LT_AC_SHELL_INIT(ARG) ++# ---------------------- ++AC_DEFUN([_LT_AC_SHELL_INIT], ++[ifdef([AC_DIVERSION_NOTICE], ++ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], ++ [AC_DIVERT_PUSH(NOTICE)]) ++$1 ++AC_DIVERT_POP ++])# _LT_AC_SHELL_INIT + +- # Write the raw and C identifiers. +-lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" +- +- # Check to see that the pipe works correctly. +- pipe_works=no +- rm -f conftest* +- cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then +- # Try sorting and uniquifying the output. +- if sort "$nlist" | uniq > "$nlist"T; then +- mv -f "$nlist"T "$nlist" +- else +- rm -f "$nlist"T +- fi +- +- # Make sure that we snagged all the symbols we need. +- if egrep ' nm_test_var$' "$nlist" >/dev/null; then +- if egrep ' nm_test_func$' "$nlist" >/dev/null; then +- cat < conftest.$ac_ext +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-EOF +- # Now generate the symbol file. +- eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' +- +- cat <> conftest.$ac_ext +-#if defined (__STDC__) && __STDC__ +-# define lt_ptr void * +-#else +-# define lt_ptr char * +-# define const +-#endif +- +-/* The mapping between symbol names and symbols. */ +-const struct { +- const char *name; +- lt_ptr address; +-} +-lt_preloaded_symbols[[]] = +-{ +-EOF +- sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext +- cat <<\EOF >> conftest.$ac_ext +- {0, (lt_ptr) 0} +-}; +- +-#ifdef __cplusplus +-} +-#endif +-EOF +- # Now try linking the two files. +- mv conftest.$ac_objext conftstm.$ac_objext +- save_LIBS="$LIBS" +- save_CFLAGS="$CFLAGS" +- LIBS="conftstm.$ac_objext" +- CFLAGS="$CFLAGS$no_builtin_flag" +- if AC_TRY_EVAL(ac_link) && test -s conftest; then +- pipe_works=yes +- fi +- LIBS="$save_LIBS" +- CFLAGS="$save_CFLAGS" +- else +- echo "cannot find nm_test_func in $nlist" >&AC_FD_CC +- fi +- else +- echo "cannot find nm_test_var in $nlist" >&AC_FD_CC +- fi +- else +- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC +- fi +- else +- echo "$progname: failed program was:" >&AC_FD_CC +- cat conftest.$ac_ext >&5 +- fi +- rm -f conftest* conftst* +- +- # Do not use the global_symbol_pipe unless it works. +- if test "$pipe_works" = yes; then +- break +- else +- lt_cv_sys_global_symbol_pipe= +- fi +-done +-]) +-global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +-if test -z "$lt_cv_sys_global_symbol_pipe"; then +- global_symbol_to_cdecl= +- global_symbol_to_c_name_address= +-else +- global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" +- global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +-fi +-if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +-then +- AC_MSG_RESULT(failed) +-else +- AC_MSG_RESULT(ok) +-fi +-]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +- +-# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR +-# --------------------------------- +-AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR], +-[# Find the correct PATH separator. Usually this is `:', but +-# DJGPP uses `;' like DOS. +-if test "X${PATH_SEPARATOR+set}" != Xset; then +- UNAME=${UNAME-`uname 2>/dev/null`} +- case X$UNAME in +- *-DOS) lt_cv_sys_path_separator=';' ;; +- *) lt_cv_sys_path_separator=':' ;; +- esac +- PATH_SEPARATOR=$lt_cv_sys_path_separator +-fi +-])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + + # _LT_AC_PROG_ECHO_BACKSLASH + # -------------------------- + # Add some code to the start of the generated configure script which + # will find an echo command which doesn't interpret backslashes. + AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +-[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], +- [AC_DIVERT_PUSH(NOTICE)]) +-_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR +- ++[_LT_AC_SHELL_INIT([ + # Check that we are running under the correct shell. + SHELL=${CONFIG_SHELL-/bin/sh} + +@@ -1511,7 +1487,7 @@ + elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then ++elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : + else +@@ -1523,14 +1499,14 @@ + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + + if test -z "$ECHO"; then + if test "X${echo_test_string+set}" != Xset; then +@@ -1557,8 +1533,9 @@ + # + # So, first we look for a working echo in the user's PATH. + +- IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do ++ IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && +@@ -1567,7 +1544,7 @@ + break + fi + done +- IFS="$save_ifs" ++ IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. +@@ -1640,17 +1617,326 @@ + fi + + AC_SUBST(ECHO) +-AC_DIVERT_POP +-])# _LT_AC_PROG_ECHO_BACKSLASH ++])])# _LT_AC_PROG_ECHO_BACKSLASH ++ ++ ++# _LT_AC_LOCK ++# ----------- ++AC_DEFUN([_LT_AC_LOCK], ++[AC_ARG_ENABLE([libtool-lock], ++ [AC_HELP_STRING([--disable-libtool-lock], ++ [avoid locking (might break parallel builds)])]) ++test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes ++ ++# Some flags need to be propagated to the compiler or linker for good ++# libtool support. ++case $host in ++ia64-*-hpux*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if AC_TRY_EVAL(ac_compile); then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *ELF-32*) ++ HPUX_IA64_MODE="32" ++ ;; ++ *ELF-64*) ++ HPUX_IA64_MODE="64" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++*-*-irix6*) ++ # Find out which ABI we are using. ++ echo '[#]line __oline__ "configure"' > conftest.$ac_ext ++ if AC_TRY_EVAL(ac_compile); then ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *32-bit*) ++ LD="${LD-ld} -melf32bsmip" ++ ;; ++ *N32*) ++ LD="${LD-ld} -melf32bmipn32" ++ ;; ++ *64-bit*) ++ LD="${LD-ld} -melf64bmip" ++ ;; ++ esac ++ else ++ case `/usr/bin/file conftest.$ac_objext` in ++ *32-bit*) ++ LD="${LD-ld} -32" ++ ;; ++ *N32*) ++ LD="${LD-ld} -n32" ++ ;; ++ *64-bit*) ++ LD="${LD-ld} -64" ++ ;; ++ esac ++ fi ++ fi ++ rm -rf conftest* ++ ;; ++ ++x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if AC_TRY_EVAL(ac_compile); then ++ case "`/usr/bin/file conftest.o`" in ++ *32-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_i386" ++ ;; ++ ppc64-*linux*|powerpc64-*linux*) ++ LD="${LD-ld} -m elf32ppclinux" ++ ;; ++ s390x-*linux*) ++ LD="${LD-ld} -m elf_s390" ++ ;; ++ sparc64-*linux*) ++ LD="${LD-ld} -m elf32_sparc" ++ ;; ++ esac ++ ;; ++ *64-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_x86_64" ++ ;; ++ ppc*-*linux*|powerpc*-*linux*) ++ LD="${LD-ld} -m elf64ppc" ++ ;; ++ s390*-*linux*) ++ LD="${LD-ld} -m elf64_s390" ++ ;; ++ sparc*-*linux*) ++ LD="${LD-ld} -m elf64_sparc" ++ ;; ++ esac ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ ++*-*-linux*) ++ # Test if the compiler is 64bit ++ echo 'int i;' > conftest.$ac_ext ++ lt_cv_cc_64bit_output=no ++ if AC_TRY_EVAL(ac_compile); then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *"ELF 64"*) ++ lt_cv_cc_64bit_output=yes ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ ++*-*-sco3.2v5*) ++ # On SCO OpenServer 5, we need -belf to get full-featured binaries. ++ SAVE_CFLAGS="$CFLAGS" ++ CFLAGS="$CFLAGS -belf" ++ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, ++ [AC_LANG_PUSH(C) ++ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) ++ AC_LANG_POP]) ++ if test x"$lt_cv_cc_needs_belf" != x"yes"; then ++ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf ++ CFLAGS="$SAVE_CFLAGS" ++ fi ++ ;; ++AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], ++[*-*-cygwin* | *-*-mingw* | *-*-pw32*) ++ AC_CHECK_TOOL(DLLTOOL, dlltool, false) ++ AC_CHECK_TOOL(AS, as, false) ++ AC_CHECK_TOOL(OBJDUMP, objdump, false) ++ ;; ++ ]) ++esac ++ ++need_locks="$enable_libtool_lock" ++ ++])# _LT_AC_LOCK ++ ++ ++# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, ++# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) ++# ---------------------------------------------------------------- ++# Check whether the given compiler option works ++AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], ++[AC_REQUIRE([LT_AC_PROG_SED]) ++AC_CACHE_CHECK([$1], [$2], ++ [$2=no ++ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ lt_compiler_flag="$3" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ # The option is referenced via a variable to avoid confusing sed. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) ++ (eval "$lt_compile" 2>conftest.err) ++ ac_status=$? ++ cat conftest.err >&AS_MESSAGE_LOG_FD ++ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD ++ if (exit $ac_status) && test -s "$ac_outfile"; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s conftest.err; then ++ $2=yes ++ fi ++ fi ++ $rm conftest* ++]) ++ ++if test x"[$]$2" = xyes; then ++ ifelse([$5], , :, [$5]) ++else ++ ifelse([$6], , :, [$6]) ++fi ++])# AC_LIBTOOL_COMPILER_OPTION ++ ++ ++# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, ++# [ACTION-SUCCESS], [ACTION-FAILURE]) ++# ------------------------------------------------------------ ++# Check whether the given compiler option works ++AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], ++[AC_CACHE_CHECK([$1], [$2], ++ [$2=no ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS $3" ++ printf "$lt_simple_link_test_code" > conftest.$ac_ext ++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test -s conftest.err; then ++ # Append any errors to the config.log. ++ cat conftest.err 1>&AS_MESSAGE_LOG_FD ++ else ++ $2=yes ++ fi ++ fi ++ $rm conftest* ++ LDFLAGS="$save_LDFLAGS" ++]) ++ ++if test x"[$]$2" = xyes; then ++ ifelse([$4], , :, [$4]) ++else ++ ifelse([$5], , :, [$5]) ++fi ++])# AC_LIBTOOL_LINKER_OPTION ++ ++ ++# AC_LIBTOOL_SYS_MAX_CMD_LEN ++# -------------------------- ++AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], ++[# find the maximum length of command line arguments ++AC_MSG_CHECKING([the maximum length of command line arguments]) ++AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl ++ i=0 ++ teststring="ABCD" ++ ++ case $build_os in ++ msdosdjgpp*) ++ # On DJGPP, this test can blow up pretty badly due to problems in libc ++ # (any single argument exceeding 2000 bytes causes a buffer overrun ++ # during glob expansion). Even if it were fixed, the result of this ++ # check would be larger than it should be. ++ lt_cv_sys_max_cmd_len=12288; # 12K is about right ++ ;; ++ ++ gnu*) ++ # Under GNU Hurd, this test is not required because there is ++ # no limit to the length of command line arguments. ++ # Libtool will interpret -1 as no limit whatsoever ++ lt_cv_sys_max_cmd_len=-1; ++ ;; ++ ++ cygwin* | mingw*) ++ # On Win9x/ME, this test blows up -- it succeeds, but takes ++ # about 5 minutes as the teststring grows exponentially. ++ # Worse, since 9x/ME are not pre-emptively multitasking, ++ # you end up with a "frozen" computer, even though with patience ++ # the test eventually succeeds (with a max line length of 256k). ++ # Instead, let's just punt: use the minimum linelength reported by ++ # all of the supported platforms: 8192 (on NT/2K/XP). ++ lt_cv_sys_max_cmd_len=8192; ++ ;; ++ ++ amigaos*) ++ # On AmigaOS with pdksh, this test takes hours, literally. ++ # So we just punt and use a minimum line length of 8192. ++ lt_cv_sys_max_cmd_len=8192; ++ ;; ++ ++ netbsd* | freebsd* | openbsd* | darwin* ) ++ # This has been around since 386BSD, at least. Likely further. ++ if test -x /sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` ++ elif test -x /usr/sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` ++ else ++ lt_cv_sys_max_cmd_len=65536 # usable default for *BSD ++ fi ++ # And add a safety zone ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ++ ;; ++ ++ *) ++ # If test is not a shell built-in, we'll probably end up computing a ++ # maximum length that is only half of the actual maximum length, but ++ # we can't tell. ++ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} ++ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ ++ = "XX$teststring") >/dev/null 2>&1 && ++ new_result=`expr "X$teststring" : ".*" 2>&1` && ++ lt_cv_sys_max_cmd_len=$new_result && ++ test $i != 17 # 1/2 MB should be enough ++ do ++ i=`expr $i + 1` ++ teststring=$teststring$teststring ++ done ++ teststring= ++ # Add a significant safety factor because C++ compilers can tack on massive ++ # amounts of additional arguments before passing them to the linker. ++ # It appears as though 1/2 is a usable value. ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ++ ;; ++ esac ++]) ++if test -n $lt_cv_sys_max_cmd_len ; then ++ AC_MSG_RESULT($lt_cv_sys_max_cmd_len) ++else ++ AC_MSG_RESULT(none) ++fi ++])# AC_LIBTOOL_SYS_MAX_CMD_LEN ++ ++ ++# _LT_AC_CHECK_DLFCN ++# -------------------- ++AC_DEFUN([_LT_AC_CHECK_DLFCN], ++[AC_CHECK_HEADERS(dlfcn.h)dnl ++])# _LT_AC_CHECK_DLFCN ++ + + # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, + # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) + # ------------------------------------------------------------------ + AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +-[if test "$cross_compiling" = yes; then : ++[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl ++if test "$cross_compiling" = yes; then : + [$4] + else +- AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext </dev/null ++ mkdir conftest ++ cd conftest ++ mkdir out ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ lt_compiler_flag="-o out/conftest2.$ac_objext" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) ++ (eval "$lt_compile" 2>out/conftest.err) ++ ac_status=$? ++ cat out/conftest.err >&AS_MESSAGE_LOG_FD ++ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD ++ if (exit $ac_status) && test -s out/conftest2.$ac_objext ++ then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s out/conftest.err; then ++ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes ++ fi ++ fi ++ chmod u+w . ++ $rm conftest* ++ # SGI C++ compiler will create directory out/ii_files/ for ++ # template instantiation ++ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files ++ $rm out/* && rmdir out ++ cd .. ++ rmdir conftest ++ $rm conftest* ++]) ++])# AC_LIBTOOL_PROG_CC_C_O + +-# All known linkers require a `.a' archive for static linking (except M$VC, +-# which needs '.lib'). +-libext=a +-ltmain="$ac_aux_dir/ltmain.sh" +-ofile="$default_ofile" +-with_gnu_ld="$lt_cv_prog_gnu_ld" +-need_locks="$enable_libtool_lock" + +-old_CC="$CC" +-old_CFLAGS="$CFLAGS" ++# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) ++# ----------------------------------------- ++# Check to see if we can do hard links to lock some files if needed ++AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], ++[AC_REQUIRE([_LT_AC_LOCK])dnl ++ ++hard_links="nottested" ++if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then ++ # do not overwrite the value of need_locks provided by the user ++ AC_MSG_CHECKING([if we can lock with hard links]) ++ hard_links=yes ++ $rm conftest* ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ touch conftest.a ++ ln conftest.a conftest.b 2>&5 || hard_links=no ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ AC_MSG_RESULT([$hard_links]) ++ if test "$hard_links" = no; then ++ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) ++ need_locks=warn ++ fi ++else ++ need_locks=no ++fi ++])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + +-# Set sane defaults for various variables +-test -z "$AR" && AR=ar +-test -z "$AR_FLAGS" && AR_FLAGS=cru +-test -z "$AS" && AS=as +-test -z "$CC" && CC=cc +-test -z "$DLLTOOL" && DLLTOOL=dlltool +-test -z "$LD" && LD=ld +-test -z "$LN_S" && LN_S="ln -s" +-test -z "$MAGIC_CMD" && MAGIC_CMD=file +-test -z "$NM" && NM=nm +-test -z "$OBJDUMP" && OBJDUMP=objdump +-test -z "$RANLIB" && RANLIB=: +-test -z "$STRIP" && STRIP=: +-test -z "$ac_objext" && ac_objext=o + +-if test x"$host" != x"$build"; then +- ac_tool_prefix=${host_alias}- ++# AC_LIBTOOL_OBJDIR ++# ----------------- ++AC_DEFUN([AC_LIBTOOL_OBJDIR], ++[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], ++[rm -f .libs 2>/dev/null ++mkdir .libs 2>/dev/null ++if test -d .libs; then ++ lt_cv_objdir=.libs + else +- ac_tool_prefix= ++ # MS-DOS does not allow filenames that begin with a dot. ++ lt_cv_objdir=_libs + fi ++rmdir .libs 2>/dev/null]) ++objdir=$lt_cv_objdir ++])# AC_LIBTOOL_OBJDIR + +-# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +-case $host_os in +-linux-gnu*) ;; +-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +-esac + +-case $host_os in +-aix3*) +- # AIX sometimes has problems with the GCC collect2 program. For some +- # reason, if we set the COLLECT_NAMES environment variable, the problems +- # vanish in a puff of smoke. +- if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES ++# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) ++# ---------------------------------------------- ++# Check hardcoding attributes. ++AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], ++[AC_MSG_CHECKING([how to hardcode library paths into programs]) ++_LT_AC_TAGVAR(hardcode_action, $1)= ++if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ ++ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ ++ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then ++ ++ # We can hardcode non-existant directories. ++ if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && ++ # If the only mechanism to avoid hardcoding is shlibpath_var, we ++ # have to relink, otherwise we might link with an installed library ++ # when we should be linking with a yet-to-be-installed one ++ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && ++ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then ++ # Linking always hardcodes the temporary library directory. ++ _LT_AC_TAGVAR(hardcode_action, $1)=relink ++ else ++ # We can link without hardcoding, and we can hardcode nonexisting dirs. ++ _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +- ;; +-esac ++else ++ # We cannot hardcode anything, or else we can only hardcode existing ++ # directories. ++ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported ++fi ++AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +-# Determine commands to create old-style static archives. +-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +-old_postinstall_cmds='chmod 644 $oldlib' +-old_postuninstall_cmds= ++if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then ++ # Fast installation is not supported ++ enable_fast_install=no ++elif test "$shlibpath_overrides_runpath" = yes || ++ test "$enable_shared" = no; then ++ # Fast installation is not necessary ++ enable_fast_install=needless ++fi ++])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + +-if test -n "$RANLIB"; then ++ ++# AC_LIBTOOL_SYS_LIB_STRIP ++# ------------------------ ++AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], ++[striplib= ++old_striplib= ++AC_MSG_CHECKING([whether stripping libraries is possible]) ++if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then ++ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" ++ test -z "$striplib" && striplib="$STRIP --strip-unneeded" ++ AC_MSG_RESULT([yes]) ++else ++# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in +- openbsd*) +- old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" +- ;; +- *) +- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ++ darwin*) ++ if test -n "$STRIP" ; then ++ striplib="$STRIP -x" ++ AC_MSG_RESULT([yes]) ++ else ++ AC_MSG_RESULT([no]) ++fi ++ ;; ++ *) ++ AC_MSG_RESULT([no]) + ;; + esac +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + fi ++])# AC_LIBTOOL_SYS_LIB_STRIP + +-# Allow CC to be a program name with arguments. +-set dummy $CC +-compiler="[$]2" + +-AC_MSG_CHECKING([for objdir]) +-rm -f .libs 2>/dev/null +-mkdir .libs 2>/dev/null +-if test -d .libs; then +- objdir=.libs ++# AC_LIBTOOL_SYS_DYNAMIC_LINKER ++# ----------------------------- ++# PORTME Fill in your ld.so characteristics ++AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], ++[AC_MSG_CHECKING([dynamic linker characteristics]) ++library_names_spec= ++libname_spec='lib$name' ++soname_spec= ++shrext_cmds=".so" ++postinstall_cmds= ++postuninstall_cmds= ++finish_cmds= ++finish_eval= ++shlibpath_var= ++shlibpath_overrides_runpath=unknown ++version_type=none ++dynamic_linker="$host_os ld.so" ++sys_lib_dlsearch_path_spec="/lib /usr/lib" ++if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then ++ # if the path contains ";" then we assume it to be the separator ++ # otherwise default to the standard path separator (i.e. ":") - it is ++ # assumed that no part of a normal pathname contains ";" but that should ++ # okay in the real world where ";" in dirpaths is itself problematic. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi + else +- # MS-DOS does not allow filenames that begin with a dot. +- objdir=_libs ++ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + fi +-rmdir .libs 2>/dev/null +-AC_MSG_RESULT($objdir) +- ++need_lib_prefix=unknown ++hardcode_into_libs=no + +-AC_ARG_WITH(pic, +-[ --with-pic try to use only PIC/non-PIC objects [default=use both]], +-pic_mode="$withval", pic_mode=default) +-test -z "$pic_mode" && pic_mode=default ++# when you set need_version to no, make sure it does not cause -set_version ++# flags to be left without arguments ++need_version=unknown + +-# We assume here that the value for lt_cv_prog_cc_pic will not be cached +-# in isolation, and that seeing it set (from the cache) indicates that +-# the associated values are set (in the cache) correctly too. +-AC_MSG_CHECKING([for $compiler option to produce PIC]) +-AC_CACHE_VAL(lt_cv_prog_cc_pic, +-[ lt_cv_prog_cc_pic= +- lt_cv_prog_cc_shlib= +- lt_cv_prog_cc_wl= +- lt_cv_prog_cc_static= +- lt_cv_prog_cc_no_builtin= +- lt_cv_prog_cc_can_build_shared=$can_build_shared ++case $host_os in ++aix3*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' ++ shlibpath_var=LIBPATH + +- if test "$GCC" = yes; then +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static='-static' ++ # AIX 3 has no versioning support, so we append a major version to the name. ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; + +- case $host_os in +- aix*) +- # Below there is a dirty hack to force normal static linking with -ldl +- # The problem is because libdl dynamically linked with both libc and +- # libC (AIX C++ library), which obviously doesn't included in libraries +- # list by gcc. This cause undefined symbols with -static flags. +- # This hack allows C programs to be linked with "-static -ldl", but +- # not sure about C++ programs. +- lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" +- ;; +- amigaos*) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' +- ;; +- beos* | irix5* | irix6* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- darwin* | rhapsody*) +- # PIC is the default on this platform +- # Common symbols not allowed in MH_DYLIB files +- lt_cv_prog_cc_pic='-fno-common' +- ;; +- cygwin* | mingw* | pw32* | os2*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_cv_prog_cc_pic='-DDLL_EXPORT' +- ;; +- sysv4*MP*) +- if test -d /usr/nec; then +- lt_cv_prog_cc_pic=-Kconform_pic +- fi +- ;; +- *) +- lt_cv_prog_cc_pic='-fPIC' +- ;; +- esac ++aix4* | aix5*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ hardcode_into_libs=yes ++ if test "$host_cpu" = ia64; then ++ # AIX 5 supports IA64 ++ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH + else +- # PORTME Check for PIC flags for the system compiler. ++ # With GCC up to 2.95.x, collect2 would create an import file ++ # for dependence libraries. The import file would start with ++ # the line `#! .'. This would cause the generated library to ++ # depend on `.', always an invalid library. This was fixed in ++ # development snapshots of GCC prior to 3.0. + case $host_os in +- aix3* | aix4* | aix5*) +- lt_cv_prog_cc_wl='-Wl,' +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_cv_prog_cc_static='-Bstatic' ++ aix4 | aix4.[[01]] | aix4.[[01]].*) ++ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' ++ echo ' yes ' ++ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then ++ : + else +- lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' ++ can_build_shared=no + fi + ;; ++ esac ++ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct ++ # soname into executable. Probably we can add versioning support to ++ # collect2, so additional links can be useful in future. ++ if test "$aix_use_runtimelinking" = yes; then ++ # If using run time linking (on AIX 4.2 or later) use lib.so ++ # instead of lib.a to let people know that these are not ++ # typical AIX shared libraries. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ else ++ # We preserve .a as extension for shared libraries through AIX4.2 ++ # and later when we are not doing run time linking. ++ library_names_spec='${libname}${release}.a $libname.a' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ fi ++ shlibpath_var=LIBPATH ++ fi ++ ;; + +- hpux9* | hpux10* | hpux11*) +- # Is there a better lt_cv_prog_cc_static that works with the bundled CC? +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" +- lt_cv_prog_cc_pic='+Z' +- ;; +- +- irix5* | irix6*) +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static='-non_shared' +- # PIC (with -KPIC) is the default. +- ;; +- +- cygwin* | mingw* | pw32* | os2*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_cv_prog_cc_pic='-DDLL_EXPORT' +- ;; ++amigaos*) ++ library_names_spec='$libname.ixlibrary $libname.a' ++ # Create ${libname}_ixlibrary.a entries in /sys/libs. ++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ++ ;; + +- newsos6) +- lt_cv_prog_cc_pic='-KPIC' +- lt_cv_prog_cc_static='-Bstatic' +- ;; ++beos*) ++ library_names_spec='${libname}${shared_ext}' ++ dynamic_linker="$host_os ld.so" ++ shlibpath_var=LIBRARY_PATH ++ ;; + +- osf3* | osf4* | osf5*) +- # All OSF/1 code is PIC. +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static='-non_shared' +- ;; ++bsdi[[45]]*) ++ version_type=linux ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" ++ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" ++ # the default ld.so.conf also contains /usr/contrib/lib and ++ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow ++ # libtool to hard-code these into programs ++ ;; + +- sco3.2v5*) +- lt_cv_prog_cc_pic='-Kpic' +- lt_cv_prog_cc_static='-dn' +- lt_cv_prog_cc_shlib='-belf' +- ;; ++cygwin* | mingw* | pw32*) ++ version_type=windows ++ shrext_cmds=".dll" ++ need_version=no ++ need_lib_prefix=no + +- solaris*) +- lt_cv_prog_cc_pic='-KPIC' +- lt_cv_prog_cc_static='-Bstatic' +- lt_cv_prog_cc_wl='-Wl,' +- ;; ++ case $GCC,$host_os in ++ yes,cygwin* | yes,mingw* | yes,pw32*) ++ library_names_spec='$libname.dll.a' ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ ++ dldir=$destdir/`dirname \$dlpath`~ ++ test -d \$dldir || mkdir -p \$dldir~ ++ $install_prog $dir/$dlname \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ dlpath=$dir/\$dldll~ ++ $rm \$dlpath' ++ shlibpath_overrides_runpath=yes + +- sunos4*) +- lt_cv_prog_cc_pic='-PIC' +- lt_cv_prog_cc_static='-Bstatic' +- lt_cv_prog_cc_wl='-Qoption ld ' ++ case $host_os in ++ cygwin*) ++ # Cygwin DLLs use 'cyg' prefix rather than 'lib' ++ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; +- +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- lt_cv_prog_cc_pic='-KPIC' +- lt_cv_prog_cc_static='-Bstatic' +- if test "x$host_vendor" = xsni; then +- lt_cv_prog_cc_wl='-LD' ++ mingw*) ++ # MinGW DLLs use traditional 'lib' prefix ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then ++ # It is most probably a Windows format PATH printed by ++ # mingw gcc, but we are running on Cygwin. Gcc prints its search ++ # path with ; separators, and with drive letters. We can handle the ++ # drive letters (cygwin fileutils understands them), so leave them, ++ # especially as we might pass files found there to a mingw objdump, ++ # which wouldn't understand a cygwinified path. Ahh. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else +- lt_cv_prog_cc_wl='-Wl,' +- fi +- ;; +- +- uts4*) +- lt_cv_prog_cc_pic='-pic' +- lt_cv_prog_cc_static='-Bstatic' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec ;then +- lt_cv_prog_cc_pic='-Kconform_pic' +- lt_cv_prog_cc_static='-Bstatic' ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; +- +- *) +- lt_cv_prog_cc_can_build_shared=no ++ pw32*) ++ # pw32 DLLs use 'pw' prefix rather than 'lib' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac +- fi +-]) +-if test -z "$lt_cv_prog_cc_pic"; then +- AC_MSG_RESULT([none]) +-else +- AC_MSG_RESULT([$lt_cv_prog_cc_pic]) ++ ;; + +- # Check to make sure the pic_flag actually works. +- AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works]) +- AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" +- AC_TRY_COMPILE([], [], [dnl +- case $host_os in +- hpux9* | hpux10* | hpux11*) +- # On HP-UX, both CC and GCC only warn that PIC is supported... then +- # they create non-PIC objects. So, if there were any warnings, we +- # assume that PIC is not supported. +- if test -s conftest.err; then +- lt_cv_prog_cc_pic_works=no +- else +- lt_cv_prog_cc_pic_works=yes +- fi +- ;; +- *) +- lt_cv_prog_cc_pic_works=yes +- ;; ++ linux*) ++ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; + esac +- ], [dnl +- lt_cv_prog_cc_pic_works=no +- ]) +- CFLAGS="$save_CFLAGS" +- ]) +- +- if test "X$lt_cv_prog_cc_pic_works" = Xno; then +- lt_cv_prog_cc_pic= +- lt_cv_prog_cc_can_build_shared=no +- else +- lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" +- fi +- +- AC_MSG_RESULT([$lt_cv_prog_cc_pic_works]) +-fi +- +-# Check for any special shared library compilation flags. +-if test -n "$lt_cv_prog_cc_shlib"; then +- AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries]) +- if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then : +- else +- AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure]) +- lt_cv_prog_cc_can_build_shared=no +- fi +-fi +- +-AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works]) +-AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl +- lt_cv_prog_cc_static_works=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" +- AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes]) +- LDFLAGS="$save_LDFLAGS" +-]) +- +-# Belt *and* braces to stop my trousers falling down: +-test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +-AC_MSG_RESULT([$lt_cv_prog_cc_static_works]) +- +-pic_flag="$lt_cv_prog_cc_pic" +-special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +-wl="$lt_cv_prog_cc_wl" +-link_static_flag="$lt_cv_prog_cc_static" +-no_builtin_flag="$lt_cv_prog_cc_no_builtin" +-can_build_shared="$lt_cv_prog_cc_can_build_shared" +- +- +-# Check to see if options -o and -c are simultaneously supported by compiler +-AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext]) +-AC_CACHE_VAL([lt_cv_compiler_c_o], [ +-$rm -r conftest 2>/dev/null +-mkdir conftest +-cd conftest +-echo "int some_variable = 0;" > conftest.$ac_ext +-mkdir out +-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +-# that will create temporary files in the current directory regardless of +-# the output directory. Thus, making CWD read-only will cause this test +-# to fail, enabling locking or at least warning the user not to do parallel +-# builds. +-chmod -w . +-save_CFLAGS="$CFLAGS" +-CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +-compiler_c_o=no +-if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s out/conftest.err; then +- lt_cv_compiler_c_o=no +- else +- lt_cv_compiler_c_o=yes +- fi +-else +- # Append any errors to the config.log. +- cat out/conftest.err 1>&AC_FD_CC +- lt_cv_compiler_c_o=no +-fi +-CFLAGS="$save_CFLAGS" +-chmod u+w . +-$rm conftest* out/* +-rmdir out +-cd .. +-rmdir conftest +-$rm -r conftest 2>/dev/null +-]) +-compiler_c_o=$lt_cv_compiler_c_o +-AC_MSG_RESULT([$compiler_c_o]) +- +-if test x"$compiler_c_o" = x"yes"; then +- # Check to see if we can write to a .lo +- AC_MSG_CHECKING([if $compiler supports -c -o file.lo]) +- AC_CACHE_VAL([lt_cv_compiler_o_lo], [ +- lt_cv_compiler_o_lo=no +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -c -o conftest.lo" +- save_objext="$ac_objext" +- ac_objext=lo +- AC_TRY_COMPILE([], [int some_variable = 0;], [dnl +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- lt_cv_compiler_o_lo=no ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ $archive_expsym_cmds="$archive_cmds" ++ fi + else +- lt_cv_compiler_o_lo=yes ++ ld_shlibs=no + fi +- ]) +- ac_objext="$save_objext" +- CFLAGS="$save_CFLAGS" +- ]) +- compiler_o_lo=$lt_cv_compiler_o_lo +- AC_MSG_RESULT([$compiler_o_lo]) +-else +- compiler_o_lo=no +-fi +- +-# Check to see if we can do hard links to lock some files if needed +-hard_links="nottested" +-if test "$compiler_c_o" = no && test "$need_locks" != no; then +- # do not overwrite the value of need_locks provided by the user +- AC_MSG_CHECKING([if we can lock with hard links]) +- hard_links=yes +- $rm conftest* +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- touch conftest.a +- ln conftest.a conftest.b 2>&5 || hard_links=no +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- AC_MSG_RESULT([$hard_links]) +- if test "$hard_links" = no; then +- AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe]) +- need_locks=warn +- fi +-else +- need_locks=no +-fi ++ ;; + +-if test "$GCC" = yes; then +- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler +- AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions]) +- echo "int some_variable = 0;" > conftest.$ac_ext +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" +- compiler_rtti_exceptions=no +- AC_TRY_COMPILE([], [int some_variable = 0;], [dnl +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- compiler_rtti_exceptions=no +- else +- compiler_rtti_exceptions=yes +- fi +- ]) +- CFLAGS="$save_CFLAGS" +- AC_MSG_RESULT([$compiler_rtti_exceptions]) ++ *) ++ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ++ ;; ++ esac ++ dynamic_linker='Win32 ld.exe' ++ # FIXME: first we should search . and the directory the executable is in ++ shlibpath_var=PATH ++ ;; + +- if test "$compiler_rtti_exceptions" = "yes"; then +- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' ++darwin* | rhapsody*) ++ dynamic_linker="$host_os dyld" ++ version_type=darwin ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' ++ soname_spec='${libname}${release}${major}$shared_ext' ++ shlibpath_overrides_runpath=yes ++ shlibpath_var=DYLD_LIBRARY_PATH ++ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. ++ if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else +- no_builtin_flag=' -fno-builtin' ++ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi +-fi +- +-# See if the linker supports building shared libraries. +-AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries]) +- +-allow_undefined_flag= +-no_undefined_flag= +-need_lib_prefix=unknown +-need_version=unknown +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-archive_cmds= +-archive_expsym_cmds= +-old_archive_from_new_cmds= +-old_archive_from_expsyms_cmds= +-export_dynamic_flag_spec= +-whole_archive_flag_spec= +-thread_safe_flag_spec= +-hardcode_into_libs=no +-hardcode_libdir_flag_spec= +-hardcode_libdir_separator= +-hardcode_direct=no +-hardcode_minus_L=no +-hardcode_shlibpath_var=unsupported +-runpath_var= +-link_all_deplibs=unknown +-always_export_symbols=no +-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +-# include_expsyms should be a list of space-separated symbols to be *always* +-# included in the symbol list +-include_expsyms= +-# exclude_expsyms can be an egrep regular expression of symbols to exclude +-# it will be wrapped by ` (' and `)$', so one must not match beginning or +-# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +-# as well as any symbol that contains `d'. +-exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +-# platforms (ab)use it in PIC code, but their linkers get confused if +-# the symbol is explicitly referenced. Since portable code cannot +-# rely on this symbol name, it's probably fine to never include it in +-# preloaded symbol tables. +-extract_expsyms_cmds= ++ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ++ ;; + +-case $host_os in +-cygwin* | mingw* | pw32*) +- # FIXME: the MSVC++ port hasn't been tested in a loooong time +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- if test "$GCC" != yes; then +- with_gnu_ld=no +- fi ++dgux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH + ;; +-openbsd*) +- with_gnu_ld=no ++ ++freebsd1*) ++ dynamic_linker=no + ;; +-esac + +-ld_shlibs=yes +-if test "$with_gnu_ld" = yes; then +- # If archive_cmds runs LD, not CC, wlarc should be empty +- wlarc='${wl}' ++kfreebsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; + +- # See if GNU ld supports shared libraries. ++freebsd*) ++ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++ version_type=freebsd-$objformat ++ case $version_type in ++ freebsd-elf*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ need_version=no ++ need_lib_prefix=no ++ ;; ++ freebsd-*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' ++ need_version=yes ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY_PATH + case $host_os in +- aix3* | aix4* | aix5*) +- # On AIX, the GNU linker is very broken +- # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. +- ld_shlibs=no +- cat <&2 +- +-*** Warning: the GNU linker, at least up to release 2.9.1, is reported +-*** to be unable to reliably create shared libraries on AIX. +-*** Therefore, libtool is disabling shared libraries support. If you +-*** really care for shared libraries, you may want to modify your PATH +-*** so that a non-GNU linker is found, and then restart. +- +-EOF ++ freebsd2*) ++ shlibpath_overrides_runpath=yes + ;; +- +- amigaos*) +- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- +- # Samuel A. Falvo II reports +- # that the semantics of dynamic libraries on AmigaOS, at least up +- # to version 4, is to share data among multiple programs linked +- # with the same dynamic library. Since this doesn't match the +- # behavior of shared libraries on other platforms, we can use +- # them. +- ld_shlibs=no ++ freebsd3.[01]* | freebsdelf3.[01]*) ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes + ;; +- +- beos*) +- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- allow_undefined_flag=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- ld_shlibs=no +- fi ++ *) # from 3.2 on ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes + ;; ++ esac ++ ;; + +- cygwin* | mingw* | pw32*) +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec='-L$libdir' +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- +- extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ +- sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ +- test -f $output_objdir/impgen.exe || (cd $output_objdir && \ +- if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ +- else $CC -o impgen impgen.c ; fi)~ +- $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' +- +- old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' +- +- # cygwin and mingw dlls have different entry points and sets of symbols +- # to exclude. +- # FIXME: what about values for MSVC? +- dll_entry=__cygwin_dll_entry@12 +- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ +- case $host_os in +- mingw*) +- # mingw values +- dll_entry=_DllMainCRTStartup@12 +- dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ +- ;; +- esac ++gnu*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ ;; + +- # mingw and cygwin differ, and it's simplest to just exclude the union +- # of the two symbol sets. +- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 +- +- # recent cygwin and mingw systems supply a stub DllMain which the user +- # can override, but on older systems we have to supply one (in ltdll.c) +- if test "x$lt_cv_need_dllmain" = "xyes"; then +- ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " +- ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ +- test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' ++hpux9* | hpux10* | hpux11*) ++ # Give a soname corresponding to the major version so that dld.sl refuses to ++ # link against other versions. ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ case "$host_cpu" in ++ ia64*) ++ shrext_cmds='.so' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.so" ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ if test "X$HPUX_IA64_MODE" = X32; then ++ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else +- ltdll_obj= +- ltdll_cmds= ++ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi +- +- # Extract the symbol export list from an `--export-all' def file, +- # then regenerate the def file from the symbol export list, so that +- # the compiled dll only exports the symbol export list. +- # Be careful not to strip the DATA tag left be newer dlltools. +- export_symbols_cmds="$ltdll_cmds"' +- $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ +- sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' +- +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is. +- # If DATA tags from a recent dlltool are present, honour them! +- archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname-def; +- else +- echo EXPORTS > $output_objdir/$soname-def; +- _lt_hint=1; +- cat $export_symbols | while read symbol; do +- set dummy \$symbol; +- case \[$]# in +- 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; +- *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; +- esac; +- _lt_hint=`expr 1 + \$_lt_hint`; +- done; +- fi~ +- '"$ltdll_cmds"' +- $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ +- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ +- $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ +- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ +- $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' +- wlarc= +- else +- archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- fi ++ hppa*64*) ++ shrext_cmds='.sl' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ *) ++ shrext_cmds='.sl' ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=SHLIB_PATH ++ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + ;; ++ esac ++ # HP-UX runs *really* slowly unless shared libraries are mode 555. ++ postinstall_cmds='chmod 555 $lib' ++ ;; + +- solaris* | sysv5*) +- if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then +- ld_shlibs=no +- cat <&2 ++irix5* | irix6* | nonstopux*) ++ case $host_os in ++ nonstopux*) version_type=nonstopux ;; ++ *) ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ version_type=linux ++ else ++ version_type=irix ++ fi ;; ++ esac ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' ++ case $host_os in ++ irix5* | nonstopux*) ++ libsuff= shlibsuff= ++ ;; ++ *) ++ case $LD in # libtool.m4 will add one of these switches to LD ++ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") ++ libsuff= shlibsuff= libmagic=32-bit;; ++ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") ++ libsuff=32 shlibsuff=N32 libmagic=N32;; ++ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") ++ libsuff=64 shlibsuff=64 libmagic=64-bit;; ++ *) libsuff= shlibsuff= libmagic=never-match;; ++ esac ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" ++ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ++ hardcode_into_libs=yes ++ ;; + +-*** Warning: The releases 2.8.* of the GNU linker cannot reliably +-*** create shared libraries on Solaris systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.9.1 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. ++# No shared lib support for Linux oldld, aout, or coff. ++linux*oldld* | linux*aout* | linux*coff*) ++ dynamic_linker=no ++ ;; + +-EOF +- elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; ++# This must be Linux ELF. ++linux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes + +- sunos4*) +- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- wlarc= +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; ++ # Append ld.so.conf contents to the search path ++ if test -f /etc/ld.so.conf; then ++ lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` ++ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ fi + +- *) +- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi ++ case $host_cpu:$lt_cv_cc_64bit_output in ++ powerpc64:yes | s390x:yes | sparc64:yes | x86_64:yes) ++ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64" ++ sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64 /usr/X11R6/lib64" + ;; + esac + +- if test "$ld_shlibs" = yes; then +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec='${wl}--export-dynamic' +- case $host_os in +- cygwin* | mingw* | pw32*) +- # dlltool doesn't understand --whole-archive et. al. +- whole_archive_flag_spec= +- ;; +- *) +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec= +- fi +- ;; +- esac +- fi +-else +- # PORTME fill in a description of your system's linker (not GNU ld) +- case $host_os in +- aix3*) +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' +- # Note: this linker hardcodes the directories in LIBPATH if there +- # are no directories specified by -L. +- hardcode_minus_L=yes +- if test "$GCC" = yes && test -z "$link_static_flag"; then +- # Neither direct hardcoding nor static linking is supported with a +- # broken collect2. +- hardcode_direct=unsupported ++ # We used to test for /lib/ld.so.1 and disable shared libraries on ++ # powerpc, because MkLinux only supported shared libraries with the ++ # GNU dynamic linker. Since this was broken with cross compilers, ++ # most powerpc-linux boxes support dynamic linking these days and ++ # people can always --disable-shared, the test was removed, and we ++ # assume the GNU/Linux dynamic linker is in use. ++ dynamic_linker='GNU/Linux ld.so' ++ ++ # Find out which ABI we are using (multilib Linux x86_64 hack). ++ libsuff= ++ case "$host_cpu" in ++ x86_64*) ++ echo '[#]line __oline__ "configure"' > conftest.$ac_ext ++ if AC_TRY_EVAL(ac_compile); then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ ;; ++ esac + fi ++ rm -rf conftest* + ;; ++ *) ++ ;; ++ esac ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ ;; + +- aix4* | aix5*) +- if test "$host_cpu" = ia64; then +- # On IA64, the linker does run time linking by default, so we don't +- # have to do anything special. +- aix_use_runtimelinking=no +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- else +- aix_use_runtimelinking=no ++knetbsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; + +- # Test if we are trying to use run time linking or normal +- # AIX style linking. If -brtl is somewhere in LDFLAGS, we +- # need to do runtime linking. +- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) +- for ld_flag in $LDFLAGS; do +- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then +- aix_use_runtimelinking=yes +- break +- fi +- done +- esac ++netbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ dynamic_linker='NetBSD (a.out) ld.so' ++ else ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='NetBSD ld.elf_so' ++ fi ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; + +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' +- fi ++newsos6) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; + +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. ++nto-qnx*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; + +- hardcode_direct=yes +- archive_cmds='' +- hardcode_libdir_separator=':' +- if test "$GCC" = yes; then +- case $host_os in aix4.[[012]]|aix4.[[012]].*) +- collect2name=`${CC} -print-prog-name=collect2` +- if test -f "$collect2name" && \ +- strings "$collect2name" | grep resolve_lib_name >/dev/null +- then +- # We have reworked collect2 +- hardcode_direct=yes +- else +- # We have old collect2 +- hardcode_direct=unsupported +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- hardcode_minus_L=yes +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_libdir_separator= +- fi ++openbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ case $host_os in ++ openbsd2.[[89]] | openbsd2.[[89]].*) ++ shlibpath_overrides_runpath=no ++ ;; ++ *) ++ shlibpath_overrides_runpath=yes ++ ;; + esac ++ else ++ shlibpath_overrides_runpath=yes ++ fi ++ ;; + +- shared_flag='-shared' +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- shared_flag='${wl}-G' +- else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' +- else +- shared_flag='${wl}-bM:SRE' +- fi +- fi +- fi ++os2*) ++ libname_spec='$name' ++ shrext_cmds=".dll" ++ need_lib_prefix=no ++ library_names_spec='$libname${shared_ext} $libname.a' ++ dynamic_linker='OS/2 ld.exe' ++ shlibpath_var=LIBPATH ++ ;; + +- # It seems that -bexpall can do strange things, so it is better to +- # generate a list of symbols to export. +- always_export_symbols=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- allow_undefined_flag='-berok' +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' +- archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' +- allow_undefined_flag="-z nodefs" +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" +- else +- hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' +- # Warning - without using the other run time loading flags, +- # -berok will link without error, but may produce a broken library. +- allow_undefined_flag='${wl}-berok' +- # This is a bit strange, but is similar to how AIX traditionally builds +- # it's shared libraries. +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' +- fi +- fi +- ;; ++osf3* | osf4* | osf5*) ++ version_type=osf ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" ++ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ++ ;; + +- amigaos*) +- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- # see comment about different semantics on the GNU ld section +- ld_shlibs=no +- ;; ++sco3.2v5*) ++ version_type=osf ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; + +- cygwin* | mingw* | pw32*) +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- old_archive_from_new_cmds='true' +- # FIXME: Should let the user specify the lib program. +- old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' +- fix_srcfile_path='`cygpath -w "$srcfile"`' +- ;; +- +- darwin* | rhapsody*) +- case "$host_os" in +- rhapsody* | darwin1.[[012]]) +- allow_undefined_flag='-undefined suppress' ++solaris*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ # ldd complains unless libraries are executable ++ postinstall_cmds='chmod +x $lib' ++ ;; ++ ++sunos4*) ++ version_type=sunos ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ if test "$with_gnu_ld" = yes; then ++ need_lib_prefix=no ++ fi ++ need_version=yes ++ ;; ++ ++sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_vendor in ++ sni) ++ shlibpath_overrides_runpath=no ++ need_lib_prefix=no ++ export_dynamic_flag_spec='${wl}-Blargedynsym' ++ runpath_var=LD_RUN_PATH + ;; +- *) # Darwin 1.3 on +- allow_undefined_flag='-flat_namespace -undefined suppress' ++ siemens) ++ need_lib_prefix=no + ;; +- esac +- # FIXME: Relying on posixy $() will cause problems for +- # cross-compilation, but unfortunately the echo tests do not +- # yet detect zsh echo's removal of \ escapes. +- archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' +- # We need to add '_' to the symbols in $export_symbols first +- #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- whole_archive_flag_spec='-all_load $convenience' +- ;; +- +- freebsd1*) +- ld_shlibs=no +- ;; +- +- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor +- # support. Future versions do this automatically, but an explicit c++rt0.o +- # does not break anything, and helps significantly (at the cost of a little +- # extra space). +- freebsd2.2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; ++ motorola) ++ need_lib_prefix=no ++ need_version=no ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ++ ;; ++ esac ++ ;; + +- # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd*) +- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; ++sysv4*MP*) ++ if test -d /usr/nec ;then ++ version_type=linux ++ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' ++ soname_spec='$libname${shared_ext}.$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ fi ++ ;; + +- hpux9* | hpux10* | hpux11*) +- case $host_os in +- hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; +- *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; +- esac +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_direct=yes +- hardcode_minus_L=yes # Not in the search PATH, but as the default +- # location of the library. +- export_dynamic_flag_spec='${wl}-E' +- ;; ++uts4*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; + +- irix5* | irix6*) +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' +- fi +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- link_all_deplibs=yes +- ;; ++*) ++ dynamic_linker=no ++ ;; ++esac ++AC_MSG_RESULT([$dynamic_linker]) ++test "$dynamic_linker" = no && can_build_shared=no ++])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + +- netbsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out +- else +- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF +- fi +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; + +- newsos6) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_shlibpath_var=no +- ;; ++# _LT_AC_TAGCONFIG ++# ---------------- ++AC_DEFUN([_LT_AC_TAGCONFIG], ++[AC_ARG_WITH([tags], ++ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], ++ [include additional configurations @<:@automatic@:>@])], ++ [tagnames="$withval"]) ++ ++if test -f "$ltmain" && test -n "$tagnames"; then ++ if test ! -f "${ofile}"; then ++ AC_MSG_WARN([output file `$ofile' does not exist]) ++ fi + +- openbsd*) +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- export_dynamic_flag_spec='${wl}-E' ++ if test -z "$LTCC"; then ++ eval "`$SHELL ${ofile} --config | grep '^LTCC='`" ++ if test -z "$LTCC"; then ++ AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else +- case "$host_os" in +- openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- ;; +- *) +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- ;; +- esac ++ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi +- ;; ++ fi + +- os2*) +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- allow_undefined_flag=unsupported +- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' +- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' +- ;; ++ # Extract list of available tagged configurations in $ofile. ++ # Note that this assumes the entire list is on one line. ++ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` ++ ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for tagname in $tagnames; do ++ IFS="$lt_save_ifs" ++ # Check whether tagname contains only valid characters ++ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in ++ "") ;; ++ *) AC_MSG_ERROR([invalid tag name: $tagname]) ++ ;; ++ esac + +- osf3*) +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null ++ then ++ AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; + +- osf4* | osf5*) # as osf3* with the addition of -msym flag +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ +- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' +- +- #Both c and cxx compiler support -rpath directly +- hardcode_libdir_flag_spec='-rpath $libdir' +- fi +- hardcode_libdir_separator=: +- ;; ++ # Update the list of available tags. ++ if test -n "$tagname"; then ++ echo appending configuration tag \"$tagname\" to $ofile ++ ++ case $tagname in ++ CXX) ++ if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then ++ AC_LIBTOOL_LANG_CXX_CONFIG ++ else ++ tagname="" ++ fi ++ ;; + +- sco3.2v5*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- export_dynamic_flag_spec='${wl}-Bexport' +- ;; ++ F77) ++ if test -n "$F77" && test "X$F77" != "Xno"; then ++ AC_LIBTOOL_LANG_F77_CONFIG ++ else ++ tagname="" ++ fi ++ ;; + +- solaris*) +- # gcc --version < 3.0 without binutils cannot create self contained +- # shared libraries reliably, requiring libgcc.a to resolve some of +- # the object symbols generated in some cases. Libraries that use +- # assert need libgcc.a to resolve __eprintf, for example. Linking +- # a copy of libgcc.a into every shared library to guarantee resolving +- # such symbols causes other problems: According to Tim Van Holder +- # , C++ libraries end up with a separate +- # (to the application) exception stack for one thing. +- no_undefined_flag=' -z defs' +- if test "$GCC" = yes; then +- case `$CC --version 2>/dev/null` in +- [[12]].*) +- cat <&2 ++ GCJ) ++ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then ++ AC_LIBTOOL_LANG_GCJ_CONFIG ++ else ++ tagname="" ++ fi ++ ;; + +-*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +-*** create self contained shared libraries on Solaris systems, without +-*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +-*** -no-undefined support, which will at least allow you to build shared +-*** libraries. However, you may find that when you link such libraries +-*** into an application without using GCC, you have to manually add +-*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +-*** upgrade to a newer version of GCC. Another option is to rebuild your +-*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. ++ RC) ++ AC_LIBTOOL_LANG_RC_CONFIG ++ ;; + +-EOF +- no_undefined_flag= ++ *) ++ AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac +- fi +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_shlibpath_var=no +- case $host_os in +- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; +- *) # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; +- esac +- link_all_deplibs=yes +- ;; + +- sunos4*) +- if test "x$host_vendor" = xsequent; then +- # Use $CC to link under sequent, because it throws in some extra .o +- # files that make .init and .fini sections work. +- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' ++ # Append the new tag name to the list of available tags. ++ if test -n "$tagname" ; then ++ available_tags="$available_tags $tagname" + fi +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; +- +- sysv4) +- if test "x$host_vendor" = xsno; then +- archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes # is this really true??? +- else +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=no #Motorola manual says yes, but my tests say they lie + fi +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- ;; +- +- sysv4.3*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- export_dynamic_flag_spec='-Bexport' +- ;; +- +- sysv5*) +- no_undefined_flag=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- hardcode_libdir_flag_spec= +- hardcode_shlibpath_var=no +- runpath_var='LD_RUN_PATH' +- ;; +- +- uts4*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; ++ done ++ IFS="$lt_save_ifs" + +- dgux*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ld_shlibs=yes +- fi +- ;; +- +- sysv4.2uw2*) +- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_minus_L=no +- hardcode_shlibpath_var=no +- hardcode_runpath_var=yes +- runpath_var=LD_RUN_PATH +- ;; +- +- sysv5uw7* | unixware7*) +- no_undefined_flag='${wl}-z ${wl}text' +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- ;; +- +- *) +- ld_shlibs=no +- ;; +- esac +-fi +-AC_MSG_RESULT([$ld_shlibs]) +-test "$ld_shlibs" = no && can_build_shared=no +- +-# Check hardcoding attributes. +-AC_MSG_CHECKING([how to hardcode library paths into programs]) +-hardcode_action= +-if test -n "$hardcode_libdir_flag_spec" || \ +- test -n "$runpath_var"; then +- +- # We can hardcode non-existant directories. +- if test "$hardcode_direct" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$hardcode_shlibpath_var" != no && +- test "$hardcode_minus_L" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action=relink ++ # Now substitute the updated list of available tags. ++ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then ++ mv "${ofile}T" "$ofile" ++ chmod +x "$ofile" + else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action=immediate ++ rm -f "${ofile}T" ++ AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action=unsupported + fi +-AC_MSG_RESULT([$hardcode_action]) ++])# _LT_AC_TAGCONFIG + +-striplib= +-old_striplib= +-AC_MSG_CHECKING([whether stripping libraries is possible]) +-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- AC_MSG_RESULT([yes]) +-else +- AC_MSG_RESULT([no]) +-fi + +-reload_cmds='$LD$reload_flag -o $output$reload_objs' +-test -z "$deplibs_check_method" && deplibs_check_method=unknown ++# AC_LIBTOOL_DLOPEN ++# ----------------- ++# enable checks for dlopen support ++AC_DEFUN([AC_LIBTOOL_DLOPEN], ++ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ++])# AC_LIBTOOL_DLOPEN + +-# PORTME Fill in your ld.so characteristics +-AC_MSG_CHECKING([dynamic linker characteristics]) +-library_names_spec= +-libname_spec='lib$name' +-soname_spec= +-postinstall_cmds= +-postuninstall_cmds= +-finish_cmds= +-finish_eval= +-shlibpath_var= +-shlibpath_overrides_runpath=unknown +-version_type=none +-dynamic_linker="$host_os ld.so" +-sys_lib_dlsearch_path_spec="/lib /usr/lib" +-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +-case $host_os in +-aix3*) +- version_type=linux +- library_names_spec='${libname}${release}.so$versuffix $libname.a' +- shlibpath_var=LIBPATH ++# AC_LIBTOOL_WIN32_DLL ++# -------------------- ++# declare package support for building win32 dll's ++AC_DEFUN([AC_LIBTOOL_WIN32_DLL], ++[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ++])# AC_LIBTOOL_WIN32_DLL + +- # AIX has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}.so$major' +- ;; + +-aix4* | aix5*) +- version_type=linux +- if test "$host_cpu" = ia64; then +- # AIX 5 supports IA64 +- library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' +- shlibpath_var=LD_LIBRARY_PATH +- else +- # With GCC up to 2.95.x, collect2 would create an import file +- # for dependence libraries. The import file would start with +- # the line `#! .'. This would cause the generated library to +- # depend on `.', always an invalid library. This was fixed in +- # development snapshots of GCC prior to 3.0. +- case $host_os in +- aix4 | aix4.[[01]] | aix4.[[01]].*) +- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' +- echo ' yes ' +- echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then +- : +- else +- can_build_shared=no ++# AC_ENABLE_SHARED([DEFAULT]) ++# --------------------------- ++# implement the --enable-shared flag ++# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. ++AC_DEFUN([AC_ENABLE_SHARED], ++[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl ++AC_ARG_ENABLE([shared], ++ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], ++ [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], ++ [p=${PACKAGE-default} ++ case $enableval in ++ yes) enable_shared=yes ;; ++ no) enable_shared=no ;; ++ *) ++ enable_shared=no ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for pkg in $enableval; do ++ IFS="$lt_save_ifs" ++ if test "X$pkg" = "X$p"; then ++ enable_shared=yes + fi +- ;; +- esac +- # AIX (on Power*) has no versioning support, so currently we can +- # not hardcode correct soname into executable. Probably we can +- # add versioning support to collect2, so additional links can +- # be useful in future. +- if test "$aix_use_runtimelinking" = yes; then +- # If using run time linking (on AIX 4.2 or later) use lib.so +- # instead of lib.a to let people know that these are not +- # typical AIX shared libraries. +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- else +- # We preserve .a as extension for shared libraries through AIX4.2 +- # and later when we are not doing run time linking. +- library_names_spec='${libname}${release}.a $libname.a' +- soname_spec='${libname}${release}.so$major' +- fi +- shlibpath_var=LIBPATH +- fi +- ;; ++ done ++ IFS="$lt_save_ifs" ++ ;; ++ esac], ++ [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ++])# AC_ENABLE_SHARED + +-amigaos*) +- library_names_spec='$libname.ixlibrary $libname.a' +- # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' +- ;; + +-beos*) +- library_names_spec='${libname}.so' +- dynamic_linker="$host_os ld.so" +- shlibpath_var=LIBRARY_PATH +- ;; ++# AC_DISABLE_SHARED ++# ----------------- ++#- set the default shared flag to --disable-shared ++AC_DEFUN([AC_DISABLE_SHARED], ++[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl ++AC_ENABLE_SHARED(no) ++])# AC_DISABLE_SHARED + +-bsdi4*) +- version_type=linux +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- export_dynamic_flag_spec=-rdynamic +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; + +-cygwin* | mingw* | pw32*) +- version_type=windows +- need_version=no +- need_lib_prefix=no +- case $GCC,$host_os in +- yes,cygwin*) +- library_names_spec='$libname.dll.a' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' +- postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog .libs/$dlname \$dldir/$dlname' +- postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $rm \$dlpath' +- ;; +- yes,mingw*) +- library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' +- sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` +- ;; +- yes,pw32*) +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' +- ;; +- *) +- library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- ;; ++# AC_ENABLE_STATIC([DEFAULT]) ++# --------------------------- ++# implement the --enable-static flag ++# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. ++AC_DEFUN([AC_ENABLE_STATIC], ++[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl ++AC_ARG_ENABLE([static], ++ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], ++ [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], ++ [p=${PACKAGE-default} ++ case $enableval in ++ yes) enable_static=yes ;; ++ no) enable_static=no ;; ++ *) ++ enable_static=no ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for pkg in $enableval; do ++ IFS="$lt_save_ifs" ++ if test "X$pkg" = "X$p"; then ++ enable_static=yes ++ fi ++ done ++ IFS="$lt_save_ifs" ++ ;; ++ esac], ++ [enable_static=]AC_ENABLE_STATIC_DEFAULT) ++])# AC_ENABLE_STATIC + +-darwin* | rhapsody*) +- dynamic_linker="$host_os dyld" +- version_type=darwin +- need_lib_prefix=no +- need_version=no +- # FIXME: Relying on posixy $() will cause problems for +- # cross-compilation, but unfortunately the echo tests do not +- # yet detect zsh echo's removal of \ escapes. +- library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' +- soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' +- shlibpath_overrides_runpath=yes +- shlibpath_var=DYLD_LIBRARY_PATH +- ;; + +-freebsd1*) +- dynamic_linker=no +- ;; ++# AC_DISABLE_STATIC ++# ----------------- ++# set the default static flag to --disable-static ++AC_DEFUN([AC_DISABLE_STATIC], ++[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl ++AC_ENABLE_STATIC(no) ++])# AC_DISABLE_STATIC + +-freebsd*) +- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` +- version_type=freebsd-$objformat +- case $version_type in +- freebsd-elf*) +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' +- need_version=yes ++ ++# AC_ENABLE_FAST_INSTALL([DEFAULT]) ++# --------------------------------- ++# implement the --enable-fast-install flag ++# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. ++AC_DEFUN([AC_ENABLE_FAST_INSTALL], ++[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl ++AC_ARG_ENABLE([fast-install], ++ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], ++ [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], ++ [p=${PACKAGE-default} ++ case $enableval in ++ yes) enable_fast_install=yes ;; ++ no) enable_fast_install=no ;; ++ *) ++ enable_fast_install=no ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for pkg in $enableval; do ++ IFS="$lt_save_ifs" ++ if test "X$pkg" = "X$p"; then ++ enable_fast_install=yes ++ fi ++ done ++ IFS="$lt_save_ifs" + ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case $host_os in +- freebsd2*) +- shlibpath_overrides_runpath=yes +- ;; +- *) +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- esac +- ;; ++ esac], ++ [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ++])# AC_ENABLE_FAST_INSTALL + +-gnu*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- hardcode_into_libs=yes +- ;; + +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- dynamic_linker="$host_os dld.sl" +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' +- soname_spec='${libname}${release}.sl$major' +- # HP-UX runs *really* slowly unless shared libraries are mode 555. +- postinstall_cmds='chmod 555 $lib' +- ;; ++# AC_DISABLE_FAST_INSTALL ++# ----------------------- ++# set the default to --disable-fast-install ++AC_DEFUN([AC_DISABLE_FAST_INSTALL], ++[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl ++AC_ENABLE_FAST_INSTALL(no) ++])# AC_DISABLE_FAST_INSTALL + +-irix5* | irix6*) +- version_type=irix +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}.so$major' +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' +- case $host_os in +- irix5*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- ;; + +-# No shared lib support for Linux oldld, aout, or coff. +-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) +- dynamic_linker=no +- ;; ++# AC_LIBTOOL_PICMODE([MODE]) ++# -------------------------- ++# implement the --with-pic flag ++# MODE is either `yes' or `no'. If omitted, it defaults to `both'. ++AC_DEFUN([AC_LIBTOOL_PICMODE], ++[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl ++pic_mode=ifelse($#,1,$1,default) ++])# AC_LIBTOOL_PICMODE + +-# This must be Linux ELF. +-linux-gnu*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- # This implies no fast_install, which is unacceptable. +- # Some rework will be needed to allow for fast_install +- # before this can be enabled. +- hardcode_into_libs=yes + +- # We used to test for /lib/ld.so.1 and disable shared libraries on +- # powerpc, because MkLinux only supported shared libraries with the +- # GNU dynamic linker. Since this was broken with cross compilers, +- # most powerpc-linux boxes support dynamic linking these days and +- # people can always --disable-shared, the test was removed, and we +- # assume the GNU/Linux dynamic linker is in use. +- dynamic_linker='GNU/Linux ld.so' +- ;; ++# AC_PROG_EGREP ++# ------------- ++# This is predefined starting with Autoconf 2.54, so this conditional ++# definition can be removed once we require Autoconf 2.54 or later. ++m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], ++[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], ++ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 ++ then ac_cv_prog_egrep='grep -E' ++ else ac_cv_prog_egrep='egrep' ++ fi]) ++ EGREP=$ac_cv_prog_egrep ++ AC_SUBST([EGREP]) ++])]) + +-netbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' +- soname_spec='${libname}${release}.so$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes ++ ++# AC_PATH_TOOL_PREFIX ++# ------------------- ++# find a file program which can recognise shared library ++AC_DEFUN([AC_PATH_TOOL_PREFIX], ++[AC_REQUIRE([AC_PROG_EGREP])dnl ++AC_MSG_CHECKING([for $1]) ++AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, ++[case $MAGIC_CMD in ++[[\\/*] | ?:[\\/]*]) ++ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; ++*) ++ lt_save_MAGIC_CMD="$MAGIC_CMD" ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++dnl $ac_dummy forces splitting on constant user-supplied paths. ++dnl POSIX.2 word splitting is done only on the output of word expansions, ++dnl not every word. This closes a longstanding sh security hole. ++ ac_dummy="ifelse([$2], , $PATH, [$2])" ++ for ac_dir in $ac_dummy; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$1; then ++ lt_cv_path_MAGIC_CMD="$ac_dir/$1" ++ if test -n "$file_magic_test_file"; then ++ case $deplibs_check_method in ++ "file_magic "*) ++ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" ++ MAGIC_CMD="$lt_cv_path_MAGIC_CMD" ++ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | ++ $EGREP "$file_magic_regex" > /dev/null; then ++ : ++ else ++ cat <&2 + +-newsos6) +- version_type=linux +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes ++*** Warning: the command libtool uses to detect shared libraries, ++*** $file_magic_cmd, produces output that libtool cannot recognize. ++*** The result is that libtool may fail to recognize shared libraries ++*** as such. This will affect the creation of libtool libraries that ++*** depend on shared libraries, but programs linked with such libtool ++*** libraries will work regardless of this problem. Nevertheless, you ++*** may want to report the problem to your system manager and/or to ++*** bug-libtool@gnu.org ++ ++EOF ++ fi ;; ++ esac ++ fi ++ break ++ fi ++ done ++ IFS="$lt_save_ifs" ++ MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; ++esac]) ++MAGIC_CMD="$lt_cv_path_MAGIC_CMD" ++if test -n "$MAGIC_CMD"; then ++ AC_MSG_RESULT($MAGIC_CMD) ++else ++ AC_MSG_RESULT(no) ++fi ++])# AC_PATH_TOOL_PREFIX + +-openbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case "$host_os" in +- openbsd2.[[89]] | openbsd2.[[89]].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac ++ ++# AC_PATH_MAGIC ++# ------------- ++# find a file program which can recognise a shared library ++AC_DEFUN([AC_PATH_MAGIC], ++[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) ++if test -z "$lt_cv_path_MAGIC_CMD"; then ++ if test -n "$ac_tool_prefix"; then ++ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else +- shlibpath_overrides_runpath=yes ++ MAGIC_CMD=: + fi +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- ;; ++fi ++])# AC_PATH_MAGIC + +-os2*) +- libname_spec='$name' +- need_lib_prefix=no +- library_names_spec='$libname.dll $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; + +-osf3* | osf4* | osf5*) +- version_type=osf +- need_version=no +- soname_spec='${libname}${release}.so' +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; ++# AC_PROG_LD ++# ---------- ++# find the pathname to the GNU or non-GNU linker ++AC_DEFUN([AC_PROG_LD], ++[AC_ARG_WITH([gnu-ld], ++ [AC_HELP_STRING([--with-gnu-ld], ++ [assume the C compiler uses GNU ld @<:@default=no@:>@])], ++ [test "$withval" = no || with_gnu_ld=yes], ++ [with_gnu_ld=no]) ++AC_REQUIRE([LT_AC_PROG_SED])dnl ++AC_REQUIRE([AC_PROG_CC])dnl ++AC_REQUIRE([AC_CANONICAL_HOST])dnl ++AC_REQUIRE([AC_CANONICAL_BUILD])dnl ++ac_prog=ld ++if test "$GCC" = yes; then ++ # Check if gcc -print-prog-name=ld gives a path. ++ AC_MSG_CHECKING([for ld used by $CC]) ++ case $host in ++ *-*-mingw*) ++ # gcc leaves a trailing carriage return which upsets mingw ++ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; ++ *) ++ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; ++ esac ++ case $ac_prog in ++ # Accept absolute paths. ++ [[\\/]]* | ?:[[\\/]]*) ++ re_direlt='/[[^/]][[^/]]*/\.\./' ++ # Canonicalize the pathname of ld ++ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` ++ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ++ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` ++ done ++ test -z "$LD" && LD="$ac_prog" ++ ;; ++ "") ++ # If it fails, then pretend we aren't using GCC. ++ ac_prog=ld ++ ;; ++ *) ++ # If it is relative, then search for the first ld in PATH. ++ with_gnu_ld=unknown ++ ;; ++ esac ++elif test "$with_gnu_ld" = yes; then ++ AC_MSG_CHECKING([for GNU ld]) ++else ++ AC_MSG_CHECKING([for non-GNU ld]) ++fi ++AC_CACHE_VAL(lt_cv_path_LD, ++[if test -z "$LD"; then ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for ac_dir in $PATH; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then ++ lt_cv_path_LD="$ac_dir/$ac_prog" ++ # Check to see if the program is GNU ld. I'd rather use --version, ++ # but apparently some GNU ld's only accept -v. ++ # Break only if it was the GNU/non-GNU ld that we prefer. ++ case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then ++ case $host_cpu in ++ i*86 ) ++ # Not sure whether the presence of OpenBSD here was a mistake. ++ # Let's accept both of them until this is cleared up. ++ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' ++ lt_cv_file_magic_cmd=/usr/bin/file ++ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ++ ;; ++ esac ++ else ++ lt_cv_deplibs_check_method=pass_all ++ fi ++ ;; ++ ++gnu*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ ++hpux10.20* | hpux11*) ++ lt_cv_file_magic_cmd=/usr/bin/file ++ case "$host_cpu" in ++ ia64*) ++ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' ++ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ++ ;; ++ hppa*64*) ++ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] ++ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ++ ;; ++ *) ++ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' ++ lt_cv_file_magic_test_file=/usr/lib/libc.sl ++ ;; ++ esac ++ ;; ++ ++irix5* | irix6* | nonstopux*) ++ case $LD in ++ *-32|*"-32 ") libmagic=32-bit;; ++ *-n32|*"-n32 ") libmagic=N32;; ++ *-64|*"-64 ") libmagic=64-bit;; ++ *) libmagic=never-match;; ++ esac ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ ++# This must be Linux ELF. ++linux*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ ++netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then ++ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' ++ else ++ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' ++ fi ++ ;; ++ ++newos6*) ++ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' ++ lt_cv_file_magic_cmd=/usr/bin/file ++ lt_cv_file_magic_test_file=/usr/lib/libnls.so ++ ;; ++ ++nto-qnx*) ++ lt_cv_deplibs_check_method=unknown ++ ;; ++ ++openbsd*) ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' ++ else ++ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' ++ fi ++ ;; ++ ++osf3* | osf4* | osf5*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ ++sco3.2v5*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ ++solaris*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ ++sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ case $host_vendor in ++ motorola) ++ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' ++ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ++ ;; ++ ncr) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ sequent) ++ lt_cv_file_magic_cmd='/bin/file' ++ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ++ ;; ++ sni) ++ lt_cv_file_magic_cmd='/bin/file' ++ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" ++ lt_cv_file_magic_test_file=/lib/libc.so ++ ;; ++ siemens) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++ esac ++ ;; ++ ++sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; ++esac ++]) ++file_magic_cmd=$lt_cv_file_magic_cmd ++deplibs_check_method=$lt_cv_deplibs_check_method ++test -z "$deplibs_check_method" && deplibs_check_method=unknown ++])# AC_DEPLIBS_CHECK_METHOD ++ ++ ++# AC_PROG_NM ++# ---------- ++# find the pathname to a BSD-compatible name lister ++AC_DEFUN([AC_PROG_NM], ++[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, ++[if test -n "$NM"; then ++ # Let the user override the test. ++ lt_cv_path_NM="$NM" ++else ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ tmp_nm="$ac_dir/${ac_tool_prefix}nm" ++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then ++ # Check to see if the nm accepts a BSD-compat flag. ++ # Adding the `sed 1q' prevents false positives on HP-UX, which says: ++ # nm: unknown option "B" ignored ++ # Tru64's nm complains that /dev/null is an invalid object file ++ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in ++ */dev/null* | *'Invalid file or object type'*) ++ lt_cv_path_NM="$tmp_nm -B" ++ break ++ ;; ++ *) ++ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in ++ */dev/null*) ++ lt_cv_path_NM="$tmp_nm -p" ++ break ++ ;; ++ *) ++ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but ++ continue # so that we can try to find one that supports BSD flags ++ ;; ++ esac ++ esac ++ fi ++ done ++ IFS="$lt_save_ifs" ++ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm ++fi]) ++NM="$lt_cv_path_NM" ++])# AC_PROG_NM ++ ++ ++# AC_CHECK_LIBM ++# ------------- ++# check for math library ++AC_DEFUN([AC_CHECK_LIBM], ++[AC_REQUIRE([AC_CANONICAL_HOST])dnl ++LIBM= ++case $host in ++*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) ++ # These system don't have libm, or don't need it ++ ;; ++*-ncr-sysv4.3*) ++ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") ++ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ++ ;; ++*) ++ AC_CHECK_LIB(m, cos, LIBM="-lm") ++ ;; ++esac ++])# AC_CHECK_LIBM ++ ++ ++# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) ++# ----------------------------------- ++# sets LIBLTDL to the link flags for the libltdl convenience library and ++# LTDLINCL to the include flags for the libltdl header and adds ++# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL ++# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If ++# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will ++# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with ++# '${top_srcdir}/' (note the single quotes!). If your package is not ++# flat and you're not using automake, define top_builddir and ++# top_srcdir appropriately in the Makefiles. ++AC_DEFUN([AC_LIBLTDL_CONVENIENCE], ++[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl ++ case $enable_ltdl_convenience in ++ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; ++ "") enable_ltdl_convenience=yes ++ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; ++ esac ++ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la ++ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) ++ # For backwards non-gettext consistent compatibility... ++ INCLTDL="$LTDLINCL" ++])# AC_LIBLTDL_CONVENIENCE ++ ++ ++# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) ++# ----------------------------------- ++# sets LIBLTDL to the link flags for the libltdl installable library and ++# LTDLINCL to the include flags for the libltdl header and adds ++# --enable-ltdl-install to the configure arguments. Note that LIBLTDL ++# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If ++# DIRECTORY is not provided and an installed libltdl is not found, it is ++# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' ++# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single ++# quotes!). If your package is not flat and you're not using automake, ++# define top_builddir and top_srcdir appropriately in the Makefiles. ++# In the future, this macro may have to be called after AC_PROG_LIBTOOL. ++AC_DEFUN([AC_LIBLTDL_INSTALLABLE], ++[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl ++ AC_CHECK_LIB(ltdl, lt_dlinit, ++ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], ++ [if test x"$enable_ltdl_install" = xno; then ++ AC_MSG_WARN([libltdl not installed, but installation disabled]) ++ else ++ enable_ltdl_install=yes ++ fi ++ ]) ++ if test x"$enable_ltdl_install" = x"yes"; then ++ ac_configure_args="$ac_configure_args --enable-ltdl-install" ++ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la ++ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) ++ else ++ ac_configure_args="$ac_configure_args --enable-ltdl-install=no" ++ LIBLTDL="-lltdl" ++ LTDLINCL= ++ fi ++ # For backwards non-gettext consistent compatibility... ++ INCLTDL="$LTDLINCL" ++])# AC_LIBLTDL_INSTALLABLE ++ ++ ++# AC_LIBTOOL_CXX ++# -------------- ++# enable support for C++ libraries ++AC_DEFUN([AC_LIBTOOL_CXX], ++[AC_REQUIRE([_LT_AC_LANG_CXX]) ++])# AC_LIBTOOL_CXX ++ ++ ++# _LT_AC_LANG_CXX ++# --------------- ++AC_DEFUN([_LT_AC_LANG_CXX], ++[AC_REQUIRE([AC_PROG_CXX]) ++AC_REQUIRE([_LT_AC_PROG_CXXCPP]) ++_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ++])# _LT_AC_LANG_CXX ++ ++# _LT_AC_PROG_CXXCPP ++# --------------- ++AC_DEFUN([_LT_AC_PROG_CXXCPP], ++[ ++AC_REQUIRE([AC_PROG_CXX]) ++if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then ++ AC_PROG_CXXCPP ++fi ++])# _LT_AC_PROG_CXXCPP ++ ++# AC_LIBTOOL_F77 ++# -------------- ++# enable support for Fortran 77 libraries ++AC_DEFUN([AC_LIBTOOL_F77], ++[AC_REQUIRE([_LT_AC_LANG_F77]) ++])# AC_LIBTOOL_F77 ++ ++ ++# _LT_AC_LANG_F77 ++# --------------- ++AC_DEFUN([_LT_AC_LANG_F77], ++[AC_REQUIRE([AC_PROG_F77]) ++_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ++])# _LT_AC_LANG_F77 ++ ++ ++# AC_LIBTOOL_GCJ ++# -------------- ++# enable support for GCJ libraries ++AC_DEFUN([AC_LIBTOOL_GCJ], ++[AC_REQUIRE([_LT_AC_LANG_GCJ]) ++])# AC_LIBTOOL_GCJ ++ ++ ++# _LT_AC_LANG_GCJ ++# --------------- ++AC_DEFUN([_LT_AC_LANG_GCJ], ++[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], ++ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], ++ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], ++ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], ++ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], ++ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) ++_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ++])# _LT_AC_LANG_GCJ ++ ++ ++# AC_LIBTOOL_RC ++# -------------- ++# enable support for Windows resource files ++AC_DEFUN([AC_LIBTOOL_RC], ++[AC_REQUIRE([LT_AC_PROG_RC]) ++_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ++])# AC_LIBTOOL_RC ++ ++ ++# AC_LIBTOOL_LANG_C_CONFIG ++# ------------------------ ++# Ensure that the configuration vars for the C compiler are ++# suitably defined. Those variables are subsequently used by ++# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. ++AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) ++AC_DEFUN([_LT_AC_LANG_C_CONFIG], ++[lt_save_CC="$CC" ++AC_LANG_PUSH(C) ++ ++# Source file extension for C test sources. ++ac_ext=c ++ ++# Object file extension for compiled C test sources. ++objext=o ++_LT_AC_TAGVAR(objext, $1)=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code="int some_variable = 0;\n" ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code='int main(){return(0);}\n' ++ ++_LT_AC_SYS_COMPILER ++ ++# ++# Check for any special shared library compilation flags. ++# ++_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= ++if test "$GCC" = no; then ++ case $host_os in ++ sco3.2v5*) ++ _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' ++ ;; ++ esac ++fi ++if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then ++ AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) ++ if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : ++ else ++ AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) ++ _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no ++ fi ++fi ++ ++ ++# ++# Check to make sure the static flag actually works. ++# ++AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], ++ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), ++ $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), ++ [], ++ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ++ ++ ++AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) ++AC_LIBTOOL_PROG_COMPILER_PIC($1) ++AC_LIBTOOL_PROG_CC_C_O($1) ++AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) ++AC_LIBTOOL_PROG_LD_SHLIBS($1) ++AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) ++AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) ++AC_LIBTOOL_SYS_LIB_STRIP ++AC_LIBTOOL_DLOPEN_SELF($1) ++ ++# Report which librarie types wil actually be built ++AC_MSG_CHECKING([if libtool supports shared libraries]) ++AC_MSG_RESULT([$can_build_shared]) ++ ++AC_MSG_CHECKING([whether to build shared libraries]) ++test "$can_build_shared" = "no" && enable_shared=no ++ ++# On AIX, shared libraries and static libraries use the same namespace, and ++# are all built from PIC. ++case "$host_os" in ++aix3*) ++ test "$enable_shared" = yes && enable_static=no ++ if test -n "$RANLIB"; then ++ archive_cmds="$archive_cmds~\$RANLIB \$lib" ++ postinstall_cmds='$RANLIB $lib' ++ fi ++ ;; ++ ++aix4* | aix5*) ++ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then ++ test "$enable_shared" = yes && enable_static=no ++ fi ++ ;; ++esac ++AC_MSG_RESULT([$enable_shared]) ++ ++AC_MSG_CHECKING([whether to build static libraries]) ++# Make sure either enable_shared or enable_static is yes. ++test "$enable_shared" = yes || enable_static=yes ++AC_MSG_RESULT([$enable_static]) ++ ++AC_LIBTOOL_CONFIG($1) ++ ++AC_LANG_POP ++CC="$lt_save_CC" ++])# AC_LIBTOOL_LANG_C_CONFIG ++ ++ ++# AC_LIBTOOL_LANG_CXX_CONFIG ++# -------------------------- ++# Ensure that the configuration vars for the C compiler are ++# suitably defined. Those variables are subsequently used by ++# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. ++AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) ++AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], ++[AC_LANG_PUSH(C++) ++AC_REQUIRE([AC_PROG_CXX]) ++AC_REQUIRE([_LT_AC_PROG_CXXCPP]) ++ ++_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++_LT_AC_TAGVAR(allow_undefined_flag, $1)= ++_LT_AC_TAGVAR(always_export_symbols, $1)=no ++_LT_AC_TAGVAR(archive_expsym_cmds, $1)= ++_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= ++_LT_AC_TAGVAR(hardcode_direct, $1)=no ++_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= ++_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= ++_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= ++_LT_AC_TAGVAR(hardcode_minus_L, $1)=no ++_LT_AC_TAGVAR(hardcode_automatic, $1)=no ++_LT_AC_TAGVAR(module_cmds, $1)= ++_LT_AC_TAGVAR(module_expsym_cmds, $1)= ++_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown ++_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ++_LT_AC_TAGVAR(no_undefined_flag, $1)= ++_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= ++_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no ++ ++# Dependencies to place before and after the object being linked: ++_LT_AC_TAGVAR(predep_objects, $1)= ++_LT_AC_TAGVAR(postdep_objects, $1)= ++_LT_AC_TAGVAR(predeps, $1)= ++_LT_AC_TAGVAR(postdeps, $1)= ++_LT_AC_TAGVAR(compiler_lib_search_path, $1)= ++ ++# Source file extension for C++ test sources. ++ac_ext=cc ++ ++# Object file extension for compiled C++ test sources. ++objext=o ++_LT_AC_TAGVAR(objext, $1)=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code="int some_variable = 0;\n" ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' ++ ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. ++_LT_AC_SYS_COMPILER ++ ++# Allow CC to be a program name with arguments. ++lt_save_CC=$CC ++lt_save_LD=$LD ++lt_save_GCC=$GCC ++GCC=$GXX ++lt_save_with_gnu_ld=$with_gnu_ld ++lt_save_path_LD=$lt_cv_path_LD ++if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then ++ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx ++else ++ unset lt_cv_prog_gnu_ld ++fi ++if test -n "${lt_cv_path_LDCXX+set}"; then ++ lt_cv_path_LD=$lt_cv_path_LDCXX ++else ++ unset lt_cv_path_LD ++fi ++test -z "${LDCXX+set}" || LD=$LDCXX ++CC=${CXX-"c++"} ++compiler=$CC ++_LT_AC_TAGVAR(compiler, $1)=$CC ++cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++ ++# We don't want -fno-exception wen compiling C++ code, so set the ++# no_builtin_flag separately ++if test "$GXX" = yes; then ++ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ++else ++ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= ++fi ++ ++if test "$GXX" = yes; then ++ # Set up default GNU C++ configuration ++ ++ AC_PROG_LD ++ ++ # Check if GNU C++ uses GNU ld as the underlying linker, since the ++ # archiving commands below assume that GNU ld is being used. ++ if test "$with_gnu_ld" = yes; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' ++ ++ # If archive_cmds runs LD, not CC, wlarc should be empty ++ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to ++ # investigate it a little bit more. (MM) ++ wlarc='${wl}' ++ ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ ++ grep 'no-whole-archive' > /dev/null; then ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= ++ fi ++ else ++ with_gnu_ld=no ++ wlarc= ++ ++ # A generic and very simple default shared library creation ++ # command for GNU C++ for the case where it uses the native ++ # linker, instead of GNU ld. If possible, this setting should ++ # overridden to take advantage of the native linker features on ++ # the platform it is being used on. ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' ++ fi ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' ++ ++else ++ GXX=no ++ with_gnu_ld=no ++ wlarc= ++fi ++ ++# PORTME: fill in a description of your system's C++ link characteristics ++AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ++_LT_AC_TAGVAR(ld_shlibs, $1)=yes ++case $host_os in ++ aix3*) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ aix4* | aix5*) ++ if test "$host_cpu" = ia64; then ++ # On IA64, the linker does run time linking by default, so we don't ++ # have to do anything special. ++ aix_use_runtimelinking=no ++ exp_sym_flag='-Bexport' ++ no_entry_flag="" ++ else ++ aix_use_runtimelinking=no ++ ++ # Test if we are trying to use run time linking or normal ++ # AIX style linking. If -brtl is somewhere in LDFLAGS, we ++ # need to do runtime linking. ++ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) ++ for ld_flag in $LDFLAGS; do ++ case $ld_flag in ++ *-brtl*) ++ aix_use_runtimelinking=yes ++ break ++ ;; ++ esac ++ done ++ esac ++ ++ exp_sym_flag='-bexport' ++ no_entry_flag='-bnoentry' ++ fi ++ ++ # When large executables or shared objects are built, AIX ld can ++ # have problems creating the table of contents. If linking a library ++ # or program results in "error TOC overflow" add -mminimal-toc to ++ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not ++ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. ++ ++ _LT_AC_TAGVAR(archive_cmds, $1)='' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ ++ if test "$GXX" = yes; then ++ case $host_os in aix4.[012]|aix4.[012].*) ++ # We only want to do this on AIX 4.2 and lower, the check ++ # below for broken collect2 doesn't work under 4.3+ ++ collect2name=`${CC} -print-prog-name=collect2` ++ if test -f "$collect2name" && \ ++ strings "$collect2name" | grep resolve_lib_name >/dev/null ++ then ++ # We have reworked collect2 ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ else ++ # We have old collect2 ++ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported ++ # It fails to find uninstalled libraries when the uninstalled ++ # path is not listed in the libpath. Setting hardcode_minus_L ++ # to unsupported forces relinking ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= ++ fi ++ esac ++ shared_flag='-shared' ++ else ++ # not using gcc ++ if test "$host_cpu" = ia64; then ++ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release ++ # chokes on -Wl,-G. The following line is correct: ++ shared_flag='-G' ++ else ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag='${wl}-G' ++ else ++ shared_flag='${wl}-bM:SRE' ++ fi ++ fi ++ fi ++ ++ # It seems that -bexpall does not export symbols beginning with ++ # underscore (_), so it is better to generate a list of symbols to export. ++ _LT_AC_TAGVAR(always_export_symbols, $1)=yes ++ if test "$aix_use_runtimelinking" = yes; then ++ # Warning - without using the other runtime loading flags (-brtl), ++ # -berok will link without error, but may produce a broken library. ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' ++ # Determine the default libpath from the value encoded in an empty executable. ++ _LT_AC_SYS_LIBPATH_AIX ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" ++ ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ else ++ if test "$host_cpu" = ia64; then ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ else ++ # Determine the default libpath from the value encoded in an empty executable. ++ _LT_AC_SYS_LIBPATH_AIX ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" ++ # Warning - without using the other run time loading flags, ++ # -berok will link without error, but may produce a broken library. ++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' ++ # -bexpall does not export symbols beginning with underscore (_) ++ _LT_AC_TAGVAR(always_export_symbols, $1)=yes ++ # Exported symbols can be pulled into shared objects from archives ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes ++ # This is similar to how AIX traditionally builds it's shared libraries. ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ fi ++ fi ++ ;; ++ chorus*) ++ case $cc_basename in ++ *) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ ;; ++ ++ ++ cygwin* | mingw* | pw32*) ++ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, ++ # as there is no search path for DLLs. ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported ++ _LT_AC_TAGVAR(always_export_symbols, $1)=no ++ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ++ ++ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ # If the export-symbols file already is a .def file (1st line ++ # is EXPORTS), use it as is; otherwise, prepend... ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ cp $export_symbols $output_objdir/$soname.def; ++ else ++ echo EXPORTS > $output_objdir/$soname.def; ++ cat $export_symbols >> $output_objdir/$soname.def; ++ fi~ ++ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ darwin* | rhapsody*) ++ case "$host_os" in ++ rhapsody* | darwin1.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ ++ if test "$GXX" = yes ; then ++ lt_int_apple_cc_single_mod=no ++ output_verbose_link_cmd='echo' ++ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then ++ lt_int_apple_cc_single_mod=yes ++ fi ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ fi ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ fi ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case "$cc_basename" in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ fi ++ ;; ++ ++ dgux*) ++ case $cc_basename in ++ ec++) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ ghcx) ++ # Green Hills C++ Compiler ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ ;; ++ freebsd[12]*) ++ # C++ shared libraries reported to be fairly broken before switch to ELF ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ freebsd-elf*) ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ ;; ++ freebsd* | kfreebsd*-gnu) ++ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF ++ # conventions ++ _LT_AC_TAGVAR(ld_shlibs, $1)=yes ++ ;; ++ gnu*) ++ ;; ++ hpux9*) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, ++ # but as the default ++ # location of the library. ++ ++ case $cc_basename in ++ CC) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ aCC) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ else ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ esac ++ ;; ++ hpux10*|hpux11*) ++ if test $with_gnu_ld = no; then ++ case "$host_cpu" in ++ hppa*64*) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ;; ++ ia64*) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ ;; ++ *) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ ;; ++ esac ++ fi ++ case "$host_cpu" in ++ hppa*64*) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; ++ ia64*) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, ++ # but as the default ++ # location of the library. ++ ;; ++ *) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, ++ # but as the default ++ # location of the library. ++ ;; ++ esac ++ ++ case $cc_basename in ++ CC) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ aCC) ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ ;; ++ *) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ esac ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes; then ++ if test $with_gnu_ld = no; then ++ case "$host_cpu" in ++ ia64*|hppa*64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ ;; ++ *) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ esac ++ fi ++ else ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ esac ++ ;; ++ irix5* | irix6*) ++ case $cc_basename in ++ CC) ++ # SGI C++ ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ ++ # Archives containing C++ object files must be created using ++ # "CC -ar", where "CC" is the IRIX C++ compiler. This is ++ # necessary to make sure instantiated templates are included ++ # in the archive. ++ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ++ ;; ++ *) ++ if test "$GXX" = yes; then ++ if test "$with_gnu_ld" = no; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' ++ fi ++ fi ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ ;; ++ esac ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ;; ++ linux*) ++ case $cc_basename in ++ KCC) ++ # Kuck and Associates, Inc. (KAI) C++ Compiler ++ ++ # KCC will only create a shared library if the output file ++ # ends with ".so" (or ".sl" for HP-UX), so rename the library ++ # to its proper name (with version) after linking. ++ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' ++ ++ # Archives containing C++ object files must be created using ++ # "CC -Bstatic", where "CC" is the KAI C++ compiler. ++ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ++ ;; ++ icpc) ++ # Intel C++ ++ with_gnu_ld=yes ++ # version 8.0 and above of icpc choke on multiply defined symbols ++ # if we add $predep_objects and $postdep_objects, however 7.1 and ++ # earlier do not add the objects themselves. ++ case `$CC -V 2>&1` in ++ *"Version 7."*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ *) # Version 8.0 or newer ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ esac ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ++ ;; ++ cxx) ++ # Compaq C++ ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' ++ ++ runpath_var=LD_RUN_PATH ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ esac ++ ;; ++ lynxos*) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ m88k*) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ mvs*) ++ case $cc_basename in ++ cxx) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ ;; ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' ++ wlarc= ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ fi ++ # Workaround some broken pre-1.5 toolchains ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ++ ;; ++ openbsd2*) ++ # C++ shared libraries are fairly broken ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ openbsd*) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ fi ++ output_verbose_link_cmd='echo' ++ ;; ++ osf3*) ++ case $cc_basename in ++ KCC) ++ # Kuck and Associates, Inc. (KAI) C++ Compiler ++ ++ # KCC will only create a shared library if the output file ++ # ends with ".so" (or ".sl" for HP-UX), so rename the library ++ # to its proper name (with version) after linking. ++ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ # Archives containing C++ object files must be created using ++ # "CC -Bstatic", where "CC" is the KAI C++ compiler. ++ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ++ ++ ;; ++ RCC) ++ # Rational C++ 2.4.1 ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ cxx) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes && test "$with_gnu_ld" = no; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' ++ ++ else ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ esac ++ ;; ++ osf4* | osf5*) ++ case $cc_basename in ++ KCC) ++ # Kuck and Associates, Inc. (KAI) C++ Compiler ++ ++ # KCC will only create a shared library if the output file ++ # ends with ".so" (or ".sl" for HP-UX), so rename the library ++ # to its proper name (with version) after linking. ++ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ # Archives containing C++ object files must be created using ++ # the KAI C++ compiler. ++ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ++ ;; ++ RCC) ++ # Rational C++ 2.4.1 ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ cxx) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ ++ echo "-hidden">> $lib.exp~ ++ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ ++ $rm $lib.exp' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes && test "$with_gnu_ld" = no; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' ++ ++ else ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ esac ++ ;; ++ psos*) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ sco*) ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ case $cc_basename in ++ CC) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ ;; ++ sunos4*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.x ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ lcc) ++ # Lucid ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ ;; ++ solaris*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.2, 5.x and Centerline C++ ++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ case $host_os in ++ solaris2.[0-5] | solaris2.[0-5].*) ;; ++ *) ++ # The C++ compiler is used as linker so we must use $wl ++ # flag to pass the commands to the underlying system ++ # linker. ++ # Supported since Solaris 2.6 (maybe 2.5.1?) ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ++ ;; ++ esac ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ++ # Archives containing C++ object files must be created using ++ # "CC -xar", where "CC" is the Sun C++ compiler. This is ++ # necessary to make sure instantiated templates are included ++ # in the archive. ++ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ++ ;; ++ gcx) ++ # Green Hills C++ Compiler ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' ++ ++ # The C++ compiler must be used to create the archive. ++ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ++ ;; ++ *) ++ # GNU C++ compiler with Solaris linker ++ if test "$GXX" = yes && test "$with_gnu_ld" = no; then ++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' ++ if $CC --version | grep -v '^2\.7' > /dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" ++ else ++ # g++ 2.7 appears to require `-G' NOT `-shared' on this ++ # platform. ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" ++ fi ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' ++ fi ++ ;; ++ esac ++ ;; ++ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ ;; ++ tandem*) ++ case $cc_basename in ++ NCC) ++ # NonStop-UX NCC 3.20 ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ ;; ++ vxworks*) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++esac ++AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) ++test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no ++ ++_LT_AC_TAGVAR(GCC, $1)="$GXX" ++_LT_AC_TAGVAR(LD, $1)="$LD" ++ ++AC_LIBTOOL_POSTDEP_PREDEP($1) ++AC_LIBTOOL_PROG_COMPILER_PIC($1) ++AC_LIBTOOL_PROG_CC_C_O($1) ++AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) ++AC_LIBTOOL_PROG_LD_SHLIBS($1) ++AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) ++AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) ++AC_LIBTOOL_SYS_LIB_STRIP ++AC_LIBTOOL_DLOPEN_SELF($1) ++ ++AC_LIBTOOL_CONFIG($1) ++ ++AC_LANG_POP ++CC=$lt_save_CC ++LDCXX=$LD ++LD=$lt_save_LD ++GCC=$lt_save_GCC ++with_gnu_ldcxx=$with_gnu_ld ++with_gnu_ld=$lt_save_with_gnu_ld ++lt_cv_path_LDCXX=$lt_cv_path_LD ++lt_cv_path_LD=$lt_save_path_LD ++lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld ++lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ++])# AC_LIBTOOL_LANG_CXX_CONFIG ++ ++# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) ++# ------------------------ ++# Figure out "hidden" library dependencies from verbose ++# compiler output when linking a shared library. ++# Parse the compiler output and extract the necessary ++# objects, libraries and library flags. ++AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ ++dnl we can't use the lt_simple_compile_test_code here, ++dnl because it contains code intended for an executable, ++dnl not a library. It's possible we should let each ++dnl tag define a new lt_????_link_test_code variable, ++dnl but it's only used here... ++ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext + +- if AC_TRY_EVAL(ac_compile); then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$lt_cv_prog_cc_wl +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- save_allow_undefined_flag=$allow_undefined_flag +- allow_undefined_flag= +- if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) +- then +- lt_cv_archive_cmds_need_lc=no +- else +- lt_cv_archive_cmds_need_lc=yes +- fi +- allow_undefined_flag=$save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi]) +- AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc]) +- ;; +- esac +-fi +-need_lc=${lt_cv_archive_cmds_need_lc-yes} ++AC_LIBTOOL_CONFIG($1) ++ ++AC_LANG_POP ++CC="$lt_save_CC" ++])# AC_LIBTOOL_LANG_F77_CONFIG ++ ++ ++# AC_LIBTOOL_LANG_GCJ_CONFIG ++# -------------------------- ++# Ensure that the configuration vars for the C compiler are ++# suitably defined. Those variables are subsequently used by ++# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. ++AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) ++AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], ++[AC_LANG_SAVE ++ ++# Source file extension for Java test sources. ++ac_ext=java ++ ++# Object file extension for compiled Java test sources. ++objext=o ++_LT_AC_TAGVAR(objext, $1)=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code="class foo {}\n" ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' ++ ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. ++_LT_AC_SYS_COMPILER ++ ++# Allow CC to be a program name with arguments. ++lt_save_CC="$CC" ++CC=${GCJ-"gcj"} ++compiler=$CC ++_LT_AC_TAGVAR(compiler, $1)=$CC ++ ++# GCJ did not exist at the time GCC didn't implicitly link libc in. ++_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ ++AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) ++AC_LIBTOOL_PROG_COMPILER_PIC($1) ++AC_LIBTOOL_PROG_CC_C_O($1) ++AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) ++AC_LIBTOOL_PROG_LD_SHLIBS($1) ++AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) ++AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) ++AC_LIBTOOL_SYS_LIB_STRIP ++AC_LIBTOOL_DLOPEN_SELF($1) ++ ++AC_LIBTOOL_CONFIG($1) ++ ++AC_LANG_RESTORE ++CC="$lt_save_CC" ++])# AC_LIBTOOL_LANG_GCJ_CONFIG ++ + +-# The second clause should only fire when bootstrapping the ++# AC_LIBTOOL_LANG_RC_CONFIG ++# -------------------------- ++# Ensure that the configuration vars for the Windows resource compiler are ++# suitably defined. Those variables are subsequently used by ++# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. ++AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) ++AC_DEFUN([_LT_AC_LANG_RC_CONFIG], ++[AC_LANG_SAVE ++ ++# Source file extension for RC test sources. ++ac_ext=rc ++ ++# Object file extension for compiled RC test sources. ++objext=o ++_LT_AC_TAGVAR(objext, $1)=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code="$lt_simple_compile_test_code" ++ ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. ++_LT_AC_SYS_COMPILER ++ ++# Allow CC to be a program name with arguments. ++lt_save_CC="$CC" ++CC=${RC-"windres"} ++compiler=$CC ++_LT_AC_TAGVAR(compiler, $1)=$CC ++_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes ++ ++AC_LIBTOOL_CONFIG($1) ++ ++AC_LANG_RESTORE ++CC="$lt_save_CC" ++])# AC_LIBTOOL_LANG_RC_CONFIG ++ ++ ++# AC_LIBTOOL_CONFIG([TAGNAME]) ++# ---------------------------- ++# If TAGNAME is not passed, then create an initial libtool script ++# with a default configuration from the untagged config vars. Otherwise ++# add code to config.status for appending the configuration named by ++# TAGNAME from the matching tagged config vars. ++AC_DEFUN([AC_LIBTOOL_CONFIG], ++[# The else clause should only fire when bootstrapping the + # libtool distribution, otherwise you forgot to ship ltmain.sh + # with your package, and you will get complaints that there are + # no rules to generate ltmain.sh. + if test -f "$ltmain"; then +- : +-else +- # If there is no Makefile yet, we rely on a make rule to execute +- # `config.status --recheck' to rerun these tests and create the +- # libtool script then. +- test -f Makefile && make "$ltmain" +-fi +- +-if test -f "$ltmain"; then +- trap "$rm \"${ofile}T\"; exit 1" 1 2 15 +- $rm -f "${ofile}T" +- +- echo creating $ofile +- ++ # See if we are running on zsh, and set the options which allow our commands through ++ # without removal of \ escapes. ++ if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++ fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS \ +- AR AR_FLAGS CC LD LN_S NM SHELL \ +- reload_flag reload_cmds wl \ +- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ +- thread_safe_flag_spec whole_archive_flag_spec libname_spec \ +- library_names_spec soname_spec \ +- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ +- old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ +- postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ +- old_striplib striplib file_magic_cmd export_symbols_cmds \ +- deplibs_check_method allow_undefined_flag no_undefined_flag \ +- finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ +- global_symbol_to_c_name_address \ +- hardcode_libdir_flag_spec hardcode_libdir_separator \ ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ SED SHELL STRIP \ ++ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ ++ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ ++ deplibs_check_method reload_flag reload_cmds need_locks \ ++ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ ++ lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ +- compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do ++ old_postinstall_cmds old_postuninstall_cmds \ ++ _LT_AC_TAGVAR(compiler, $1) \ ++ _LT_AC_TAGVAR(CC, $1) \ ++ _LT_AC_TAGVAR(LD, $1) \ ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ ++ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ ++ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ ++ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ ++ _LT_AC_TAGVAR(old_archive_cmds, $1) \ ++ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ ++ _LT_AC_TAGVAR(predep_objects, $1) \ ++ _LT_AC_TAGVAR(postdep_objects, $1) \ ++ _LT_AC_TAGVAR(predeps, $1) \ ++ _LT_AC_TAGVAR(postdeps, $1) \ ++ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ ++ _LT_AC_TAGVAR(archive_cmds, $1) \ ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ ++ _LT_AC_TAGVAR(postinstall_cmds, $1) \ ++ _LT_AC_TAGVAR(postuninstall_cmds, $1) \ ++ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ ++ _LT_AC_TAGVAR(allow_undefined_flag, $1) \ ++ _LT_AC_TAGVAR(no_undefined_flag, $1) \ ++ _LT_AC_TAGVAR(export_symbols_cmds, $1) \ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ ++ _LT_AC_TAGVAR(hardcode_automatic, $1) \ ++ _LT_AC_TAGVAR(module_cmds, $1) \ ++ _LT_AC_TAGVAR(module_expsym_cmds, $1) \ ++ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ ++ _LT_AC_TAGVAR(exclude_expsyms, $1) \ ++ _LT_AC_TAGVAR(include_expsyms, $1); do + + case $var in +- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ +- old_postinstall_cmds | old_postuninstall_cmds | \ +- export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ +- extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ ++ _LT_AC_TAGVAR(old_archive_cmds, $1) | \ ++ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ ++ _LT_AC_TAGVAR(archive_cmds, $1) | \ ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ ++ _LT_AC_TAGVAR(module_cmds, $1) | \ ++ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ ++ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ ++ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ ++ extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ +- finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) ++ old_postinstall_cmds | old_postuninstall_cmds | \ ++ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; +@@ -3533,14 +5185,31 @@ + esac + done + +- cat <<__EOF__ > "${ofile}T" +-#! $SHELL ++ case $lt_echo in ++ *'\[$]0 --fallback-echo"') ++ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` ++ ;; ++ esac ++ ++ifelse([$1], [], ++ [cfgfile="${ofile}T" ++ trap "$rm \"$cfgfile\"; exit 1" 1 2 15 ++ $rm -f "$cfgfile" ++ AC_MSG_NOTICE([creating $ofile])], ++ [cfgfile="$ofile"]) ++ ++ cat <<__EOF__ >> "$cfgfile" ++ifelse([$1], [], ++[#! $SHELL + +-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. ++# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. + # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) + # NOTE: Changes made to this file will be lost: look at ltmain.sh. + # +-# Copyright (C) 1996-2000 Free Software Foundation, Inc. ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 ++# Free Software Foundation, Inc. ++# ++# This file is part of GNU Libtool: + # Originally by Gordon Matzigkeit , 1996 + # + # This program is free software; you can redistribute it and/or modify +@@ -3562,14 +5231,21 @@ + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + ++# A sed program that does not truncate output. ++SED=$lt_SED ++ + # Sed that helps us avoid accidentally triggering echo(1) options like -n. +-Xsed="sed -e s/^X//" ++Xsed="$SED -e s/^X//" + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. +-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH ++ ++# The names of the tagged configurations supported by this script. ++available_tags= + +-# ### BEGIN LIBTOOL CONFIG ++# ### BEGIN LIBTOOL CONFIG], ++[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + + # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +@@ -3583,7 +5259,10 @@ + build_old_libs=$enable_static + + # Whether or not to add -lc for building shared libraries. +-build_libtool_need_lc=$need_lc ++build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) ++ ++# Whether or not to disallow shared libs when runtime libs are static ++allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + + # Whether or not to optimize for fast installation. + fast_install=$enable_fast_install +@@ -3599,14 +5278,20 @@ + AR=$lt_AR + AR_FLAGS=$lt_AR_FLAGS + +-# The default C compiler. +-CC=$lt_CC ++# A C compiler. ++LTCC=$lt_LTCC ++ ++# A language-specific compiler. ++CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + + # Is the compiler the GNU C compiler? +-with_gcc=$GCC ++with_gcc=$_LT_AC_TAGVAR(GCC, $1) ++ ++# An ERE matcher. ++EGREP=$lt_EGREP + + # The linker used to build libraries. +-LD=$lt_LD ++LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + + # Whether we need hard or soft links. + LN_S=$lt_LN_S +@@ -3615,7 +5300,7 @@ + NM=$lt_NM + + # A symbol stripping program +-STRIP=$STRIP ++STRIP=$lt_STRIP + + # Used to examine libraries when file_magic_cmd begins "file" + MAGIC_CMD=$MAGIC_CMD +@@ -3637,7 +5322,7 @@ + reload_cmds=$lt_reload_cmds + + # How to pass a linker flag through the compiler. +-wl=$lt_wl ++wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + + # Object file suffix (normally "o"). + objext="$ac_objext" +@@ -3645,18 +5330,21 @@ + # Old archive suffix (normally "a"). + libext="$libext" + ++# Shared library suffix (normally ".so"). ++shrext_cmds='$shrext_cmds' ++ + # Executable file suffix (normally ""). + exeext="$exeext" + + # Additional compiler flags for building library objects. +-pic_flag=$lt_pic_flag ++pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + pic_mode=$pic_mode + +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$lt_compiler_c_o ++# What is the maximum length of a command? ++max_cmd_len=$lt_cv_sys_max_cmd_len + +-# Can we write directly to a .lo ? +-compiler_o_lo=$lt_compiler_o_lo ++# Does compiler simultaneously support -c and -o options? ++compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + + # Must we lock files when doing compilation ? + need_locks=$lt_need_locks +@@ -3677,939 +5365,1794 @@ + dlopen_self_static=$enable_dlopen_self_static + + # Compiler flag to prevent dynamic linking. +-link_static_flag=$lt_link_static_flag ++link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + + # Compiler flag to turn off builtin functions. +-no_builtin_flag=$lt_no_builtin_flag ++no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + + # Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec ++export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + + # Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$lt_whole_archive_flag_spec ++whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + + # Compiler flag to generate thread-safe objects. +-thread_safe_flag_spec=$lt_thread_safe_flag_spec ++thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) ++ ++# Library versioning type. ++version_type=$version_type ++ ++# Format of library name prefix. ++libname_spec=$lt_libname_spec ++ ++# List of archive names. First name is the real one, the rest are links. ++# The last name is the one that the linker finds with -lNAME. ++library_names_spec=$lt_library_names_spec ++ ++# The coded name of the library, if different from the real name. ++soname_spec=$lt_soname_spec ++ ++# Commands used to build and install an old-style archive. ++RANLIB=$lt_RANLIB ++old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) ++old_postinstall_cmds=$lt_old_postinstall_cmds ++old_postuninstall_cmds=$lt_old_postuninstall_cmds ++ ++# Create an old-style archive from a shared archive. ++old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) ++ ++# Create a temporary old-style archive to link instead of a shared archive. ++old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) ++ ++# Commands used to build and install a shared archive. ++archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) ++archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) ++postinstall_cmds=$lt_postinstall_cmds ++postuninstall_cmds=$lt_postuninstall_cmds ++ ++# Commands used to build a loadable module (assumed same as above if empty) ++module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) ++module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) ++ ++# Commands to strip libraries. ++old_striplib=$lt_old_striplib ++striplib=$lt_striplib ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) ++ ++# The library search path used internally by the compiler when linking ++# a shared library. ++compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) ++ ++# Method to check whether dependent libraries are shared objects. ++deplibs_check_method=$lt_deplibs_check_method ++ ++# Command to use when deplibs_check_method == file_magic. ++file_magic_cmd=$lt_file_magic_cmd ++ ++# Flag that allows shared libraries with undefined symbols to be built. ++allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) ++ ++# Flag that forces no undefined symbols. ++no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) ++ ++# Commands used to finish a libtool library installation in a directory. ++finish_cmds=$lt_finish_cmds ++ ++# Same as above, but a single script fragment to be evaled but not shown. ++finish_eval=$lt_finish_eval ++ ++# Take the output of nm and produce a listing of raw symbols and C names. ++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe ++ ++# Transform the output of nm in a proper C declaration ++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl ++ ++# Transform the output of nm in a C name address pair ++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address ++ ++# This is the shared library runtime path variable. ++runpath_var=$runpath_var ++ ++# This is the shared library path variable. ++shlibpath_var=$shlibpath_var ++ ++# Is shlibpath searched before the hard-coded library search path? ++shlibpath_overrides_runpath=$shlibpath_overrides_runpath ++ ++# How to hardcode a shared library path into an executable. ++hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) ++ ++# Whether we should hardcode library paths into libraries. ++hardcode_into_libs=$hardcode_into_libs ++ ++# Flag to hardcode \$libdir into a binary during linking. ++# This must work even if \$libdir does not exist. ++hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) ++ ++# If ld is used when linking, flag to hardcode \$libdir into ++# a binary during linking. This must work even if \$libdir does ++# not exist. ++hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) ++ ++# Whether we need a single -rpath flag with a separated argument. ++hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) ++ ++# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the ++# resulting binary. ++hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) ++ ++# Set to yes if using the -LDIR flag during linking hardcodes DIR into the ++# resulting binary. ++hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) ++ ++# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into ++# the resulting binary. ++hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) ++ ++# Set to yes if building a shared library automatically hardcodes DIR into the library ++# and all subsequent libraries and executables linked against it. ++hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) ++ ++# Variables whose values should be saved in libtool wrapper scripts and ++# restored at relink time. ++variables_saved_for_relink="$variables_saved_for_relink" ++ ++# Whether libtool must link a program against all its dependency libraries. ++link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) ++ ++# Compile-time system search path for libraries ++sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++ ++# Run-time system search path for libraries ++sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec ++ ++# Fix the shell variable \$srcfile for the compiler. ++fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" ++ ++# Set to yes if exported symbols are required. ++always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) ++ ++# The commands to list exported symbols. ++export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) ++ ++# The commands to extract the exported symbol list from a shared archive. ++extract_expsyms_cmds=$lt_extract_expsyms_cmds ++ ++# Symbols that should not be listed in the preloaded symbols. ++exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) ++ ++# Symbols that must always be exported. ++include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ++ ++ifelse([$1],[], ++[# ### END LIBTOOL CONFIG], ++[# ### END LIBTOOL TAG CONFIG: $tagname]) ++ ++__EOF__ ++ ++ifelse([$1],[], [ ++ case $host_os in ++ aix3*) ++ cat <<\EOF >> "$cfgfile" ++ ++# AIX sometimes has problems with the GCC collect2 program. For some ++# reason, if we set the COLLECT_NAMES environment variable, the problems ++# vanish in a puff of smoke. ++if test "X${COLLECT_NAMES+set}" != Xset; then ++ COLLECT_NAMES= ++ export COLLECT_NAMES ++fi ++EOF ++ ;; ++ esac ++ ++ # We use sed instead of cat because bash on DJGPP gets confused if ++ # if finds mixed CR/LF and LF-only lines. Since sed operates in ++ # text mode, it properly converts lines to CR/LF. This bash problem ++ # is reportedly fixed, but why not run on old versions too? ++ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) ++ ++ mv -f "$cfgfile" "$ofile" || \ ++ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") ++ chmod +x "$ofile" ++]) ++else ++ # If there is no Makefile yet, we rely on a make rule to execute ++ # `config.status --recheck' to rerun these tests and create the ++ # libtool script then. ++ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` ++ if test -f "$ltmain_in"; then ++ test -f Makefile && make "$ltmain" ++ fi ++fi ++])# AC_LIBTOOL_CONFIG ++ ++ ++# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) ++# ------------------------------------------- ++AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], ++[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl ++ ++_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= ++ ++if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ++ ++ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], ++ lt_cv_prog_compiler_rtti_exceptions, ++ [-fno-rtti -fno-exceptions], [], ++ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) ++fi ++])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI ++ ++ ++# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE ++# --------------------------------- ++AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], ++[AC_REQUIRE([AC_CANONICAL_HOST]) ++AC_REQUIRE([AC_PROG_NM]) ++AC_REQUIRE([AC_OBJEXT]) ++# Check for command to grab the raw symbol name followed by C symbol from nm. ++AC_MSG_CHECKING([command to parse $NM output from $compiler object]) ++AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], ++[ ++# These are sane defaults that work on at least a few old systems. ++# [They come from Ultrix. What could be older than Ultrix?!! ;)] ++ ++# Character class describing NM global symbol codes. ++symcode='[[BCDEGRST]]' ++ ++# Regexp to match symbols that can be accessed directly from C. ++sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' ++ ++# Transform the above into a raw symbol and a C symbol. ++symxfrm='\1 \2\3 \3' ++ ++# Transform an extracted symbol line into a proper C declaration ++lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +-# Library versioning type. +-version_type=$version_type ++# Transform an extracted symbol line into symbol name and symbol address ++lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +-# Format of library name prefix. +-libname_spec=$lt_libname_spec ++# Define system-specific variables. ++case $host_os in ++aix*) ++ symcode='[[BCDT]]' ++ ;; ++cygwin* | mingw* | pw32*) ++ symcode='[[ABCDGISTW]]' ++ ;; ++hpux*) # Its linker distinguishes data from code symbols ++ if test "$host_cpu" = ia64; then ++ symcode='[[ABCDEGRST]]' ++ fi ++ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" ++ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++ ;; ++linux*) ++ if test "$host_cpu" = ia64; then ++ symcode='[[ABCDGIRSTW]]' ++ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" ++ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++ fi ++ ;; ++irix* | nonstopux*) ++ symcode='[[BCDEGRST]]' ++ ;; ++osf*) ++ symcode='[[BCDEGQRST]]' ++ ;; ++solaris* | sysv5*) ++ symcode='[[BDRT]]' ++ ;; ++sysv4) ++ symcode='[[DFNSTU]]' ++ ;; ++esac + +-# List of archive names. First name is the real one, the rest are links. +-# The last name is the one that the linker finds with -lNAME. +-library_names_spec=$lt_library_names_spec ++# Handle CRLF in mingw tool chain ++opt_cr= ++case $build_os in ++mingw*) ++ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ++ ;; ++esac + +-# The coded name of the library, if different from the real name. +-soname_spec=$lt_soname_spec ++# If we're using GNU nm, then use its standard symbol codes. ++case `$NM -V 2>&1` in ++*GNU* | *'with BFD'*) ++ symcode='[[ABCDGIRSTW]]' ;; ++esac + +-# Commands used to build and install an old-style archive. +-RANLIB=$lt_RANLIB +-old_archive_cmds=$lt_old_archive_cmds +-old_postinstall_cmds=$lt_old_postinstall_cmds +-old_postuninstall_cmds=$lt_old_postuninstall_cmds ++# Try without a prefix undercore, then with it. ++for ac_symprfx in "" "_"; do + +-# Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds ++ # Write the raw and C identifiers. ++ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + +-# Create a temporary old-style archive to link instead of a shared archive. +-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds ++ # Check to see that the pipe works correctly. ++ pipe_works=no + +-# Commands used to build and install a shared archive. +-archive_cmds=$lt_archive_cmds +-archive_expsym_cmds=$lt_archive_expsym_cmds +-postinstall_cmds=$lt_postinstall_cmds +-postuninstall_cmds=$lt_postuninstall_cmds ++ rm -f conftest* ++ cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then ++ # Try sorting and uniquifying the output. ++ if sort "$nlist" | uniq > "$nlist"T; then ++ mv -f "$nlist"T "$nlist" ++ else ++ rm -f "$nlist"T ++ fi + +-# Method to check whether dependent libraries are shared objects. +-deplibs_check_method=$lt_deplibs_check_method ++ # Make sure that we snagged all the symbols we need. ++ if grep ' nm_test_var$' "$nlist" >/dev/null; then ++ if grep ' nm_test_func$' "$nlist" >/dev/null; then ++ cat < conftest.$ac_ext ++#ifdef __cplusplus ++extern "C" { ++#endif + +-# Command to use when deplibs_check_method == file_magic. +-file_magic_cmd=$lt_file_magic_cmd ++EOF ++ # Now generate the symbol file. ++ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + +-# Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$lt_allow_undefined_flag ++ cat <> conftest.$ac_ext ++#if defined (__STDC__) && __STDC__ ++# define lt_ptr_t void * ++#else ++# define lt_ptr_t char * ++# define const ++#endif + +-# Flag that forces no undefined symbols. +-no_undefined_flag=$lt_no_undefined_flag ++/* The mapping between symbol names and symbols. */ ++const struct { ++ const char *name; ++ lt_ptr_t address; ++} ++lt_preloaded_symbols[[]] = ++{ ++EOF ++ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext ++ cat <<\EOF >> conftest.$ac_ext ++ {0, (lt_ptr_t) 0} ++}; + +-# Commands used to finish a libtool library installation in a directory. +-finish_cmds=$lt_finish_cmds ++#ifdef __cplusplus ++} ++#endif ++EOF ++ # Now try linking the two files. ++ mv conftest.$ac_objext conftstm.$ac_objext ++ lt_save_LIBS="$LIBS" ++ lt_save_CFLAGS="$CFLAGS" ++ LIBS="conftstm.$ac_objext" ++ CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" ++ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then ++ pipe_works=yes ++ fi ++ LIBS="$lt_save_LIBS" ++ CFLAGS="$lt_save_CFLAGS" ++ else ++ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD ++ fi ++ else ++ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD ++ fi ++ else ++ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD ++ fi ++ else ++ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD ++ cat conftest.$ac_ext >&5 ++ fi ++ rm -f conftest* conftst* + +-# Same as above, but a single script fragment to be evaled but not shown. +-finish_eval=$lt_finish_eval ++ # Do not use the global_symbol_pipe unless it works. ++ if test "$pipe_works" = yes; then ++ break ++ else ++ lt_cv_sys_global_symbol_pipe= ++ fi ++done ++]) ++if test -z "$lt_cv_sys_global_symbol_pipe"; then ++ lt_cv_sys_global_symbol_to_cdecl= ++fi ++if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then ++ AC_MSG_RESULT(failed) ++else ++ AC_MSG_RESULT(ok) ++fi ++]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + +-# Take the output of nm and produce a listing of raw symbols and C names. +-global_symbol_pipe=$lt_global_symbol_pipe + +-# Transform the output of nm in a proper C declaration +-global_symbol_to_cdecl=$lt_global_symbol_to_cdecl ++# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) ++# --------------------------------------- ++AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], ++[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= ++_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ++_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +-# Transform the output of nm in a C name address pair +-global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address ++AC_MSG_CHECKING([for $compiler option to produce PIC]) ++ ifelse([$1],[CXX],[ ++ # C++ specific cases for pic, static, wl, etc. ++ if test "$GXX" = yes; then ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + +-# This is the shared library runtime path variable. +-runpath_var=$runpath_var ++ case $host_os in ++ aix*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ fi ++ ;; ++ amigaos*) ++ # FIXME: we need at least 68020 code to build shared libraries, but ++ # adding the `-m68020' flag to GCC prevents building anything better, ++ # like `-m68040'. ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ++ ;; ++ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) ++ # PIC is the default for these OSes. ++ ;; ++ mingw* | os2* | pw32*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ++ ;; ++ darwin* | rhapsody*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ++ ;; ++ *djgpp*) ++ # DJGPP does not support shared libraries at all ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ++ ;; ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic ++ fi ++ ;; ++ hpux*) ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ ;; ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ ;; ++ esac ++ ;; ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ ;; ++ esac ++ else ++ case $host_os in ++ aix4* | aix5*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ else ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' ++ fi ++ ;; ++ chorus*) ++ case $cc_basename in ++ cxch68) ++ # Green Hills C++ Compiler ++ # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ++ ;; ++ esac ++ ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case "$cc_basename" in ++ xlc*) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ ;; ++ esac ++ ;; ++ dgux*) ++ case $cc_basename in ++ ec++) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ ;; ++ ghcx) ++ # Green Hills C++ Compiler ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ freebsd* | kfreebsd*-gnu) ++ # FreeBSD uses GNU C++ ++ ;; ++ hpux9* | hpux10* | hpux11*) ++ case $cc_basename in ++ CC) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" ++ if test "$host_cpu" != ia64; then ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ++ fi ++ ;; ++ aCC) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ++ ;; ++ esac ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ irix5* | irix6* | nonstopux*) ++ case $cc_basename in ++ CC) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ++ # CC pic flag -KPIC is the default. ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ linux*) ++ case $cc_basename in ++ KCC) ++ # KAI C++ Compiler ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ ;; ++ icpc) ++ # Intel C++ ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ++ ;; ++ cxx) ++ # Compaq C++ ++ # Make sure the PIC flag is empty. It appears that all Alpha ++ # Linux and Compaq Tru64 Unix objects are PIC. ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ lynxos*) ++ ;; ++ m88k*) ++ ;; ++ mvs*) ++ case $cc_basename in ++ cxx) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ netbsd*) ++ ;; ++ osf3* | osf4* | osf5*) ++ case $cc_basename in ++ KCC) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ++ ;; ++ RCC) ++ # Rational C++ 2.4.1 ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ++ ;; ++ cxx) ++ # Digital/Compaq C++ ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ # Make sure the PIC flag is empty. It appears that all Alpha ++ # Linux and Compaq Tru64 Unix objects are PIC. ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ psos*) ++ ;; ++ sco*) ++ case $cc_basename in ++ CC) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ solaris*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.2, 5.x and Centerline C++ ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ++ ;; ++ gcx) ++ # Green Hills C++ Compiler ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ sunos4*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.x ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; ++ lcc) ++ # Lucid ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ tandem*) ++ case $cc_basename in ++ NCC) ++ # NonStop-UX NCC 3.20 ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ unixware*) ++ ;; ++ vxworks*) ++ ;; ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ++ ;; ++ esac ++ fi ++], ++[ ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + +-# This is the shared library path variable. +-shlibpath_var=$shlibpath_var ++ case $host_os in ++ aix*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ fi ++ ;; + +-# Is shlibpath searched before the hard-coded library search path? +-shlibpath_overrides_runpath=$shlibpath_overrides_runpath ++ amigaos*) ++ # FIXME: we need at least 68020 code to build shared libraries, but ++ # adding the `-m68020' flag to GCC prevents building anything better, ++ # like `-m68040'. ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ++ ;; + +-# How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action ++ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) ++ # PIC is the default for these OSes. ++ ;; + +-# Whether we should hardcode library paths into libraries. +-hardcode_into_libs=$hardcode_into_libs ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ++ ;; + +-# Flag to hardcode \$libdir into a binary during linking. +-# This must work even if \$libdir does not exist. +-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec ++ darwin* | rhapsody*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ++ ;; + +-# Whether we need a single -rpath flag with a separated argument. +-hardcode_libdir_separator=$lt_hardcode_libdir_separator ++ msdosdjgpp*) ++ # Just because we use GCC doesn't mean we suddenly get shared libraries ++ # on systems that don't support them. ++ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ++ enable_shared=no ++ ;; + +-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +-# resulting binary. +-hardcode_direct=$hardcode_direct ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic ++ fi ++ ;; + +-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +-# resulting binary. +-hardcode_minus_L=$hardcode_minus_L ++ hpux*) ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ ;; ++ esac ++ ;; + +-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +-# the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ++ ;; ++ esac ++ else ++ # PORTME Check for flag to pass linker flags through the system compiler. ++ case $host_os in ++ aix*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ else ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' ++ fi ++ ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case "$cc_basename" in ++ xlc*) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ ;; ++ esac ++ ;; + +-# Variables whose values should be saved in libtool wrapper scripts and +-# restored at relink time. +-variables_saved_for_relink="$variables_saved_for_relink" ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ++ ;; + +-# Whether libtool must link a program against all its dependency libraries. +-link_all_deplibs=$link_all_deplibs ++ hpux9* | hpux10* | hpux11*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ++ ;; ++ esac ++ # Is there a better lt_prog_compiler_static that works with the bundled CC? ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ++ ;; + +-# Compile-time system search path for libraries +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++ irix5* | irix6* | nonstopux*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ # PIC (with -KPIC) is the default. ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ++ ;; + +-# Run-time system search path for libraries +-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec ++ newsos6) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; + +-# Fix the shell variable \$srcfile for the compiler. +-fix_srcfile_path="$fix_srcfile_path" ++ linux*) ++ case $CC in ++ icc* | ecc*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ++ ;; ++ ccc*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ # All Alpha code is PIC. ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ++ ;; ++ esac ++ ;; + +-# Set to yes if exported symbols are required. +-always_export_symbols=$always_export_symbols ++ osf3* | osf4* | osf5*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ # All OSF/1 code is PIC. ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ++ ;; + +-# The commands to list exported symbols. +-export_symbols_cmds=$lt_export_symbols_cmds ++ sco3.2v5*) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' ++ ;; + +-# The commands to extract the exported symbol list from a shared archive. +-extract_expsyms_cmds=$lt_extract_expsyms_cmds ++ solaris*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; + +-# Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$lt_exclude_expsyms ++ sunos4*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; + +-# Symbols that must always be exported. +-include_expsyms=$lt_include_expsyms ++ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; + +-# ### END LIBTOOL CONFIG ++ sysv4*MP*) ++ if test -d /usr/nec ;then ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ fi ++ ;; + +-__EOF__ ++ uts4*) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; + +- case $host_os in +- aix3*) +- cat <<\EOF >> "${ofile}T" ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ++ ;; ++ esac ++ fi ++]) ++AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +-# AIX sometimes has problems with the GCC collect2 program. For some +-# reason, if we set the COLLECT_NAMES environment variable, the problems +-# vanish in a puff of smoke. +-if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES ++# ++# Check to make sure the PIC flag actually works. ++# ++if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then ++ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], ++ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), ++ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], ++ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in ++ "" | " "*) ;; ++ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; ++ esac], ++ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ++ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) + fi +-EOF ++case "$host_os" in ++ # For platforms which do not support PIC, -DPIC is meaningless: ++ *djgpp*) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; +- esac ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ++ ;; ++esac ++]) + ++ ++# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) ++# ------------------------------------ ++# See if the linker supports building shared libraries. ++AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], ++[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ++ifelse([$1],[CXX],[ ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in +- cygwin* | mingw* | pw32* | os2*) +- cat <<'EOF' >> "${ofile}T" +- # This is a source program that is used to create dlls on Windows +- # Don't remove nor modify the starting and closing comments +-# /* ltdll.c starts here */ +-# #define WIN32_LEAN_AND_MEAN +-# #include +-# #undef WIN32_LEAN_AND_MEAN +-# #include +-# +-# #ifndef __CYGWIN__ +-# # ifdef __CYGWIN32__ +-# # define __CYGWIN__ __CYGWIN32__ +-# # endif +-# #endif +-# +-# #ifdef __cplusplus +-# extern "C" { +-# #endif +-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +-# #ifdef __cplusplus +-# } +-# #endif +-# +-# #ifdef __CYGWIN__ +-# #include +-# DECLARE_CYGWIN_DLL( DllMain ); +-# #endif +-# HINSTANCE __hDllInstance_base; +-# +-# BOOL APIENTRY +-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +-# { +-# __hDllInstance_base = hInst; +-# return TRUE; +-# } +-# /* ltdll.c ends here */ +- # This is a source program that is used to create import libraries +- # on Windows for dlls which lack them. Don't remove nor modify the +- # starting and closing comments +-# /* impgen.c starts here */ +-# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +-# +-# This file is part of GNU libtool. +-# +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. +-# +-# This program 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 this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +-# */ +-# +-# #include /* for printf() */ +-# #include /* for open(), lseek(), read() */ +-# #include /* for O_RDONLY, O_BINARY */ +-# #include /* for strdup() */ +-# +-# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +-# #ifndef O_BINARY +-# #define O_BINARY 0 +-# #endif +-# +-# static unsigned int +-# pe_get16 (fd, offset) +-# int fd; +-# int offset; +-# { +-# unsigned char b[2]; +-# lseek (fd, offset, SEEK_SET); +-# read (fd, b, 2); +-# return b[0] + (b[1]<<8); +-# } +-# +-# static unsigned int +-# pe_get32 (fd, offset) +-# int fd; +-# int offset; +-# { +-# unsigned char b[4]; +-# lseek (fd, offset, SEEK_SET); +-# read (fd, b, 4); +-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +-# } +-# +-# static unsigned int +-# pe_as32 (ptr) +-# void *ptr; +-# { +-# unsigned char *b = ptr; +-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +-# } +-# +-# int +-# main (argc, argv) +-# int argc; +-# char *argv[]; +-# { +-# int dll; +-# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +-# unsigned long export_rva, export_size, nsections, secptr, expptr; +-# unsigned long name_rvas, nexp; +-# unsigned char *expdata, *erva; +-# char *filename, *dll_name; +-# +-# filename = argv[1]; +-# +-# dll = open(filename, O_RDONLY|O_BINARY); +-# if (dll < 1) +-# return 1; +-# +-# dll_name = filename; +-# +-# for (i=0; filename[i]; i++) +-# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +-# dll_name = filename + i +1; +-# +-# pe_header_offset = pe_get32 (dll, 0x3c); +-# opthdr_ofs = pe_header_offset + 4 + 20; +-# num_entries = pe_get32 (dll, opthdr_ofs + 92); +-# +-# if (num_entries < 1) /* no exports */ +-# return 1; +-# +-# export_rva = pe_get32 (dll, opthdr_ofs + 96); +-# export_size = pe_get32 (dll, opthdr_ofs + 100); +-# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +-# secptr = (pe_header_offset + 4 + 20 + +-# pe_get16 (dll, pe_header_offset + 4 + 16)); +-# +-# expptr = 0; +-# for (i = 0; i < nsections; i++) +-# { +-# char sname[8]; +-# unsigned long secptr1 = secptr + 40 * i; +-# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +-# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +-# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +-# lseek(dll, secptr1, SEEK_SET); +-# read(dll, sname, 8); +-# if (vaddr <= export_rva && vaddr+vsize > export_rva) +-# { +-# expptr = fptr + (export_rva - vaddr); +-# if (export_rva + export_size > vaddr + vsize) +-# export_size = vsize - (export_rva - vaddr); +-# break; +-# } +-# } +-# +-# expdata = (unsigned char*)malloc(export_size); +-# lseek (dll, expptr, SEEK_SET); +-# read (dll, expdata, export_size); +-# erva = expdata - export_rva; +-# +-# nexp = pe_as32 (expdata+24); +-# name_rvas = pe_as32 (expdata+32); +-# +-# printf ("EXPORTS\n"); +-# for (i = 0; i&1 | grep 'GNU' > /dev/null; then ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' ++ else ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' ++ fi ++ ;; ++ pw32*) ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ++ ;; ++ cygwin* | mingw*) ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ++ ;; ++ *) ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ ;; ++ esac ++],[ ++ runpath_var= ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)= ++ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no ++ _LT_AC_TAGVAR(archive_cmds, $1)= ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)= ++ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= ++ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= ++ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown ++ _LT_AC_TAGVAR(hardcode_automatic, $1)=no ++ _LT_AC_TAGVAR(module_cmds, $1)= ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)= ++ _LT_AC_TAGVAR(always_export_symbols, $1)=no ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ # include_expsyms should be a list of space-separated symbols to be *always* ++ # included in the symbol list ++ _LT_AC_TAGVAR(include_expsyms, $1)= ++ # exclude_expsyms can be an extended regexp of symbols to exclude ++ # it will be wrapped by ` (' and `)$', so one must not match beginning or ++ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', ++ # as well as any symbol that contains `d'. ++ _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" ++ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out ++ # platforms (ab)use it in PIC code, but their linkers get confused if ++ # the symbol is explicitly referenced. Since portable code cannot ++ # rely on this symbol name, it's probably fine to never include it in ++ # preloaded symbol tables. ++ extract_expsyms_cmds= + +-EOF ++ case $host_os in ++ cygwin* | mingw* | pw32*) ++ # FIXME: the MSVC++ port hasn't been tested in a loooong time ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ if test "$GCC" != yes; then ++ with_gnu_ld=no ++ fi ++ ;; ++ openbsd*) ++ with_gnu_ld=no + ;; + esac + +- # We use sed instead of cat because bash on DJGPP gets confused if +- # if finds mixed CR/LF and LF-only lines. Since sed operates in +- # text mode, it properly converts lines to CR/LF. This bash problem +- # is reportedly fixed, but why not run on old versions too? +- sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=yes ++ if test "$with_gnu_ld" = yes; then ++ # If archive_cmds runs LD, not CC, wlarc should be empty ++ wlarc='${wl}' + +- mv -f "${ofile}T" "$ofile" || \ +- (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") +- chmod +x "$ofile" +-fi ++ # See if GNU ld supports shared libraries. ++ case $host_os in ++ aix3* | aix4* | aix5*) ++ # On AIX/PPC, the GNU linker is very broken ++ if test "$host_cpu" != ia64; then ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ cat <&2 + +-])# _LT_AC_LTCONFIG_HACK ++*** Warning: the GNU linker, at least up to release 2.9.1, is reported ++*** to be unable to reliably create shared libraries on AIX. ++*** Therefore, libtool is disabling shared libraries support. If you ++*** really care for shared libraries, you may want to modify your PATH ++*** so that a non-GNU linker is found, and then restart. + +-# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +-AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) ++EOF ++ fi ++ ;; + +-# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +-AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) ++ amigaos*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ ++ # Samuel A. Falvo II reports ++ # that the semantics of dynamic libraries on AmigaOS, at least up ++ # to version 4, is to share data among multiple programs linked ++ # with the same dynamic library. Since this doesn't match the ++ # behavior of shared libraries on other platforms, we can't use ++ # them. ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; + +-# AC_ENABLE_SHARED - implement the --enable-shared flag +-# Usage: AC_ENABLE_SHARED[(DEFAULT)] +-# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +-# `yes'. +-AC_DEFUN([AC_ENABLE_SHARED], +-[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +-AC_ARG_ENABLE(shared, +-changequote(<<, >>)dnl +-<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +-changequote([, ])dnl +-[p=${PACKAGE-default} +-case $enableval in +-yes) enable_shared=yes ;; +-no) enable_shared=no ;; +-*) +- enable_shared=no +- # Look at the argument we got. We use all the common list separators. +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," +- for pkg in $enableval; do +- if test "X$pkg" = "X$p"; then +- enable_shared=yes +- fi +- done +- IFS="$ac_save_ifs" +- ;; +-esac], +-enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +-]) ++ beos*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported ++ # Joseph Beckenbach says some releases of gcc ++ # support --undefined. This deserves some investigation. FIXME ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; + +-# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +-AC_DEFUN([AC_DISABLE_SHARED], +-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +-AC_ENABLE_SHARED(no)]) ++ cygwin* | mingw* | pw32*) ++ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, ++ # as there is no search path for DLLs. ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported ++ _LT_AC_TAGVAR(always_export_symbols, $1)=no ++ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ++ ++ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ # If the export-symbols file already is a .def file (1st line ++ # is EXPORTS), use it as is; otherwise, prepend... ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ cp $export_symbols $output_objdir/$soname.def; ++ else ++ echo EXPORTS > $output_objdir/$soname.def; ++ cat $export_symbols >> $output_objdir/$soname.def; ++ fi~ ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; + +-# AC_ENABLE_STATIC - implement the --enable-static flag +-# Usage: AC_ENABLE_STATIC[(DEFAULT)] +-# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +-# `yes'. +-AC_DEFUN([AC_ENABLE_STATIC], +-[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +-AC_ARG_ENABLE(static, +-changequote(<<, >>)dnl +-<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +-changequote([, ])dnl +-[p=${PACKAGE-default} +-case $enableval in +-yes) enable_static=yes ;; +-no) enable_static=no ;; +-*) +- enable_static=no +- # Look at the argument we got. We use all the common list separators. +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," +- for pkg in $enableval; do +- if test "X$pkg" = "X$p"; then +- enable_static=yes +- fi +- done +- IFS="$ac_save_ifs" +- ;; +-esac], +-enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +-]) ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' ++ wlarc= ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ fi ++ ;; + +-# AC_DISABLE_STATIC - set the default static flag to --disable-static +-AC_DEFUN([AC_DISABLE_STATIC], +-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +-AC_ENABLE_STATIC(no)]) ++ solaris* | sysv5*) ++ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ cat <&2 ++ ++*** Warning: The releases 2.8.* of the GNU linker cannot reliably ++*** create shared libraries on Solaris systems. Therefore, libtool ++*** is disabling shared libraries support. We urge you to upgrade GNU ++*** binutils to release 2.9.1 or newer. Another option is to modify ++*** your PATH or compiler configuration so that the native linker is ++*** used, and then restart. ++ ++EOF ++ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ ++ sunos4*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ wlarc= ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" ++ fi ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; + ++ *) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ esac + +-# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +-# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +-# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +-# `yes'. +-AC_DEFUN([AC_ENABLE_FAST_INSTALL], +-[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +-AC_ARG_ENABLE(fast-install, +-changequote(<<, >>)dnl +-<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +-changequote([, ])dnl +-[p=${PACKAGE-default} +-case $enableval in +-yes) enable_fast_install=yes ;; +-no) enable_fast_install=no ;; +-*) +- enable_fast_install=no +- # Look at the argument we got. We use all the common list separators. +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," +- for pkg in $enableval; do +- if test "X$pkg" = "X$p"; then +- enable_fast_install=yes ++ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then ++ runpath_var=LD_RUN_PATH ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= ++ fi + fi +- done +- IFS="$ac_save_ifs" +- ;; +-esac], +-enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +-]) ++ else ++ # PORTME fill in a description of your system's linker (not GNU ld) ++ case $host_os in ++ aix3*) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported ++ _LT_AC_TAGVAR(always_export_symbols, $1)=yes ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' ++ # Note: this linker hardcodes the directories in LIBPATH if there ++ # are no directories specified by -L. ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ if test "$GCC" = yes && test -z "$link_static_flag"; then ++ # Neither direct hardcoding nor static linking is supported with a ++ # broken collect2. ++ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported ++ fi ++ ;; + +-# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install +-AC_DEFUN([AC_DISABLE_FAST_INSTALL], +-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +-AC_ENABLE_FAST_INSTALL(no)]) ++ aix4* | aix5*) ++ if test "$host_cpu" = ia64; then ++ # On IA64, the linker does run time linking by default, so we don't ++ # have to do anything special. ++ aix_use_runtimelinking=no ++ exp_sym_flag='-Bexport' ++ no_entry_flag="" ++ else ++ # If we're using GNU nm, then we don't want the "-C" option. ++ # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' ++ else ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' ++ fi ++ aix_use_runtimelinking=no + +-# AC_LIBTOOL_PICMODE - implement the --with-pic flag +-# Usage: AC_LIBTOOL_PICMODE[(MODE)] +-# Where MODE is either `yes' or `no'. If omitted, it defaults to +-# `both'. +-AC_DEFUN([AC_LIBTOOL_PICMODE], +-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +-pic_mode=ifelse($#,1,$1,default)]) ++ # Test if we are trying to use run time linking or normal ++ # AIX style linking. If -brtl is somewhere in LDFLAGS, we ++ # need to do runtime linking. ++ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) ++ for ld_flag in $LDFLAGS; do ++ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then ++ aix_use_runtimelinking=yes ++ break ++ fi ++ done ++ esac + ++ exp_sym_flag='-bexport' ++ no_entry_flag='-bnoentry' ++ fi + +-# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library +-AC_DEFUN([AC_PATH_TOOL_PREFIX], +-[AC_MSG_CHECKING([for $1]) +-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +-[case $MAGIC_CMD in +- /*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +- ?:/*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. +- ;; +- *) +- ac_save_MAGIC_CMD="$MAGIC_CMD" +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +-dnl $ac_dummy forces splitting on constant user-supplied paths. +-dnl POSIX.2 word splitting is done only on the output of word expansions, +-dnl not every word. This closes a longstanding sh security hole. +- ac_dummy="ifelse([$2], , $PATH, [$2])" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$1; then +- lt_cv_path_MAGIC_CMD="$ac_dir/$1" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- egrep "$file_magic_regex" > /dev/null; then +- : ++ # When large executables or shared objects are built, AIX ld can ++ # have problems creating the table of contents. If linking a library ++ # or program results in "error TOC overflow" add -mminimal-toc to ++ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not ++ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. ++ ++ _LT_AC_TAGVAR(archive_cmds, $1)='' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ ++ if test "$GCC" = yes; then ++ case $host_os in aix4.[012]|aix4.[012].*) ++ # We only want to do this on AIX 4.2 and lower, the check ++ # below for broken collect2 doesn't work under 4.3+ ++ collect2name=`${CC} -print-prog-name=collect2` ++ if test -f "$collect2name" && \ ++ strings "$collect2name" | grep resolve_lib_name >/dev/null ++ then ++ # We have reworked collect2 ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else +- cat <&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-EOF +- fi ;; ++ # We have old collect2 ++ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported ++ # It fails to find uninstalled libraries when the uninstalled ++ # path is not listed in the libpath. Setting hardcode_minus_L ++ # to unsupported forces relinking ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= ++ fi + esac ++ shared_flag='-shared' ++ else ++ # not using gcc ++ if test "$host_cpu" = ia64; then ++ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release ++ # chokes on -Wl,-G. The following line is correct: ++ shared_flag='-G' ++ else ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag='${wl}-G' ++ else ++ shared_flag='${wl}-bM:SRE' ++ fi ++ fi + fi +- break +- fi +- done +- IFS="$ac_save_ifs" +- MAGIC_CMD="$ac_save_MAGIC_CMD" +- ;; +-esac]) +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- AC_MSG_RESULT($MAGIC_CMD) +-else +- AC_MSG_RESULT(no) +-fi +-]) + ++ # It seems that -bexpall does not export symbols beginning with ++ # underscore (_), so it is better to generate a list of symbols to export. ++ _LT_AC_TAGVAR(always_export_symbols, $1)=yes ++ if test "$aix_use_runtimelinking" = yes; then ++ # Warning - without using the other runtime loading flags (-brtl), ++ # -berok will link without error, but may produce a broken library. ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' ++ # Determine the default libpath from the value encoded in an empty executable. ++ _LT_AC_SYS_LIBPATH_AIX ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ else ++ if test "$host_cpu" = ia64; then ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ else ++ # Determine the default libpath from the value encoded in an empty executable. ++ _LT_AC_SYS_LIBPATH_AIX ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" ++ # Warning - without using the other run time loading flags, ++ # -berok will link without error, but may produce a broken library. ++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' ++ # -bexpall does not export symbols beginning with underscore (_) ++ _LT_AC_TAGVAR(always_export_symbols, $1)=yes ++ # Exported symbols can be pulled into shared objects from archives ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes ++ # This is similar to how AIX traditionally builds it's shared libraries. ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ fi ++ fi ++ ;; + +-# AC_PATH_MAGIC - find a file program which can recognise a shared library +-AC_DEFUN([AC_PATH_MAGIC], +-[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl +-AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH) +-if test -z "$lt_cv_path_MAGIC_CMD"; then +- if test -n "$ac_tool_prefix"; then +- AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH) +- else +- MAGIC_CMD=: +- fi +-fi +-]) ++ amigaos*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ # see comment about different semantics on the GNU ld section ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; + ++ bsdi[[45]]*) ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ++ ;; + +-# AC_PROG_LD - find the path to the GNU or non-GNU linker +-AC_DEFUN([AC_PROG_LD], +-[AC_ARG_WITH(gnu-ld, +-[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +-test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +-AC_REQUIRE([AC_PROG_CC])dnl +-AC_REQUIRE([AC_CANONICAL_HOST])dnl +-AC_REQUIRE([AC_CANONICAL_BUILD])dnl +-AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +-ac_prog=ld +-if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- AC_MSG_CHECKING([for ld used by GCC]) +- case $host in +- *-*-mingw*) +- # gcc leaves a trailing carriage return which upsets mingw +- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $ac_prog in +- # Accept absolute paths. +- [[\\/]]* | [[A-Za-z]]:[[\\/]]*) +- re_direlt='/[[^/]][[^/]]*/\.\./' +- # Canonicalize the path of ld +- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` +- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" ++ cygwin* | mingw* | pw32*) ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ # hardcode_libdir_flag_spec is actually meaningless, as there is ++ # no search path for DLLs. ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' ++ # The linker will automatically build a .lib file if we build a DLL. ++ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' ++ # FIXME: Should let the user specify the lib program. ++ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' ++ fix_srcfile_path='`cygpath -w "$srcfile"`' ++ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +-elif test "$with_gnu_ld" = yes; then +- AC_MSG_CHECKING([for GNU ld]) +-else +- AC_MSG_CHECKING([for non-GNU ld]) +-fi +-AC_CACHE_VAL(lt_cv_path_LD, +-[if test -z "$LD"; then +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- lt_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some GNU ld's only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then +- test "$with_gnu_ld" != no && break +- else +- test "$with_gnu_ld" != yes && break +- fi ++ ++ darwin* | rhapsody*) ++ case "$host_os" in ++ rhapsody* | darwin1.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case "$cc_basename" in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac + fi +- done +- IFS="$ac_save_ifs" +-else +- lt_cv_path_LD="$LD" # Let the user override the test with a path. +-fi]) +-LD="$lt_cv_path_LD" +-if test -n "$LD"; then +- AC_MSG_RESULT($LD) +-else +- AC_MSG_RESULT(no) +-fi +-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +-AC_PROG_LD_GNU +-]) ++ ;; + +-# AC_PROG_LD_GNU - +-AC_DEFUN([AC_PROG_LD_GNU], +-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +-[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +-if $LD -v 2>&1 &5; then +- lt_cv_prog_gnu_ld=yes +-else +- lt_cv_prog_gnu_ld=no +-fi]) +-with_gnu_ld=$lt_cv_prog_gnu_ld +-]) ++ dgux*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; + +-# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker +-# -- PORTME Some linkers may need a different reload flag. +-AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +-[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag, +-[lt_cv_ld_reload_flag='-r']) +-reload_flag=$lt_cv_ld_reload_flag +-test -n "$reload_flag" && reload_flag=" $reload_flag" +-]) ++ freebsd1*) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; + +-# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies +-# -- PORTME fill in with the dynamic library characteristics +-AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +-[AC_CACHE_CHECK([how to recognise dependant libraries], +-lt_cv_deplibs_check_method, +-[lt_cv_file_magic_cmd='$MAGIC_CMD' +-lt_cv_file_magic_test_file= +-lt_cv_deplibs_check_method='unknown' +-# Need to set the preceding variable on all platforms that support +-# interlibrary dependencies. +-# 'none' -- dependencies not supported. +-# `unknown' -- same as none, but documents that we really don't know. +-# 'pass_all' -- all dependencies passed with no checks. +-# 'test_compile' -- check by making test program. +-# 'file_magic [[regex]]' -- check by looking for files in library path +-# which responds to the $file_magic_cmd with a given egrep regex. +-# If you have `file' or equivalent on your system and you're not sure +-# whether `pass_all' will *always* work, you probably want this one. ++ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor ++ # support. Future versions do this automatically, but an explicit c++rt0.o ++ # does not break anything, and helps significantly (at the cost of a little ++ # extra space). ++ freebsd2.2*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; + +-case $host_os in +-aix4* | aix5*) +- lt_cv_deplibs_check_method=pass_all +- ;; ++ # Unfortunately, older versions of FreeBSD 2 do not have this feature. ++ freebsd2*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; + +-beos*) +- lt_cv_deplibs_check_method=pass_all +- ;; ++ # FreeBSD 3 and greater uses gcc -shared to do shared libraries. ++ freebsd* | kfreebsd*-gnu) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; + +-bsdi4*) +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' +- lt_cv_file_magic_cmd='/usr/bin/file -L' +- lt_cv_file_magic_test_file=/shlib/libc.so +- ;; ++ hpux9*) ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ fi ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ ;; + +-cygwin* | mingw* | pw32*) +- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' +- lt_cv_file_magic_cmd='$OBJDUMP -f' +- ;; ++ hpux10* | hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac ++ else ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ *) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ esac ++ fi ++ if test "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; ++ ia64*) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ ;; ++ *) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ ;; ++ esac ++ fi ++ ;; + +-darwin* | rhapsody*) +- lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' +- lt_cv_file_magic_cmd='/usr/bin/file -L' +- case "$host_os" in +- rhapsody* | darwin1.[[012]]) +- lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` +- ;; +- *) # Darwin 1.3 on +- lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' +- ;; +- esac +- ;; ++ irix5* | irix6* | nonstopux*) ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' ++ fi ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ ;; + +-freebsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +- case $host_cpu in +- i*86 ) +- # Not sure whether the presence of OpenBSD here was a mistake. +- # Let's accept both of them until this is cleared up. +- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF ++ fi ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; ++ ++ newsos6) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; ++ ++ openbsd*) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ else ++ case $host_os in ++ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ++ ;; ++ *) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ ;; ++ esac ++ fi ++ ;; ++ ++ os2*) ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported ++ _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' ++ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ++ ;; ++ ++ osf3*) ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ fi ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; +- esac +- else +- lt_cv_deplibs_check_method=pass_all +- fi +- ;; + +-gnu*) +- lt_cv_deplibs_check_method=pass_all +- ;; ++ osf4* | osf5*) # as osf3* with the addition of -msym flag ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ++ else ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + +-hpux10.20*|hpux11*) +- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libc.sl +- ;; ++ # Both c and cxx compiler support -rpath directly ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ++ fi ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ;; + +-irix5* | irix6*) +- case $host_os in +- irix5*) +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" +- ;; +- *) +- case $LD in +- *-32|*"-32 ") libmagic=32-bit;; +- *-n32|*"-n32 ") libmagic=N32;; +- *-64|*"-64 ") libmagic=64-bit;; +- *) libmagic=never-match;; +- esac +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" +- ;; +- esac +- lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` +- lt_cv_deplibs_check_method=pass_all +- ;; ++ sco3.2v5*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ ;; + +-# This must be Linux ELF. +-linux-gnu*) +- case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* ) +- lt_cv_deplibs_check_method=pass_all ;; +- *) +- # glibc up to 2.1.1 does not perform some relocations on ARM +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; +- esac +- lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +- ;; ++ solaris*) ++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ fi ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ case $host_os in ++ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; ++ *) # Supported since Solaris 2.6 (maybe 2.5.1?) ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; ++ esac ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ ;; + +-netbsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +- lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' +- else +- lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' +- fi +- ;; ++ sunos4*) ++ if test "x$host_vendor" = xsequent; then ++ # Use $CC to link under sequent, because it throws in some extra .o ++ # files that make .init and .fini sections work. ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; + +-newos6*) +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libnls.so +- ;; ++ sysv4) ++ case $host_vendor in ++ sni) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ++ ;; ++ siemens) ++ ## LD is ld it makes a PLAMLIB ++ ## CC just makes a GrossModule. ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ ;; ++ motorola) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ++ ;; ++ esac ++ runpath_var='LD_RUN_PATH' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; + +-openbsd*) +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' +- else +- lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' +- fi +- ;; ++ sysv4.3*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ++ ;; + +-osf3* | osf4* | osf5*) +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' +- lt_cv_file_magic_test_file=/shlib/libc.so +- lt_cv_deplibs_check_method=pass_all +- ;; ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ _LT_AC_TAGVAR(ld_shlibs, $1)=yes ++ fi ++ ;; + +-sco3.2v5*) +- lt_cv_deplibs_check_method=pass_all +- ;; ++ sysv4.2uw2*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ hardcode_runpath_var=yes ++ runpath_var=LD_RUN_PATH ++ ;; + +-solaris*) +- lt_cv_deplibs_check_method=pass_all +- lt_cv_file_magic_test_file=/lib/libc.so +- ;; ++ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) ++ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi ++ runpath_var='LD_RUN_PATH' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; + +-sysv5uw[[78]]* | sysv4*uw2*) +- lt_cv_deplibs_check_method=pass_all +- ;; ++ sysv5*) ++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' ++ # $CC -shared without GNU ld will not create a library from C++ ++ # object files and a static libstdc++, better avoid it by now ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ runpath_var='LD_RUN_PATH' ++ ;; + +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- case $host_vendor in +- motorola) +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` +- ;; +- ncr) +- lt_cv_deplibs_check_method=pass_all +- ;; +- sequent) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' +- ;; +- sni) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" +- lt_cv_file_magic_test_file=/lib/libc.so +- ;; +- esac +- ;; +-esac +-]) +-file_magic_cmd=$lt_cv_file_magic_cmd +-deplibs_check_method=$lt_cv_deplibs_check_method ++ uts4*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ ;; ++ ++ *) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac ++ fi + ]) ++AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) ++test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi + +-# AC_PROG_NM - find the path to a BSD-compatible name lister +-AC_DEFUN([AC_PROG_NM], +-[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +-AC_MSG_CHECKING([for BSD-compatible nm]) +-AC_CACHE_VAL(lt_cv_path_NM, +-[if test -n "$NM"; then +- # Let the user override the test. +- lt_cv_path_NM="$NM" +-else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do +- test -z "$ac_dir" && ac_dir=. +- tmp_nm=$ac_dir/${ac_tool_prefix}nm +- if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then +- lt_cv_path_NM="$tmp_nm -B" +- break +- elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then +- lt_cv_path_NM="$tmp_nm -p" +- break ++# ++# Do we need to explicitly link libc? ++# ++case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in ++x|xyes) ++ # Assume -lc should be added ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes ++ ++ if test "$enable_shared" = yes && test "$GCC" = yes; then ++ case $_LT_AC_TAGVAR(archive_cmds, $1) in ++ *'~'*) ++ # FIXME: we may have to deal with multi-command sequences. ++ ;; ++ '$CC '*) ++ # Test whether the compiler implicitly links with -lc since on some ++ # systems, -lgcc has to come before -lc. If gcc already passes -lc ++ # to ld, don't add -lc before -lgcc. ++ AC_MSG_CHECKING([whether -lc should be explicitly linked in]) ++ $rm conftest* ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then ++ soname=conftest ++ lib=conftest ++ libobjs=conftest.$ac_objext ++ deplibs= ++ wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) ++ compiler_flags=-v ++ linker_flags=-v ++ verstring= ++ output_objdir=. ++ libname=conftest ++ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)= ++ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) ++ then ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ else ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes ++ fi ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags ++ cat conftest.err 1>&5 + fi +- fi +- done +- IFS="$ac_save_ifs" +- test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +-fi]) +-NM="$lt_cv_path_NM" +-AC_MSG_RESULT([$NM]) +-]) +- +-# AC_CHECK_LIBM - check for math library +-AC_DEFUN([AC_CHECK_LIBM], +-[AC_REQUIRE([AC_CANONICAL_HOST])dnl +-LIBM= +-case $host in +-*-*-beos* | *-*-cygwin* | *-*-pw32*) +- # These system don't have libm +- ;; +-*-ncr-sysv4.3*) +- AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") +- AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") +- ;; +-*) +- AC_CHECK_LIB(m, main, LIBM="-lm") ++ $rm conftest* ++ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ++ ;; ++ esac ++ fi + ;; + esac +-]) ++])# AC_LIBTOOL_PROG_LD_SHLIBS + +-# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +-# the libltdl convenience library and INCLTDL to the include flags for +-# the libltdl header and adds --enable-ltdl-convenience to the +-# configure arguments. Note that LIBLTDL and INCLTDL are not +-# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not +-# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed +-# with '${top_builddir}/' and INCLTDL will be prefixed with +-# '${top_srcdir}/' (note the single quotes!). If your package is not +-# flat and you're not using automake, define top_builddir and +-# top_srcdir appropriately in the Makefiles. +-AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +- case $enable_ltdl_convenience in +- no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; +- "") enable_ltdl_convenience=yes +- ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; +- esac +- LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la +- INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) +-]) + +-# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +-# the libltdl installable library and INCLTDL to the include flags for +-# the libltdl header and adds --enable-ltdl-install to the configure +-# arguments. Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is +-# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed +-# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will +-# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed +-# with '${top_srcdir}/' (note the single quotes!). If your package is +-# not flat and you're not using automake, define top_builddir and +-# top_srcdir appropriately in the Makefiles. +-# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +-AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +- AC_CHECK_LIB(ltdl, main, +- [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], +- [if test x"$enable_ltdl_install" = xno; then +- AC_MSG_WARN([libltdl not installed, but installation disabled]) +- else +- enable_ltdl_install=yes +- fi +- ]) +- if test x"$enable_ltdl_install" = x"yes"; then +- ac_configure_args="$ac_configure_args --enable-ltdl-install" +- LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la +- INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) +- else +- ac_configure_args="$ac_configure_args --enable-ltdl-install=no" +- LIBLTDL="-lltdl" +- INCLTDL= +- fi +-]) ++# _LT_AC_FILE_LTDLL_C ++# ------------------- ++# Be careful that the start marker always follows a newline. ++AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ ++# /* ltdll.c starts here */ ++# #define WIN32_LEAN_AND_MEAN ++# #include ++# #undef WIN32_LEAN_AND_MEAN ++# #include ++# ++# #ifndef __CYGWIN__ ++# # ifdef __CYGWIN32__ ++# # define __CYGWIN__ __CYGWIN32__ ++# # endif ++# #endif ++# ++# #ifdef __cplusplus ++# extern "C" { ++# #endif ++# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); ++# #ifdef __cplusplus ++# } ++# #endif ++# ++# #ifdef __CYGWIN__ ++# #include ++# DECLARE_CYGWIN_DLL( DllMain ); ++# #endif ++# HINSTANCE __hDllInstance_base; ++# ++# BOOL APIENTRY ++# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) ++# { ++# __hDllInstance_base = hInst; ++# return TRUE; ++# } ++# /* ltdll.c ends here */ ++])# _LT_AC_FILE_LTDLL_C ++ ++ ++# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) ++# --------------------------------- ++AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) ++ + + # old names + AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +@@ -4623,6 +7166,77 @@ + # This is just to silence aclocal about the macro not being used + ifelse([AC_DISABLE_FAST_INSTALL]) + ++AC_DEFUN([LT_AC_PROG_GCJ], ++[AC_CHECK_TOOL(GCJ, gcj, no) ++ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" ++ AC_SUBST(GCJFLAGS) ++]) ++ ++AC_DEFUN([LT_AC_PROG_RC], ++[AC_CHECK_TOOL(RC, windres, no) ++]) ++ ++# NOTE: This macro has been submitted for inclusion into # ++# GNU Autoconf as AC_PROG_SED. When it is available in # ++# a released version of Autoconf we should remove this # ++# macro and use it instead. # ++# LT_AC_PROG_SED ++# -------------- ++# Check for a fully-functional sed program, that truncates ++# as few characters as possible. Prefer GNU sed if found. ++AC_DEFUN([LT_AC_PROG_SED], ++[AC_MSG_CHECKING([for a sed that does not truncate output]) ++AC_CACHE_VAL(lt_cv_path_SED, ++[# Loop through the user's path and test for sed and gsed. ++# Then use that list of sed's as ones to test for truncation. ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for lt_ac_prog in sed gsed; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then ++ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" ++ fi ++ done ++ done ++done ++lt_ac_max=0 ++lt_ac_count=0 ++# Add /usr/xpg4/bin/sed as it is typically found on Solaris ++# along with /bin/sed that truncates output. ++for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do ++ test ! -f $lt_ac_sed && break ++ cat /dev/null > conftest.in ++ lt_ac_count=0 ++ echo $ECHO_N "0123456789$ECHO_C" >conftest.in ++ # Check for GNU sed and select it if it is found. ++ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then ++ lt_cv_path_SED=$lt_ac_sed ++ break ++ fi ++ while true; do ++ cat conftest.in conftest.in >conftest.tmp ++ mv conftest.tmp conftest.in ++ cp conftest.in conftest.nl ++ echo >>conftest.nl ++ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break ++ cmp -s conftest.out conftest.nl || break ++ # 10000 chars as input seems more than enough ++ test $lt_ac_count -gt 10 && break ++ lt_ac_count=`expr $lt_ac_count + 1` ++ if test $lt_ac_count -gt $lt_ac_max; then ++ lt_ac_max=$lt_ac_count ++ lt_cv_path_SED=$lt_ac_sed ++ fi ++ done ++done ++]) ++SED=$lt_cv_path_SED ++AC_MSG_RESULT([$SED]) ++]) ++ + dnl Available from the GNU Autoconf Macro Archive at: + dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_c_long_long.html + dnl +@@ -4655,7 +7269,7 @@ + fi + odbc_libraries_dir="$odbc_dir/lib" + odbc_includes_dir="$odbc_dir/include" +-]) ++], [ odbc_dir=yes ] ) + + AC_ARG_WITH(odbc-includes, + [ --with-odbc-includes=DIR Find unixODBC headers in DIR], +@@ -4667,27 +7281,31 @@ + [odbc_libraries_dir=$withval] + ) + +-save_CPPFLAGS="$CPPFLAGS" +-save_LIBS="$LIBS" +- +-if test "x$odbc_includes_dir" != "x" -a "x$odbc_includes_dir" != "x/usr/include" +-then +- CPPFLAGS="$CPPFLAGS -I$odbc_includes_dir" +-fi +- +-if test "x$odbc_libraries_dir" != "x" +-then +- LIBS="$LIBS -L$odbc_libraries_dir" +-fi ++if test "x$odbc_dir" != "xno"; then ++ save_CPPFLAGS="$CPPFLAGS" ++ save_LIBS="$LIBS" ++ ++ if test "x$odbc_includes_dir" != "x" -a "x$odbc_includes_dir" != "x/usr/include" ++ then ++ CPPFLAGS="$CPPFLAGS -I$odbc_includes_dir" ++ fi + +-AC_CHECK_HEADERS([sql.h sqlext.h sqlucode.h], +-[odbc_ok=yes; odbc_headers="$odbc_headers $ac_hdr"], +-[odbc_ok=no; break] +-) ++ if test "x$odbc_libraries_dir" != "x" ++ then ++ LIBS="$LIBS -L$odbc_libraries_dir" ++ fi + +-if test "x$odbc_ok" = "xyes" +-then +- AC_CHECK_LIB(odbc,SQLConnect,[odbc_ok=yes],[odbc_ok=no]) ++ AC_CHECK_HEADERS([sql.h sqlext.h sqlucode.h], ++ [odbc_ok=yes; odbc_headers="$odbc_headers $ac_hdr"], ++ [odbc_ok=no; break] ++ ) ++ ++ if test "x$odbc_ok" = "xyes" ++ then ++ AC_CHECK_LIB(odbc,SQLConnect,[odbc_ok=yes],[odbc_ok=no]) ++ fi ++else ++ odbc_ok=no + fi + + AC_MSG_CHECKING([whether unixODBC should be used]) +diff -Naur libodbc++-0.2.3/AUTHORS libodbc++-0.2.3-20050404/AUTHORS +--- libodbc++-0.2.3/AUTHORS 2001-06-12 12:38:10.000000000 +0200 ++++ libodbc++-0.2.3-20050404/AUTHORS 2003-11-27 17:38:25.000000000 +0100 +@@ -1,3 +1,5 @@ + Authors of libodbc++ + +-Manush Dodunekov ++Manush Dodunekov - Original author and maintainer ++ ++Other contributors are listed in the THANKS file. +diff -Naur libodbc++-0.2.3/ChangeLog libodbc++-0.2.3-20050404/ChangeLog +--- libodbc++-0.2.3/ChangeLog 2003-06-17 12:11:05.000000000 +0200 ++++ libodbc++-0.2.3-20050404/ChangeLog 2003-12-16 11:45:14.000000000 +0100 +@@ -1,3 +1,27 @@ ++2003-12-16 Alex Hornby ++ ++ * src/datastream.h: correct return type of showmanyc ++ ++2003-12-16 Alex Hornby ++ ++ * src/drivermanager.cpp: don't rely on static ++ constructor/destructor for mutex. ++ ++2003-12-05 Alex Hornby ++ ++ * acinclude.m4: update pthread test to work on hpux 11.11 ++ ++2003-12-02 Alex Hornby ++ ++ * m4/ac_check_odbc.m4: allow user to deselect unixODBC even when ++ it has been installed on the system (e.g. as an RPM). ++ ++2003-06-17 Alex Hornby ++ ++ * NEWS: update for 0.2.3 release ++ ++ * configure.ac: update for 0.2.3 release ++ + 2003-06-17 Alex Hornby + + * src/resultset.cpp: Add tests for stricmp defines. Should fix +diff -Naur libodbc++-0.2.3/config.guess libodbc++-0.2.3-20050404/config.guess +--- libodbc++-0.2.3/config.guess 2003-06-17 12:20:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/config.guess 2005-04-04 18:10:50.000000000 +0200 +@@ -1,9 +1,9 @@ + #! /bin/sh + # Attempt to guess a canonical system name. +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +-# Free Software Foundation, Inc. ++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ++# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +-timestamp='2001-09-04' ++timestamp='2005-02-10' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -24,8 +24,9 @@ + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + +-# Written by Per Bothner . +-# Please send patches to . ++# Originally written by Per Bothner . ++# Please send patches to . Submit a context ++# diff and a properly formatted ChangeLog entry. + # + # This script attempts to guess a canonical system name similar to + # config.sub. If it succeeds, it prints the system name on stdout, and +@@ -52,7 +53,7 @@ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO +@@ -87,30 +88,42 @@ + exit 1 + fi + ++trap 'exit 1' 1 2 15 + +-dummy=dummy-$$ +-trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 ++# CC_FOR_BUILD -- compiler used by this script. Note that the use of a ++# compiler to aid in system detection is discouraged as it requires ++# temporary files to be created and, as you can see below, it is a ++# headache to deal with in a portable fashion. + +-# CC_FOR_BUILD -- compiler used by this script. + # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still + # use `HOST_CC' if defined, but it is deprecated. + +-set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in +- ,,) echo "int dummy(){}" > $dummy.c ; +- for c in cc gcc c89 ; do +- ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; +- if test $? = 0 ; then ++# Portable tmp directory creation inspired by the Autoconf team. ++ ++set_cc_for_build=' ++trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; ++trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; ++: ${TMPDIR=/tmp} ; ++ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || ++ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || ++ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || ++ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; ++dummy=$tmp/dummy ; ++tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; ++case $CC_FOR_BUILD,$HOST_CC,$CC in ++ ,,) echo "int x;" > $dummy.c ; ++ for c in cc gcc c89 c99 ; do ++ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; +- rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +-esac' ++esac ;' + + # This is needed to find uname on a Pyramid OSx when run in the BSD universe. + # (ghazi@noc.rutgers.edu 1994-08-24) +@@ -123,33 +136,51 @@ + UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + ++if [ "${UNAME_SYSTEM}" = "Linux" ] ; then ++ eval $set_cc_for_build ++ cat << EOF > $dummy.c ++ #include ++ #ifdef __UCLIBC__ ++ # ifdef __UCLIBC_CONFIG_VERSION__ ++ LIBC=uclibc __UCLIBC_CONFIG_VERSION__ ++ # else ++ LIBC=uclibc ++ # endif ++ #else ++ LIBC=gnu ++ #endif ++EOF ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` ++fi ++ + # Note: order is significant - the case branches are not exclusive. + + case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) +- # Netbsd (nbsd) targets should (where applicable) match one or ++ # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. +- # Determine the machine/vendor (is the vendor relevant). +- case "${UNAME_MACHINE}" in +- amiga) machine=m68k-unknown ;; +- arm32) machine=arm-unknown ;; +- atari*) machine=m68k-atari ;; +- sun3*) machine=m68k-sun ;; +- mac68k) machine=m68k-apple ;; +- macppc) machine=powerpc-apple ;; +- hp3[0-9][05]) machine=m68k-hp ;; +- ibmrt|romp-ibm) machine=romp-ibm ;; +- *) machine=${UNAME_MACHINE}-unknown ;; ++ # ++ # Note: NetBSD doesn't particularly care about the vendor ++ # portion of the name. We always set it to "unknown". ++ sysctl="sysctl -n hw.machine_arch" ++ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ ++ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` ++ case "${UNAME_MACHINE_ARCH}" in ++ armeb) machine=armeb-unknown ;; ++ arm*) machine=arm-unknown ;; ++ sh3el) machine=shl-unknown ;; ++ sh3eb) machine=sh-unknown ;; ++ *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. +- case "${UNAME_MACHINE}" in +- i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) ++ case "${UNAME_MACHINE_ARCH}" in ++ arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null +@@ -166,74 +197,123 @@ + ;; + esac + # The OS release +- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ++ # Debian GNU/NetBSD machines have a different userland, and ++ # thus, need a distinct triplet. However, they do not need ++ # kernel version information, so it can be replaced with a ++ # suitable tag, in the style of linux-gnu. ++ case "${UNAME_VERSION}" in ++ Debian*) ++ release='-gnu' ++ ;; ++ *) ++ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ++ ;; ++ esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; ++ amd64:OpenBSD:*:*) ++ echo x86_64-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ amiga:OpenBSD:*:*) ++ echo m68k-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ cats:OpenBSD:*:*) ++ echo arm-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ hp300:OpenBSD:*:*) ++ echo m68k-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ luna88k:OpenBSD:*:*) ++ echo m88k-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ mac68k:OpenBSD:*:*) ++ echo m68k-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ macppc:OpenBSD:*:*) ++ echo powerpc-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ mvme68k:OpenBSD:*:*) ++ echo m68k-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ mvme88k:OpenBSD:*:*) ++ echo m88k-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ mvmeppc:OpenBSD:*:*) ++ echo powerpc-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ sgi:OpenBSD:*:*) ++ echo mips64-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ sun3:OpenBSD:*:*) ++ echo m68k-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ *:OpenBSD:*:*) ++ echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} ++ exit 0 ;; ++ *:ekkoBSD:*:*) ++ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} ++ exit 0 ;; ++ macppc:MirBSD:*:*) ++ echo powerppc-unknown-mirbsd${UNAME_RELEASE} ++ exit 0 ;; ++ *:MirBSD:*:*) ++ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} ++ exit 0 ;; + alpha:OSF1:*:*) +- if test $UNAME_RELEASE = "V4.0"; then ++ case $UNAME_RELEASE in ++ *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` +- fi ++ ;; ++ *5.*) ++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ++ ;; ++ esac ++ # According to Compaq, /usr/sbin/psrinfo has been available on ++ # OSF/1 and Tru64 systems produced since 1995. I hope that ++ # covers most systems running today. This code pipes the CPU ++ # types through head -n 1, so we only detect the type of CPU 0. ++ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` ++ case "$ALPHA_CPU_TYPE" in ++ "EV4 (21064)") ++ UNAME_MACHINE="alpha" ;; ++ "EV4.5 (21064)") ++ UNAME_MACHINE="alpha" ;; ++ "LCA4 (21066/21068)") ++ UNAME_MACHINE="alpha" ;; ++ "EV5 (21164)") ++ UNAME_MACHINE="alphaev5" ;; ++ "EV5.6 (21164A)") ++ UNAME_MACHINE="alphaev56" ;; ++ "EV5.6 (21164PC)") ++ UNAME_MACHINE="alphapca56" ;; ++ "EV5.7 (21164PC)") ++ UNAME_MACHINE="alphapca57" ;; ++ "EV6 (21264)") ++ UNAME_MACHINE="alphaev6" ;; ++ "EV6.7 (21264A)") ++ UNAME_MACHINE="alphaev67" ;; ++ "EV6.8CB (21264C)") ++ UNAME_MACHINE="alphaev68" ;; ++ "EV6.8AL (21264B)") ++ UNAME_MACHINE="alphaev68" ;; ++ "EV6.8CX (21264D)") ++ UNAME_MACHINE="alphaev68" ;; ++ "EV6.9A (21264/EV69A)") ++ UNAME_MACHINE="alphaev69" ;; ++ "EV7 (21364)") ++ UNAME_MACHINE="alphaev7" ;; ++ "EV7.9 (21364A)") ++ UNAME_MACHINE="alphaev79" ;; ++ esac ++ # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. +- cat <$dummy.s +- .data +-\$Lformat: +- .byte 37,100,45,37,120,10,0 # "%d-%x\n" +- +- .text +- .globl main +- .align 4 +- .ent main +-main: +- .frame \$30,16,\$26,0 +- ldgp \$29,0(\$27) +- .prologue 1 +- .long 0x47e03d80 # implver \$0 +- lda \$2,-1 +- .long 0x47e20c21 # amask \$2,\$1 +- lda \$16,\$Lformat +- mov \$0,\$17 +- not \$1,\$18 +- jsr \$26,printf +- ldgp \$29,0(\$26) +- mov 0,\$16 +- jsr \$26,exit +- .end main +-EOF +- eval $set_cc_for_build +- $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null +- if test "$?" = 0 ; then +- case `./$dummy` in +- 0-0) +- UNAME_MACHINE="alpha" +- ;; +- 1-0) +- UNAME_MACHINE="alphaev5" +- ;; +- 1-1) +- UNAME_MACHINE="alphaev56" +- ;; +- 1-101) +- UNAME_MACHINE="alphapca56" +- ;; +- 2-303) +- UNAME_MACHINE="alphaev6" +- ;; +- 2-307) +- UNAME_MACHINE="alphaev67" +- ;; +- 2-1307) +- UNAME_MACHINE="alphaev68" +- ;; +- esac +- fi +- rm -f $dummy.s $dummy +- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ++ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? +@@ -247,33 +327,21 @@ + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; +- amiga:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; +- arc64:OpenBSD:*:*) +- echo mips64el-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- arc:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- hkmips:OpenBSD:*:*) +- echo mips-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- pmax:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- sgi:OpenBSD:*:*) +- echo mips-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- wgrisc:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} ++ *:[Mm]orph[Oo][Ss]:*:*) ++ echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; ++ *:z/VM:*:*) ++ echo s390-ibm-zvmoe ++ exit 0 ;; ++ *:OS400:*:*) ++ echo powerpc-ibm-os400 ++ exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; +@@ -291,6 +359,13 @@ + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; ++ DRS?6000:unix:4.0:6*) ++ echo sparc-icl-nx6 ++ exit 0 ;; ++ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) ++ case `/usr/bin/uname -p` in ++ sparc) echo sparc-icl-nx7 && exit 0 ;; ++ esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; +@@ -319,7 +394,7 @@ + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) +- UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` ++ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) +@@ -333,12 +408,6 @@ + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; +- sparc*:NetBSD:*) +- echo `uname -p`-unknown-netbsd${UNAME_RELEASE} +- exit 0 ;; +- atari*:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor +@@ -365,17 +434,8 @@ + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; +- sun3*:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mac68k:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvme68k:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvme88k:OpenBSD:*:*) +- echo m88k-unknown-openbsd${UNAME_RELEASE} ++ m68k:machten:*:*) ++ echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} +@@ -415,15 +475,20 @@ + exit (-1); + } + EOF +- $CC_FOR_BUILD $dummy.c -o $dummy \ +- && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ +- && rm -f $dummy.c $dummy && exit 0 +- rm -f $dummy.c $dummy ++ $CC_FOR_BUILD -o $dummy $dummy.c \ ++ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ ++ && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; ++ Motorola:*:4.3:PL8-*) ++ echo powerpc-harris-powermax ++ exit 0 ;; ++ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) ++ echo powerpc-harris-powermax ++ exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; +@@ -496,8 +561,7 @@ + exit(0); + } + EOF +- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 +- rm -f $dummy.c $dummy ++ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 +@@ -506,7 +570,7 @@ + fi + exit 0 ;; + *:AIX:*:[45]) +- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` ++ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else +@@ -546,10 +610,8 @@ + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) +- case "${HPUX_REV}" in +- 11.[0-9][0-9]) +- if [ -x /usr/bin/getconf ]; then +- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` ++ if [ -x /usr/bin/getconf ]; then ++ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 +@@ -558,13 +620,13 @@ + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; ++ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac +- fi ;; +- esac +- if [ "${HP_ARCH}" = "" ]; then +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ fi ++ if [ "${HP_ARCH}" = "" ]; then ++ eval $set_cc_for_build ++ sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include +@@ -597,11 +659,21 @@ + exit (0); + } + EOF +- (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` +- if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi +- rm -f $dummy.c $dummy +- fi ;; ++ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` ++ test -z "$HP_ARCH" && HP_ARCH=hppa ++ fi ;; + esac ++ if [ ${HP_ARCH} = "hppa2.0w" ] ++ then ++ # avoid double evaluation of $set_cc_for_build ++ test -n "$CC_FOR_BUILD" || eval $set_cc_for_build ++ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null ++ then ++ HP_ARCH="hppa2.0w" ++ else ++ HP_ARCH="hppa64" ++ fi ++ fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) +@@ -635,8 +707,7 @@ + exit (0); + } + EOF +- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 +- rm -f $dummy.c $dummy ++ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) +@@ -664,9 +735,6 @@ + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; +- hppa*:OpenBSD:*:*) +- echo hppa-unknown-openbsd +- exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; +@@ -685,9 +753,6 @@ + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; +- CRAY*X-MP:*:*:*) +- echo xmp-cray-unicos +- exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; +@@ -700,26 +765,25 @@ + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; +- CRAY*T3D:*:*:*) +- echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; +- CRAY-2:*:*:*) +- echo cray2-cray-unicos +- exit 0 ;; ++ *:UNICOS/mp:*:*) ++ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; +- hp300:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} ++ 5000:UNIX_System_V:4.*:*) ++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` ++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} +@@ -733,9 +797,6 @@ + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; +- *:OpenBSD:*:*) +- echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` +- exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; +@@ -745,15 +806,24 @@ + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; ++ x86:Interix*:[34]*) ++ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' ++ exit 0 ;; ++ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) ++ echo i${UNAME_MACHINE}-pc-mks ++ exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? +- echo i386-pc-interix ++ echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; ++ amd64:CYGWIN*:*:*) ++ echo x86_64-unknown-cygwin ++ exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; +@@ -761,31 +831,80 @@ + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) ++ # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; ++ *:GNU/*:*:*) ++ # other systems with GNU libc and userland ++ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu ++ exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit 0 ;; ++ cris:Linux:*:*) ++ echo cris-axis-linux-${LIBC} ++ exit 0 ;; ++ crisv32:Linux:*:*) ++ echo crisv32-axis-linux-${LIBC} ++ exit 0 ;; ++ frv:Linux:*:*) ++ echo frv-unknown-linux-${LIBC} + exit 0 ;; + ia64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit 0 ;; ++ m32r*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit 0 ;; + m68*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit 0 ;; + mips:Linux:*:*) +- case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in +- big) echo mips-unknown-linux-gnu && exit 0 ;; +- little) echo mipsel-unknown-linux-gnu && exit 0 ;; +- esac ++ eval $set_cc_for_build ++ sed 's/^ //' << EOF >$dummy.c ++ #undef CPU ++ #undef mips ++ #undef mipsel ++ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) ++ CPU=mipsel ++ #else ++ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) ++ CPU=mips ++ #else ++ CPU= ++ #endif ++ #endif ++EOF ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` ++ test x"${CPU}" != x && echo "${CPU}-unknown-linux-${LIBC}" && exit 0 ++ ;; ++ mips64:Linux:*:*) ++ eval $set_cc_for_build ++ sed 's/^ //' << EOF >$dummy.c ++ #undef CPU ++ #undef mips64 ++ #undef mips64el ++ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) ++ CPU=mips64el ++ #else ++ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) ++ CPU=mips64 ++ #else ++ CPU= ++ #endif ++ #endif ++EOF ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` ++ test x"${CPU}" != x && echo "${CPU}-unknown-linux-${LIBC}" && exit 0 + ;; + ppc:Linux:*:*) +- echo powerpc-unknown-linux-gnu ++ echo powerpc-unknown-linux-${LIBC} + exit 0 ;; + ppc64:Linux:*:*) +- echo powerpc64-unknown-linux-gnu ++ echo powerpc64-unknown-linux-${LIBC} + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in +@@ -798,37 +917,41 @@ + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null +- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi +- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ++ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in +- PA7*) echo hppa1.1-unknown-linux-gnu ;; +- PA8*) echo hppa2.0-unknown-linux-gnu ;; +- *) echo hppa-unknown-linux-gnu ;; ++ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; ++ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; ++ *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) +- echo hppa64-unknown-linux-gnu ++ echo hppa64-unknown-linux-${LIBC} + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; ++ sh64*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit 0 ;; + sh*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit 0 ;; + x86_64:Linux:*:*) +- echo x86_64-unknown-linux-gnu ++ echo x86_64-unknown-linux-${LIBC} + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. +- ld_supported_targets=`cd /; ld --help 2>&1 \ ++ # Set LC_ALL=C to ensure ld outputs messages in English. ++ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// +@@ -836,48 +959,48 @@ + p'` + case "$ld_supported_targets" in + elf32-i386) +- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ++ TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" + ;; + a.out-i386-linux) +- echo "${UNAME_MACHINE}-pc-linux-gnuaout" +- exit 0 ;; ++ echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" ++ exit 0 ;; + coff-i386) +- echo "${UNAME_MACHINE}-pc-linux-gnucoff" ++ echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. +- echo "${UNAME_MACHINE}-pc-linux-gnuoldld" ++ echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" + exit 0 ;; + esac ++ if [ "`echo $LIBC | sed -e 's:uclibc::'`" != "$LIBC" ] ; then echo "$TENTATIVE" && exit 0 ; fi + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build +- cat >$dummy.c < +-#ifdef __cplusplus +-#include /* for printf() prototype */ +- int main (int argc, char *argv[]) { +-#else +- int main (argc, argv) int argc; char *argv[]; { +-#endif +-#ifdef __ELF__ +-# ifdef __GLIBC__ +-# if __GLIBC__ >= 2 +- printf ("%s-pc-linux-gnu\n", argv[1]); +-# else +- printf ("%s-pc-linux-gnulibc1\n", argv[1]); +-# endif +-# else +- printf ("%s-pc-linux-gnulibc1\n", argv[1]); +-# endif +-#else +- printf ("%s-pc-linux-gnuaout\n", argv[1]); +-#endif +- return 0; +-} ++ sed 's/^ //' << EOF >$dummy.c ++ #include ++ #ifdef __ELF__ ++ # ifdef __GLIBC__ ++ # if __GLIBC__ >= 2 ++ LIBC=gnu ++ # else ++ LIBC=gnulibc1 ++ # endif ++ # else ++ LIBC=gnulibc1 ++ # endif ++ #else ++ #ifdef __INTEL_COMPILER ++ LIBC=gnu ++ #else ++ LIBC=gnuaout ++ #endif ++ #endif ++ #ifdef __dietlibc__ ++ LIBC=dietlibc ++ #endif + EOF +- $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 +- rm -f $dummy.c $dummy ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` ++ test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) +@@ -894,6 +1017,26 @@ + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; ++ i*86:OS/2:*:*) ++ # If we were able to find `uname', then EMX Unix compatibility ++ # is probably installed. ++ echo ${UNAME_MACHINE}-pc-os2-emx ++ exit 0 ;; ++ i*86:XTS-300:*:STOP) ++ echo ${UNAME_MACHINE}-unknown-stop ++ exit 0 ;; ++ i*86:atheos:*:*) ++ echo ${UNAME_MACHINE}-unknown-atheos ++ exit 0 ;; ++ i*86:syllable:*:*) ++ echo ${UNAME_MACHINE}-pc-syllable ++ exit 0 ;; ++ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) ++ echo i386-unknown-lynxos${UNAME_RELEASE} ++ exit 0 ;; ++ i*86:*DOS:*:*) ++ echo ${UNAME_MACHINE}-pc-msdosdjgpp ++ exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then +@@ -915,22 +1058,19 @@ + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then +- UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` +- (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 +- (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ ++ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` ++ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 ++ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 +- (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ ++ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 +- (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ ++ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; +- i*86:*DOS:*:*) +- echo ${UNAME_MACHINE}-pc-msdosdjgpp +- exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about +@@ -954,9 +1094,15 @@ + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; +- M68*:*:R3V[567]*:*) ++ mc68k:UNIX:SYSTEM5:3.51m) ++ echo m68k-convergent-sysv ++ exit 0 ;; ++ M680?0:D-NIX:5.3:*) ++ echo m68k-diab-dnix ++ exit 0 ;; ++ M68*:*:R3V[5678]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; +- 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) ++ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` +@@ -973,9 +1119,6 @@ + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; +- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) +- echo i386-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; +@@ -1047,6 +1190,9 @@ + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; ++ SX-6:SUPER-UX:*:*) ++ echo sx6-nec-superux${UNAME_RELEASE} ++ exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; +@@ -1054,18 +1200,28 @@ + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) +- echo `uname -p`-apple-darwin${UNAME_RELEASE} ++ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown ++ case $UNAME_PROCESSOR in ++ *86) UNAME_PROCESSOR=i686 ;; ++ unknown) UNAME_PROCESSOR=powerpc ;; ++ esac ++ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) +- if test "${UNAME_MACHINE}" = "x86pc"; then ++ UNAME_PROCESSOR=`uname -p` ++ if test "$UNAME_PROCESSOR" = "x86"; then ++ UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi +- echo `uname -p`-${UNAME_MACHINE}-nto-qnx ++ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; +- NSR-[KW]:NONSTOP_KERNEL:*:*) ++ NSE-?:NONSTOP_KERNEL:*:*) ++ echo nse-tandem-nsk${UNAME_RELEASE} ++ exit 0 ;; ++ NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) +@@ -1088,11 +1244,6 @@ + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; +- i*86:OS/2:*:*) +- # If we were able to find `uname', then EMX Unix compatibility +- # is probably installed. +- echo ${UNAME_MACHINE}-pc-os2-emx +- exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; +@@ -1111,11 +1262,21 @@ + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; +- i*86:XTS-300:*:STOP) +- echo ${UNAME_MACHINE}-unknown-stop ++ SEI:*:*:SEIUX) ++ echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; +- i*86:atheos:*:*) +- echo ${UNAME_MACHINE}-unknown-atheos ++ *:DragonFly:*:*) ++ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ++ exit 0 ;; ++ *:*VMS:*:*) ++ UNAME_MACHINE=`(uname -p) 2>/dev/null` ++ case "${UNAME_MACHINE}" in ++ A*) echo alpha-dec-vms && exit 0 ;; ++ I*) echo ia64-dec-vms && exit 0 ;; ++ V*) echo vax-dec-vms && exit 0 ;; ++ esac ;; ++ *:XENIX:*:SysV) ++ echo i386-pc-xenix + exit 0 ;; + esac + +@@ -1237,8 +1398,7 @@ + } + EOF + +-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +-rm -f $dummy.c $dummy ++$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + + # Apollos put the system type in the environment. + +diff -Naur libodbc++-0.2.3/config.sub libodbc++-0.2.3-20050404/config.sub +--- libodbc++-0.2.3/config.sub 2003-06-17 12:20:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/config.sub 2005-04-04 18:10:50.000000000 +0200 +@@ -1,9 +1,9 @@ + #! /bin/sh + # Configuration validation subroutine script. +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +-# Free Software Foundation, Inc. ++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ++# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +-timestamp='2001-09-07' ++timestamp='2005-02-10' + + # This file is (in principle) common to ALL GNU software. + # The presence of a machine in this file suggests that SOME GNU software +@@ -29,7 +29,8 @@ + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + +-# Please send patches to . ++# Please send patches to . Submit a context ++# diff and a properly formatted ChangeLog entry. + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. +@@ -69,7 +70,7 @@ + version="\ + GNU config.sub ($timestamp) + +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO +@@ -117,7 +118,8 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ ++ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -143,7 +145,7 @@ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple | -axis) ++ -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; +@@ -226,32 +228,46 @@ + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ ++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ ++ | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ +- | d10v | d30v | dsp16xx \ +- | fr30 \ ++ | d10v | d30v | dlx | dsp16xx \ ++ | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ +- | m32r | m68000 | m68k | m88k | mcore \ +- | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ +- | mips64vr4100 | mips64vr4100el | mips64vr4300 \ +- | mips64vr4300el | mips64vr5000 | mips64vr5000el \ +- | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ +- | mipsisa32 \ ++ | ip2k | iq2000 \ ++ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ ++ | mips | mipsbe | mipseb | mipsel | mipsle \ ++ | mips16 \ ++ | mips64 | mips64el \ ++ | mips64vr | mips64vrel \ ++ | mips64orion | mips64orionel \ ++ | mips64vr4100 | mips64vr4100el \ ++ | mips64vr4300 | mips64vr4300el \ ++ | mips64vr5000 | mips64vr5000el \ ++ | mipsisa32 | mipsisa32el \ ++ | mipsisa32r2 | mipsisa32r2el \ ++ | mipsisa64 | mipsisa64el \ ++ | mipsisa64r2 | mipsisa64r2el \ ++ | mipsisa64sb1 | mipsisa64sb1el \ ++ | mipsisa64sr71k | mipsisa64sr71kel \ ++ | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ ++ | msp430 \ + | ns16k | ns32k \ +- | openrisc \ ++ | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ +- | s390 | s390x \ +- | sh | sh[34] | sh[34]eb | shbe | shle \ +- | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ +- | stormy16 | strongarm \ +- | tahoe | thumb | tic80 | tron \ +- | v850 \ ++ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ ++ | sh64 | sh64le \ ++ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ ++ | strongarm \ ++ | tahoe | thumb | tic4x | tic80 | tron \ ++ | v850 | v850e \ + | we32k \ +- | x86 | xscale \ ++ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; +@@ -278,38 +294,57 @@ + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ +- | alphapca5[67]-* | arc-* \ +- | arm-* | armbe-* | armle-* | armv*-* \ ++ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ ++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ ++ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ ++ | avr-* \ + | bs2000-* \ +- | c[123]* | c30-* | [cjt]90-* | c54x-* \ +- | clipper-* | cray2-* | cydra-* \ +- | d10v-* | d30v-* \ ++ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ ++ | clipper-* | craynv-* | cydra-* \ ++ | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ +- | f30[01]-* | f700-* | fr30-* | fx80-* \ ++ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ +- | m32r-* \ +- | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ +- | m88110-* | m88k-* | mcore-* \ +- | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ +- | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ +- | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ +- | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ ++ | ip2k-* | iq2000-* \ ++ | m32r-* | m32rle-* \ ++ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ ++ | m88110-* | m88k-* | maxq-* | mcore-* \ ++ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ ++ | mips16-* \ ++ | mips64-* | mips64el-* \ ++ | mips64vr-* | mips64vrel-* \ ++ | mips64orion-* | mips64orionel-* \ ++ | mips64vr4100-* | mips64vr4100el-* \ ++ | mips64vr4300-* | mips64vr4300el-* \ ++ | mips64vr5000-* | mips64vr5000el-* \ ++ | mipsisa32-* | mipsisa32el-* \ ++ | mipsisa32r2-* | mipsisa32r2el-* \ ++ | mipsisa64-* | mipsisa64el-* \ ++ | mipsisa64r2-* | mipsisa64r2el-* \ ++ | mipsisa64sb1-* | mipsisa64sb1el-* \ ++ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ ++ | mipstx39-* | mipstx39el-* \ ++ | mmix-* \ ++ | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ +- | s390-* | s390x-* \ +- | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ +- | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ +- | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ +- | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ +- | v850-* | vax-* \ ++ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ ++ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ ++ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ ++ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ ++ | tahoe-* | thumb-* \ ++ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ ++ | tron-* \ ++ | v850-* | v850e-* | vax-* \ + | we32k-* \ +- | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ ++ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ ++ | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; +@@ -329,6 +364,9 @@ + basic_machine=a29k-amd + os=-udi + ;; ++ abacus) ++ basic_machine=abacus-unknown ++ ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout +@@ -343,6 +381,12 @@ + basic_machine=a29k-none + os=-bsd + ;; ++ amd64) ++ basic_machine=x86_64-pc ++ ;; ++ amd64-*) ++ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + amdahl) + basic_machine=580-amdahl + os=-sysv +@@ -374,6 +418,10 @@ + basic_machine=ns32k-sequent + os=-dynix + ;; ++ c90) ++ basic_machine=c90-cray ++ os=-unicos ++ ;; + convex-c1) + basic_machine=c1-convex + os=-bsd +@@ -394,30 +442,45 @@ + basic_machine=c38-convex + os=-bsd + ;; +- cray | ymp) +- basic_machine=ymp-cray ++ cray | j90) ++ basic_machine=j90-cray + os=-unicos + ;; +- cray2) +- basic_machine=cray2-cray +- os=-unicos ++ craynv) ++ basic_machine=craynv-cray ++ os=-unicosmp + ;; +- [cjt]90) +- basic_machine=${basic_machine}-cray +- os=-unicos ++ cr16c) ++ basic_machine=cr16c-unknown ++ os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; ++ crisv32 | crisv32-* | etraxfs*) ++ basic_machine=crisv32-axis ++ ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; ++ crx) ++ basic_machine=crx-unknown ++ os=-elf ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; ++ decsystem10* | dec10*) ++ basic_machine=pdp10-dec ++ os=-tops10 ++ ;; ++ decsystem20* | dec20*) ++ basic_machine=pdp10-dec ++ os=-tops20 ++ ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola +@@ -426,6 +489,10 @@ + basic_machine=m88k-motorola + os=-sysv3 + ;; ++ djgpp) ++ basic_machine=i586-pc ++ os=-msdosdjgpp ++ ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx +@@ -598,28 +665,20 @@ + basic_machine=m68k-atari + os=-mint + ;; +- mipsel*-linux*) +- basic_machine=mipsel-unknown +- os=-linux-gnu +- ;; +- mips*-linux*) +- basic_machine=mips-unknown +- os=-linux-gnu +- ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; +- mmix*) +- basic_machine=mmix-knuth +- os=-mmixware +- ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; ++ morphos) ++ basic_machine=powerpc-unknown ++ os=-morphos ++ ;; + msdos) + basic_machine=i386-pc + os=-msdos +@@ -699,6 +758,14 @@ + basic_machine=hppa1.1-oki + os=-proelf + ;; ++ or32 | or32-*) ++ basic_machine=or32-unknown ++ os=-coff ++ ;; ++ os400) ++ basic_machine=powerpc-ibm ++ os=-os400 ++ ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose +@@ -721,49 +788,55 @@ + pbb) + basic_machine=m68k-tti + ;; +- pc532 | pc532-*) ++ pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; +- pentium | p5 | k5 | k6 | nexgen) ++ pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; +- pentiumpro | p6 | 6x86 | athlon) ++ pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; +- pentiumii | pentium2) ++ pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; +- pentium-* | p5-* | k5-* | k6-* | nexgen-*) ++ pentium4) ++ basic_machine=i786-pc ++ ;; ++ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; +- pentiumii-* | pentium2-*) ++ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; ++ pentium4-*) ++ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown +- ;; ++ ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown +- ;; ++ ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown +- ;; ++ ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown +- ;; ++ ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; +@@ -784,10 +857,26 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; ++ s390 | s390-*) ++ basic_machine=s390-ibm ++ ;; ++ s390x | s390x-*) ++ basic_machine=s390x-ibm ++ ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; ++ sb1) ++ basic_machine=mipsisa64sb1-unknown ++ ;; ++ sb1el) ++ basic_machine=mipsisa64sb1el-unknown ++ ;; ++ sei) ++ basic_machine=mips-sei ++ os=-seiux ++ ;; + sequent) + basic_machine=i386-sequent + ;; +@@ -795,7 +884,10 @@ + basic_machine=sh-hitachi + os=-hms + ;; +- sparclite-wrs) ++ sh64) ++ basic_machine=sh64-unknown ++ ;; ++ sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; +@@ -862,22 +954,42 @@ + os=-dynix + ;; + t3e) +- basic_machine=t3e-cray ++ basic_machine=alphaev5-cray ++ os=-unicos ++ ;; ++ t90) ++ basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; ++ tic55x | c55x*) ++ basic_machine=tic55x-unknown ++ os=-coff ++ ;; ++ tic6x | c6x*) ++ basic_machine=tic6x-unknown ++ os=-coff ++ ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; ++ toad1) ++ basic_machine=pdp10-xkl ++ os=-tops20 ++ ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; ++ tpf) ++ basic_machine=s390x-ibm ++ os=-tpf ++ ;; + udi29k) + basic_machine=a29k-amd + os=-udi +@@ -899,8 +1011,8 @@ + os=-vms + ;; + vpp*|vx|vx-*) +- basic_machine=f301-fujitsu +- ;; ++ basic_machine=f301-fujitsu ++ ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks +@@ -921,17 +1033,17 @@ + basic_machine=hppa1.1-winbond + os=-proelf + ;; +- windows32) +- basic_machine=i386-pc +- os=-windows32-msvcrt +- ;; +- xmp) +- basic_machine=xmp-cray +- os=-unicos ++ xbox) ++ basic_machine=i686-pc ++ os=-mingw32 + ;; +- xps | xps100) ++ xps | xps100) + basic_machine=xps100-honeywell + ;; ++ ymp) ++ basic_machine=ymp-cray ++ os=-unicos ++ ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim +@@ -952,16 +1064,12 @@ + op60c) + basic_machine=hppa1.1-oki + ;; +- mips) +- if [ x$os = x-linux-gnu ]; then +- basic_machine=mips-unknown +- else +- basic_machine=mips-mips +- fi +- ;; + romp) + basic_machine=romp-ibm + ;; ++ mmix) ++ basic_machine=mmix-knuth ++ ;; + rs6000) + basic_machine=rs6000-ibm + ;; +@@ -978,13 +1086,16 @@ + we32k) + basic_machine=we32k-att + ;; +- sh3 | sh4 | sh3eb | sh4eb) ++ sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; +- sparc | sparcv9 | sparcv9b) ++ sh64) ++ basic_machine=sh64-unknown ++ ;; ++ sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; +- cydra) ++ cydra) + basic_machine=cydra-cydrome + ;; + orion) +@@ -999,10 +1110,6 @@ + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; +- c4x*) +- basic_machine=c4x-none +- os=-coff +- ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; +@@ -1058,17 +1165,20 @@ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ +- | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ +- | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ ++ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ ++ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ ++ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ +- | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +- | -os2* | -vos*) ++ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ ++ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ ++ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) +@@ -1080,8 +1190,10 @@ + ;; + esac + ;; ++ -nto-qnx*) ++ ;; + -nto*) +- os=-nto-qnx ++ os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ +@@ -1090,6 +1202,9 @@ + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; ++ -linux-dietlibc) ++ os=-linux-dietlibc ++ ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; +@@ -1102,6 +1217,9 @@ + -opened*) + os=-openedition + ;; ++ -os400*) ++ os=-os400 ++ ;; + -wince*) + os=-wince + ;; +@@ -1120,14 +1238,23 @@ + -acis*) + os=-aos + ;; ++ -atheos*) ++ os=-atheos ++ ;; ++ -syllable*) ++ os=-syllable ++ ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; ++ -nova*) ++ os=-rtmk-nova ++ ;; + -ns2 ) +- os=-nextstep2 ++ os=-nextstep2 + ;; + -nsk*) + os=-nsk +@@ -1139,6 +1266,9 @@ + -sinix*) + os=-sysv4 + ;; ++ -tpf*) ++ os=-tpf ++ ;; + -triton*) + os=-sysv3 + ;; +@@ -1166,8 +1296,17 @@ + -xenix) + os=-xenix + ;; +- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) +- os=-mint ++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) ++ os=-mint ++ ;; ++ -aros*) ++ os=-aros ++ ;; ++ -kaos*) ++ os=-kaos ++ ;; ++ -zvmoe) ++ os=-zvmoe + ;; + -none) + ;; +@@ -1200,10 +1339,14 @@ + arm*-semi) + os=-aout + ;; ++ c4x-* | tic4x-*) ++ os=-coff ++ ;; ++ # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; +- pdp11-*) ++ pdp11-*) + os=-none + ;; + *-dec | vax-*) +@@ -1230,6 +1373,9 @@ + mips*-*) + os=-elf + ;; ++ or32-*) ++ os=-coff ++ ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; +@@ -1242,6 +1388,9 @@ + *-ibm) + os=-aix + ;; ++ *-knuth) ++ os=-mmixware ++ ;; + *-wec) + os=-proelf + ;; +@@ -1293,19 +1442,19 @@ + *-next) + os=-nextstep3 + ;; +- *-gould) ++ *-gould) + os=-sysv + ;; +- *-highlevel) ++ *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; +- *-sgi) ++ *-sgi) + os=-irix + ;; +- *-siemens) ++ *-siemens) + os=-sysv4 + ;; + *-masscomp) +@@ -1374,10 +1523,16 @@ + -mvs* | -opened*) + vendor=ibm + ;; ++ -os400*) ++ vendor=ibm ++ ;; + -ptx*) + vendor=sequent + ;; +- -vxsim* | -vxworks*) ++ -tpf*) ++ vendor=ibm ++ ;; ++ -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) +diff -Naur libodbc++-0.2.3/configure libodbc++-0.2.3-20050404/configure +--- libodbc++-0.2.3/configure 2003-06-17 12:20:57.000000000 +0200 ++++ libodbc++-0.2.3-20050404/configure 2005-04-04 18:21:10.000000000 +0200 +@@ -1,180 +1,12 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.53 for libodbcxx 0.2.3. ++# Generated by GNU Autoconf 2.59 for libodbcxx 0.2.3-20050404. + # + # Report bugs to . + # +-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +-# Free Software Foundation, Inc. ++# Copyright (C) 2003 Free Software Foundation, Inc. + # This configure script is free software; the Free Software Foundation + # gives unlimited permission to copy, distribute and modify it. +- +-# Find the correct PATH separator. Usually this is `:', but +-# DJGPP uses `;' like DOS. +-if test "X${PATH_SEPARATOR+set}" != Xset; then +- UNAME=${UNAME-`uname 2>/dev/null`} +- case X$UNAME in +- *-DOS) lt_cv_sys_path_separator=';' ;; +- *) lt_cv_sys_path_separator=':' ;; +- esac +- PATH_SEPARATOR=$lt_cv_sys_path_separator +-fi +- +- +-# Check that we are running under the correct shell. +-SHELL=${CONFIG_SHELL-/bin/sh} +- +-case X$ECHO in +-X*--fallback-echo) +- # Remove one level of quotation (which was required for Make). +- ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` +- ;; +-esac +- +-echo=${ECHO-echo} +-if test "X$1" = X--no-reexec; then +- # Discard the --no-reexec flag, and continue. +- shift +-elif test "X$1" = X--fallback-echo; then +- # Avoid inline document here, it may be left over +- : +-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then +- # Yippee, $echo works! +- : +-else +- # Restart under the correct shell. +- exec $SHELL "$0" --no-reexec ${1+"$@"} +-fi +- +-if test "X$1" = X--fallback-echo; then +- # used as fallback echo +- shift +- cat </dev/null && +- echo_test_string="`eval $cmd`" && +- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null +- then +- break +- fi +- done +-fi +- +-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && +- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- : +-else +- # The Solaris, AIX, and Digital Unix default echo programs unquote +- # backslashes. This makes it impossible to quote backslashes using +- # echo "$something" | sed 's/\\/\\\\/g' +- # +- # So, first we look for a working echo in the user's PATH. +- +- IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for dir in $PATH /usr/ucb; do +- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && +- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && +- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- echo="$dir/echo" +- break +- fi +- done +- IFS="$save_ifs" +- +- if test "X$echo" = Xecho; then +- # We didn't find a better echo, so look for alternatives. +- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && +- echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # This shell has a builtin print -r that does the trick. +- echo='print -r' +- elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && +- test "X$CONFIG_SHELL" != X/bin/ksh; then +- # If we have ksh, try running configure again with it. +- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} +- export ORIGINAL_CONFIG_SHELL +- CONFIG_SHELL=/bin/ksh +- export CONFIG_SHELL +- exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} +- else +- # Try using printf. +- echo='printf %s\n' +- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && +- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- # Cool, printf works +- : +- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL +- export CONFIG_SHELL +- SHELL="$CONFIG_SHELL" +- export SHELL +- echo="$CONFIG_SHELL $0 --fallback-echo" +- elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && +- test "X$echo_testing_string" = 'X\t' && +- echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && +- test "X$echo_testing_string" = "X$echo_test_string"; then +- echo="$CONFIG_SHELL $0 --fallback-echo" +- else +- # maybe with a smaller string... +- prev=: +- +- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do +- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null +- then +- break +- fi +- prev="$cmd" +- done +- +- if test "$prev" != 'sed 50q "$0"'; then +- echo_test_string=`eval $prev` +- export echo_test_string +- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} +- else +- # Oops. We lost completely, so just stick with echo. +- echo=echo +- fi +- fi +- fi +- fi +-fi +-fi +- +-# Copy echo and quote the copy suitably for passing to libtool from +-# the Makefile, instead of quoting the original, which is used later. +-ECHO=$echo +-if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then +- ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +-fi +- +- +- +-if expr a : '\(a\)' >/dev/null 2>&1; then +- as_expr=expr +-else +- as_expr=false +-fi +- +- + ## --------------------- ## + ## M4sh Initialization. ## + ## --------------------- ## +@@ -183,46 +15,57 @@ + if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' + elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix + fi ++DUALCASE=1; export DUALCASE # for MKS sh + +-# NLS nuisances. + # Support unset when possible. +-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset + else + as_unset=false + fi + +-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && +- { $as_unset LANG || test "${LANG+set}" != set; } || +- { LANG=C; export LANG; } +-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && +- { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || +- { LC_ALL=C; export LC_ALL; } +-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && +- { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || +- { LC_TIME=C; export LC_TIME; } +-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && +- { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || +- { LC_CTYPE=C; export LC_CTYPE; } +-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && +- { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || +- { LANGUAGE=C; export LANGUAGE; } +-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && +- { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || +- { LC_COLLATE=C; export LC_COLLATE; } +-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && +- { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || +- { LC_NUMERIC=C; export LC_NUMERIC; } +-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && +- { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || +- { LC_MESSAGES=C; export LC_MESSAGES; } ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++$as_unset ENV MAIL MAILPATH ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi + + + # Name of the executable. +-as_me=`(basename "$0") 2>/dev/null || ++as_me=`$as_basename "$0" || + $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ +@@ -233,6 +76,7 @@ + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + ++ + # PATH needs CR, and LINENO needs CR and PATH. + # Avoid depending upon Character Ranges. + as_cr_letters='abcdefghijklmnopqrstuvwxyz' +@@ -243,15 +87,15 @@ + + # The user is always right. + if test "${PATH_SEPARATOR+set}" != set; then +- echo "#! /bin/sh" >conftest.sh +- echo "exit 0" >>conftest.sh +- chmod +x conftest.sh +- if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi +- rm -f conftest.sh ++ rm -f conf$$.sh + fi + + +@@ -299,6 +143,8 @@ + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then ++ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } ++ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} +@@ -371,13 +217,20 @@ + fi + rm -f conf$$ conf$$.exe conf$$.file + ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ + as_executable_p="test -f" + + # Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + + # Sed expression to map a string onto a valid variable name. +-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + # IFS +@@ -387,76 +240,233 @@ + IFS=" $as_nl" + + # CDPATH. +-$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } +- ++$as_unset CDPATH + +-# Name of the host. +-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +-# so uname gets run too. +-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +-exec 6>&1 + +-# +-# Initializations. +-# +-ac_default_prefix=/usr/local +-cross_compiling=no +-subdirs= +-MFLAGS= +-MAKEFLAGS= ++# Check that we are running under the correct shell. + SHELL=${CONFIG_SHELL-/bin/sh} + +-# Maximum number of lines to put in a shell here document. +-# This variable seems obsolete. It should probably be removed, and +-# only ac_max_sed_lines should be used. +-: ${ac_max_here_lines=38} ++case X$ECHO in ++X*--fallback-echo) ++ # Remove one level of quotation (which was required for Make). ++ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ++ ;; ++esac + +-# Identity of this package. +-PACKAGE_NAME='libodbcxx' +-PACKAGE_TARNAME='libodbc++' +-PACKAGE_VERSION='0.2.3' +-PACKAGE_STRING='libodbcxx 0.2.3' +-PACKAGE_BUGREPORT='freeodbc++@orcane.net' ++echo=${ECHO-echo} ++if test "X$1" = X--no-reexec; then ++ # Discard the --no-reexec flag, and continue. ++ shift ++elif test "X$1" = X--fallback-echo; then ++ # Avoid inline document here, it may be left over ++ : ++elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then ++ # Yippee, $echo works! ++ : ++else ++ # Restart under the correct shell. ++ exec $SHELL "$0" --no-reexec ${1+"$@"} ++fi + +-ac_unique_file="src/connection.cpp" +-# Factoring default headers for most tests. +-ac_includes_default="\ +-#include +-#if HAVE_SYS_TYPES_H +-# include +-#endif +-#if HAVE_SYS_STAT_H +-# include +-#endif +-#if STDC_HEADERS +-# include +-# include +-#else +-# if HAVE_STDLIB_H +-# include +-# endif +-#endif +-#if HAVE_STRING_H +-# if !STDC_HEADERS && HAVE_MEMORY_H +-# include +-# endif +-# include +-#endif +-#if HAVE_STRINGS_H +-# include +-#endif +-#if HAVE_INTTYPES_H +-# include +-#else +-# if HAVE_STDINT_H +-# include +-# endif +-#endif +-#if HAVE_UNISTD_H +-# include +-#endif" ++if test "X$1" = X--fallback-echo; then ++ # used as fallback echo ++ shift ++ cat </dev/null 2>&1 && unset CDPATH ++ ++if test -z "$ECHO"; then ++if test "X${echo_test_string+set}" != Xset; then ++# find a string as large as possible, as long as the shell can cope with it ++ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do ++ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... ++ if (echo_test_string="`eval $cmd`") 2>/dev/null && ++ echo_test_string="`eval $cmd`" && ++ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null ++ then ++ break ++ fi ++ done ++fi ++ ++if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && ++ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && ++ test "X$echo_testing_string" = "X$echo_test_string"; then ++ : ++else ++ # The Solaris, AIX, and Digital Unix default echo programs unquote ++ # backslashes. This makes it impossible to quote backslashes using ++ # echo "$something" | sed 's/\\/\\\\/g' ++ # ++ # So, first we look for a working echo in the user's PATH. ++ ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for dir in $PATH /usr/ucb; do ++ IFS="$lt_save_ifs" ++ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && ++ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && ++ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && ++ test "X$echo_testing_string" = "X$echo_test_string"; then ++ echo="$dir/echo" ++ break ++ fi ++ done ++ IFS="$lt_save_ifs" ++ ++ if test "X$echo" = Xecho; then ++ # We didn't find a better echo, so look for alternatives. ++ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && ++ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && ++ test "X$echo_testing_string" = "X$echo_test_string"; then ++ # This shell has a builtin print -r that does the trick. ++ echo='print -r' ++ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && ++ test "X$CONFIG_SHELL" != X/bin/ksh; then ++ # If we have ksh, try running configure again with it. ++ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} ++ export ORIGINAL_CONFIG_SHELL ++ CONFIG_SHELL=/bin/ksh ++ export CONFIG_SHELL ++ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} ++ else ++ # Try using printf. ++ echo='printf %s\n' ++ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && ++ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && ++ test "X$echo_testing_string" = "X$echo_test_string"; then ++ # Cool, printf works ++ : ++ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && ++ test "X$echo_testing_string" = 'X\t' && ++ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && ++ test "X$echo_testing_string" = "X$echo_test_string"; then ++ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL ++ export CONFIG_SHELL ++ SHELL="$CONFIG_SHELL" ++ export SHELL ++ echo="$CONFIG_SHELL $0 --fallback-echo" ++ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && ++ test "X$echo_testing_string" = 'X\t' && ++ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && ++ test "X$echo_testing_string" = "X$echo_test_string"; then ++ echo="$CONFIG_SHELL $0 --fallback-echo" ++ else ++ # maybe with a smaller string... ++ prev=: ++ ++ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do ++ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null ++ then ++ break ++ fi ++ prev="$cmd" ++ done ++ ++ if test "$prev" != 'sed 50q "$0"'; then ++ echo_test_string=`eval $prev` ++ export echo_test_string ++ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} ++ else ++ # Oops. We lost completely, so just stick with echo. ++ echo=echo ++ fi ++ fi ++ fi ++ fi ++fi ++fi ++ ++# Copy echo and quote the copy suitably for passing to libtool from ++# the Makefile, instead of quoting the original, which is used later. ++ECHO=$echo ++if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ++ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" ++fi ++ ++ ++ ++ ++tagnames=${tagnames+${tagnames},}CXX ++ ++tagnames=${tagnames+${tagnames},}F77 ++ ++# Name of the host. ++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# so uname gets run too. ++ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` ++ ++exec 6>&1 ++ ++# ++# Initializations. ++# ++ac_default_prefix=/usr/local ++ac_config_libobj_dir=. ++cross_compiling=no ++subdirs= ++MFLAGS= ++MAKEFLAGS= ++SHELL=${CONFIG_SHELL-/bin/sh} ++ ++# Maximum number of lines to put in a shell here document. ++# This variable seems obsolete. It should probably be removed, and ++# only ac_max_sed_lines should be used. ++: ${ac_max_here_lines=38} ++ ++# Identity of this package. ++PACKAGE_NAME='libodbcxx' ++PACKAGE_TARNAME='libodbc++' ++PACKAGE_VERSION='0.2.3-20050404' ++PACKAGE_STRING='libodbcxx 0.2.3-20050404' ++PACKAGE_BUGREPORT='freeodbc++@orcane.net' ++ ++ac_unique_file="src/connection.cpp" ++# Factoring default headers for most tests. ++ac_includes_default="\ ++#include ++#if HAVE_SYS_TYPES_H ++# include ++#endif ++#if HAVE_SYS_STAT_H ++# include ++#endif ++#if STDC_HEADERS ++# include ++# include ++#else ++# if HAVE_STDLIB_H ++# include ++# endif ++#endif ++#if HAVE_STRING_H ++# if !STDC_HEADERS && HAVE_MEMORY_H ++# include ++# endif ++# include ++#endif ++#if HAVE_STRINGS_H ++# include ++#endif ++#if HAVE_INTTYPES_H ++# include ++#else ++# if HAVE_STDINT_H ++# include ++# endif ++#endif ++#if HAVE_UNISTD_H ++# include ++#endif" + ++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE am__leading_dot lib_version build build_cpu build_vendor build_os host host_cpu host_vendor host_os sed CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP F77 FFLAGS ac_ct_F77 LIBTOOL docdir THREAD_LIBS THREADS_TRUE THREADS_FALSE LIBREADLINE INCLUDES doxygen perl db2html zip bzip2 BUILD_QTSQLXX_TRUE BUILD_QTSQLXX_FALSE QT_INCLUDES QT_LIBS QT_DEFS QT_MOC QT_TRUE QT_FALSE BUILD_ISQLXX_TRUE BUILD_ISQLXX_FALSE BUILD_TESTS_TRUE BUILD_TESTS_FALSE LIBOBJS LTLIBOBJS' ++ac_subst_files='' + + # Initialize some variables set by options. + ac_init_help= +@@ -814,7 +824,7 @@ + + # Be sure to have absolute paths. + for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ +- localstatedir libdir includedir oldincludedir infodir mandir ++ localstatedir libdir includedir oldincludedir infodir mandir + do + eval ac_val=$`echo $ac_var` + case $ac_val in +@@ -854,10 +864,10 @@ + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || + $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$0" : 'X\(//\)[^/]' \| \ +- X"$0" : 'X\(//\)$' \| \ +- X"$0" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$0" : 'X\(//\)[^/]' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -880,6 +890,9 @@ + { (exit 1); exit 1; }; } + fi + fi ++(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || ++ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 ++ { (exit 1); exit 1; }; } + srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` + ac_env_build_alias_set=${build_alias+set} + ac_env_build_alias_value=$build_alias +@@ -925,6 +938,14 @@ + ac_env_CPP_value=$CPP + ac_cv_env_CPP_set=${CPP+set} + ac_cv_env_CPP_value=$CPP ++ac_env_F77_set=${F77+set} ++ac_env_F77_value=$F77 ++ac_cv_env_F77_set=${F77+set} ++ac_cv_env_F77_value=$F77 ++ac_env_FFLAGS_set=${FFLAGS+set} ++ac_env_FFLAGS_value=$FFLAGS ++ac_cv_env_FFLAGS_set=${FFLAGS+set} ++ac_cv_env_FFLAGS_value=$FFLAGS + + # + # Report the --help message. +@@ -933,7 +954,7 @@ + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures libodbcxx 0.2.3 to adapt to many kinds of systems. ++\`configure' configures libodbcxx 0.2.3-20050404 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -958,9 +979,9 @@ + cat <<_ACEOF + Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX +- [$ac_default_prefix] ++ [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX +- [PREFIX] ++ [PREFIX] + + By default, \`make install' will install all the files in + \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +@@ -999,26 +1020,32 @@ + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of libodbcxx 0.2.3:";; ++ short | recursive ) echo "Configuration of libodbcxx 0.2.3-20050404:";; + esac + cat <<\_ACEOF + + Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +- --enable-shared=PKGS build shared libraries default=yes +- --enable-static=PKGS build static libraries default=no ++ --enable-shared[=PKGS] ++ build shared libraries [default=yes] ++ --enable-static[=PKGS] ++ build static libraries [default=no] + --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors +- --enable-fast-install=PKGS optimize for fast installation default=yes ++ --enable-fast-install[=PKGS] ++ optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-threads Enable threads + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) +- --with-gnu-ld assume the C compiler uses GNU ld default=no +- --with-pic try to use only PIC/non-PIC objects default=use both ++ --with-gnu-ld assume the C compiler uses GNU ld [default=no] ++ --with-pic try to use only PIC/non-PIC objects [default=use ++ both] ++ --with-tags[=TAGS] ++ include additional configurations [automatic] + --with-docdir=DIR Where to install documentation DATADIR/doc + --with-odbc=DIR Use unixODBC, optionally installed in DIR + --with-odbc-includes=DIR Find unixODBC headers in DIR +@@ -1046,6 +1073,8 @@ + CC C compiler command + CFLAGS C compiler flags + CPP C preprocessor ++ F77 Fortran 77 compiler command ++ FFLAGS Fortran 77 compiler flags + + Use these variables to override the choices made by `configure' or to help + it to find libraries and programs with nonstandard names/locations. +@@ -1084,12 +1113,45 @@ + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac +-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +-# absolute. +-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. +@@ -1100,7 +1162,7 @@ + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || +- test -f $ac_srcdir/configure.in; then ++ test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else +@@ -1113,11 +1175,10 @@ + test -n "$ac_init_help" && exit 0 + if $ac_init_version; then + cat <<\_ACEOF +-libodbcxx configure 0.2.3 +-generated by GNU Autoconf 2.53 ++libodbcxx configure 0.2.3-20050404 ++generated by GNU Autoconf 2.59 + +-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +-Free Software Foundation, Inc. ++Copyright (C) 2003 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF +@@ -1128,8 +1189,8 @@ + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by libodbcxx $as_me 0.2.3, which was +-generated by GNU Autoconf 2.53. Invocation command line was ++It was created by libodbcxx $as_me 0.2.3-20050404, which was ++generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +@@ -1181,27 +1242,54 @@ + + # Keep a trace of the command line. + # Strip out --no-create and --no-recursion so they do not pile up. ++# Strip out --silent because we don't want to record it for future runs. + # Also quote any args containing shell meta-characters. ++# Make two passes to allow for proper duplicate-argument suppression. + ac_configure_args= ++ac_configure_args0= ++ac_configure_args1= + ac_sep= +-for ac_arg ++ac_must_keep_next=false ++for ac_pass in 1 2 + do +- case $ac_arg in +- -no-create | --no-create | --no-creat | --no-crea | --no-cre \ +- | --no-cr | --no-c | -n ) continue ;; +- -no-recursion | --no-recursion | --no-recursio | --no-recursi \ +- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) +- continue ;; +- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) +- ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; +- esac +- case " $ac_configure_args " in +- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. +- *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" +- ac_sep=" " ;; +- esac +- # Get rid of the leading space. ++ for ac_arg ++ do ++ case $ac_arg in ++ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ continue ;; ++ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ++ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ esac ++ case $ac_pass in ++ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; ++ 2) ++ ac_configure_args1="$ac_configure_args1 '$ac_arg'" ++ if test $ac_must_keep_next = true; then ++ ac_must_keep_next=false # Got value, back to normal. ++ else ++ case $ac_arg in ++ *=* | --config-cache | -C | -disable-* | --disable-* \ ++ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ ++ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ ++ | -with-* | --with-* | -without-* | --without-* | --x) ++ case "$ac_configure_args0 " in ++ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; ++ esac ++ ;; ++ -* ) ac_must_keep_next=true ;; ++ esac ++ fi ++ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" ++ # Get rid of the leading space. ++ ac_sep=" " ++ ;; ++ esac ++ done + done ++$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } ++$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + + # When interrupted or exit'd, cleanup temporary files, and complete + # config.log. We remove comments because anyway the quotes in there +@@ -1212,6 +1300,7 @@ + # Save into config.log some information that might help in debugging. + { + echo ++ + cat <<\_ASBOX + ## ---------------- ## + ## Cache variables. ## +@@ -1224,16 +1313,45 @@ + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ +- "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ++ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ +- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ++ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; + } + echo ++ ++ cat <<\_ASBOX ++## ----------------- ## ++## Output variables. ## ++## ----------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_vars ++ do ++ eval ac_val=$`echo $ac_var` ++ echo "$ac_var='"'"'$ac_val'"'"'" ++ done | sort ++ echo ++ ++ if test -n "$ac_subst_files"; then ++ cat <<\_ASBOX ++## ------------- ## ++## Output files. ## ++## ------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_files ++ do ++ eval ac_val=$`echo $ac_var` ++ echo "$ac_var='"'"'$ac_val'"'"'" ++ done | sort ++ echo ++ fi ++ + if test -s confdefs.h; then + cat <<\_ASBOX + ## ----------- ## +@@ -1241,14 +1359,14 @@ + ## ----------- ## + _ASBOX + echo +- sed "/^$/d" confdefs.h ++ sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 +- rm -f core core.* *.core && ++ rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +@@ -1328,7 +1446,7 @@ + # value. + ac_cache_corrupted=false + for ac_var in `(set) 2>&1 | +- sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do ++ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" +@@ -1345,13 +1463,13 @@ + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then +- { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 ++ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} +- { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 ++ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + echo "$as_me: former value: $ac_old_val" >&2;} +- { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 ++ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + echo "$as_me: current value: $ac_new_val" >&2;} +- ac_cache_corrupted=: ++ ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. +@@ -1407,7 +1525,8 @@ + + + +-am__api_version="1.6" ++ ++am__api_version="1.7" + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then +@@ -1444,6 +1563,7 @@ + # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag + # AFS /usr/afsws/bin/install, which mishandles nonexistent args + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic + # ./install, which can be erroneously created by make from ./install.sh. + echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 + echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +@@ -1460,6 +1580,7 @@ + case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. +@@ -1467,20 +1588,20 @@ + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then +- if test $ac_prog = install && +- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # AIX install. It has an incompatible calling convention. +- : +- elif test $ac_prog = install && +- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # program-specific install script used by HP pwplus--don't use. +- : +- else +- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" +- break 3 +- fi +- fi ++ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then ++ if test $ac_prog = install && ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : ++ else ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 ++ fi ++ fi + done + done + ;; +@@ -1622,15 +1743,15 @@ + test -n "$AWK" && break + done + +-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5 +-echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` ++echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 ++echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 ++set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` + if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.make <<\_ACEOF + all: +- @echo 'ac_maketemp="${MAKE}"' ++ @echo 'ac_maketemp="$(MAKE)"' + _ACEOF + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +@@ -1651,6 +1772,15 @@ + SET_MAKE="MAKE=${MAKE-make}" + fi + ++rm -rf .tst 2>/dev/null ++mkdir .tst 2>/dev/null ++if test -d .tst; then ++ am__leading_dot=. ++else ++ am__leading_dot=_ ++fi ++rmdir .tst 2>/dev/null ++ + # test to see if srcdir already configured + if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then +@@ -1659,9 +1789,19 @@ + { (exit 1); exit 1; }; } + fi + ++# test whether we have cygpath ++if test -z "$CYGPATH_W"; then ++ if (cygpath --version) >/dev/null 2>/dev/null; then ++ CYGPATH_W='cygpath -w' ++ else ++ CYGPATH_W=echo ++ fi ++fi ++ ++ + # Define the identity of the package. +- PACKAGE=libodbc++ +- VERSION=0.2.3 ++ PACKAGE='libodbc++' ++ VERSION='0.2.3-20050404' + + + cat >>confdefs.h <<_ACEOF +@@ -1787,11 +1927,7 @@ + + + +-# Add the stamp file to the list of files AC keeps track of, +-# along with our hook. +-ac_config_headers="$ac_config_headers config.h" +- +- ++ ac_config_headers="$ac_config_headers config.h" + + + # version is current:revision:age +@@ -1808,47 +1944,51 @@ + if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +-case $enableval in +-yes) enable_shared=yes ;; +-no) enable_shared=no ;; +-*) +- enable_shared=no +- # Look at the argument we got. We use all the common list separators. +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," +- for pkg in $enableval; do +- if test "X$pkg" = "X$p"; then +- enable_shared=yes +- fi +- done +- IFS="$ac_save_ifs" +- ;; +-esac ++ case $enableval in ++ yes) enable_shared=yes ;; ++ no) enable_shared=no ;; ++ *) ++ enable_shared=no ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for pkg in $enableval; do ++ IFS="$lt_save_ifs" ++ if test "X$pkg" = "X$p"; then ++ enable_shared=yes ++ fi ++ done ++ IFS="$lt_save_ifs" ++ ;; ++ esac + else + enable_shared=yes + fi; ++ + # Check whether --enable-static or --disable-static was given. + if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} +-case $enableval in +-yes) enable_static=yes ;; +-no) enable_static=no ;; +-*) +- enable_static=no +- # Look at the argument we got. We use all the common list separators. +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," +- for pkg in $enableval; do +- if test "X$pkg" = "X$p"; then +- enable_static=yes +- fi +- done +- IFS="$ac_save_ifs" +- ;; +-esac ++ case $enableval in ++ yes) enable_static=yes ;; ++ no) enable_static=no ;; ++ *) ++ enable_static=no ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for pkg in $enableval; do ++ IFS="$lt_save_ifs" ++ if test "X$pkg" = "X$p"; then ++ enable_static=yes ++ fi ++ done ++ IFS="$lt_save_ifs" ++ ;; ++ esac + else + enable_static=no + fi; + ++ + # Prevents the Makefile rebuild rules runnning automatically. Use + # autogen.sh instead. + # AM_MAINTAINER_MODE +@@ -2071,15 +2211,12 @@ + (exit $ac_status); } + + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -2089,12 +2226,12 @@ + } + _ACEOF + ac_clean_files_save=$ac_clean_files +-ac_clean_files="$ac_clean_files a.out a.exe" ++ac_clean_files="$ac_clean_files a.out a.exe b.out" + # Try to create an executable without -o first, disregard a.out. + # It will help us diagnose broken compilers, and finding out an intuition + # of exeext. +-echo "$as_me:$LINENO: checking for C++ compiler default output" >&5 +-echo $ECHO_N "checking for C++ compiler default output... $ECHO_C" >&6 ++echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 ++echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6 + ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 +@@ -2108,26 +2245,39 @@ + # Be careful to initialize this variable, since it used to be cached. + # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. + ac_cv_exeext= +-for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null; +- ls a.out conftest 2>/dev/null; +- ls a.* conftest.* 2>/dev/null`; do ++# b.out is created by i960 compilers. ++for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out ++do ++ test -f "$ac_file" || continue + case $ac_file in +- *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;; +- a.out ) # We found the default executable, but exeext='' is most +- # certainly right. +- break;; +- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- # FIXME: I believe we export ac_cv_exeext for Libtool --akim. +- export ac_cv_exeext +- break;; +- * ) break;; ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ++ ;; ++ conftest.$ac_ext ) ++ # This is the source file. ++ ;; ++ [ab].out ) ++ # We found the default executable, but exeext='' is most ++ # certainly right. ++ break;; ++ *.* ) ++ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` ++ # FIXME: I believe we export ac_cv_exeext for Libtool, ++ # but it would be cool to find out if it's true. Does anybody ++ # maintain Libtool? --akim. ++ export ac_cv_exeext ++ break;; ++ * ) ++ break;; + esac + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 +-{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables" >&5 +-echo "$as_me: error: C++ compiler cannot create executables" >&2;} ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C++ compiler cannot create executables ++See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } + fi + +@@ -2154,9 +2304,11 @@ + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C++ compiled programs. +-If you meant to cross compile, use \`--host'." >&5 ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details." >&5 + echo "$as_me: error: cannot run C++ compiled programs. +-If you meant to cross compile, use \`--host'." >&2;} ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +@@ -2164,7 +2316,7 @@ + echo "$as_me:$LINENO: result: yes" >&5 + echo "${ECHO_T}yes" >&6 + +-rm -f a.out a.exe conftest$ac_cv_exeext ++rm -f a.out a.exe conftest$ac_cv_exeext b.out + ac_clean_files=$ac_clean_files_save + # Check the compiler produces executables we can run. If not, either + # the compiler is broken, or we cross compile. +@@ -2184,18 +2336,21 @@ + # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will + # work properly (i.e., refer to `conftest.exe'), while it won't with + # `rm'. +-for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do ++for ac_file in conftest.exe conftest conftest.*; do ++ test -f "$ac_file" || continue + case $ac_file in +- *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;; ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- export ac_cv_exeext +- break;; ++ export ac_cv_exeext ++ break;; + * ) break;; + esac + done + else +- { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5 +-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;} ++ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + +@@ -2212,15 +2367,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -2237,16 +2389,19 @@ + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;; ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 +-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5 +-echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;} ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute suffix of object files: cannot compile ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + +@@ -2262,15 +2417,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -2284,11 +2436,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2297,10 +2459,11 @@ + ac_compiler_gnu=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_compiler_gnu=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + + fi +@@ -2316,15 +2479,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -2335,11 +2495,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2348,10 +2518,11 @@ + ac_cv_prog_cxx_g=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_prog_cxx_g=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 + echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +@@ -2371,8 +2542,7 @@ + fi + fi + for ac_declaration in \ +- ''\ +- '#include ' \ ++ '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ +@@ -2380,16 +2550,13 @@ + 'void exit (int);' + do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +-#include ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_declaration +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif ++#include + int + main () + { +@@ -2400,11 +2567,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2413,20 +2590,18 @@ + : + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + continue + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_declaration +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -2437,11 +2612,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2450,9 +2635,10 @@ + break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + rm -f conftest* + if test -n "$ac_declaration"; then +@@ -2466,24 +2652,16 @@ + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu +-rm -f .deps 2>/dev/null +-mkdir .deps 2>/dev/null +-if test -d .deps; then +- DEPDIR=.deps +-else +- # MS-DOS does not allow filenames that begin with a dot. +- DEPDIR=_deps +-fi +-rmdir .deps 2>/dev/null ++DEPDIR="${am__leading_dot}deps" + +- +-ac_config_commands="$ac_config_commands depfiles" ++ ac_config_commands="$ac_config_commands depfiles" + + + am_make=${MAKE-make} + cat > confinc << 'END' +-doit: ++am__doit: + @echo done ++.PHONY: am__doit + END + # If we don't find an include directive, just comment out the code. + echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +@@ -2498,7 +2676,7 @@ + # In particular we don't look at `^make:' because GNU make might + # be invoked under some other name (usually "gmake"), in which + # case it prints its new name instead of `make'. +-if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then ++if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +@@ -2558,18 +2736,32 @@ + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir ++ # We will build objects and dependencies in a subdirectory because ++ # it helps to detect inapplicable dependency modes. For instance ++ # both Tru64's cc and ICC support -MD to output dependencies as a ++ # side effect of compilation, but ICC will put the dependencies in ++ # the current directory while Tru64 will put them in the object ++ # directory. ++ mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do ++ # Setup a source with many dependencies, because some compilers ++ # like to wrap large dependency lists on column 80 (with \), and ++ # we should not choose a depcomp mode which is confused by this. ++ # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. +- echo '#include "conftest.h"' > conftest.c +- echo 'int i;' > conftest.h +- echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf ++ : > sub/conftest.c ++ for i in 1 2 3 4 5 6; do ++ echo '#include "conftst'$i'.h"' >> sub/conftest.c ++ : > sub/conftst$i.h ++ done ++ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) +@@ -2587,13 +2779,20 @@ + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ +- source=conftest.c object=conftest.o \ +- depfile=conftest.Po tmpdepfile=conftest.TPo \ +- $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && +- grep conftest.h conftest.Po > /dev/null 2>&1 && ++ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ ++ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ ++ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ ++ >/dev/null 2>conftest.err && ++ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && ++ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then +- am_cv_CXX_dependencies_compiler_type=$depmode +- break ++ # icc doesn't choke on unknown options, it will just issue warnings ++ # (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored. ++ if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else ++ am_cv_CXX_dependencies_compiler_type=$depmode ++ break ++ fi + fi + done + +@@ -2609,6 +2808,18 @@ + CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + ++ ++if ++ test "x$enable_dependency_tracking" != xno \ ++ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then ++ am__fastdepCXX_TRUE= ++ am__fastdepCXX_FALSE='#' ++else ++ am__fastdepCXX_TRUE='#' ++ am__fastdepCXX_FALSE= ++fi ++ ++ + ac_ext=cc + ac_cpp='$CXXCPP $CPPFLAGS' + ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -2628,24 +2839,34 @@ + do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +-#include +- Syntax error ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -2656,7 +2877,8 @@ + : + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Broken: fails on valid input. + continue + fi +@@ -2665,20 +2887,24 @@ + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -2690,7 +2916,8 @@ + continue + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Passes both tests. + ac_preproc_ok=: + break +@@ -2719,24 +2946,34 @@ + do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +-#include +- Syntax error ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -2747,7 +2984,8 @@ + : + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Broken: fails on valid input. + continue + fi +@@ -2756,20 +2994,24 @@ + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -2781,7 +3023,8 @@ + continue + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Passes both tests. + ac_preproc_ok=: + break +@@ -2794,8 +3037,10 @@ + if $ac_preproc_ok; then + : + else +- { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&5 +-echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&2;} ++ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + +@@ -2815,24 +3060,26 @@ + if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} +-case $enableval in +-yes) enable_fast_install=yes ;; +-no) enable_fast_install=no ;; +-*) +- enable_fast_install=no +- # Look at the argument we got. We use all the common list separators. +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," +- for pkg in $enableval; do +- if test "X$pkg" = "X$p"; then +- enable_fast_install=yes +- fi +- done +- IFS="$ac_save_ifs" +- ;; +-esac ++ case $enableval in ++ yes) enable_fast_install=yes ;; ++ no) enable_fast_install=no ;; ++ *) ++ enable_fast_install=no ++ # Look at the argument we got. We use all the common list separators. ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for pkg in $enableval; do ++ IFS="$lt_save_ifs" ++ if test "X$pkg" = "X$p"; then ++ enable_fast_install=yes ++ fi ++ done ++ IFS="$lt_save_ifs" ++ ;; ++ esac + else + enable_fast_install=yes + fi; ++ + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -3037,9 +3284,7 @@ + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift +- set dummy "$as_dir/$ac_word" ${1+"$@"} +- shift +- ac_cv_prog_CC="$@" ++ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi + fi + fi +@@ -3144,8 +3389,10 @@ + fi + + +-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5 +-echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;} ++test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH ++See \`config.log' for more details." >&5 ++echo "$as_me: error: no acceptable C compiler found in \$PATH ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + + # Provide some information about the compiler. +@@ -3174,15 +3421,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -3196,11 +3440,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3209,10 +3463,11 @@ + ac_compiler_gnu=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_compiler_gnu=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_c_compiler_gnu=$ac_compiler_gnu + + fi +@@ -3228,15 +3483,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -3247,11 +3499,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3260,10 +3522,11 @@ + ac_cv_prog_cc_g=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_prog_cc_g=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 + echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +@@ -3282,6 +3545,121 @@ + CFLAGS= + fi + fi ++echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 ++echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 ++if test "${ac_cv_prog_cc_stdc+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_cv_prog_cc_stdc=no ++ac_save_CC=$CC ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++#include ++#include ++#include ++/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ ++struct buf { int x; }; ++FILE * (*rcsopen) (struct buf *, struct stat *, int); ++static char *e (p, i) ++ char **p; ++ int i; ++{ ++ return p[i]; ++} ++static char *f (char * (*g) (char **, int), char **p, ...) ++{ ++ char *s; ++ va_list v; ++ va_start (v,p); ++ s = g (p, va_arg (v,int)); ++ va_end (v); ++ return s; ++} ++ ++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has ++ function prototypes and stuff, but not '\xHH' hex character constants. ++ These don't provoke an error unfortunately, instead are silently treated ++ as 'x'. The following induces an error, until -std1 is added to get ++ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an ++ array size at least. It's necessary to write '\x00'==0 to get something ++ that's true only with -std1. */ ++int osf4_cc_array ['\x00' == 0 ? 1 : -1]; ++ ++int test (int i, double x); ++struct s1 {int (*f) (int a);}; ++struct s2 {int (*f) (double a);}; ++int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); ++int argc; ++char **argv; ++int ++main () ++{ ++return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ++ ; ++ return 0; ++} ++_ACEOF ++# Don't try gcc -ansi; that turns off useful extensions and ++# breaks some systems' header files. ++# AIX -qlanglvl=ansi ++# Ultrix and OSF/1 -std1 ++# HP-UX 10.20 and later -Ae ++# HP-UX older versions -Aa -D_HPUX_SOURCE ++# SVR4 -Xc -D__EXTENSIONS__ ++for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" ++do ++ CC="$ac_save_CC $ac_arg" ++ rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_prog_cc_stdc=$ac_arg ++break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext ++done ++rm -f conftest.$ac_ext conftest.$ac_objext ++CC=$ac_save_CC ++ ++fi ++ ++case "x$ac_cv_prog_cc_stdc" in ++ x|xno) ++ echo "$as_me:$LINENO: result: none needed" >&5 ++echo "${ECHO_T}none needed" >&6 ;; ++ *) ++ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 ++echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 ++ CC="$CC $ac_cv_prog_cc_stdc" ;; ++esac ++ + # Some people use a C++ compiler to compile C. Since we use `exit', + # in C++ we need to declare it. In case someone uses the same compiler + # for both compiling C and C++ we need to have the C++ compiler decide +@@ -3293,19 +3671,28 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ +- ''\ +- '#include ' \ ++ '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ +@@ -3313,16 +3700,13 @@ + 'void exit (int);' + do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +-#include ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_declaration +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif ++#include + int + main () + { +@@ -3333,11 +3717,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3346,20 +3740,18 @@ + : + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + continue + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_declaration +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -3370,11 +3762,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3383,9 +3785,10 @@ + break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + rm -f conftest* + if test -n "$ac_declaration"; then +@@ -3396,9 +3799,10 @@ + + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -3423,18 +3827,32 @@ + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir ++ # We will build objects and dependencies in a subdirectory because ++ # it helps to detect inapplicable dependency modes. For instance ++ # both Tru64's cc and ICC support -MD to output dependencies as a ++ # side effect of compilation, but ICC will put the dependencies in ++ # the current directory while Tru64 will put them in the object ++ # directory. ++ mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do ++ # Setup a source with many dependencies, because some compilers ++ # like to wrap large dependency lists on column 80 (with \), and ++ # we should not choose a depcomp mode which is confused by this. ++ # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. +- echo '#include "conftest.h"' > conftest.c +- echo 'int i;' > conftest.h +- echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf ++ : > sub/conftest.c ++ for i in 1 2 3 4 5 6; do ++ echo '#include "conftst'$i'.h"' >> sub/conftest.c ++ : > sub/conftst$i.h ++ done ++ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) +@@ -3452,13 +3870,20 @@ + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ +- source=conftest.c object=conftest.o \ +- depfile=conftest.Po tmpdepfile=conftest.TPo \ +- $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && +- grep conftest.h conftest.Po > /dev/null 2>&1 && ++ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ ++ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ ++ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ ++ >/dev/null 2>conftest.err && ++ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && ++ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then +- am_cv_CC_dependencies_compiler_type=$depmode +- break ++ # icc doesn't choke on unknown options, it will just issue warnings ++ # (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored. ++ if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else ++ am_cv_CC_dependencies_compiler_type=$depmode ++ break ++ fi + fi + done + +@@ -3474,16 +3899,89 @@ + CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + +-# Find the correct PATH separator. Usually this is `:', but +-# DJGPP uses `;' like DOS. +-if test "X${PATH_SEPARATOR+set}" != Xset; then +- UNAME=${UNAME-`uname 2>/dev/null`} +- case X$UNAME in +- *-DOS) lt_cv_sys_path_separator=';' ;; +- *) lt_cv_sys_path_separator=':' ;; +- esac +- PATH_SEPARATOR=$lt_cv_sys_path_separator ++ ++if ++ test "x$enable_dependency_tracking" != xno \ ++ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then ++ am__fastdepCC_TRUE= ++ am__fastdepCC_FALSE='#' ++else ++ am__fastdepCC_TRUE='#' ++ am__fastdepCC_FALSE= ++fi ++ ++ ++echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 ++echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 ++if test "${lt_cv_path_SED+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ # Loop through the user's path and test for sed and gsed. ++# Then use that list of sed's as ones to test for truncation. ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for lt_ac_prog in sed gsed; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then ++ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" ++ fi ++ done ++ done ++done ++lt_ac_max=0 ++lt_ac_count=0 ++# Add /usr/xpg4/bin/sed as it is typically found on Solaris ++# along with /bin/sed that truncates output. ++for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do ++ test ! -f $lt_ac_sed && break ++ cat /dev/null > conftest.in ++ lt_ac_count=0 ++ echo $ECHO_N "0123456789$ECHO_C" >conftest.in ++ # Check for GNU sed and select it if it is found. ++ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then ++ lt_cv_path_SED=$lt_ac_sed ++ break ++ fi ++ while true; do ++ cat conftest.in conftest.in >conftest.tmp ++ mv conftest.tmp conftest.in ++ cp conftest.in conftest.nl ++ echo >>conftest.nl ++ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break ++ cmp -s conftest.out conftest.nl || break ++ # 10000 chars as input seems more than enough ++ test $lt_ac_count -gt 10 && break ++ lt_ac_count=`expr $lt_ac_count + 1` ++ if test $lt_ac_count -gt $lt_ac_max; then ++ lt_ac_max=$lt_ac_count ++ lt_cv_path_SED=$lt_ac_sed ++ fi ++ done ++done ++ ++fi ++ ++SED=$lt_cv_path_SED ++echo "$as_me:$LINENO: result: $SED" >&5 ++echo "${ECHO_T}$SED" >&6 ++ ++echo "$as_me:$LINENO: checking for egrep" >&5 ++echo $ECHO_N "checking for egrep... $ECHO_C" >&6 ++if test "${ac_cv_prog_egrep+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if echo a | (grep -E '(a|b)') >/dev/null 2>&1 ++ then ac_cv_prog_egrep='grep -E' ++ else ac_cv_prog_egrep='egrep' ++ fi + fi ++echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 ++echo "${ECHO_T}$ac_cv_prog_egrep" >&6 ++ EGREP=$ac_cv_prog_egrep ++ + + + # Check whether --with-gnu-ld or --without-gnu-ld was given. +@@ -3496,8 +3994,8 @@ + ac_prog=ld + if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. +- echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +-echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 ++ echo "$as_me:$LINENO: checking for ld used by $CC" >&5 ++echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw +@@ -3507,12 +4005,12 @@ + esac + case $ac_prog in + # Accept absolute paths. +- [\\/]* | [A-Za-z]:[\\/]*) ++ [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' +- # Canonicalize the path of ld +- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` ++ # Canonicalize the pathname of ld ++ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` ++ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; +@@ -3536,22 +4034,26 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + if test -z "$LD"; then +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do ++ IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. +- if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then ++ case `"$lt_cv_path_LD" -v 2>&1 &6 + else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +-if $LD -v 2>&1 &5; then ++case `$LD -v 2>&1 &5 + echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +@@ -3595,7 +4100,20 @@ + echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 + echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 + reload_flag=$lt_cv_ld_reload_flag +-test -n "$reload_flag" && reload_flag=" $reload_flag" ++case $reload_flag in ++"" | " "*) ;; ++*) reload_flag=" $reload_flag" ;; ++esac ++reload_cmds='$LD$reload_flag -o $output$reload_objs' ++case $host_os in ++ darwin*) ++ if test "$GCC" = yes; then ++ reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' ++ else ++ reload_cmds='$LD$reload_flag -o $output$reload_objs' ++ fi ++ ;; ++esac + + echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 + echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +@@ -3606,35 +4124,42 @@ + # Let the user override the test. + lt_cv_path_NM="$NM" + else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do ++ IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. +- tmp_nm=$ac_dir/${ac_tool_prefix}nm +- if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then ++ tmp_nm="$ac_dir/${ac_tool_prefix}nm" ++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file +- if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then ++ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in ++ */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break +- elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then +- lt_cv_path_NM="$tmp_nm -p" +- break +- else +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- fi ++ ;; ++ *) ++ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in ++ */dev/null*) ++ lt_cv_path_NM="$tmp_nm -p" ++ break ++ ;; ++ *) ++ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but ++ continue # so that we can try to find one that supports BSD flags ++ ;; ++ esac ++ esac + fi + done +- IFS="$ac_save_ifs" ++ IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm + fi + fi +- ++echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 ++echo "${ECHO_T}$lt_cv_path_NM" >&6 + NM="$lt_cv_path_NM" +-echo "$as_me:$LINENO: result: $NM" >&5 +-echo "${ECHO_T}$NM" >&6 + + echo "$as_me:$LINENO: checking whether ln -s works" >&5 + echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +@@ -3647,8 +4172,8 @@ + echo "${ECHO_T}no, using $LN_S" >&6 + fi + +-echo "$as_me:$LINENO: checking how to recognise dependant libraries" >&5 +-echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" >&6 ++echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 ++echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 + if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +@@ -3662,7 +4187,7 @@ + # 'pass_all' -- all dependencies passed with no checks. + # 'test_compile' -- check by making test program. + # 'file_magic [[regex]]' -- check by looking for files in library path +-# which responds to the $file_magic_cmd with a given egrep regex. ++# which responds to the $file_magic_cmd with a given extended regex. + # If you have `file' or equivalent on your system and you're not sure + # whether `pass_all' will *always* work, you probably want this one. + +@@ -3675,31 +4200,30 @@ + lt_cv_deplibs_check_method=pass_all + ;; + +-bsdi4*) ++bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +-cygwin* | mingw* | pw32*) ++cygwin*) ++ # func_win32_libid is a shell function defined in ltmain.sh ++ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' ++ lt_cv_file_magic_cmd='func_win32_libid' ++ ;; ++ ++mingw* | pw32*) ++ # Base MSYS/MinGW do not provide the 'file' command needed by ++ # func_win32_libid shell function, so use a weaker test based on 'objdump'. + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + + darwin* | rhapsody*) +- lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' +- lt_cv_file_magic_cmd='/usr/bin/file -L' +- case "$host_os" in +- rhapsody* | darwin1.[012]) +- lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` +- ;; +- *) # Darwin 1.3 on +- lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' +- ;; +- esac ++ lt_cv_deplibs_check_method=pass_all + ;; + +-freebsd*) ++freebsd* | kfreebsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) +@@ -3719,50 +4243,44 @@ + lt_cv_deplibs_check_method=pass_all + ;; + +-hpux10.20*|hpux11*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' ++hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libc.sl +- ;; +- +-irix5* | irix6*) +- case $host_os in +- irix5*) +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" ++ case "$host_cpu" in ++ ia64*) ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' ++ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ++ ;; ++ hppa*64*) ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' ++ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) +- case $LD in +- *-32|*"-32 ") libmagic=32-bit;; +- *-n32|*"-n32 ") libmagic=N32;; +- *-64|*"-64 ") libmagic=64-bit;; +- *) libmagic=never-match;; +- esac +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' ++ lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac +- lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` ++ ;; ++ ++irix5* | irix6* | nonstopux*) ++ case $LD in ++ *-32|*"-32 ") libmagic=32-bit;; ++ *-n32|*"-n32 ") libmagic=N32;; ++ *-64|*"-64 ") libmagic=64-bit;; ++ *) libmagic=never-match;; ++ esac + lt_cv_deplibs_check_method=pass_all + ;; + + # This must be Linux ELF. +-linux-gnu*) +- case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* ) +- lt_cv_deplibs_check_method=pass_all ;; +- *) +- # glibc up to 2.1.1 does not perform some relocations on ARM +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; +- esac +- lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` ++linux*) ++ lt_cv_deplibs_check_method=pass_all + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +- lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' ++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else +- lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$' ++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +@@ -3772,20 +4290,19 @@ + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + ++nto-qnx*) ++ lt_cv_deplibs_check_method=unknown ++ ;; ++ + openbsd*) +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' ++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else +- lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' ++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + + osf3* | osf4* | osf5*) +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' +- lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +@@ -3795,11 +4312,6 @@ + + solaris*) + lt_cv_deplibs_check_method=pass_all +- lt_cv_file_magic_test_file=/lib/libc.so +- ;; +- +-sysv5uw[78]* | sysv4*uw2*) +- lt_cv_deplibs_check_method=pass_all + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +@@ -3820,8 +4332,15 @@ + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; ++ siemens) ++ lt_cv_deplibs_check_method=pass_all ++ ;; + esac + ;; ++ ++sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) ++ lt_cv_deplibs_check_method=pass_all ++ ;; + esac + + fi +@@ -3829,208 +4348,228 @@ + echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 + file_magic_cmd=$lt_cv_file_magic_cmd + deplibs_check_method=$lt_cv_deplibs_check_method ++test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + ++# If no C compiler was specified, use CC. ++LTCC=${LTCC-"$CC"} + ++# Allow CC to be a program name with arguments. ++compiler=$CC + + ++# Check whether --enable-libtool-lock or --disable-libtool-lock was given. ++if test "${enable_libtool_lock+set}" = set; then ++ enableval="$enable_libtool_lock" + +-# Check for command to grab the raw symbol name followed by C symbol from nm. +-echo "$as_me:$LINENO: checking command to parse $NM output" >&5 +-echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6 +-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- +-# These are sane defaults that work on at least a few old systems. +-# [They come from Ultrix. What could be older than Ultrix?!! ;)] +- +-# Character class describing NM global symbol codes. +-symcode='[BCDEGRST]' +- +-# Regexp to match symbols that can be accessed directly from C. +-sympat='\([_A-Za-z][_A-Za-z0-9]*\)' +- +-# Transform the above into a raw symbol and a C symbol. +-symxfrm='\1 \2\3 \3' +- +-# Transform an extracted symbol line into a proper C declaration +-lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" +- +-# Transform an extracted symbol line into symbol name and symbol address +-lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++fi; ++test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +-# Define system-specific variables. +-case $host_os in +-aix*) +- symcode='[BCDT]' +- ;; +-cygwin* | mingw* | pw32*) +- symcode='[ABCDGISTW]' +- ;; +-hpux*) # Its linker distinguishes data from code symbols +- lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +- lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" +- ;; +-irix*) +- symcode='[BCDEGRST]' +- ;; +-solaris* | sysv5*) +- symcode='[BDT]' +- ;; +-sysv4) +- symcode='[DFNSTU]' ++# Some flags need to be propagated to the compiler or linker for good ++# libtool support. ++case $host in ++ia64-*-hpux*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *ELF-32*) ++ HPUX_IA64_MODE="32" ++ ;; ++ *ELF-64*) ++ HPUX_IA64_MODE="64" ++ ;; ++ esac ++ fi ++ rm -rf conftest* + ;; +-esac +- +-# Handle CRLF in mingw tool chain +-opt_cr= +-case $host_os in +-mingw*) +- opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ++*-*-irix6*) ++ # Find out which ABI we are using. ++ echo '#line 4394 "configure"' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *32-bit*) ++ LD="${LD-ld} -melf32bsmip" ++ ;; ++ *N32*) ++ LD="${LD-ld} -melf32bmipn32" ++ ;; ++ *64-bit*) ++ LD="${LD-ld} -melf64bmip" ++ ;; ++ esac ++ else ++ case `/usr/bin/file conftest.$ac_objext` in ++ *32-bit*) ++ LD="${LD-ld} -32" ++ ;; ++ *N32*) ++ LD="${LD-ld} -n32" ++ ;; ++ *64-bit*) ++ LD="${LD-ld} -64" ++ ;; ++ esac ++ fi ++ fi ++ rm -rf conftest* + ;; +-esac +- +-# If we're using GNU nm, then use its standard symbol codes. +-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then +- symcode='[ABCDGISTW]' +-fi +- +-# Try without a prefix undercore, then with it. +-for ac_symprfx in "" "_"; do +- +- # Write the raw and C identifiers. +-lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" +- +- # Check to see that the pipe works correctly. +- pipe_works=no +- rm -f conftest* +- cat > conftest.$ac_ext < conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +- # Now try to grab the symbols. +- nlist=conftest.nm +- if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 +- (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ++ case "`/usr/bin/file conftest.o`" in ++ *32-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_i386" ++ ;; ++ ppc64-*linux*|powerpc64-*linux*) ++ LD="${LD-ld} -m elf32ppclinux" ++ ;; ++ s390x-*linux*) ++ LD="${LD-ld} -m elf_s390" ++ ;; ++ sparc64-*linux*) ++ LD="${LD-ld} -m elf32_sparc" ++ ;; ++ esac ++ ;; ++ *64-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_x86_64" ++ ;; ++ ppc*-*linux*|powerpc*-*linux*) ++ LD="${LD-ld} -m elf64ppc" ++ ;; ++ s390*-*linux*) ++ LD="${LD-ld} -m elf64_s390" ++ ;; ++ sparc*-*linux*) ++ LD="${LD-ld} -m elf64_sparc" ++ ;; ++ esac ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ ++*-*-linux*) ++ # Test if the compiler is 64bit ++ echo 'int i;' > conftest.$ac_ext ++ lt_cv_cc_64bit_output=no ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && test -s "$nlist"; then +- # Try sorting and uniquifying the output. +- if sort "$nlist" | uniq > "$nlist"T; then +- mv -f "$nlist"T "$nlist" +- else +- rm -f "$nlist"T +- fi +- +- # Make sure that we snagged all the symbols we need. +- if egrep ' nm_test_var$' "$nlist" >/dev/null; then +- if egrep ' nm_test_func$' "$nlist" >/dev/null; then +- cat < conftest.$ac_ext +-#ifdef __cplusplus +-extern "C" { +-#endif ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *"ELF 64"*) ++ lt_cv_cc_64bit_output=yes ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; + +-EOF +- # Now generate the symbol file. +- eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' ++*-*-sco3.2v5*) ++ # On SCO OpenServer 5, we need -belf to get full-featured binaries. ++ SAVE_CFLAGS="$CFLAGS" ++ CFLAGS="$CFLAGS -belf" ++ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 ++echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 ++if test "${lt_cv_cc_needs_belf+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu + +- cat <> conftest.$ac_ext +-#if defined (__STDC__) && __STDC__ +-# define lt_ptr void * +-#else +-# define lt_ptr char * +-# define const +-#endif ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-/* The mapping between symbol names and symbols. */ +-const struct { +- const char *name; +- lt_ptr address; +-} +-lt_preloaded_symbols[] = ++int ++main () + { +-EOF +- sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext +- cat <<\EOF >> conftest.$ac_ext +- {0, (lt_ptr) 0} +-}; + +-#ifdef __cplusplus ++ ; ++ return 0; + } +-#endif +-EOF +- # Now try linking the two files. +- mv conftest.$ac_objext conftstm.$ac_objext +- save_LIBS="$LIBS" +- save_CFLAGS="$CFLAGS" +- LIBS="conftstm.$ac_objext" +- CFLAGS="$CFLAGS$no_builtin_flag" +- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && test -s conftest; then +- pipe_works=yes +- fi +- LIBS="$save_LIBS" +- CFLAGS="$save_CFLAGS" +- else +- echo "cannot find nm_test_func in $nlist" >&5 +- fi +- else +- echo "cannot find nm_test_var in $nlist" >&5 +- fi +- else +- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 +- fi +- else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- fi +- rm -f conftest* conftst* +- +- # Do not use the global_symbol_pipe unless it works. +- if test "$pipe_works" = yes; then +- break +- else +- lt_cv_sys_global_symbol_pipe= +- fi +-done ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ lt_cv_cc_needs_belf=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + ++lt_cv_cc_needs_belf=no + fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++ ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu + +-global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +-if test -z "$lt_cv_sys_global_symbol_pipe"; then +- global_symbol_to_cdecl= +- global_symbol_to_c_name_address= +-else +- global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" +- global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +-fi +-if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +-then +- echo "$as_me:$LINENO: result: failed" >&5 +-echo "${ECHO_T}failed" >&6 +-else +- echo "$as_me:$LINENO: result: ok" >&5 +-echo "${ECHO_T}ok" >&6 + fi ++echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 ++echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 ++ if test x"$lt_cv_cc_needs_belf" != x"yes"; then ++ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf ++ CFLAGS="$SAVE_CFLAGS" ++ fi ++ ;; ++ ++esac ++ ++need_locks="$enable_libtool_lock" ++ + + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' +@@ -4055,24 +4594,34 @@ + do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +-#include +- Syntax error ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -4083,7 +4632,8 @@ + : + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Broken: fails on valid input. + continue + fi +@@ -4092,20 +4642,24 @@ + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -4117,7 +4671,8 @@ + continue + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Passes both tests. + ac_preproc_ok=: + break +@@ -4146,24 +4701,34 @@ + do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +-#include +- Syntax error ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -4174,7 +4739,8 @@ + : + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Broken: fails on valid input. + continue + fi +@@ -4183,20 +4749,24 @@ + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -4208,7 +4778,8 @@ + continue + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + # Passes both tests. + ac_preproc_ok=: + break +@@ -4221,8 +4792,10 @@ + if $ac_preproc_ok; then + : + else +- { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5 +-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} ++ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + +@@ -4239,49 +4812,68 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + #include + #include + #include + ++int ++main () ++{ ++ ++ ; ++ return 0; ++} + _ACEOF +-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 +- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } >/dev/null; then +- if test -s conftest.err; then +- ac_cpp_err=$ac_c_preproc_warn_flag +- else +- ac_cpp_err= +- fi +-else +- ac_cpp_err=yes +-fi +-if test -z "$ac_cpp_err"; then ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_cv_header_stdc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- ac_cv_header_stdc=no ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_header_stdc=no + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + + _ACEOF + if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- egrep "memchr" >/dev/null 2>&1; then ++ $EGREP "memchr" >/dev/null 2>&1; then + : + else + ac_cv_header_stdc=no +@@ -4293,13 +4885,16 @@ + if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + + _ACEOF + if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- egrep "free" >/dev/null 2>&1; then ++ $EGREP "free" >/dev/null 2>&1; then + : + else + ac_cv_header_stdc=no +@@ -4314,16 +4909,20 @@ + : + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + #if ((' ' & 0x0FF) == 0x020) + # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') + # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) + #else +-# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ +- || ('j' <= (c) && (c) <= 'r') \ +- || ('s' <= (c) && (c) <= 'z')) ++# define ISLOWER(c) \ ++ (('a' <= (c) && (c) <= 'i') \ ++ || ('j' <= (c) && (c) <= 'r') \ ++ || ('s' <= (c) && (c) <= 'z')) + # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) + #endif + +@@ -4334,7 +4933,7 @@ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) +- || toupper (i) != TOUPPER (i)) ++ || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); + } +@@ -4354,11 +4953,12 @@ + else + echo "$as_me: program exited with status $ac_status" >&5 + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ( exit $ac_status ) + ac_cv_header_stdc=no + fi +-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + fi + fi +@@ -4383,7 +4983,7 @@ + + + for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ +- inttypes.h stdint.h unistd.h ++ inttypes.h stdint.h unistd.h + do + as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` + echo "$as_me:$LINENO: checking for $ac_header" >&5 +@@ -4392,19 +4992,32 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4413,10 +5026,11 @@ + eval "$as_ac_Header=yes" + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + eval "$as_ac_Header=no" + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -4447,18 +5061,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4467,10 +5094,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -4478,20 +5106,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -4502,7 +5134,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -4510,26 +5143,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -4546,195 +5196,258 @@ + + + +- +- +-# Only perform the check for file, if the check method requires it +-case $deplibs_check_method in +-file_magic*) +- if test "$file_magic_cmd" = '$MAGIC_CMD'; then +- echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then ++if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then ++ ac_ext=cc ++ac_cpp='$CXXCPP $CPPFLAGS' ++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ++echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 ++echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 ++if test -z "$CXXCPP"; then ++ if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- case $MAGIC_CMD in +- /*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +- ?:/*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. +- ;; +- *) +- ac_save_MAGIC_CMD="$MAGIC_CMD" +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="/usr/bin:$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/${ac_tool_prefix}file; then +- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- egrep "$file_magic_regex" > /dev/null; then +- : +- else +- cat <&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$ac_save_ifs" +- MAGIC_CMD="$ac_save_MAGIC_CMD" +- ;; +-esac ++ # Double quotes because CXXCPP needs to be expanded ++ for CXXCPP in "$CXX -E" "/lib/cpp" ++ do ++ ac_preproc_ok=false ++for ac_cxx_preproc_warn_flag in '' yes ++do ++ # Use a header file that comes with gcc, so configuring glibc ++ # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. "Syntax error" is here to catch this case. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag ++ else ++ ac_cpp_err= ++ fi ++else ++ ac_cpp_err=yes + fi +- +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +-echo "${ECHO_T}$MAGIC_CMD" >&6 ++if test -z "$ac_cpp_err"; then ++ : + else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Broken: fails on valid input. ++continue + fi ++rm -f conftest.err conftest.$ac_ext + +-if test -z "$lt_cv_path_MAGIC_CMD"; then +- if test -n "$ac_tool_prefix"; then +- echo "$as_me:$LINENO: checking for file" >&5 +-echo $ECHO_N "checking for file... $ECHO_C" >&6 +-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 ++ # OK, works on sane cases. Now check whether non-existent headers ++ # can be detected and how. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag ++ else ++ ac_cpp_err= ++ fi + else +- case $MAGIC_CMD in +- /*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +- ?:/*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. +- ;; +- *) +- ac_save_MAGIC_CMD="$MAGIC_CMD" +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="/usr/bin:$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/file; then +- lt_cv_path_MAGIC_CMD="$ac_dir/file" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- egrep "$file_magic_regex" > /dev/null; then +- : +- else +- cat <&2 ++ ac_cpp_err=yes ++fi ++if test -z "$ac_cpp_err"; then ++ # Broken: success on invalid input. ++continue ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org ++ # Passes both tests. ++ac_preproc_ok=: ++break ++fi ++rm -f conftest.err conftest.$ac_ext + +-EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$ac_save_ifs" +- MAGIC_CMD="$ac_save_MAGIC_CMD" +- ;; +-esac ++done ++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. ++rm -f conftest.err conftest.$ac_ext ++if $ac_preproc_ok; then ++ break + fi + +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +-echo "${ECHO_T}$MAGIC_CMD" >&6 ++ done ++ ac_cv_prog_CXXCPP=$CXXCPP ++ ++fi ++ CXXCPP=$ac_cv_prog_CXXCPP + else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 ++ ac_cv_prog_CXXCPP=$CXXCPP + fi +- ++echo "$as_me:$LINENO: result: $CXXCPP" >&5 ++echo "${ECHO_T}$CXXCPP" >&6 ++ac_preproc_ok=false ++for ac_cxx_preproc_warn_flag in '' yes ++do ++ # Use a header file that comes with gcc, so configuring glibc ++ # with a fresh cross-compiler works. ++ # Prefer to if __STDC__ is defined, since ++ # exists even on freestanding compilers. ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. "Syntax error" is here to catch this case. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ Syntax error ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else +- MAGIC_CMD=: ++ ac_cpp_err= + fi ++else ++ ac_cpp_err=yes + fi ++if test -z "$ac_cpp_err"; then ++ : ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +- fi +- ;; +-esac ++ # Broken: fails on valid input. ++continue ++fi ++rm -f conftest.err conftest.$ac_ext + +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_RANLIB+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 ++ # OK, works on sane cases. Now check whether non-existent headers ++ # can be detected and how. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag ++ else ++ ac_cpp_err= ++ fi + else +- if test -n "$RANLIB"; then +- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. ++ ac_cpp_err=yes ++fi ++if test -z "$ac_cpp_err"; then ++ # Broken: success on invalid input. ++continue + else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + ++ # Passes both tests. ++ac_preproc_ok=: ++break + fi +-fi +-RANLIB=$ac_cv_prog_RANLIB +-if test -n "$RANLIB"; then +- echo "$as_me:$LINENO: result: $RANLIB" >&5 +-echo "${ECHO_T}$RANLIB" >&6 ++rm -f conftest.err conftest.$ac_ext ++ ++done ++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. ++rm -f conftest.err conftest.$ac_ext ++if $ac_preproc_ok; then ++ : + else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 ++ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } + fi + ++ac_ext=cc ++ac_cpp='$CXXCPP $CPPFLAGS' ++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ++ + fi +-if test -z "$ac_cv_prog_RANLIB"; then +- ac_ct_RANLIB=$RANLIB +- # Extract the first word of "ranlib", so it can be a program name with args. +-set dummy ranlib; ac_word=$2 ++ ++ ++ac_ext=f ++ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ++ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_f77_compiler_gnu ++if test -n "$ac_tool_prefix"; then ++ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran ++ do ++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. ++set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + echo "$as_me:$LINENO: checking for $ac_word" >&5 + echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then ++if test "${ac_cv_prog_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- if test -n "$ac_ct_RANLIB"; then +- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. ++ if test -n "$F77"; then ++ ac_cv_prog_F77="$F77" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH +@@ -4743,40 +5456,40 @@ + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_RANLIB="ranlib" ++ ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi + done + done + +- test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" + fi + fi +-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +-if test -n "$ac_ct_RANLIB"; then +- echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +-echo "${ECHO_T}$ac_ct_RANLIB" >&6 ++F77=$ac_cv_prog_F77 ++if test -n "$F77"; then ++ echo "$as_me:$LINENO: result: $F77" >&5 ++echo "${ECHO_T}$F77" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 + echo "${ECHO_T}no" >&6 + fi + +- RANLIB=$ac_ct_RANLIB +-else +- RANLIB="$ac_cv_prog_RANLIB" ++ test -n "$F77" && break ++ done + fi +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +-set dummy ${ac_tool_prefix}strip; ac_word=$2 ++if test -z "$F77"; then ++ ac_ct_F77=$F77 ++ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 + echo "$as_me:$LINENO: checking for $ac_word" >&5 + echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_STRIP+set}" = set; then ++if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- if test -n "$STRIP"; then +- ac_cv_prog_STRIP="$STRIP" # Let the user override the test. ++ if test -n "$ac_ct_F77"; then ++ ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. + else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH +@@ -4785,7 +5498,7 @@ + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_STRIP="${ac_tool_prefix}strip" ++ ac_cv_prog_ac_ct_F77="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +@@ -4794,709 +5507,10849 @@ + + fi + fi +-STRIP=$ac_cv_prog_STRIP +-if test -n "$STRIP"; then +- echo "$as_me:$LINENO: result: $STRIP" >&5 +-echo "${ECHO_T}$STRIP" >&6 ++ac_ct_F77=$ac_cv_prog_ac_ct_F77 ++if test -n "$ac_ct_F77"; then ++ echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 ++echo "${ECHO_T}$ac_ct_F77" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 + echo "${ECHO_T}no" >&6 + fi + ++ test -n "$ac_ct_F77" && break ++done ++ ++ F77=$ac_ct_F77 + fi +-if test -z "$ac_cv_prog_STRIP"; then +- ac_ct_STRIP=$STRIP +- # Extract the first word of "strip", so it can be a program name with args. +-set dummy strip; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test -n "$ac_ct_STRIP"; then +- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_STRIP="strip" ++ ++ ++# Provide some information about the compiler. ++echo "$as_me:5527:" \ ++ "checking for Fortran 77 compiler version" >&5 ++ac_compiler=`set X $ac_compile; echo $2` ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 ++ (eval $ac_compiler --version &5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 ++ (eval $ac_compiler -v &5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 ++ (eval $ac_compiler -V &5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++rm -f a.out ++ ++# If we don't use `.F' as extension, the preprocessor is not run on the ++# input file. (Note that this only needs to work for GNU compilers.) ++ac_save_ext=$ac_ext ++ac_ext=F ++echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 ++echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 ++if test "${ac_cv_f77_compiler_gnu+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++ program main ++#ifndef __GNUC__ ++ choke me ++#endif ++ ++ end ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_f77_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_compiler_gnu=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_compiler_gnu=no ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ac_cv_f77_compiler_gnu=$ac_compiler_gnu ++ ++fi ++echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 ++echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 ++ac_ext=$ac_save_ext ++ac_test_FFLAGS=${FFLAGS+set} ++ac_save_FFLAGS=$FFLAGS ++FFLAGS= ++echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 ++echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 ++if test "${ac_cv_prog_f77_g+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ FFLAGS=-g ++cat >conftest.$ac_ext <<_ACEOF ++ program main ++ ++ end ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_f77_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_prog_f77_g=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_prog_f77_g=no ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ ++fi ++echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 ++echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 ++if test "$ac_test_FFLAGS" = set; then ++ FFLAGS=$ac_save_FFLAGS ++elif test $ac_cv_prog_f77_g = yes; then ++ if test "x$ac_cv_f77_compiler_gnu" = xyes; then ++ FFLAGS="-g -O2" ++ else ++ FFLAGS="-g" ++ fi ++else ++ if test "x$ac_cv_f77_compiler_gnu" = xyes; then ++ FFLAGS="-O2" ++ else ++ FFLAGS= ++ fi ++fi ++ ++G77=`test $ac_compiler_gnu = yes && echo yes` ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ ++# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! ++ ++# find the maximum length of command line arguments ++echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 ++echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 ++if test "${lt_cv_sys_max_cmd_len+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ i=0 ++ teststring="ABCD" ++ ++ case $build_os in ++ msdosdjgpp*) ++ # On DJGPP, this test can blow up pretty badly due to problems in libc ++ # (any single argument exceeding 2000 bytes causes a buffer overrun ++ # during glob expansion). Even if it were fixed, the result of this ++ # check would be larger than it should be. ++ lt_cv_sys_max_cmd_len=12288; # 12K is about right ++ ;; ++ ++ gnu*) ++ # Under GNU Hurd, this test is not required because there is ++ # no limit to the length of command line arguments. ++ # Libtool will interpret -1 as no limit whatsoever ++ lt_cv_sys_max_cmd_len=-1; ++ ;; ++ ++ cygwin* | mingw*) ++ # On Win9x/ME, this test blows up -- it succeeds, but takes ++ # about 5 minutes as the teststring grows exponentially. ++ # Worse, since 9x/ME are not pre-emptively multitasking, ++ # you end up with a "frozen" computer, even though with patience ++ # the test eventually succeeds (with a max line length of 256k). ++ # Instead, let's just punt: use the minimum linelength reported by ++ # all of the supported platforms: 8192 (on NT/2K/XP). ++ lt_cv_sys_max_cmd_len=8192; ++ ;; ++ ++ amigaos*) ++ # On AmigaOS with pdksh, this test takes hours, literally. ++ # So we just punt and use a minimum line length of 8192. ++ lt_cv_sys_max_cmd_len=8192; ++ ;; ++ ++ netbsd* | freebsd* | openbsd* | darwin* ) ++ # This has been around since 386BSD, at least. Likely further. ++ if test -x /sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` ++ elif test -x /usr/sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` ++ else ++ lt_cv_sys_max_cmd_len=65536 # usable default for *BSD ++ fi ++ # And add a safety zone ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ++ ;; ++ ++ *) ++ # If test is not a shell built-in, we'll probably end up computing a ++ # maximum length that is only half of the actual maximum length, but ++ # we can't tell. ++ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} ++ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ ++ = "XX$teststring") >/dev/null 2>&1 && ++ new_result=`expr "X$teststring" : ".*" 2>&1` && ++ lt_cv_sys_max_cmd_len=$new_result && ++ test $i != 17 # 1/2 MB should be enough ++ do ++ i=`expr $i + 1` ++ teststring=$teststring$teststring ++ done ++ teststring= ++ # Add a significant safety factor because C++ compilers can tack on massive ++ # amounts of additional arguments before passing them to the linker. ++ # It appears as though 1/2 is a usable value. ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ++ ;; ++ esac ++ ++fi ++ ++if test -n $lt_cv_sys_max_cmd_len ; then ++ echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 ++echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 ++else ++ echo "$as_me:$LINENO: result: none" >&5 ++echo "${ECHO_T}none" >&6 ++fi ++ ++ ++ ++ ++# Check for command to grab the raw symbol name followed by C symbol from nm. ++echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 ++echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 ++if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ++# These are sane defaults that work on at least a few old systems. ++# [They come from Ultrix. What could be older than Ultrix?!! ;)] ++ ++# Character class describing NM global symbol codes. ++symcode='[BCDEGRST]' ++ ++# Regexp to match symbols that can be accessed directly from C. ++sympat='\([_A-Za-z][_A-Za-z0-9]*\)' ++ ++# Transform the above into a raw symbol and a C symbol. ++symxfrm='\1 \2\3 \3' ++ ++# Transform an extracted symbol line into a proper C declaration ++lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" ++ ++# Transform an extracted symbol line into symbol name and symbol address ++lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++ ++# Define system-specific variables. ++case $host_os in ++aix*) ++ symcode='[BCDT]' ++ ;; ++cygwin* | mingw* | pw32*) ++ symcode='[ABCDGISTW]' ++ ;; ++hpux*) # Its linker distinguishes data from code symbols ++ if test "$host_cpu" = ia64; then ++ symcode='[ABCDEGRST]' ++ fi ++ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" ++ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++ ;; ++linux*) ++ if test "$host_cpu" = ia64; then ++ symcode='[ABCDGIRSTW]' ++ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" ++ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++ fi ++ ;; ++irix* | nonstopux*) ++ symcode='[BCDEGRST]' ++ ;; ++osf*) ++ symcode='[BCDEGQRST]' ++ ;; ++solaris* | sysv5*) ++ symcode='[BDRT]' ++ ;; ++sysv4) ++ symcode='[DFNSTU]' ++ ;; ++esac ++ ++# Handle CRLF in mingw tool chain ++opt_cr= ++case $build_os in ++mingw*) ++ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ++ ;; ++esac ++ ++# If we're using GNU nm, then use its standard symbol codes. ++case `$NM -V 2>&1` in ++*GNU* | *'with BFD'*) ++ symcode='[ABCDGIRSTW]' ;; ++esac ++ ++# Try without a prefix undercore, then with it. ++for ac_symprfx in "" "_"; do ++ ++ # Write the raw and C identifiers. ++ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" ++ ++ # Check to see that the pipe works correctly. ++ pipe_works=no ++ ++ rm -f conftest* ++ cat > conftest.$ac_ext <&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ # Now try to grab the symbols. ++ nlist=conftest.nm ++ if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 ++ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && test -s "$nlist"; then ++ # Try sorting and uniquifying the output. ++ if sort "$nlist" | uniq > "$nlist"T; then ++ mv -f "$nlist"T "$nlist" ++ else ++ rm -f "$nlist"T ++ fi ++ ++ # Make sure that we snagged all the symbols we need. ++ if grep ' nm_test_var$' "$nlist" >/dev/null; then ++ if grep ' nm_test_func$' "$nlist" >/dev/null; then ++ cat < conftest.$ac_ext ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++EOF ++ # Now generate the symbol file. ++ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' ++ ++ cat <> conftest.$ac_ext ++#if defined (__STDC__) && __STDC__ ++# define lt_ptr_t void * ++#else ++# define lt_ptr_t char * ++# define const ++#endif ++ ++/* The mapping between symbol names and symbols. */ ++const struct { ++ const char *name; ++ lt_ptr_t address; ++} ++lt_preloaded_symbols[] = ++{ ++EOF ++ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext ++ cat <<\EOF >> conftest.$ac_ext ++ {0, (lt_ptr_t) 0} ++}; ++ ++#ifdef __cplusplus ++} ++#endif ++EOF ++ # Now try linking the two files. ++ mv conftest.$ac_objext conftstm.$ac_objext ++ lt_save_LIBS="$LIBS" ++ lt_save_CFLAGS="$CFLAGS" ++ LIBS="conftstm.$ac_objext" ++ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" ++ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && test -s conftest${ac_exeext}; then ++ pipe_works=yes ++ fi ++ LIBS="$lt_save_LIBS" ++ CFLAGS="$lt_save_CFLAGS" ++ else ++ echo "cannot find nm_test_func in $nlist" >&5 ++ fi ++ else ++ echo "cannot find nm_test_var in $nlist" >&5 ++ fi ++ else ++ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 ++ fi ++ else ++ echo "$progname: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ fi ++ rm -f conftest* conftst* ++ ++ # Do not use the global_symbol_pipe unless it works. ++ if test "$pipe_works" = yes; then ++ break ++ else ++ lt_cv_sys_global_symbol_pipe= ++ fi ++done ++ ++fi ++ ++if test -z "$lt_cv_sys_global_symbol_pipe"; then ++ lt_cv_sys_global_symbol_to_cdecl= ++fi ++if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then ++ echo "$as_me:$LINENO: result: failed" >&5 ++echo "${ECHO_T}failed" >&6 ++else ++ echo "$as_me:$LINENO: result: ok" >&5 ++echo "${ECHO_T}ok" >&6 ++fi ++ ++echo "$as_me:$LINENO: checking for objdir" >&5 ++echo $ECHO_N "checking for objdir... $ECHO_C" >&6 ++if test "${lt_cv_objdir+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ rm -f .libs 2>/dev/null ++mkdir .libs 2>/dev/null ++if test -d .libs; then ++ lt_cv_objdir=.libs ++else ++ # MS-DOS does not allow filenames that begin with a dot. ++ lt_cv_objdir=_libs ++fi ++rmdir .libs 2>/dev/null ++fi ++echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 ++echo "${ECHO_T}$lt_cv_objdir" >&6 ++objdir=$lt_cv_objdir ++ ++ ++ ++ ++ ++case $host_os in ++aix3*) ++ # AIX sometimes has problems with the GCC collect2 program. For some ++ # reason, if we set the COLLECT_NAMES environment variable, the problems ++ # vanish in a puff of smoke. ++ if test "X${COLLECT_NAMES+set}" != Xset; then ++ COLLECT_NAMES= ++ export COLLECT_NAMES ++ fi ++ ;; ++esac ++ ++# Sed substitution that helps us do robust quoting. It backslashifies ++# metacharacters that are still active within double-quoted strings. ++Xsed='sed -e s/^X//' ++sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' ++ ++# Same as above, but do not quote variable references. ++double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' ++ ++# Sed substitution to delay expansion of an escaped shell variable in a ++# double_quote_subst'ed string. ++delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' ++ ++# Sed substitution to avoid accidental globbing in evaled expressions ++no_glob_subst='s/\*/\\\*/g' ++ ++# Constants: ++rm="rm -f" ++ ++# Global variables: ++default_ofile=libtool ++can_build_shared=yes ++ ++# All known linkers require a `.a' archive for static linking (except M$VC, ++# which needs '.lib'). ++libext=a ++ltmain="$ac_aux_dir/ltmain.sh" ++ofile="$default_ofile" ++with_gnu_ld="$lt_cv_prog_gnu_ld" ++ ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. ++set dummy ${ac_tool_prefix}ar; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_AR+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$AR"; then ++ ac_cv_prog_AR="$AR" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_AR="${ac_tool_prefix}ar" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++AR=$ac_cv_prog_AR ++if test -n "$AR"; then ++ echo "$as_me:$LINENO: result: $AR" >&5 ++echo "${ECHO_T}$AR" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++fi ++if test -z "$ac_cv_prog_AR"; then ++ ac_ct_AR=$AR ++ # Extract the first word of "ar", so it can be a program name with args. ++set dummy ar; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_ac_ct_AR+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_AR"; then ++ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_AR="ar" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" ++fi ++fi ++ac_ct_AR=$ac_cv_prog_ac_ct_AR ++if test -n "$ac_ct_AR"; then ++ echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 ++echo "${ECHO_T}$ac_ct_AR" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ AR=$ac_ct_AR ++else ++ AR="$ac_cv_prog_AR" ++fi ++ ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. ++set dummy ${ac_tool_prefix}ranlib; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_RANLIB+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$RANLIB"; then ++ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++RANLIB=$ac_cv_prog_RANLIB ++if test -n "$RANLIB"; then ++ echo "$as_me:$LINENO: result: $RANLIB" >&5 ++echo "${ECHO_T}$RANLIB" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++fi ++if test -z "$ac_cv_prog_RANLIB"; then ++ ac_ct_RANLIB=$RANLIB ++ # Extract the first word of "ranlib", so it can be a program name with args. ++set dummy ranlib; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_RANLIB"; then ++ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_RANLIB="ranlib" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" ++fi ++fi ++ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB ++if test -n "$ac_ct_RANLIB"; then ++ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 ++echo "${ECHO_T}$ac_ct_RANLIB" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ RANLIB=$ac_ct_RANLIB ++else ++ RANLIB="$ac_cv_prog_RANLIB" ++fi ++ ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. ++set dummy ${ac_tool_prefix}strip; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_STRIP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$STRIP"; then ++ ac_cv_prog_STRIP="$STRIP" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_STRIP="${ac_tool_prefix}strip" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++STRIP=$ac_cv_prog_STRIP ++if test -n "$STRIP"; then ++ echo "$as_me:$LINENO: result: $STRIP" >&5 ++echo "${ECHO_T}$STRIP" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++fi ++if test -z "$ac_cv_prog_STRIP"; then ++ ac_ct_STRIP=$STRIP ++ # Extract the first word of "strip", so it can be a program name with args. ++set dummy strip; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_STRIP"; then ++ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +-done +-done ++done ++done ++ ++ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" ++fi ++fi ++ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP ++if test -n "$ac_ct_STRIP"; then ++ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 ++echo "${ECHO_T}$ac_ct_STRIP" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ STRIP=$ac_ct_STRIP ++else ++ STRIP="$ac_cv_prog_STRIP" ++fi ++ ++ ++old_CC="$CC" ++old_CFLAGS="$CFLAGS" ++ ++# Set sane defaults for various variables ++test -z "$AR" && AR=ar ++test -z "$AR_FLAGS" && AR_FLAGS=cru ++test -z "$AS" && AS=as ++test -z "$CC" && CC=cc ++test -z "$LTCC" && LTCC=$CC ++test -z "$DLLTOOL" && DLLTOOL=dlltool ++test -z "$LD" && LD=ld ++test -z "$LN_S" && LN_S="ln -s" ++test -z "$MAGIC_CMD" && MAGIC_CMD=file ++test -z "$NM" && NM=nm ++test -z "$SED" && SED=sed ++test -z "$OBJDUMP" && OBJDUMP=objdump ++test -z "$RANLIB" && RANLIB=: ++test -z "$STRIP" && STRIP=: ++test -z "$ac_objext" && ac_objext=o ++ ++# Determine commands to create old-style static archives. ++old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' ++old_postinstall_cmds='chmod 644 $oldlib' ++old_postuninstall_cmds= ++ ++if test -n "$RANLIB"; then ++ case $host_os in ++ openbsd*) ++ old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ++ ;; ++ *) ++ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ++ ;; ++ esac ++ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" ++fi ++ ++cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++ ++# Only perform the check for file, if the check method requires it ++case $deplibs_check_method in ++file_magic*) ++ if test "$file_magic_cmd" = '$MAGIC_CMD'; then ++ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 ++echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 ++if test "${lt_cv_path_MAGIC_CMD+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ case $MAGIC_CMD in ++[\\/*] | ?:[\\/]*) ++ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ++ ;; ++*) ++ lt_save_MAGIC_CMD="$MAGIC_CMD" ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" ++ for ac_dir in $ac_dummy; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/${ac_tool_prefix}file; then ++ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" ++ if test -n "$file_magic_test_file"; then ++ case $deplibs_check_method in ++ "file_magic "*) ++ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" ++ MAGIC_CMD="$lt_cv_path_MAGIC_CMD" ++ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | ++ $EGREP "$file_magic_regex" > /dev/null; then ++ : ++ else ++ cat <&2 ++ ++*** Warning: the command libtool uses to detect shared libraries, ++*** $file_magic_cmd, produces output that libtool cannot recognize. ++*** The result is that libtool may fail to recognize shared libraries ++*** as such. This will affect the creation of libtool libraries that ++*** depend on shared libraries, but programs linked with such libtool ++*** libraries will work regardless of this problem. Nevertheless, you ++*** may want to report the problem to your system manager and/or to ++*** bug-libtool@gnu.org ++ ++EOF ++ fi ;; ++ esac ++ fi ++ break ++ fi ++ done ++ IFS="$lt_save_ifs" ++ MAGIC_CMD="$lt_save_MAGIC_CMD" ++ ;; ++esac ++fi ++ ++MAGIC_CMD="$lt_cv_path_MAGIC_CMD" ++if test -n "$MAGIC_CMD"; then ++ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 ++echo "${ECHO_T}$MAGIC_CMD" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++if test -z "$lt_cv_path_MAGIC_CMD"; then ++ if test -n "$ac_tool_prefix"; then ++ echo "$as_me:$LINENO: checking for file" >&5 ++echo $ECHO_N "checking for file... $ECHO_C" >&6 ++if test "${lt_cv_path_MAGIC_CMD+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ case $MAGIC_CMD in ++[\\/*] | ?:[\\/]*) ++ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ++ ;; ++*) ++ lt_save_MAGIC_CMD="$MAGIC_CMD" ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" ++ for ac_dir in $ac_dummy; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/file; then ++ lt_cv_path_MAGIC_CMD="$ac_dir/file" ++ if test -n "$file_magic_test_file"; then ++ case $deplibs_check_method in ++ "file_magic "*) ++ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" ++ MAGIC_CMD="$lt_cv_path_MAGIC_CMD" ++ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | ++ $EGREP "$file_magic_regex" > /dev/null; then ++ : ++ else ++ cat <&2 ++ ++*** Warning: the command libtool uses to detect shared libraries, ++*** $file_magic_cmd, produces output that libtool cannot recognize. ++*** The result is that libtool may fail to recognize shared libraries ++*** as such. This will affect the creation of libtool libraries that ++*** depend on shared libraries, but programs linked with such libtool ++*** libraries will work regardless of this problem. Nevertheless, you ++*** may want to report the problem to your system manager and/or to ++*** bug-libtool@gnu.org ++ ++EOF ++ fi ;; ++ esac ++ fi ++ break ++ fi ++ done ++ IFS="$lt_save_ifs" ++ MAGIC_CMD="$lt_save_MAGIC_CMD" ++ ;; ++esac ++fi ++ ++MAGIC_CMD="$lt_cv_path_MAGIC_CMD" ++if test -n "$MAGIC_CMD"; then ++ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 ++echo "${ECHO_T}$MAGIC_CMD" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ else ++ MAGIC_CMD=: ++ fi ++fi ++ ++ fi ++ ;; ++esac ++ ++enable_dlopen=no ++enable_win32_dll=no ++ ++# Check whether --enable-libtool-lock or --disable-libtool-lock was given. ++if test "${enable_libtool_lock+set}" = set; then ++ enableval="$enable_libtool_lock" ++ ++fi; ++test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes ++ ++ ++# Check whether --with-pic or --without-pic was given. ++if test "${with_pic+set}" = set; then ++ withval="$with_pic" ++ pic_mode="$withval" ++else ++ pic_mode=default ++fi; ++test -z "$pic_mode" && pic_mode=default ++ ++# Check if we have a version mismatch between libtool.m4 and ltmain.sh. ++# ++# Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. ++# We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually ++# calls AC_LIBTOOL_CONFIG and creates libtool. ++# ++echo "$as_me:$LINENO: checking for correct ltmain.sh version" >&5 ++echo $ECHO_N "checking for correct ltmain.sh version... $ECHO_C" >&6 ++if test -z "$ltmain"; then ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ echo ++ echo "*** Gentoo sanity check failed! ***" ++ echo "*** \$ltmain is not defined, please check the patch for consistency! ***" ++ echo ++ exit 1 ++fi ++gentoo_lt_version="1.5.10" ++gentoo_ltmain_version=`grep '^[:space:]*VERSION=' $ltmain | sed -e 's|^[:space:]*VERSION=||'` ++if test "$gentoo_lt_version" != "$gentoo_ltmain_version"; then ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ echo ++ echo "*** Gentoo sanity check failed! ***" ++ echo "*** libtool.m4 and ltmain.sh have a version mismatch! ***" ++ echo "*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) ***" ++ echo ++ echo "Please run:" ++ echo ++ echo " libtoolize --copy --force" ++ echo ++ echo "if appropriate, please contact the maintainer of this" ++ echo "package (or your distribution) for help." ++ echo ++ exit 1 ++else ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++fi ++ ++ ++# Use C for the default configuration in the libtool script ++tagname= ++lt_save_CC="$CC" ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++# Source file extension for C test sources. ++ac_ext=c ++ ++# Object file extension for compiled C test sources. ++objext=o ++objext=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code="int some_variable = 0;\n" ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code='int main(){return(0);}\n' ++ ++ ++# If no C compiler was specified, use CC. ++LTCC=${LTCC-"$CC"} ++ ++# Allow CC to be a program name with arguments. ++compiler=$CC ++ ++ ++# ++# Check for any special shared library compilation flags. ++# ++lt_prog_cc_shlib= ++if test "$GCC" = no; then ++ case $host_os in ++ sco3.2v5*) ++ lt_prog_cc_shlib='-belf' ++ ;; ++ esac ++fi ++if test -n "$lt_prog_cc_shlib"; then ++ { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 ++echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} ++ if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : ++ else ++ { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 ++echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} ++ lt_cv_prog_cc_can_build_shared=no ++ fi ++fi ++ ++ ++# ++# Check to make sure the static flag actually works. ++# ++echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 ++echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_static_works+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_static_works=no ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS $lt_prog_compiler_static" ++ printf "$lt_simple_link_test_code" > conftest.$ac_ext ++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test -s conftest.err; then ++ # Append any errors to the config.log. ++ cat conftest.err 1>&5 ++ else ++ lt_prog_compiler_static_works=yes ++ fi ++ fi ++ $rm conftest* ++ LDFLAGS="$save_LDFLAGS" ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 ++echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 ++ ++if test x"$lt_prog_compiler_static_works" = xyes; then ++ : ++else ++ lt_prog_compiler_static= ++fi ++ ++ ++ ++ ++lt_prog_compiler_no_builtin_flag= ++ ++if test "$GCC" = yes; then ++ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ++ ++ ++echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 ++echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 ++if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_cv_prog_compiler_rtti_exceptions=no ++ ac_outfile=conftest.$ac_objext ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ lt_compiler_flag="-fno-rtti -fno-exceptions" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ # The option is referenced via a variable to avoid confusing sed. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:6625: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>conftest.err) ++ ac_status=$? ++ cat conftest.err >&5 ++ echo "$as_me:6629: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s "$ac_outfile"; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s conftest.err; then ++ lt_cv_prog_compiler_rtti_exceptions=yes ++ fi ++ fi ++ $rm conftest* ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 ++echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 ++ ++if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then ++ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" ++else ++ : ++fi ++ ++fi ++ ++lt_prog_compiler_wl= ++lt_prog_compiler_pic= ++lt_prog_compiler_static= ++ ++echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 ++echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 ++ ++ if test "$GCC" = yes; then ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_static='-static' ++ ++ case $host_os in ++ aix*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ lt_prog_compiler_static='-Bstatic' ++ fi ++ ;; ++ ++ amigaos*) ++ # FIXME: we need at least 68020 code to build shared libraries, but ++ # adding the `-m68020' flag to GCC prevents building anything better, ++ # like `-m68040'. ++ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ++ ;; ++ ++ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) ++ # PIC is the default for these OSes. ++ ;; ++ ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ lt_prog_compiler_pic='-DDLL_EXPORT' ++ ;; ++ ++ darwin* | rhapsody*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ lt_prog_compiler_pic='-fno-common' ++ ;; ++ ++ msdosdjgpp*) ++ # Just because we use GCC doesn't mean we suddenly get shared libraries ++ # on systems that don't support them. ++ lt_prog_compiler_can_build_shared=no ++ enable_shared=no ++ ;; ++ ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ lt_prog_compiler_pic=-Kconform_pic ++ fi ++ ;; ++ ++ hpux*) ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ lt_prog_compiler_pic='-fPIC' ++ ;; ++ esac ++ ;; ++ ++ *) ++ lt_prog_compiler_pic='-fPIC' ++ ;; ++ esac ++ else ++ # PORTME Check for flag to pass linker flags through the system compiler. ++ case $host_os in ++ aix*) ++ lt_prog_compiler_wl='-Wl,' ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ lt_prog_compiler_static='-Bstatic' ++ else ++ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' ++ fi ++ ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case "$cc_basename" in ++ xlc*) ++ lt_prog_compiler_pic='-qnocommon' ++ lt_prog_compiler_wl='-Wl,' ++ ;; ++ esac ++ ;; ++ ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ lt_prog_compiler_pic='-DDLL_EXPORT' ++ ;; ++ ++ hpux9* | hpux10* | hpux11*) ++ lt_prog_compiler_wl='-Wl,' ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ lt_prog_compiler_pic='+Z' ++ ;; ++ esac ++ # Is there a better lt_prog_compiler_static that works with the bundled CC? ++ lt_prog_compiler_static='${wl}-a ${wl}archive' ++ ;; ++ ++ irix5* | irix6* | nonstopux*) ++ lt_prog_compiler_wl='-Wl,' ++ # PIC (with -KPIC) is the default. ++ lt_prog_compiler_static='-non_shared' ++ ;; ++ ++ newsos6) ++ lt_prog_compiler_pic='-KPIC' ++ lt_prog_compiler_static='-Bstatic' ++ ;; ++ ++ linux*) ++ case $CC in ++ icc* | ecc*) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_pic='-KPIC' ++ lt_prog_compiler_static='-static' ++ ;; ++ ccc*) ++ lt_prog_compiler_wl='-Wl,' ++ # All Alpha code is PIC. ++ lt_prog_compiler_static='-non_shared' ++ ;; ++ esac ++ ;; ++ ++ osf3* | osf4* | osf5*) ++ lt_prog_compiler_wl='-Wl,' ++ # All OSF/1 code is PIC. ++ lt_prog_compiler_static='-non_shared' ++ ;; ++ ++ sco3.2v5*) ++ lt_prog_compiler_pic='-Kpic' ++ lt_prog_compiler_static='-dn' ++ ;; ++ ++ solaris*) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_pic='-KPIC' ++ lt_prog_compiler_static='-Bstatic' ++ ;; ++ ++ sunos4*) ++ lt_prog_compiler_wl='-Qoption ld ' ++ lt_prog_compiler_pic='-PIC' ++ lt_prog_compiler_static='-Bstatic' ++ ;; ++ ++ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_pic='-KPIC' ++ lt_prog_compiler_static='-Bstatic' ++ ;; ++ ++ sysv4*MP*) ++ if test -d /usr/nec ;then ++ lt_prog_compiler_pic='-Kconform_pic' ++ lt_prog_compiler_static='-Bstatic' ++ fi ++ ;; ++ ++ uts4*) ++ lt_prog_compiler_pic='-pic' ++ lt_prog_compiler_static='-Bstatic' ++ ;; ++ ++ *) ++ lt_prog_compiler_can_build_shared=no ++ ;; ++ esac ++ fi ++ ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic" >&6 ++ ++# ++# Check to make sure the PIC flag actually works. ++# ++if test -n "$lt_prog_compiler_pic"; then ++ ++echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 ++echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_pic_works+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_pic_works=no ++ ac_outfile=conftest.$ac_objext ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ # The option is referenced via a variable to avoid confusing sed. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:6868: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>conftest.err) ++ ac_status=$? ++ cat conftest.err >&5 ++ echo "$as_me:6872: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s "$ac_outfile"; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s conftest.err; then ++ lt_prog_compiler_pic_works=yes ++ fi ++ fi ++ $rm conftest* ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 ++ ++if test x"$lt_prog_compiler_pic_works" = xyes; then ++ case $lt_prog_compiler_pic in ++ "" | " "*) ;; ++ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; ++ esac ++else ++ lt_prog_compiler_pic= ++ lt_prog_compiler_can_build_shared=no ++fi ++ ++fi ++case "$host_os" in ++ # For platforms which do not support PIC, -DPIC is meaningless: ++ *djgpp*) ++ lt_prog_compiler_pic= ++ ;; ++ *) ++ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ++ ;; ++esac ++ ++echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 ++echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 ++if test "${lt_cv_prog_compiler_c_o+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_cv_prog_compiler_c_o=no ++ $rm -r conftest 2>/dev/null ++ mkdir conftest ++ cd conftest ++ mkdir out ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ lt_compiler_flag="-o out/conftest2.$ac_objext" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:6928: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>out/conftest.err) ++ ac_status=$? ++ cat out/conftest.err >&5 ++ echo "$as_me:6932: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s out/conftest2.$ac_objext ++ then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s out/conftest.err; then ++ lt_cv_prog_compiler_c_o=yes ++ fi ++ fi ++ chmod u+w . ++ $rm conftest* ++ # SGI C++ compiler will create directory out/ii_files/ for ++ # template instantiation ++ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files ++ $rm out/* && rmdir out ++ cd .. ++ rmdir conftest ++ $rm conftest* ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 ++echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 ++ ++ ++hard_links="nottested" ++if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then ++ # do not overwrite the value of need_locks provided by the user ++ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 ++echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 ++ hard_links=yes ++ $rm conftest* ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ touch conftest.a ++ ln conftest.a conftest.b 2>&5 || hard_links=no ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ echo "$as_me:$LINENO: result: $hard_links" >&5 ++echo "${ECHO_T}$hard_links" >&6 ++ if test "$hard_links" = no; then ++ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 ++echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} ++ need_locks=warn ++ fi ++else ++ need_locks=no ++fi ++ ++echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 ++echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ++ ++ runpath_var= ++ allow_undefined_flag= ++ enable_shared_with_static_runtimes=no ++ archive_cmds= ++ archive_expsym_cmds= ++ old_archive_From_new_cmds= ++ old_archive_from_expsyms_cmds= ++ export_dynamic_flag_spec= ++ whole_archive_flag_spec= ++ thread_safe_flag_spec= ++ hardcode_libdir_flag_spec= ++ hardcode_libdir_flag_spec_ld= ++ hardcode_libdir_separator= ++ hardcode_direct=no ++ hardcode_minus_L=no ++ hardcode_shlibpath_var=unsupported ++ link_all_deplibs=unknown ++ hardcode_automatic=no ++ module_cmds= ++ module_expsym_cmds= ++ always_export_symbols=no ++ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ # include_expsyms should be a list of space-separated symbols to be *always* ++ # included in the symbol list ++ include_expsyms= ++ # exclude_expsyms can be an extended regexp of symbols to exclude ++ # it will be wrapped by ` (' and `)$', so one must not match beginning or ++ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', ++ # as well as any symbol that contains `d'. ++ exclude_expsyms="_GLOBAL_OFFSET_TABLE_" ++ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out ++ # platforms (ab)use it in PIC code, but their linkers get confused if ++ # the symbol is explicitly referenced. Since portable code cannot ++ # rely on this symbol name, it's probably fine to never include it in ++ # preloaded symbol tables. ++ extract_expsyms_cmds= ++ ++ case $host_os in ++ cygwin* | mingw* | pw32*) ++ # FIXME: the MSVC++ port hasn't been tested in a loooong time ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ if test "$GCC" != yes; then ++ with_gnu_ld=no ++ fi ++ ;; ++ openbsd*) ++ with_gnu_ld=no ++ ;; ++ esac ++ ++ ld_shlibs=yes ++ if test "$with_gnu_ld" = yes; then ++ # If archive_cmds runs LD, not CC, wlarc should be empty ++ wlarc='${wl}' ++ ++ # See if GNU ld supports shared libraries. ++ case $host_os in ++ aix3* | aix4* | aix5*) ++ # On AIX/PPC, the GNU linker is very broken ++ if test "$host_cpu" != ia64; then ++ ld_shlibs=no ++ cat <&2 ++ ++*** Warning: the GNU linker, at least up to release 2.9.1, is reported ++*** to be unable to reliably create shared libraries on AIX. ++*** Therefore, libtool is disabling shared libraries support. If you ++*** really care for shared libraries, you may want to modify your PATH ++*** so that a non-GNU linker is found, and then restart. ++ ++EOF ++ fi ++ ;; ++ ++ amigaos*) ++ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_minus_L=yes ++ ++ # Samuel A. Falvo II reports ++ # that the semantics of dynamic libraries on AmigaOS, at least up ++ # to version 4, is to share data among multiple programs linked ++ # with the same dynamic library. Since this doesn't match the ++ # behavior of shared libraries on other platforms, we can't use ++ # them. ++ ld_shlibs=no ++ ;; ++ ++ beos*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ allow_undefined_flag=unsupported ++ # Joseph Beckenbach says some releases of gcc ++ # support --undefined. This deserves some investigation. FIXME ++ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ cygwin* | mingw* | pw32*) ++ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, ++ # as there is no search path for DLLs. ++ hardcode_libdir_flag_spec='-L$libdir' ++ allow_undefined_flag=unsupported ++ always_export_symbols=no ++ enable_shared_with_static_runtimes=yes ++ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ ++ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ # If the export-symbols file already is a .def file (1st line ++ # is EXPORTS), use it as is; otherwise, prepend... ++ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ cp $export_symbols $output_objdir/$soname.def; ++ else ++ echo EXPORTS > $output_objdir/$soname.def; ++ cat $export_symbols >> $output_objdir/$soname.def; ++ fi~ ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' ++ wlarc= ++ else ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ fi ++ ;; ++ ++ solaris* | sysv5*) ++ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ++ ld_shlibs=no ++ cat <&2 ++ ++*** Warning: The releases 2.8.* of the GNU linker cannot reliably ++*** create shared libraries on Solaris systems. Therefore, libtool ++*** is disabling shared libraries support. We urge you to upgrade GNU ++*** binutils to release 2.9.1 or newer. Another option is to modify ++*** your PATH or compiler configuration so that the native linker is ++*** used, and then restart. ++ ++EOF ++ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ sunos4*) ++ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ wlarc= ++ hardcode_direct=yes ++ hardcode_shlibpath_var=no ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_cmds="$tmp_archive_cmds" ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ archive_expsym_cmds="$tmp_archive_cmds" ++ fi ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ *) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ esac ++ ++ if test "$ld_shlibs" = yes; then ++ runpath_var=LD_RUN_PATH ++ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ whole_archive_flag_spec= ++ fi ++ fi ++ else ++ # PORTME fill in a description of your system's linker (not GNU ld) ++ case $host_os in ++ aix3*) ++ allow_undefined_flag=unsupported ++ always_export_symbols=yes ++ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' ++ # Note: this linker hardcodes the directories in LIBPATH if there ++ # are no directories specified by -L. ++ hardcode_minus_L=yes ++ if test "$GCC" = yes && test -z "$link_static_flag"; then ++ # Neither direct hardcoding nor static linking is supported with a ++ # broken collect2. ++ hardcode_direct=unsupported ++ fi ++ ;; ++ ++ aix4* | aix5*) ++ if test "$host_cpu" = ia64; then ++ # On IA64, the linker does run time linking by default, so we don't ++ # have to do anything special. ++ aix_use_runtimelinking=no ++ exp_sym_flag='-Bexport' ++ no_entry_flag="" ++ else ++ # If we're using GNU nm, then we don't want the "-C" option. ++ # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then ++ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' ++ else ++ export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' ++ fi ++ aix_use_runtimelinking=no ++ ++ # Test if we are trying to use run time linking or normal ++ # AIX style linking. If -brtl is somewhere in LDFLAGS, we ++ # need to do runtime linking. ++ case $host_os in aix4.[23]|aix4.[23].*|aix5*) ++ for ld_flag in $LDFLAGS; do ++ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then ++ aix_use_runtimelinking=yes ++ break ++ fi ++ done ++ esac ++ ++ exp_sym_flag='-bexport' ++ no_entry_flag='-bnoentry' ++ fi ++ ++ # When large executables or shared objects are built, AIX ld can ++ # have problems creating the table of contents. If linking a library ++ # or program results in "error TOC overflow" add -mminimal-toc to ++ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not ++ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. ++ ++ archive_cmds='' ++ hardcode_direct=yes ++ hardcode_libdir_separator=':' ++ link_all_deplibs=yes ++ ++ if test "$GCC" = yes; then ++ case $host_os in aix4.012|aix4.012.*) ++ # We only want to do this on AIX 4.2 and lower, the check ++ # below for broken collect2 doesn't work under 4.3+ ++ collect2name=`${CC} -print-prog-name=collect2` ++ if test -f "$collect2name" && \ ++ strings "$collect2name" | grep resolve_lib_name >/dev/null ++ then ++ # We have reworked collect2 ++ hardcode_direct=yes ++ else ++ # We have old collect2 ++ hardcode_direct=unsupported ++ # It fails to find uninstalled libraries when the uninstalled ++ # path is not listed in the libpath. Setting hardcode_minus_L ++ # to unsupported forces relinking ++ hardcode_minus_L=yes ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_libdir_separator= ++ fi ++ esac ++ shared_flag='-shared' ++ else ++ # not using gcc ++ if test "$host_cpu" = ia64; then ++ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release ++ # chokes on -Wl,-G. The following line is correct: ++ shared_flag='-G' ++ else ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag='${wl}-G' ++ else ++ shared_flag='${wl}-bM:SRE' ++ fi ++ fi ++ fi ++ ++ # It seems that -bexpall does not export symbols beginning with ++ # underscore (_), so it is better to generate a list of symbols to export. ++ always_export_symbols=yes ++ if test "$aix_use_runtimelinking" = yes; then ++ # Warning - without using the other runtime loading flags (-brtl), ++ # -berok will link without error, but may produce a broken library. ++ allow_undefined_flag='-berok' ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" ++ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ else ++ if test "$host_cpu" = ia64; then ++ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' ++ allow_undefined_flag="-z nodefs" ++ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ else ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" ++ # Warning - without using the other run time loading flags, ++ # -berok will link without error, but may produce a broken library. ++ no_undefined_flag=' ${wl}-bernotok' ++ allow_undefined_flag=' ${wl}-berok' ++ # -bexpall does not export symbols beginning with underscore (_) ++ always_export_symbols=yes ++ # Exported symbols can be pulled into shared objects from archives ++ whole_archive_flag_spec=' ' ++ archive_cmds_need_lc=yes ++ # This is similar to how AIX traditionally builds it's shared libraries. ++ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ fi ++ fi ++ ;; ++ ++ amigaos*) ++ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_minus_L=yes ++ # see comment about different semantics on the GNU ld section ++ ld_shlibs=no ++ ;; ++ ++ bsdi[45]*) ++ export_dynamic_flag_spec=-rdynamic ++ ;; ++ ++ cygwin* | mingw* | pw32*) ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ # hardcode_libdir_flag_spec is actually meaningless, as there is ++ # no search path for DLLs. ++ hardcode_libdir_flag_spec=' ' ++ allow_undefined_flag=unsupported ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' ++ # The linker will automatically build a .lib file if we build a DLL. ++ old_archive_From_new_cmds='true' ++ # FIXME: Should let the user specify the lib program. ++ old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' ++ fix_srcfile_path='`cygpath -w "$srcfile"`' ++ enable_shared_with_static_runtimes=yes ++ ;; ++ ++ darwin* | rhapsody*) ++ case "$host_os" in ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac ++ archive_cmds_need_lc=no ++ hardcode_direct=no ++ hardcode_automatic=yes ++ hardcode_shlibpath_var=unsupported ++ whole_archive_flag_spec='' ++ link_all_deplibs=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case "$cc_basename" in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs=no ++ ;; ++ esac ++ fi ++ ;; ++ ++ dgux*) ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_shlibpath_var=no ++ ;; ++ ++ freebsd1*) ++ ld_shlibs=no ++ ;; ++ ++ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor ++ # support. Future versions do this automatically, but an explicit c++rt0.o ++ # does not break anything, and helps significantly (at the cost of a little ++ # extra space). ++ freebsd2.2*) ++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' ++ hardcode_libdir_flag_spec='-R$libdir' ++ hardcode_direct=yes ++ hardcode_shlibpath_var=no ++ ;; ++ ++ # Unfortunately, older versions of FreeBSD 2 do not have this feature. ++ freebsd2*) ++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct=yes ++ hardcode_minus_L=yes ++ hardcode_shlibpath_var=no ++ ;; ++ ++ # FreeBSD 3 and greater uses gcc -shared to do shared libraries. ++ freebsd* | kfreebsd*-gnu) ++ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' ++ hardcode_libdir_flag_spec='-R$libdir' ++ hardcode_direct=yes ++ hardcode_shlibpath_var=no ++ ;; ++ ++ hpux9*) ++ if test "$GCC" = yes; then ++ archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ else ++ archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ fi ++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator=: ++ hardcode_direct=yes ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L=yes ++ export_dynamic_flag_spec='${wl}-E' ++ ;; ++ ++ hpux10* | hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac ++ else ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ *) ++ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ esac ++ fi ++ if test "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*) ++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec_ld='+b $libdir' ++ hardcode_libdir_separator=: ++ hardcode_direct=no ++ hardcode_shlibpath_var=no ++ ;; ++ ia64*) ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_direct=no ++ hardcode_shlibpath_var=no ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L=yes ++ ;; ++ *) ++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator=: ++ hardcode_direct=yes ++ export_dynamic_flag_spec='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L=yes ++ ;; ++ esac ++ fi ++ ;; ++ ++ irix5* | irix6* | nonstopux*) ++ if test "$GCC" = yes; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ hardcode_libdir_flag_spec_ld='-rpath $libdir' ++ fi ++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator=: ++ link_all_deplibs=yes ++ ;; ++ ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out ++ else ++ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF ++ fi ++ hardcode_libdir_flag_spec='-R$libdir' ++ hardcode_direct=yes ++ hardcode_shlibpath_var=no ++ ;; ++ ++ newsos6) ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct=yes ++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator=: ++ hardcode_shlibpath_var=no ++ ;; ++ ++ openbsd*) ++ hardcode_direct=yes ++ hardcode_shlibpath_var=no ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' ++ hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec='${wl}-E' ++ else ++ case $host_os in ++ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) ++ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec='-R$libdir' ++ ;; ++ *) ++ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ++ ;; ++ esac ++ fi ++ ;; ++ ++ os2*) ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_minus_L=yes ++ allow_undefined_flag=unsupported ++ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' ++ old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ++ ;; ++ ++ osf3*) ++ if test "$GCC" = yes; then ++ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ allow_undefined_flag=' -expect_unresolved \*' ++ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ fi ++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator=: ++ ;; ++ ++ osf4* | osf5*) # as osf3* with the addition of -msym flag ++ if test "$GCC" = yes; then ++ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' ++ else ++ allow_undefined_flag=' -expect_unresolved \*' ++ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' ++ ++ # Both c and cxx compiler support -rpath directly ++ hardcode_libdir_flag_spec='-rpath $libdir' ++ fi ++ hardcode_libdir_separator=: ++ ;; ++ ++ sco3.2v5*) ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var=no ++ export_dynamic_flag_spec='${wl}-Bexport' ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ ;; ++ ++ solaris*) ++ no_undefined_flag=' -z text' ++ if test "$GCC" = yes; then ++ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' ++ else ++ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ fi ++ hardcode_libdir_flag_spec='-R$libdir' ++ hardcode_shlibpath_var=no ++ case $host_os in ++ solaris2.[0-5] | solaris2.[0-5].*) ;; ++ *) # Supported since Solaris 2.6 (maybe 2.5.1?) ++ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; ++ esac ++ link_all_deplibs=yes ++ ;; ++ ++ sunos4*) ++ if test "x$host_vendor" = xsequent; then ++ # Use $CC to link under sequent, because it throws in some extra .o ++ # files that make .init and .fini sections work. ++ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_direct=yes ++ hardcode_minus_L=yes ++ hardcode_shlibpath_var=no ++ ;; ++ ++ sysv4) ++ case $host_vendor in ++ sni) ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct=yes # is this really true??? ++ ;; ++ siemens) ++ ## LD is ld it makes a PLAMLIB ++ ## CC just makes a GrossModule. ++ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ reload_cmds='$CC -r -o $output$reload_objs' ++ hardcode_direct=no ++ ;; ++ motorola) ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct=no #Motorola manual says yes, but my tests say they lie ++ ;; ++ esac ++ runpath_var='LD_RUN_PATH' ++ hardcode_shlibpath_var=no ++ ;; ++ ++ sysv4.3*) ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var=no ++ export_dynamic_flag_spec='-Bexport' ++ ;; ++ ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var=no ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ ld_shlibs=yes ++ fi ++ ;; ++ ++ sysv4.2uw2*) ++ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct=yes ++ hardcode_minus_L=no ++ hardcode_shlibpath_var=no ++ hardcode_runpath_var=yes ++ runpath_var=LD_RUN_PATH ++ ;; ++ ++ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ++ no_undefined_flag='${wl}-z ${wl}text' ++ if test "$GCC" = yes; then ++ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi ++ runpath_var='LD_RUN_PATH' ++ hardcode_shlibpath_var=no ++ ;; ++ ++ sysv5*) ++ no_undefined_flag=' -z text' ++ # $CC -shared without GNU ld will not create a library from C++ ++ # object files and a static libstdc++, better avoid it by now ++ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ hardcode_libdir_flag_spec= ++ hardcode_shlibpath_var=no ++ runpath_var='LD_RUN_PATH' ++ ;; ++ ++ uts4*) ++ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec='-L$libdir' ++ hardcode_shlibpath_var=no ++ ;; ++ ++ *) ++ ld_shlibs=no ++ ;; ++ esac ++ fi ++ ++echo "$as_me:$LINENO: result: $ld_shlibs" >&5 ++echo "${ECHO_T}$ld_shlibs" >&6 ++test "$ld_shlibs" = no && can_build_shared=no ++ ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi ++ ++# ++# Do we need to explicitly link libc? ++# ++case "x$archive_cmds_need_lc" in ++x|xyes) ++ # Assume -lc should be added ++ archive_cmds_need_lc=yes ++ ++ if test "$enable_shared" = yes && test "$GCC" = yes; then ++ case $archive_cmds in ++ *'~'*) ++ # FIXME: we may have to deal with multi-command sequences. ++ ;; ++ '$CC '*) ++ # Test whether the compiler implicitly links with -lc since on some ++ # systems, -lgcc has to come before -lc. If gcc already passes -lc ++ # to ld, don't add -lc before -lgcc. ++ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 ++echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 ++ $rm conftest* ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } 2>conftest.err; then ++ soname=conftest ++ lib=conftest ++ libobjs=conftest.$ac_objext ++ deplibs= ++ wl=$lt_prog_compiler_wl ++ compiler_flags=-v ++ linker_flags=-v ++ verstring= ++ output_objdir=. ++ libname=conftest ++ lt_save_allow_undefined_flag=$allow_undefined_flag ++ allow_undefined_flag= ++ if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 ++ (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++ then ++ archive_cmds_need_lc=no ++ else ++ archive_cmds_need_lc=yes ++ fi ++ allow_undefined_flag=$lt_save_allow_undefined_flag ++ else ++ cat conftest.err 1>&5 ++ fi ++ $rm conftest* ++ echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 ++echo "${ECHO_T}$archive_cmds_need_lc" >&6 ++ ;; ++ esac ++ fi ++ ;; ++esac ++ ++echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 ++echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 ++library_names_spec= ++libname_spec='lib$name' ++soname_spec= ++shrext_cmds=".so" ++postinstall_cmds= ++postuninstall_cmds= ++finish_cmds= ++finish_eval= ++shlibpath_var= ++shlibpath_overrides_runpath=unknown ++version_type=none ++dynamic_linker="$host_os ld.so" ++sys_lib_dlsearch_path_spec="/lib /usr/lib" ++if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then ++ # if the path contains ";" then we assume it to be the separator ++ # otherwise default to the standard path separator (i.e. ":") - it is ++ # assumed that no part of a normal pathname contains ";" but that should ++ # okay in the real world where ";" in dirpaths is itself problematic. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++else ++ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" ++fi ++need_lib_prefix=unknown ++hardcode_into_libs=no ++ ++# when you set need_version to no, make sure it does not cause -set_version ++# flags to be left without arguments ++need_version=unknown ++ ++case $host_os in ++aix3*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' ++ shlibpath_var=LIBPATH ++ ++ # AIX 3 has no versioning support, so we append a major version to the name. ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ ++aix4* | aix5*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ hardcode_into_libs=yes ++ if test "$host_cpu" = ia64; then ++ # AIX 5 supports IA64 ++ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ else ++ # With GCC up to 2.95.x, collect2 would create an import file ++ # for dependence libraries. The import file would start with ++ # the line `#! .'. This would cause the generated library to ++ # depend on `.', always an invalid library. This was fixed in ++ # development snapshots of GCC prior to 3.0. ++ case $host_os in ++ aix4 | aix4.[01] | aix4.[01].*) ++ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' ++ echo ' yes ' ++ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then ++ : ++ else ++ can_build_shared=no ++ fi ++ ;; ++ esac ++ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct ++ # soname into executable. Probably we can add versioning support to ++ # collect2, so additional links can be useful in future. ++ if test "$aix_use_runtimelinking" = yes; then ++ # If using run time linking (on AIX 4.2 or later) use lib.so ++ # instead of lib.a to let people know that these are not ++ # typical AIX shared libraries. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ else ++ # We preserve .a as extension for shared libraries through AIX4.2 ++ # and later when we are not doing run time linking. ++ library_names_spec='${libname}${release}.a $libname.a' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ fi ++ shlibpath_var=LIBPATH ++ fi ++ ;; ++ ++amigaos*) ++ library_names_spec='$libname.ixlibrary $libname.a' ++ # Create ${libname}_ixlibrary.a entries in /sys/libs. ++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ++ ;; ++ ++beos*) ++ library_names_spec='${libname}${shared_ext}' ++ dynamic_linker="$host_os ld.so" ++ shlibpath_var=LIBRARY_PATH ++ ;; ++ ++bsdi[45]*) ++ version_type=linux ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" ++ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" ++ # the default ld.so.conf also contains /usr/contrib/lib and ++ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow ++ # libtool to hard-code these into programs ++ ;; ++ ++cygwin* | mingw* | pw32*) ++ version_type=windows ++ shrext_cmds=".dll" ++ need_version=no ++ need_lib_prefix=no ++ ++ case $GCC,$host_os in ++ yes,cygwin* | yes,mingw* | yes,pw32*) ++ library_names_spec='$libname.dll.a' ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ ++ dldir=$destdir/`dirname \$dlpath`~ ++ test -d \$dldir || mkdir -p \$dldir~ ++ $install_prog $dir/$dlname \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ dlpath=$dir/\$dldll~ ++ $rm \$dlpath' ++ shlibpath_overrides_runpath=yes ++ ++ case $host_os in ++ cygwin*) ++ # Cygwin DLLs use 'cyg' prefix rather than 'lib' ++ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ++ ;; ++ mingw*) ++ # MinGW DLLs use traditional 'lib' prefix ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then ++ # It is most probably a Windows format PATH printed by ++ # mingw gcc, but we are running on Cygwin. Gcc prints its search ++ # path with ; separators, and with drive letters. We can handle the ++ # drive letters (cygwin fileutils understands them), so leave them, ++ # especially as we might pass files found there to a mingw objdump, ++ # which wouldn't understand a cygwinified path. Ahh. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++ ;; ++ pw32*) ++ # pw32 DLLs use 'pw' prefix rather than 'lib' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ++ ;; ++ esac ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ $archive_expsym_cmds="$archive_cmds" ++ fi ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ *) ++ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ++ ;; ++ esac ++ dynamic_linker='Win32 ld.exe' ++ # FIXME: first we should search . and the directory the executable is in ++ shlibpath_var=PATH ++ ;; ++ ++darwin* | rhapsody*) ++ dynamic_linker="$host_os dyld" ++ version_type=darwin ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' ++ soname_spec='${libname}${release}${major}$shared_ext' ++ shlibpath_overrides_runpath=yes ++ shlibpath_var=DYLD_LIBRARY_PATH ++ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. ++ if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` ++ else ++ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' ++ fi ++ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ++ ;; ++ ++dgux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++freebsd1*) ++ dynamic_linker=no ++ ;; ++ ++kfreebsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; ++ ++freebsd*) ++ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++ version_type=freebsd-$objformat ++ case $version_type in ++ freebsd-elf*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ need_version=no ++ need_lib_prefix=no ++ ;; ++ freebsd-*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' ++ need_version=yes ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_os in ++ freebsd2*) ++ shlibpath_overrides_runpath=yes ++ ;; ++ freebsd3.01* | freebsdelf3.01*) ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ *) # from 3.2 on ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ esac ++ ;; ++ ++gnu*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ ;; ++ ++hpux9* | hpux10* | hpux11*) ++ # Give a soname corresponding to the major version so that dld.sl refuses to ++ # link against other versions. ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ case "$host_cpu" in ++ ia64*) ++ shrext_cmds='.so' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.so" ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ if test "X$HPUX_IA64_MODE" = X32; then ++ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" ++ else ++ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" ++ fi ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ hppa*64*) ++ shrext_cmds='.sl' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ *) ++ shrext_cmds='.sl' ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=SHLIB_PATH ++ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ esac ++ # HP-UX runs *really* slowly unless shared libraries are mode 555. ++ postinstall_cmds='chmod 555 $lib' ++ ;; ++ ++irix5* | irix6* | nonstopux*) ++ case $host_os in ++ nonstopux*) version_type=nonstopux ;; ++ *) ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ version_type=linux ++ else ++ version_type=irix ++ fi ;; ++ esac ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' ++ case $host_os in ++ irix5* | nonstopux*) ++ libsuff= shlibsuff= ++ ;; ++ *) ++ case $LD in # libtool.m4 will add one of these switches to LD ++ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") ++ libsuff= shlibsuff= libmagic=32-bit;; ++ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") ++ libsuff=32 shlibsuff=N32 libmagic=N32;; ++ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") ++ libsuff=64 shlibsuff=64 libmagic=64-bit;; ++ *) libsuff= shlibsuff= libmagic=never-match;; ++ esac ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" ++ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ++ hardcode_into_libs=yes ++ ;; ++ ++# No shared lib support for Linux oldld, aout, or coff. ++linux*oldld* | linux*aout* | linux*coff*) ++ dynamic_linker=no ++ ;; ++ ++# This must be Linux ELF. ++linux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes ++ ++ # Append ld.so.conf contents to the search path ++ if test -f /etc/ld.so.conf; then ++ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` ++ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ fi ++ ++ case $host_cpu:$lt_cv_cc_64bit_output in ++ powerpc64:yes | s390x:yes | sparc64:yes | x86_64:yes) ++ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64" ++ sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64 /usr/X11R6/lib64" ++ ;; ++ esac ++ ++ # We used to test for /lib/ld.so.1 and disable shared libraries on ++ # powerpc, because MkLinux only supported shared libraries with the ++ # GNU dynamic linker. Since this was broken with cross compilers, ++ # most powerpc-linux boxes support dynamic linking these days and ++ # people can always --disable-shared, the test was removed, and we ++ # assume the GNU/Linux dynamic linker is in use. ++ dynamic_linker='GNU/Linux ld.so' ++ ++ # Find out which ABI we are using (multilib Linux x86_64 hack). ++ libsuff= ++ case "$host_cpu" in ++ x86_64*) ++ echo '#line 8308 "configure"' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ *) ++ ;; ++ esac ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ ;; ++ ++knetbsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; ++ ++netbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ dynamic_linker='NetBSD (a.out) ld.so' ++ else ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='NetBSD ld.elf_so' ++ fi ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ ++newsos6) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; ++ ++nto-qnx*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; ++ ++openbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ case $host_os in ++ openbsd2.[89] | openbsd2.[89].*) ++ shlibpath_overrides_runpath=no ++ ;; ++ *) ++ shlibpath_overrides_runpath=yes ++ ;; ++ esac ++ else ++ shlibpath_overrides_runpath=yes ++ fi ++ ;; ++ ++os2*) ++ libname_spec='$name' ++ shrext_cmds=".dll" ++ need_lib_prefix=no ++ library_names_spec='$libname${shared_ext} $libname.a' ++ dynamic_linker='OS/2 ld.exe' ++ shlibpath_var=LIBPATH ++ ;; ++ ++osf3* | osf4* | osf5*) ++ version_type=osf ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" ++ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ++ ;; ++ ++sco3.2v5*) ++ version_type=osf ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++solaris*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ # ldd complains unless libraries are executable ++ postinstall_cmds='chmod +x $lib' ++ ;; ++ ++sunos4*) ++ version_type=sunos ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ if test "$with_gnu_ld" = yes; then ++ need_lib_prefix=no ++ fi ++ need_version=yes ++ ;; ++ ++sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_vendor in ++ sni) ++ shlibpath_overrides_runpath=no ++ need_lib_prefix=no ++ export_dynamic_flag_spec='${wl}-Blargedynsym' ++ runpath_var=LD_RUN_PATH ++ ;; ++ siemens) ++ need_lib_prefix=no ++ ;; ++ motorola) ++ need_lib_prefix=no ++ need_version=no ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ++ ;; ++ esac ++ ;; ++ ++sysv4*MP*) ++ if test -d /usr/nec ;then ++ version_type=linux ++ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' ++ soname_spec='$libname${shared_ext}.$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ fi ++ ;; ++ ++uts4*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++*) ++ dynamic_linker=no ++ ;; ++esac ++echo "$as_me:$LINENO: result: $dynamic_linker" >&5 ++echo "${ECHO_T}$dynamic_linker" >&6 ++test "$dynamic_linker" = no && can_build_shared=no ++ ++echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 ++echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 ++hardcode_action= ++if test -n "$hardcode_libdir_flag_spec" || \ ++ test -n "$runpath_var" || \ ++ test "X$hardcode_automatic" = "Xyes" ; then ++ ++ # We can hardcode non-existant directories. ++ if test "$hardcode_direct" != no && ++ # If the only mechanism to avoid hardcoding is shlibpath_var, we ++ # have to relink, otherwise we might link with an installed library ++ # when we should be linking with a yet-to-be-installed one ++ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && ++ test "$hardcode_minus_L" != no; then ++ # Linking always hardcodes the temporary library directory. ++ hardcode_action=relink ++ else ++ # We can link without hardcoding, and we can hardcode nonexisting dirs. ++ hardcode_action=immediate ++ fi ++else ++ # We cannot hardcode anything, or else we can only hardcode existing ++ # directories. ++ hardcode_action=unsupported ++fi ++echo "$as_me:$LINENO: result: $hardcode_action" >&5 ++echo "${ECHO_T}$hardcode_action" >&6 ++ ++if test "$hardcode_action" = relink; then ++ # Fast installation is not supported ++ enable_fast_install=no ++elif test "$shlibpath_overrides_runpath" = yes || ++ test "$enable_shared" = no; then ++ # Fast installation is not necessary ++ enable_fast_install=needless ++fi ++ ++striplib= ++old_striplib= ++echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 ++echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 ++if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then ++ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" ++ test -z "$striplib" && striplib="$STRIP --strip-unneeded" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++else ++# FIXME - insert some real tests, host_os isn't really good enough ++ case $host_os in ++ darwin*) ++ if test -n "$STRIP" ; then ++ striplib="$STRIP -x" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ;; ++ *) ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ ;; ++ esac ++fi ++ ++if test "x$enable_dlopen" != xyes; then ++ enable_dlopen=unknown ++ enable_dlopen_self=unknown ++ enable_dlopen_self_static=unknown ++else ++ lt_cv_dlopen=no ++ lt_cv_dlopen_libs= ++ ++ case $host_os in ++ beos*) ++ lt_cv_dlopen="load_add_on" ++ lt_cv_dlopen_libs= ++ lt_cv_dlopen_self=yes ++ ;; ++ ++ mingw* | pw32*) ++ lt_cv_dlopen="LoadLibrary" ++ lt_cv_dlopen_libs= ++ ;; ++ ++ cygwin*) ++ lt_cv_dlopen="dlopen" ++ lt_cv_dlopen_libs= ++ ;; ++ ++ darwin*) ++ # if libdl is installed we need to link against it ++ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 ++echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 ++if test "${ac_cv_lib_dl_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldl $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++int ++main () ++{ ++dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dl_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dl_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 ++if test $ac_cv_lib_dl_dlopen = yes; then ++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" ++else ++ ++ lt_cv_dlopen="dyld" ++ lt_cv_dlopen_libs= ++ lt_cv_dlopen_self=yes ++ ++fi ++ ++ ;; ++ ++ *) ++ echo "$as_me:$LINENO: checking for shl_load" >&5 ++echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 ++if test "${ac_cv_func_shl_load+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define shl_load to an innocuous variant, in case declares shl_load. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define shl_load innocuous_shl_load ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char shl_load (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef shl_load ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char shl_load (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_shl_load) || defined (__stub___shl_load) ++choke me ++#else ++char (*f) () = shl_load; ++#endif ++#ifdef __cplusplus ++} ++#endif ++ ++int ++main () ++{ ++return f != shl_load; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_shl_load=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_func_shl_load=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 ++echo "${ECHO_T}$ac_cv_func_shl_load" >&6 ++if test $ac_cv_func_shl_load = yes; then ++ lt_cv_dlopen="shl_load" ++else ++ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 ++echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 ++if test "${ac_cv_lib_dld_shl_load+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldld $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char shl_load (); ++int ++main () ++{ ++shl_load (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dld_shl_load=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dld_shl_load=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 ++echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 ++if test $ac_cv_lib_dld_shl_load = yes; then ++ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" ++else ++ echo "$as_me:$LINENO: checking for dlopen" >&5 ++echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 ++if test "${ac_cv_func_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define dlopen to an innocuous variant, in case declares dlopen. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define dlopen innocuous_dlopen ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char dlopen (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef dlopen ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_dlopen) || defined (__stub___dlopen) ++choke me ++#else ++char (*f) () = dlopen; ++#endif ++#ifdef __cplusplus ++} ++#endif ++ ++int ++main () ++{ ++return f != dlopen; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_func_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_func_dlopen" >&6 ++if test $ac_cv_func_dlopen = yes; then ++ lt_cv_dlopen="dlopen" ++else ++ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 ++echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 ++if test "${ac_cv_lib_dl_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldl $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++int ++main () ++{ ++dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dl_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dl_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 ++if test $ac_cv_lib_dl_dlopen = yes; then ++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" ++else ++ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 ++echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 ++if test "${ac_cv_lib_svld_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lsvld $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++int ++main () ++{ ++dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_svld_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_svld_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 ++if test $ac_cv_lib_svld_dlopen = yes; then ++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" ++else ++ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 ++echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 ++if test "${ac_cv_lib_dld_dld_link+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldld $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dld_link (); ++int ++main () ++{ ++dld_link (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dld_dld_link=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dld_dld_link=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 ++echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 ++if test $ac_cv_lib_dld_dld_link = yes; then ++ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ;; ++ esac ++ ++ if test "x$lt_cv_dlopen" != xno; then ++ enable_dlopen=yes ++ else ++ enable_dlopen=no ++ fi ++ ++ case $lt_cv_dlopen in ++ dlopen) ++ save_CPPFLAGS="$CPPFLAGS" ++ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" ++ ++ save_LDFLAGS="$LDFLAGS" ++ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" ++ ++ save_LIBS="$LIBS" ++ LIBS="$lt_cv_dlopen_libs $LIBS" ++ ++ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 ++echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 ++if test "${lt_cv_dlopen_self+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ lt_cv_dlopen_self=cross ++else ++ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 ++ lt_status=$lt_dlunknown ++ cat > conftest.$ac_ext < ++#endif ++ ++#include ++ ++#ifdef RTLD_GLOBAL ++# define LT_DLGLOBAL RTLD_GLOBAL ++#else ++# ifdef DL_GLOBAL ++# define LT_DLGLOBAL DL_GLOBAL ++# else ++# define LT_DLGLOBAL 0 ++# endif ++#endif ++ ++/* We may have to define LT_DLLAZY_OR_NOW in the command line if we ++ find out it does not work in some platform. */ ++#ifndef LT_DLLAZY_OR_NOW ++# ifdef RTLD_LAZY ++# define LT_DLLAZY_OR_NOW RTLD_LAZY ++# else ++# ifdef DL_LAZY ++# define LT_DLLAZY_OR_NOW DL_LAZY ++# else ++# ifdef RTLD_NOW ++# define LT_DLLAZY_OR_NOW RTLD_NOW ++# else ++# ifdef DL_NOW ++# define LT_DLLAZY_OR_NOW DL_NOW ++# else ++# define LT_DLLAZY_OR_NOW 0 ++# endif ++# endif ++# endif ++# endif ++#endif ++ ++#ifdef __cplusplus ++extern "C" void exit (int); ++#endif ++ ++void fnord() { int i=42;} ++int main () ++{ ++ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); ++ int status = $lt_dlunknown; ++ ++ if (self) ++ { ++ if (dlsym (self,"fnord")) status = $lt_dlno_uscore; ++ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ /* dlclose (self); */ ++ } ++ ++ exit (status); ++} ++EOF ++ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then ++ (./conftest; exit; ) 2>/dev/null ++ lt_status=$? ++ case x$lt_status in ++ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; ++ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; ++ x$lt_unknown|x*) lt_cv_dlopen_self=no ;; ++ esac ++ else : ++ # compilation failed ++ lt_cv_dlopen_self=no ++ fi ++fi ++rm -fr conftest* ++ ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 ++echo "${ECHO_T}$lt_cv_dlopen_self" >&6 ++ ++ if test "x$lt_cv_dlopen_self" = xyes; then ++ LDFLAGS="$LDFLAGS $link_static_flag" ++ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 ++echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 ++if test "${lt_cv_dlopen_self_static+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ lt_cv_dlopen_self_static=cross ++else ++ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 ++ lt_status=$lt_dlunknown ++ cat > conftest.$ac_ext < ++#endif ++ ++#include ++ ++#ifdef RTLD_GLOBAL ++# define LT_DLGLOBAL RTLD_GLOBAL ++#else ++# ifdef DL_GLOBAL ++# define LT_DLGLOBAL DL_GLOBAL ++# else ++# define LT_DLGLOBAL 0 ++# endif ++#endif ++ ++/* We may have to define LT_DLLAZY_OR_NOW in the command line if we ++ find out it does not work in some platform. */ ++#ifndef LT_DLLAZY_OR_NOW ++# ifdef RTLD_LAZY ++# define LT_DLLAZY_OR_NOW RTLD_LAZY ++# else ++# ifdef DL_LAZY ++# define LT_DLLAZY_OR_NOW DL_LAZY ++# else ++# ifdef RTLD_NOW ++# define LT_DLLAZY_OR_NOW RTLD_NOW ++# else ++# ifdef DL_NOW ++# define LT_DLLAZY_OR_NOW DL_NOW ++# else ++# define LT_DLLAZY_OR_NOW 0 ++# endif ++# endif ++# endif ++# endif ++#endif ++ ++#ifdef __cplusplus ++extern "C" void exit (int); ++#endif ++ ++void fnord() { int i=42;} ++int main () ++{ ++ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); ++ int status = $lt_dlunknown; ++ ++ if (self) ++ { ++ if (dlsym (self,"fnord")) status = $lt_dlno_uscore; ++ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ /* dlclose (self); */ ++ } ++ ++ exit (status); ++} ++EOF ++ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then ++ (./conftest; exit; ) 2>/dev/null ++ lt_status=$? ++ case x$lt_status in ++ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; ++ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; ++ x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; ++ esac ++ else : ++ # compilation failed ++ lt_cv_dlopen_self_static=no ++ fi ++fi ++rm -fr conftest* ++ ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 ++echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 ++ fi ++ ++ CPPFLAGS="$save_CPPFLAGS" ++ LDFLAGS="$save_LDFLAGS" ++ LIBS="$save_LIBS" ++ ;; ++ esac ++ ++ case $lt_cv_dlopen_self in ++ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; ++ *) enable_dlopen_self=unknown ;; ++ esac ++ ++ case $lt_cv_dlopen_self_static in ++ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; ++ *) enable_dlopen_self_static=unknown ;; ++ esac ++fi ++ ++ ++# Report which librarie types wil actually be built ++echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 ++echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 ++echo "$as_me:$LINENO: result: $can_build_shared" >&5 ++echo "${ECHO_T}$can_build_shared" >&6 ++ ++echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 ++echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 ++test "$can_build_shared" = "no" && enable_shared=no ++ ++# On AIX, shared libraries and static libraries use the same namespace, and ++# are all built from PIC. ++case "$host_os" in ++aix3*) ++ test "$enable_shared" = yes && enable_static=no ++ if test -n "$RANLIB"; then ++ archive_cmds="$archive_cmds~\$RANLIB \$lib" ++ postinstall_cmds='$RANLIB $lib' ++ fi ++ ;; ++ ++aix4* | aix5*) ++ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then ++ test "$enable_shared" = yes && enable_static=no ++ fi ++ ;; ++esac ++echo "$as_me:$LINENO: result: $enable_shared" >&5 ++echo "${ECHO_T}$enable_shared" >&6 ++ ++echo "$as_me:$LINENO: checking whether to build static libraries" >&5 ++echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 ++# Make sure either enable_shared or enable_static is yes. ++test "$enable_shared" = yes || enable_static=yes ++echo "$as_me:$LINENO: result: $enable_static" >&5 ++echo "${ECHO_T}$enable_static" >&6 ++ ++# The else clause should only fire when bootstrapping the ++# libtool distribution, otherwise you forgot to ship ltmain.sh ++# with your package, and you will get complaints that there are ++# no rules to generate ltmain.sh. ++if test -f "$ltmain"; then ++ # See if we are running on zsh, and set the options which allow our commands through ++ # without removal of \ escapes. ++ if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++ fi ++ # Now quote all the things that may contain metacharacters while being ++ # careful not to overquote the AC_SUBSTed values. We take copies of the ++ # variables and quote the copies for generation of the libtool script. ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ SED SHELL STRIP \ ++ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ ++ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ ++ deplibs_check_method reload_flag reload_cmds need_locks \ ++ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ ++ lt_cv_sys_global_symbol_to_c_name_address \ ++ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ ++ old_postinstall_cmds old_postuninstall_cmds \ ++ compiler \ ++ CC \ ++ LD \ ++ lt_prog_compiler_wl \ ++ lt_prog_compiler_pic \ ++ lt_prog_compiler_static \ ++ lt_prog_compiler_no_builtin_flag \ ++ export_dynamic_flag_spec \ ++ thread_safe_flag_spec \ ++ whole_archive_flag_spec \ ++ enable_shared_with_static_runtimes \ ++ old_archive_cmds \ ++ old_archive_from_new_cmds \ ++ predep_objects \ ++ postdep_objects \ ++ predeps \ ++ postdeps \ ++ compiler_lib_search_path \ ++ archive_cmds \ ++ archive_expsym_cmds \ ++ postinstall_cmds \ ++ postuninstall_cmds \ ++ old_archive_from_expsyms_cmds \ ++ allow_undefined_flag \ ++ no_undefined_flag \ ++ export_symbols_cmds \ ++ hardcode_libdir_flag_spec \ ++ hardcode_libdir_flag_spec_ld \ ++ hardcode_libdir_separator \ ++ hardcode_automatic \ ++ module_cmds \ ++ module_expsym_cmds \ ++ lt_cv_prog_compiler_c_o \ ++ exclude_expsyms \ ++ include_expsyms; do ++ ++ case $var in ++ old_archive_cmds | \ ++ old_archive_from_new_cmds | \ ++ archive_cmds | \ ++ archive_expsym_cmds | \ ++ module_cmds | \ ++ module_expsym_cmds | \ ++ old_archive_from_expsyms_cmds | \ ++ export_symbols_cmds | \ ++ extract_expsyms_cmds | reload_cmds | finish_cmds | \ ++ postinstall_cmds | postuninstall_cmds | \ ++ old_postinstall_cmds | old_postuninstall_cmds | \ ++ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) ++ # Double-quote double-evaled strings. ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ++ ;; ++ *) ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ++ ;; ++ esac ++ done ++ ++ case $lt_echo in ++ *'\$0 --fallback-echo"') ++ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ++ ;; ++ esac ++ ++cfgfile="${ofile}T" ++ trap "$rm \"$cfgfile\"; exit 1" 1 2 15 ++ $rm -f "$cfgfile" ++ { echo "$as_me:$LINENO: creating $ofile" >&5 ++echo "$as_me: creating $ofile" >&6;} ++ ++ cat <<__EOF__ >> "$cfgfile" ++#! $SHELL ++ ++# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. ++# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) ++# NOTE: Changes made to this file will be lost: look at ltmain.sh. ++# ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 ++# Free Software Foundation, Inc. ++# ++# This file is part of GNU Libtool: ++# Originally by Gordon Matzigkeit , 1996 ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program 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 this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# ++# As a special exception to the GNU General Public License, if you ++# distribute this file as part of a program that contains a ++# configuration script generated by Autoconf, you may include it under ++# the same distribution terms that you use for the rest of that program. ++ ++# A sed program that does not truncate output. ++SED=$lt_SED ++ ++# Sed that helps us avoid accidentally triggering echo(1) options like -n. ++Xsed="$SED -e s/^X//" ++ ++# The HP-UX ksh and POSIX shell print the target directory to stdout ++# if CDPATH is set. ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH ++ ++# The names of the tagged configurations supported by this script. ++available_tags= ++ ++# ### BEGIN LIBTOOL CONFIG ++ ++# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: ++ ++# Shell to use when invoking shell scripts. ++SHELL=$lt_SHELL ++ ++# Whether or not to build shared libraries. ++build_libtool_libs=$enable_shared ++ ++# Whether or not to build static libraries. ++build_old_libs=$enable_static ++ ++# Whether or not to add -lc for building shared libraries. ++build_libtool_need_lc=$archive_cmds_need_lc ++ ++# Whether or not to disallow shared libs when runtime libs are static ++allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes ++ ++# Whether or not to optimize for fast installation. ++fast_install=$enable_fast_install ++ ++# The host system. ++host_alias=$host_alias ++host=$host ++ ++# An echo program that does not interpret backslashes. ++echo=$lt_echo ++ ++# The archiver. ++AR=$lt_AR ++AR_FLAGS=$lt_AR_FLAGS ++ ++# A C compiler. ++LTCC=$lt_LTCC ++ ++# A language-specific compiler. ++CC=$lt_compiler ++ ++# Is the compiler the GNU C compiler? ++with_gcc=$GCC ++ ++# An ERE matcher. ++EGREP=$lt_EGREP ++ ++# The linker used to build libraries. ++LD=$lt_LD ++ ++# Whether we need hard or soft links. ++LN_S=$lt_LN_S ++ ++# A BSD-compatible nm program. ++NM=$lt_NM ++ ++# A symbol stripping program ++STRIP=$lt_STRIP ++ ++# Used to examine libraries when file_magic_cmd begins "file" ++MAGIC_CMD=$MAGIC_CMD ++ ++# Used on cygwin: DLL creation program. ++DLLTOOL="$DLLTOOL" ++ ++# Used on cygwin: object dumper. ++OBJDUMP="$OBJDUMP" ++ ++# Used on cygwin: assembler. ++AS="$AS" ++ ++# The name of the directory that contains temporary libtool files. ++objdir=$objdir ++ ++# How to create reloadable object files. ++reload_flag=$lt_reload_flag ++reload_cmds=$lt_reload_cmds ++ ++# How to pass a linker flag through the compiler. ++wl=$lt_lt_prog_compiler_wl ++ ++# Object file suffix (normally "o"). ++objext="$ac_objext" ++ ++# Old archive suffix (normally "a"). ++libext="$libext" ++ ++# Shared library suffix (normally ".so"). ++shrext_cmds='$shrext_cmds' ++ ++# Executable file suffix (normally ""). ++exeext="$exeext" ++ ++# Additional compiler flags for building library objects. ++pic_flag=$lt_lt_prog_compiler_pic ++pic_mode=$pic_mode ++ ++# What is the maximum length of a command? ++max_cmd_len=$lt_cv_sys_max_cmd_len ++ ++# Does compiler simultaneously support -c and -o options? ++compiler_c_o=$lt_lt_cv_prog_compiler_c_o ++ ++# Must we lock files when doing compilation ? ++need_locks=$lt_need_locks ++ ++# Do we need the lib prefix for modules? ++need_lib_prefix=$need_lib_prefix ++ ++# Do we need a version for libraries? ++need_version=$need_version ++ ++# Whether dlopen is supported. ++dlopen_support=$enable_dlopen ++ ++# Whether dlopen of programs is supported. ++dlopen_self=$enable_dlopen_self ++ ++# Whether dlopen of statically linked programs is supported. ++dlopen_self_static=$enable_dlopen_self_static ++ ++# Compiler flag to prevent dynamic linking. ++link_static_flag=$lt_lt_prog_compiler_static ++ ++# Compiler flag to turn off builtin functions. ++no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag ++ ++# Compiler flag to allow reflexive dlopens. ++export_dynamic_flag_spec=$lt_export_dynamic_flag_spec ++ ++# Compiler flag to generate shared objects directly from archives. ++whole_archive_flag_spec=$lt_whole_archive_flag_spec ++ ++# Compiler flag to generate thread-safe objects. ++thread_safe_flag_spec=$lt_thread_safe_flag_spec ++ ++# Library versioning type. ++version_type=$version_type ++ ++# Format of library name prefix. ++libname_spec=$lt_libname_spec ++ ++# List of archive names. First name is the real one, the rest are links. ++# The last name is the one that the linker finds with -lNAME. ++library_names_spec=$lt_library_names_spec ++ ++# The coded name of the library, if different from the real name. ++soname_spec=$lt_soname_spec ++ ++# Commands used to build and install an old-style archive. ++RANLIB=$lt_RANLIB ++old_archive_cmds=$lt_old_archive_cmds ++old_postinstall_cmds=$lt_old_postinstall_cmds ++old_postuninstall_cmds=$lt_old_postuninstall_cmds ++ ++# Create an old-style archive from a shared archive. ++old_archive_from_new_cmds=$lt_old_archive_from_new_cmds ++ ++# Create a temporary old-style archive to link instead of a shared archive. ++old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds ++ ++# Commands used to build and install a shared archive. ++archive_cmds=$lt_archive_cmds ++archive_expsym_cmds=$lt_archive_expsym_cmds ++postinstall_cmds=$lt_postinstall_cmds ++postuninstall_cmds=$lt_postuninstall_cmds ++ ++# Commands used to build a loadable module (assumed same as above if empty) ++module_cmds=$lt_module_cmds ++module_expsym_cmds=$lt_module_expsym_cmds ++ ++# Commands to strip libraries. ++old_striplib=$lt_old_striplib ++striplib=$lt_striplib ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predep_objects=$lt_predep_objects ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdep_objects=$lt_postdep_objects ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predeps=$lt_predeps ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdeps=$lt_postdeps ++ ++# The library search path used internally by the compiler when linking ++# a shared library. ++compiler_lib_search_path=$lt_compiler_lib_search_path ++ ++# Method to check whether dependent libraries are shared objects. ++deplibs_check_method=$lt_deplibs_check_method ++ ++# Command to use when deplibs_check_method == file_magic. ++file_magic_cmd=$lt_file_magic_cmd ++ ++# Flag that allows shared libraries with undefined symbols to be built. ++allow_undefined_flag=$lt_allow_undefined_flag ++ ++# Flag that forces no undefined symbols. ++no_undefined_flag=$lt_no_undefined_flag ++ ++# Commands used to finish a libtool library installation in a directory. ++finish_cmds=$lt_finish_cmds ++ ++# Same as above, but a single script fragment to be evaled but not shown. ++finish_eval=$lt_finish_eval ++ ++# Take the output of nm and produce a listing of raw symbols and C names. ++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe ++ ++# Transform the output of nm in a proper C declaration ++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl ++ ++# Transform the output of nm in a C name address pair ++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address ++ ++# This is the shared library runtime path variable. ++runpath_var=$runpath_var ++ ++# This is the shared library path variable. ++shlibpath_var=$shlibpath_var ++ ++# Is shlibpath searched before the hard-coded library search path? ++shlibpath_overrides_runpath=$shlibpath_overrides_runpath ++ ++# How to hardcode a shared library path into an executable. ++hardcode_action=$hardcode_action ++ ++# Whether we should hardcode library paths into libraries. ++hardcode_into_libs=$hardcode_into_libs ++ ++# Flag to hardcode \$libdir into a binary during linking. ++# This must work even if \$libdir does not exist. ++hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec ++ ++# If ld is used when linking, flag to hardcode \$libdir into ++# a binary during linking. This must work even if \$libdir does ++# not exist. ++hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld ++ ++# Whether we need a single -rpath flag with a separated argument. ++hardcode_libdir_separator=$lt_hardcode_libdir_separator ++ ++# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the ++# resulting binary. ++hardcode_direct=$hardcode_direct ++ ++# Set to yes if using the -LDIR flag during linking hardcodes DIR into the ++# resulting binary. ++hardcode_minus_L=$hardcode_minus_L ++ ++# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into ++# the resulting binary. ++hardcode_shlibpath_var=$hardcode_shlibpath_var ++ ++# Set to yes if building a shared library automatically hardcodes DIR into the library ++# and all subsequent libraries and executables linked against it. ++hardcode_automatic=$hardcode_automatic ++ ++# Variables whose values should be saved in libtool wrapper scripts and ++# restored at relink time. ++variables_saved_for_relink="$variables_saved_for_relink" ++ ++# Whether libtool must link a program against all its dependency libraries. ++link_all_deplibs=$link_all_deplibs ++ ++# Compile-time system search path for libraries ++sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++ ++# Run-time system search path for libraries ++sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec ++ ++# Fix the shell variable \$srcfile for the compiler. ++fix_srcfile_path="$fix_srcfile_path" ++ ++# Set to yes if exported symbols are required. ++always_export_symbols=$always_export_symbols ++ ++# The commands to list exported symbols. ++export_symbols_cmds=$lt_export_symbols_cmds ++ ++# The commands to extract the exported symbol list from a shared archive. ++extract_expsyms_cmds=$lt_extract_expsyms_cmds ++ ++# Symbols that should not be listed in the preloaded symbols. ++exclude_expsyms=$lt_exclude_expsyms ++ ++# Symbols that must always be exported. ++include_expsyms=$lt_include_expsyms ++ ++# ### END LIBTOOL CONFIG ++ ++__EOF__ ++ ++ ++ case $host_os in ++ aix3*) ++ cat <<\EOF >> "$cfgfile" ++ ++# AIX sometimes has problems with the GCC collect2 program. For some ++# reason, if we set the COLLECT_NAMES environment variable, the problems ++# vanish in a puff of smoke. ++if test "X${COLLECT_NAMES+set}" != Xset; then ++ COLLECT_NAMES= ++ export COLLECT_NAMES ++fi ++EOF ++ ;; ++ esac ++ ++ # We use sed instead of cat because bash on DJGPP gets confused if ++ # if finds mixed CR/LF and LF-only lines. Since sed operates in ++ # text mode, it properly converts lines to CR/LF. This bash problem ++ # is reportedly fixed, but why not run on old versions too? ++ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) ++ ++ mv -f "$cfgfile" "$ofile" || \ ++ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") ++ chmod +x "$ofile" ++ ++else ++ # If there is no Makefile yet, we rely on a make rule to execute ++ # `config.status --recheck' to rerun these tests and create the ++ # libtool script then. ++ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` ++ if test -f "$ltmain_in"; then ++ test -f Makefile && make "$ltmain" ++ fi ++fi ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++CC="$lt_save_CC" ++ ++ ++# Check whether --with-tags or --without-tags was given. ++if test "${with_tags+set}" = set; then ++ withval="$with_tags" ++ tagnames="$withval" ++fi; ++ ++if test -f "$ltmain" && test -n "$tagnames"; then ++ if test ! -f "${ofile}"; then ++ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 ++echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} ++ fi ++ ++ if test -z "$LTCC"; then ++ eval "`$SHELL ${ofile} --config | grep '^LTCC='`" ++ if test -z "$LTCC"; then ++ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 ++echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} ++ else ++ { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 ++echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} ++ fi ++ fi ++ ++ # Extract list of available tagged configurations in $ofile. ++ # Note that this assumes the entire list is on one line. ++ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` ++ ++ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," ++ for tagname in $tagnames; do ++ IFS="$lt_save_ifs" ++ # Check whether tagname contains only valid characters ++ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in ++ "") ;; ++ *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 ++echo "$as_me: error: invalid tag name: $tagname" >&2;} ++ { (exit 1); exit 1; }; } ++ ;; ++ esac ++ ++ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null ++ then ++ { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 ++echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} ++ { (exit 1); exit 1; }; } ++ fi ++ ++ # Update the list of available tags. ++ if test -n "$tagname"; then ++ echo appending configuration tag \"$tagname\" to $ofile ++ ++ case $tagname in ++ CXX) ++ if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then ++ ac_ext=cc ++ac_cpp='$CXXCPP $CPPFLAGS' ++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ++ ++ ++ ++ ++archive_cmds_need_lc_CXX=no ++allow_undefined_flag_CXX= ++always_export_symbols_CXX=no ++archive_expsym_cmds_CXX= ++export_dynamic_flag_spec_CXX= ++hardcode_direct_CXX=no ++hardcode_libdir_flag_spec_CXX= ++hardcode_libdir_flag_spec_ld_CXX= ++hardcode_libdir_separator_CXX= ++hardcode_minus_L_CXX=no ++hardcode_automatic_CXX=no ++module_cmds_CXX= ++module_expsym_cmds_CXX= ++link_all_deplibs_CXX=unknown ++old_archive_cmds_CXX=$old_archive_cmds ++no_undefined_flag_CXX= ++whole_archive_flag_spec_CXX= ++enable_shared_with_static_runtimes_CXX=no ++ ++# Dependencies to place before and after the object being linked: ++predep_objects_CXX= ++postdep_objects_CXX= ++predeps_CXX= ++postdeps_CXX= ++compiler_lib_search_path_CXX= ++ ++# Source file extension for C++ test sources. ++ac_ext=cc ++ ++# Object file extension for compiled C++ test sources. ++objext=o ++objext_CXX=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code="int some_variable = 0;\n" ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code='int main(int, char *) { return(0); }\n' ++ ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. ++ ++# If no C compiler was specified, use CC. ++LTCC=${LTCC-"$CC"} ++ ++# Allow CC to be a program name with arguments. ++compiler=$CC ++ ++ ++# Allow CC to be a program name with arguments. ++lt_save_CC=$CC ++lt_save_LD=$LD ++lt_save_GCC=$GCC ++GCC=$GXX ++lt_save_with_gnu_ld=$with_gnu_ld ++lt_save_path_LD=$lt_cv_path_LD ++if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then ++ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx ++else ++ unset lt_cv_prog_gnu_ld ++fi ++if test -n "${lt_cv_path_LDCXX+set}"; then ++ lt_cv_path_LD=$lt_cv_path_LDCXX ++else ++ unset lt_cv_path_LD ++fi ++test -z "${LDCXX+set}" || LD=$LDCXX ++CC=${CXX-"c++"} ++compiler=$CC ++compiler_CXX=$CC ++cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++ ++# We don't want -fno-exception wen compiling C++ code, so set the ++# no_builtin_flag separately ++if test "$GXX" = yes; then ++ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' ++else ++ lt_prog_compiler_no_builtin_flag_CXX= ++fi ++ ++if test "$GXX" = yes; then ++ # Set up default GNU C++ configuration ++ ++ ++# Check whether --with-gnu-ld or --without-gnu-ld was given. ++if test "${with_gnu_ld+set}" = set; then ++ withval="$with_gnu_ld" ++ test "$withval" = no || with_gnu_ld=yes ++else ++ with_gnu_ld=no ++fi; ++ac_prog=ld ++if test "$GCC" = yes; then ++ # Check if gcc -print-prog-name=ld gives a path. ++ echo "$as_me:$LINENO: checking for ld used by $CC" >&5 ++echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ++ case $host in ++ *-*-mingw*) ++ # gcc leaves a trailing carriage return which upsets mingw ++ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; ++ *) ++ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; ++ esac ++ case $ac_prog in ++ # Accept absolute paths. ++ [\\/]* | ?:[\\/]*) ++ re_direlt='/[^/][^/]*/\.\./' ++ # Canonicalize the pathname of ld ++ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` ++ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ++ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` ++ done ++ test -z "$LD" && LD="$ac_prog" ++ ;; ++ "") ++ # If it fails, then pretend we aren't using GCC. ++ ac_prog=ld ++ ;; ++ *) ++ # If it is relative, then search for the first ld in PATH. ++ with_gnu_ld=unknown ++ ;; ++ esac ++elif test "$with_gnu_ld" = yes; then ++ echo "$as_me:$LINENO: checking for GNU ld" >&5 ++echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 ++else ++ echo "$as_me:$LINENO: checking for non-GNU ld" >&5 ++echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 ++fi ++if test "${lt_cv_path_LD+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -z "$LD"; then ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for ac_dir in $PATH; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then ++ lt_cv_path_LD="$ac_dir/$ac_prog" ++ # Check to see if the program is GNU ld. I'd rather use --version, ++ # but apparently some GNU ld's only accept -v. ++ # Break only if it was the GNU/non-GNU ld that we prefer. ++ case `"$lt_cv_path_LD" -v 2>&1 &5 ++echo "${ECHO_T}$LD" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 ++echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} ++ { (exit 1); exit 1; }; } ++echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 ++echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 ++if test "${lt_cv_prog_gnu_ld+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ # I'd rather use --version here, but apparently some GNU ld's only accept -v. ++case `$LD -v 2>&1 &5 ++echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 ++with_gnu_ld=$lt_cv_prog_gnu_ld ++ ++ ++ ++ # Check if GNU C++ uses GNU ld as the underlying linker, since the ++ # archiving commands below assume that GNU ld is being used. ++ if test "$with_gnu_ld" = yes; then ++ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec_CXX='${wl}--export-dynamic' ++ ++ # If archive_cmds runs LD, not CC, wlarc should be empty ++ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to ++ # investigate it a little bit more. (MM) ++ wlarc='${wl}' ++ ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ ++ grep 'no-whole-archive' > /dev/null; then ++ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ whole_archive_flag_spec_CXX= ++ fi ++ else ++ with_gnu_ld=no ++ wlarc= ++ ++ # A generic and very simple default shared library creation ++ # command for GNU C++ for the case where it uses the native ++ # linker, instead of GNU ld. If possible, this setting should ++ # overridden to take advantage of the native linker features on ++ # the platform it is being used on. ++ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' ++ fi ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' ++ ++else ++ GXX=no ++ with_gnu_ld=no ++ wlarc= ++fi ++ ++# PORTME: fill in a description of your system's C++ link characteristics ++echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 ++echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ++ld_shlibs_CXX=yes ++case $host_os in ++ aix3*) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ aix4* | aix5*) ++ if test "$host_cpu" = ia64; then ++ # On IA64, the linker does run time linking by default, so we don't ++ # have to do anything special. ++ aix_use_runtimelinking=no ++ exp_sym_flag='-Bexport' ++ no_entry_flag="" ++ else ++ aix_use_runtimelinking=no ++ ++ # Test if we are trying to use run time linking or normal ++ # AIX style linking. If -brtl is somewhere in LDFLAGS, we ++ # need to do runtime linking. ++ case $host_os in aix4.[23]|aix4.[23].*|aix5*) ++ for ld_flag in $LDFLAGS; do ++ case $ld_flag in ++ *-brtl*) ++ aix_use_runtimelinking=yes ++ break ++ ;; ++ esac ++ done ++ esac ++ ++ exp_sym_flag='-bexport' ++ no_entry_flag='-bnoentry' ++ fi ++ ++ # When large executables or shared objects are built, AIX ld can ++ # have problems creating the table of contents. If linking a library ++ # or program results in "error TOC overflow" add -mminimal-toc to ++ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not ++ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. ++ ++ archive_cmds_CXX='' ++ hardcode_direct_CXX=yes ++ hardcode_libdir_separator_CXX=':' ++ link_all_deplibs_CXX=yes ++ ++ if test "$GXX" = yes; then ++ case $host_os in aix4.012|aix4.012.*) ++ # We only want to do this on AIX 4.2 and lower, the check ++ # below for broken collect2 doesn't work under 4.3+ ++ collect2name=`${CC} -print-prog-name=collect2` ++ if test -f "$collect2name" && \ ++ strings "$collect2name" | grep resolve_lib_name >/dev/null ++ then ++ # We have reworked collect2 ++ hardcode_direct_CXX=yes ++ else ++ # We have old collect2 ++ hardcode_direct_CXX=unsupported ++ # It fails to find uninstalled libraries when the uninstalled ++ # path is not listed in the libpath. Setting hardcode_minus_L ++ # to unsupported forces relinking ++ hardcode_minus_L_CXX=yes ++ hardcode_libdir_flag_spec_CXX='-L$libdir' ++ hardcode_libdir_separator_CXX= ++ fi ++ esac ++ shared_flag='-shared' ++ else ++ # not using gcc ++ if test "$host_cpu" = ia64; then ++ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release ++ # chokes on -Wl,-G. The following line is correct: ++ shared_flag='-G' ++ else ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag='${wl}-G' ++ else ++ shared_flag='${wl}-bM:SRE' ++ fi ++ fi ++ fi ++ ++ # It seems that -bexpall does not export symbols beginning with ++ # underscore (_), so it is better to generate a list of symbols to export. ++ always_export_symbols_CXX=yes ++ if test "$aix_use_runtimelinking" = yes; then ++ # Warning - without using the other runtime loading flags (-brtl), ++ # -berok will link without error, but may produce a broken library. ++ allow_undefined_flag_CXX='-berok' ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" ++ ++ archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ else ++ if test "$host_cpu" = ia64; then ++ hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' ++ allow_undefined_flag_CXX="-z nodefs" ++ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ else ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" ++ # Warning - without using the other run time loading flags, ++ # -berok will link without error, but may produce a broken library. ++ no_undefined_flag_CXX=' ${wl}-bernotok' ++ allow_undefined_flag_CXX=' ${wl}-berok' ++ # -bexpall does not export symbols beginning with underscore (_) ++ always_export_symbols_CXX=yes ++ # Exported symbols can be pulled into shared objects from archives ++ whole_archive_flag_spec_CXX=' ' ++ archive_cmds_need_lc_CXX=yes ++ # This is similar to how AIX traditionally builds it's shared libraries. ++ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ fi ++ fi ++ ;; ++ chorus*) ++ case $cc_basename in ++ *) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ ;; ++ ++ ++ cygwin* | mingw* | pw32*) ++ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, ++ # as there is no search path for DLLs. ++ hardcode_libdir_flag_spec_CXX='-L$libdir' ++ allow_undefined_flag_CXX=unsupported ++ always_export_symbols_CXX=no ++ enable_shared_with_static_runtimes_CXX=yes ++ ++ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then ++ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ # If the export-symbols file already is a .def file (1st line ++ # is EXPORTS), use it as is; otherwise, prepend... ++ archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ cp $export_symbols $output_objdir/$soname.def; ++ else ++ echo EXPORTS > $output_objdir/$soname.def; ++ cat $export_symbols >> $output_objdir/$soname.def; ++ fi~ ++ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ else ++ ld_shlibs_CXX=no ++ fi ++ ;; ++ darwin* | rhapsody*) ++ case "$host_os" in ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac ++ archive_cmds_need_lc_CXX=no ++ hardcode_direct_CXX=no ++ hardcode_automatic_CXX=yes ++ hardcode_shlibpath_var_CXX=unsupported ++ whole_archive_flag_spec_CXX='' ++ link_all_deplibs_CXX=yes ++ ++ if test "$GXX" = yes ; then ++ lt_int_apple_cc_single_mod=no ++ output_verbose_link_cmd='echo' ++ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then ++ lt_int_apple_cc_single_mod=yes ++ fi ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ else ++ archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ fi ++ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ fi ++ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case "$cc_basename" in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ fi ++ ;; ++ ++ dgux*) ++ case $cc_basename in ++ ec++) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ ghcx) ++ # Green Hills C++ Compiler ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ ;; ++ freebsd12*) ++ # C++ shared libraries reported to be fairly broken before switch to ELF ++ ld_shlibs_CXX=no ++ ;; ++ freebsd-elf*) ++ archive_cmds_need_lc_CXX=no ++ ;; ++ freebsd* | kfreebsd*-gnu) ++ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF ++ # conventions ++ ld_shlibs_CXX=yes ++ ;; ++ gnu*) ++ ;; ++ hpux9*) ++ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_CXX=: ++ export_dynamic_flag_spec_CXX='${wl}-E' ++ hardcode_direct_CXX=yes ++ hardcode_minus_L_CXX=yes # Not in the search PATH, ++ # but as the default ++ # location of the library. ++ ++ case $cc_basename in ++ CC) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ aCC) ++ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes; then ++ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ else ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ fi ++ ;; ++ esac ++ ;; ++ hpux10*|hpux11*) ++ if test $with_gnu_ld = no; then ++ case "$host_cpu" in ++ hppa*64*) ++ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec_ld_CXX='+b $libdir' ++ hardcode_libdir_separator_CXX=: ++ ;; ++ ia64*) ++ hardcode_libdir_flag_spec_CXX='-L$libdir' ++ ;; ++ *) ++ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_CXX=: ++ export_dynamic_flag_spec_CXX='${wl}-E' ++ ;; ++ esac ++ fi ++ case "$host_cpu" in ++ hppa*64*) ++ hardcode_direct_CXX=no ++ hardcode_shlibpath_var_CXX=no ++ ;; ++ ia64*) ++ hardcode_direct_CXX=no ++ hardcode_shlibpath_var_CXX=no ++ hardcode_minus_L_CXX=yes # Not in the search PATH, ++ # but as the default ++ # location of the library. ++ ;; ++ *) ++ hardcode_direct_CXX=yes ++ hardcode_minus_L_CXX=yes # Not in the search PATH, ++ # but as the default ++ # location of the library. ++ ;; ++ esac ++ ++ case $cc_basename in ++ CC) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ aCC) ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ ;; ++ *) ++ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ esac ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes; then ++ if test $with_gnu_ld = no; then ++ case "$host_cpu" in ++ ia64*|hppa*64*) ++ archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ ;; ++ *) ++ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ esac ++ fi ++ else ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ fi ++ ;; ++ esac ++ ;; ++ irix5* | irix6*) ++ case $cc_basename in ++ CC) ++ # SGI C++ ++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ ++ # Archives containing C++ object files must be created using ++ # "CC -ar", where "CC" is the IRIX C++ compiler. This is ++ # necessary to make sure instantiated templates are included ++ # in the archive. ++ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ++ ;; ++ *) ++ if test "$GXX" = yes; then ++ if test "$with_gnu_ld" = no; then ++ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ else ++ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' ++ fi ++ fi ++ link_all_deplibs_CXX=yes ++ ;; ++ esac ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_CXX=: ++ ;; ++ linux*) ++ case $cc_basename in ++ KCC) ++ # Kuck and Associates, Inc. (KAI) C++ Compiler ++ ++ # KCC will only create a shared library if the output file ++ # ends with ".so" (or ".sl" for HP-UX), so rename the library ++ # to its proper name (with version) after linking. ++ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' ++ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' ++ export_dynamic_flag_spec_CXX='${wl}--export-dynamic' ++ ++ # Archives containing C++ object files must be created using ++ # "CC -Bstatic", where "CC" is the KAI C++ compiler. ++ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ++ ;; ++ icpc) ++ # Intel C++ ++ with_gnu_ld=yes ++ # version 8.0 and above of icpc choke on multiply defined symbols ++ # if we add $predep_objects and $postdep_objects, however 7.1 and ++ # earlier do not add the objects themselves. ++ case `$CC -V 2>&1` in ++ *"Version 7."*) ++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ *) # Version 8.0 or newer ++ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ esac ++ archive_cmds_need_lc_CXX=no ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec_CXX='${wl}--export-dynamic' ++ whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ++ ;; ++ cxx) ++ # Compaq C++ ++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' ++ ++ runpath_var=LD_RUN_PATH ++ hardcode_libdir_flag_spec_CXX='-rpath $libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ esac ++ ;; ++ lynxos*) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ m88k*) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ mvs*) ++ case $cc_basename in ++ cxx) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ ;; ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' ++ wlarc= ++ hardcode_libdir_flag_spec_CXX='-R$libdir' ++ hardcode_direct_CXX=yes ++ hardcode_shlibpath_var_CXX=no ++ fi ++ # Workaround some broken pre-1.5 toolchains ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ++ ;; ++ openbsd2*) ++ # C++ shared libraries are fairly broken ++ ld_shlibs_CXX=no ++ ;; ++ openbsd*) ++ hardcode_direct_CXX=yes ++ hardcode_shlibpath_var_CXX=no ++ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' ++ export_dynamic_flag_spec_CXX='${wl}-E' ++ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ fi ++ output_verbose_link_cmd='echo' ++ ;; ++ osf3*) ++ case $cc_basename in ++ KCC) ++ # Kuck and Associates, Inc. (KAI) C++ Compiler ++ ++ # KCC will only create a shared library if the output file ++ # ends with ".so" (or ".sl" for HP-UX), so rename the library ++ # to its proper name (with version) after linking. ++ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ # Archives containing C++ object files must be created using ++ # "CC -Bstatic", where "CC" is the KAI C++ compiler. ++ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ++ ++ ;; ++ RCC) ++ # Rational C++ 2.4.1 ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ cxx) ++ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes && test "$with_gnu_ld" = no; then ++ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' ++ ++ else ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ fi ++ ;; ++ esac ++ ;; ++ osf4* | osf5*) ++ case $cc_basename in ++ KCC) ++ # Kuck and Associates, Inc. (KAI) C++ Compiler ++ ++ # KCC will only create a shared library if the output file ++ # ends with ".so" (or ".sl" for HP-UX), so rename the library ++ # to its proper name (with version) after linking. ++ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ # Archives containing C++ object files must be created using ++ # the KAI C++ compiler. ++ old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ++ ;; ++ RCC) ++ # Rational C++ 2.4.1 ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ cxx) ++ allow_undefined_flag_CXX=' -expect_unresolved \*' ++ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ ++ echo "-hidden">> $lib.exp~ ++ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ ++ $rm $lib.exp' ++ ++ hardcode_libdir_flag_spec_CXX='-rpath $libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ;; ++ *) ++ if test "$GXX" = yes && test "$with_gnu_ld" = no; then ++ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' ++ ++ else ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ fi ++ ;; ++ esac ++ ;; ++ psos*) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ sco*) ++ archive_cmds_need_lc_CXX=no ++ case $cc_basename in ++ CC) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ ;; ++ sunos4*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.x ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ lcc) ++ # Lucid ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ ;; ++ solaris*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.2, 5.x and Centerline C++ ++ no_undefined_flag_CXX=' -zdefs' ++ archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ ++ hardcode_libdir_flag_spec_CXX='-R$libdir' ++ hardcode_shlibpath_var_CXX=no ++ case $host_os in ++ solaris2.0-5 | solaris2.0-5.*) ;; ++ *) ++ # The C++ compiler is used as linker so we must use $wl ++ # flag to pass the commands to the underlying system ++ # linker. ++ # Supported since Solaris 2.6 (maybe 2.5.1?) ++ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ++ ;; ++ esac ++ link_all_deplibs_CXX=yes ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ # ++ # There doesn't appear to be a way to prevent this compiler from ++ # explicitly linking system object files so we need to strip them ++ # from the output so that they don't get included in the library ++ # dependencies. ++ output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ ++ # Archives containing C++ object files must be created using ++ # "CC -xar", where "CC" is the Sun C++ compiler. This is ++ # necessary to make sure instantiated templates are included ++ # in the archive. ++ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ++ ;; ++ gcx) ++ # Green Hills C++ Compiler ++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' ++ ++ # The C++ compiler must be used to create the archive. ++ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ++ ;; ++ *) ++ # GNU C++ compiler with Solaris linker ++ if test "$GXX" = yes && test "$with_gnu_ld" = no; then ++ no_undefined_flag_CXX=' ${wl}-z ${wl}defs' ++ if $CC --version | grep -v '^2\.7' > /dev/null; then ++ archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" ++ else ++ # g++ 2.7 appears to require `-G' NOT `-shared' on this ++ # platform. ++ archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ ++ # Commands to make compiler produce verbose output that lists ++ # what "hidden" libraries, object files and flags are used when ++ # linking a shared library. ++ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" ++ fi ++ ++ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' ++ fi ++ ;; ++ esac ++ ;; ++ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ++ archive_cmds_need_lc_CXX=no ++ ;; ++ tandem*) ++ case $cc_basename in ++ NCC) ++ # NonStop-UX NCC 3.20 ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ ;; ++ vxworks*) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++ *) ++ # FIXME: insert proper C++ library support ++ ld_shlibs_CXX=no ++ ;; ++esac ++echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 ++echo "${ECHO_T}$ld_shlibs_CXX" >&6 ++test "$ld_shlibs_CXX" = no && can_build_shared=no ++ ++GCC_CXX="$GXX" ++LD_CXX="$LD" ++ ++ ++cat > conftest.$ac_ext <&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ # Parse the compiler output and extract the necessary ++ # objects, libraries and library flags. ++ ++ # Sentinel used to keep track of whether or not we are before ++ # the conftest object file. ++ pre_test_object_deps_done=no ++ ++ # The `*' in the case matches for architectures that use `case' in ++ # $output_verbose_cmd can trigger glob expansion during the loop ++ # eval without this substitution. ++ output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" ++ ++ for p in `eval $output_verbose_link_cmd`; do ++ case $p in ++ ++ -L* | -R* | -l*) ++ # Some compilers place space between "-{L,R}" and the path. ++ # Remove the space. ++ if test $p = "-L" \ ++ || test $p = "-R"; then ++ prev=$p ++ continue ++ else ++ prev= ++ fi ++ ++ if test "$pre_test_object_deps_done" = no; then ++ case $p in ++ -L* | -R*) ++ # Internal compiler library paths should come after those ++ # provided the user. The postdeps already come after the ++ # user supplied libs so there is no need to process them. ++ if test -z "$compiler_lib_search_path_CXX"; then ++ compiler_lib_search_path_CXX="${prev}${p}" ++ else ++ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" ++ fi ++ ;; ++ # The "-l" case would never come before the object being ++ # linked, so don't bother handling this case. ++ esac ++ else ++ if test -z "$postdeps_CXX"; then ++ postdeps_CXX="${prev}${p}" ++ else ++ postdeps_CXX="${postdeps_CXX} ${prev}${p}" ++ fi ++ fi ++ ;; ++ ++ *.$objext) ++ # This assumes that the test object file only shows up ++ # once in the compiler output. ++ if test "$p" = "conftest.$objext"; then ++ pre_test_object_deps_done=yes ++ continue ++ fi ++ ++ if test "$pre_test_object_deps_done" = no; then ++ if test -z "$predep_objects_CXX"; then ++ predep_objects_CXX="$p" ++ else ++ predep_objects_CXX="$predep_objects_CXX $p" ++ fi ++ else ++ if test -z "$postdep_objects_CXX"; then ++ postdep_objects_CXX="$p" ++ else ++ postdep_objects_CXX="$postdep_objects_CXX $p" ++ fi ++ fi ++ ;; ++ ++ *) ;; # Ignore the rest. ++ ++ esac ++ done ++ ++ # Clean up. ++ rm -f a.out a.exe ++else ++ echo "libtool.m4: error: problem compiling CXX test program" ++fi ++ ++$rm -f confest.$objext ++ ++case " $postdeps_CXX " in ++*" -lc "*) archive_cmds_need_lc_CXX=no ;; ++esac ++ ++lt_prog_compiler_wl_CXX= ++lt_prog_compiler_pic_CXX= ++lt_prog_compiler_static_CXX= ++ ++echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 ++echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 ++ ++ # C++ specific cases for pic, static, wl, etc. ++ if test "$GXX" = yes; then ++ lt_prog_compiler_wl_CXX='-Wl,' ++ lt_prog_compiler_static_CXX='-static' ++ ++ case $host_os in ++ aix*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ lt_prog_compiler_static_CXX='-Bstatic' ++ fi ++ ;; ++ amigaos*) ++ # FIXME: we need at least 68020 code to build shared libraries, but ++ # adding the `-m68020' flag to GCC prevents building anything better, ++ # like `-m68040'. ++ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ++ ;; ++ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) ++ # PIC is the default for these OSes. ++ ;; ++ mingw* | os2* | pw32*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ++ ;; ++ darwin* | rhapsody*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ lt_prog_compiler_pic_CXX='-fno-common' ++ ;; ++ *djgpp*) ++ # DJGPP does not support shared libraries at all ++ lt_prog_compiler_pic_CXX= ++ ;; ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ lt_prog_compiler_pic_CXX=-Kconform_pic ++ fi ++ ;; ++ hpux*) ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ ;; ++ *) ++ lt_prog_compiler_pic_CXX='-fPIC' ++ ;; ++ esac ++ ;; ++ *) ++ lt_prog_compiler_pic_CXX='-fPIC' ++ ;; ++ esac ++ else ++ case $host_os in ++ aix4* | aix5*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ lt_prog_compiler_static_CXX='-Bstatic' ++ else ++ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' ++ fi ++ ;; ++ chorus*) ++ case $cc_basename in ++ cxch68) ++ # Green Hills C++ Compiler ++ # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ++ ;; ++ esac ++ ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case "$cc_basename" in ++ xlc*) ++ lt_prog_compiler_pic_CXX='-qnocommon' ++ lt_prog_compiler_wl_CXX='-Wl,' ++ ;; ++ esac ++ ;; ++ dgux*) ++ case $cc_basename in ++ ec++) ++ lt_prog_compiler_pic_CXX='-KPIC' ++ ;; ++ ghcx) ++ # Green Hills C++ Compiler ++ lt_prog_compiler_pic_CXX='-pic' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ freebsd* | kfreebsd*-gnu) ++ # FreeBSD uses GNU C++ ++ ;; ++ hpux9* | hpux10* | hpux11*) ++ case $cc_basename in ++ CC) ++ lt_prog_compiler_wl_CXX='-Wl,' ++ lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" ++ if test "$host_cpu" != ia64; then ++ lt_prog_compiler_pic_CXX='+Z' ++ fi ++ ;; ++ aCC) ++ lt_prog_compiler_wl_CXX='-Wl,' ++ lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ lt_prog_compiler_pic_CXX='+Z' ++ ;; ++ esac ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ irix5* | irix6* | nonstopux*) ++ case $cc_basename in ++ CC) ++ lt_prog_compiler_wl_CXX='-Wl,' ++ lt_prog_compiler_static_CXX='-non_shared' ++ # CC pic flag -KPIC is the default. ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ linux*) ++ case $cc_basename in ++ KCC) ++ # KAI C++ Compiler ++ lt_prog_compiler_wl_CXX='--backend -Wl,' ++ lt_prog_compiler_pic_CXX='-fPIC' ++ ;; ++ icpc) ++ # Intel C++ ++ lt_prog_compiler_wl_CXX='-Wl,' ++ lt_prog_compiler_pic_CXX='-KPIC' ++ lt_prog_compiler_static_CXX='-static' ++ ;; ++ cxx) ++ # Compaq C++ ++ # Make sure the PIC flag is empty. It appears that all Alpha ++ # Linux and Compaq Tru64 Unix objects are PIC. ++ lt_prog_compiler_pic_CXX= ++ lt_prog_compiler_static_CXX='-non_shared' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ lynxos*) ++ ;; ++ m88k*) ++ ;; ++ mvs*) ++ case $cc_basename in ++ cxx) ++ lt_prog_compiler_pic_CXX='-W c,exportall' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ netbsd*) ++ ;; ++ osf3* | osf4* | osf5*) ++ case $cc_basename in ++ KCC) ++ lt_prog_compiler_wl_CXX='--backend -Wl,' ++ ;; ++ RCC) ++ # Rational C++ 2.4.1 ++ lt_prog_compiler_pic_CXX='-pic' ++ ;; ++ cxx) ++ # Digital/Compaq C++ ++ lt_prog_compiler_wl_CXX='-Wl,' ++ # Make sure the PIC flag is empty. It appears that all Alpha ++ # Linux and Compaq Tru64 Unix objects are PIC. ++ lt_prog_compiler_pic_CXX= ++ lt_prog_compiler_static_CXX='-non_shared' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ psos*) ++ ;; ++ sco*) ++ case $cc_basename in ++ CC) ++ lt_prog_compiler_pic_CXX='-fPIC' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ solaris*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.2, 5.x and Centerline C++ ++ lt_prog_compiler_pic_CXX='-KPIC' ++ lt_prog_compiler_static_CXX='-Bstatic' ++ lt_prog_compiler_wl_CXX='-Qoption ld ' ++ ;; ++ gcx) ++ # Green Hills C++ Compiler ++ lt_prog_compiler_pic_CXX='-PIC' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ sunos4*) ++ case $cc_basename in ++ CC) ++ # Sun C++ 4.x ++ lt_prog_compiler_pic_CXX='-pic' ++ lt_prog_compiler_static_CXX='-Bstatic' ++ ;; ++ lcc) ++ # Lucid ++ lt_prog_compiler_pic_CXX='-pic' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ tandem*) ++ case $cc_basename in ++ NCC) ++ # NonStop-UX NCC 3.20 ++ lt_prog_compiler_pic_CXX='-KPIC' ++ ;; ++ *) ++ ;; ++ esac ++ ;; ++ unixware*) ++ ;; ++ vxworks*) ++ ;; ++ *) ++ lt_prog_compiler_can_build_shared_CXX=no ++ ;; ++ esac ++ fi ++ ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 ++ ++# ++# Check to make sure the PIC flag actually works. ++# ++if test -n "$lt_prog_compiler_pic_CXX"; then ++ ++echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 ++echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_pic_works_CXX=no ++ ac_outfile=conftest.$ac_objext ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ # The option is referenced via a variable to avoid confusing sed. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:11459: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>conftest.err) ++ ac_status=$? ++ cat conftest.err >&5 ++ echo "$as_me:11463: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s "$ac_outfile"; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s conftest.err; then ++ lt_prog_compiler_pic_works_CXX=yes ++ fi ++ fi ++ $rm conftest* ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 ++ ++if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then ++ case $lt_prog_compiler_pic_CXX in ++ "" | " "*) ;; ++ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; ++ esac ++else ++ lt_prog_compiler_pic_CXX= ++ lt_prog_compiler_can_build_shared_CXX=no ++fi ++ ++fi ++case "$host_os" in ++ # For platforms which do not support PIC, -DPIC is meaningless: ++ *djgpp*) ++ lt_prog_compiler_pic_CXX= ++ ;; ++ *) ++ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ++ ;; ++esac ++ ++echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 ++echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 ++if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_cv_prog_compiler_c_o_CXX=no ++ $rm -r conftest 2>/dev/null ++ mkdir conftest ++ cd conftest ++ mkdir out ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ lt_compiler_flag="-o out/conftest2.$ac_objext" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:11519: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>out/conftest.err) ++ ac_status=$? ++ cat out/conftest.err >&5 ++ echo "$as_me:11523: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s out/conftest2.$ac_objext ++ then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s out/conftest.err; then ++ lt_cv_prog_compiler_c_o_CXX=yes ++ fi ++ fi ++ chmod u+w . ++ $rm conftest* ++ # SGI C++ compiler will create directory out/ii_files/ for ++ # template instantiation ++ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files ++ $rm out/* && rmdir out ++ cd .. ++ rmdir conftest ++ $rm conftest* ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 ++echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 ++ ++ ++hard_links="nottested" ++if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then ++ # do not overwrite the value of need_locks provided by the user ++ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 ++echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 ++ hard_links=yes ++ $rm conftest* ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ touch conftest.a ++ ln conftest.a conftest.b 2>&5 || hard_links=no ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ echo "$as_me:$LINENO: result: $hard_links" >&5 ++echo "${ECHO_T}$hard_links" >&6 ++ if test "$hard_links" = no; then ++ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 ++echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} ++ need_locks=warn ++ fi ++else ++ need_locks=no ++fi ++ ++echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 ++echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ++ ++ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ case $host_os in ++ aix4* | aix5*) ++ # If we're using GNU nm, then we don't want the "-C" option. ++ # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then ++ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' ++ else ++ export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' ++ fi ++ ;; ++ pw32*) ++ export_symbols_cmds_CXX="$ltdll_cmds" ++ ;; ++ cygwin* | mingw*) ++ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ ;; ++ *) ++ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ ;; ++ esac ++ ++echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 ++echo "${ECHO_T}$ld_shlibs_CXX" >&6 ++test "$ld_shlibs_CXX" = no && can_build_shared=no ++ ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi ++ ++# ++# Do we need to explicitly link libc? ++# ++case "x$archive_cmds_need_lc_CXX" in ++x|xyes) ++ # Assume -lc should be added ++ archive_cmds_need_lc_CXX=yes ++ ++ if test "$enable_shared" = yes && test "$GCC" = yes; then ++ case $archive_cmds_CXX in ++ *'~'*) ++ # FIXME: we may have to deal with multi-command sequences. ++ ;; ++ '$CC '*) ++ # Test whether the compiler implicitly links with -lc since on some ++ # systems, -lgcc has to come before -lc. If gcc already passes -lc ++ # to ld, don't add -lc before -lgcc. ++ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 ++echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 ++ $rm conftest* ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } 2>conftest.err; then ++ soname=conftest ++ lib=conftest ++ libobjs=conftest.$ac_objext ++ deplibs= ++ wl=$lt_prog_compiler_wl_CXX ++ compiler_flags=-v ++ linker_flags=-v ++ verstring= ++ output_objdir=. ++ libname=conftest ++ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX ++ allow_undefined_flag_CXX= ++ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 ++ (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++ then ++ archive_cmds_need_lc_CXX=no ++ else ++ archive_cmds_need_lc_CXX=yes ++ fi ++ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag ++ else ++ cat conftest.err 1>&5 ++ fi ++ $rm conftest* ++ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 ++echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 ++ ;; ++ esac ++ fi ++ ;; ++esac ++ ++echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 ++echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 ++library_names_spec= ++libname_spec='lib$name' ++soname_spec= ++shrext_cmds=".so" ++postinstall_cmds= ++postuninstall_cmds= ++finish_cmds= ++finish_eval= ++shlibpath_var= ++shlibpath_overrides_runpath=unknown ++version_type=none ++dynamic_linker="$host_os ld.so" ++sys_lib_dlsearch_path_spec="/lib /usr/lib" ++if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then ++ # if the path contains ";" then we assume it to be the separator ++ # otherwise default to the standard path separator (i.e. ":") - it is ++ # assumed that no part of a normal pathname contains ";" but that should ++ # okay in the real world where ";" in dirpaths is itself problematic. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++else ++ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" ++fi ++need_lib_prefix=unknown ++hardcode_into_libs=no ++ ++# when you set need_version to no, make sure it does not cause -set_version ++# flags to be left without arguments ++need_version=unknown ++ ++case $host_os in ++aix3*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' ++ shlibpath_var=LIBPATH ++ ++ # AIX 3 has no versioning support, so we append a major version to the name. ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ ++aix4* | aix5*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ hardcode_into_libs=yes ++ if test "$host_cpu" = ia64; then ++ # AIX 5 supports IA64 ++ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ else ++ # With GCC up to 2.95.x, collect2 would create an import file ++ # for dependence libraries. The import file would start with ++ # the line `#! .'. This would cause the generated library to ++ # depend on `.', always an invalid library. This was fixed in ++ # development snapshots of GCC prior to 3.0. ++ case $host_os in ++ aix4 | aix4.[01] | aix4.[01].*) ++ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' ++ echo ' yes ' ++ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then ++ : ++ else ++ can_build_shared=no ++ fi ++ ;; ++ esac ++ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct ++ # soname into executable. Probably we can add versioning support to ++ # collect2, so additional links can be useful in future. ++ if test "$aix_use_runtimelinking" = yes; then ++ # If using run time linking (on AIX 4.2 or later) use lib.so ++ # instead of lib.a to let people know that these are not ++ # typical AIX shared libraries. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ else ++ # We preserve .a as extension for shared libraries through AIX4.2 ++ # and later when we are not doing run time linking. ++ library_names_spec='${libname}${release}.a $libname.a' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ fi ++ shlibpath_var=LIBPATH ++ fi ++ ;; ++ ++amigaos*) ++ library_names_spec='$libname.ixlibrary $libname.a' ++ # Create ${libname}_ixlibrary.a entries in /sys/libs. ++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ++ ;; ++ ++beos*) ++ library_names_spec='${libname}${shared_ext}' ++ dynamic_linker="$host_os ld.so" ++ shlibpath_var=LIBRARY_PATH ++ ;; ++ ++bsdi[45]*) ++ version_type=linux ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" ++ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" ++ # the default ld.so.conf also contains /usr/contrib/lib and ++ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow ++ # libtool to hard-code these into programs ++ ;; ++ ++cygwin* | mingw* | pw32*) ++ version_type=windows ++ shrext_cmds=".dll" ++ need_version=no ++ need_lib_prefix=no ++ ++ case $GCC,$host_os in ++ yes,cygwin* | yes,mingw* | yes,pw32*) ++ library_names_spec='$libname.dll.a' ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ ++ dldir=$destdir/`dirname \$dlpath`~ ++ test -d \$dldir || mkdir -p \$dldir~ ++ $install_prog $dir/$dlname \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ dlpath=$dir/\$dldll~ ++ $rm \$dlpath' ++ shlibpath_overrides_runpath=yes ++ ++ case $host_os in ++ cygwin*) ++ # Cygwin DLLs use 'cyg' prefix rather than 'lib' ++ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ++ ;; ++ mingw*) ++ # MinGW DLLs use traditional 'lib' prefix ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then ++ # It is most probably a Windows format PATH printed by ++ # mingw gcc, but we are running on Cygwin. Gcc prints its search ++ # path with ; separators, and with drive letters. We can handle the ++ # drive letters (cygwin fileutils understands them), so leave them, ++ # especially as we might pass files found there to a mingw objdump, ++ # which wouldn't understand a cygwinified path. Ahh. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++ ;; ++ pw32*) ++ # pw32 DLLs use 'pw' prefix rather than 'lib' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ++ ;; ++ esac ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ $archive_expsym_cmds="$archive_cmds" ++ fi ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ *) ++ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ++ ;; ++ esac ++ dynamic_linker='Win32 ld.exe' ++ # FIXME: first we should search . and the directory the executable is in ++ shlibpath_var=PATH ++ ;; ++ ++darwin* | rhapsody*) ++ dynamic_linker="$host_os dyld" ++ version_type=darwin ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' ++ soname_spec='${libname}${release}${major}$shared_ext' ++ shlibpath_overrides_runpath=yes ++ shlibpath_var=DYLD_LIBRARY_PATH ++ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. ++ if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` ++ else ++ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' ++ fi ++ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ++ ;; ++ ++dgux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++freebsd1*) ++ dynamic_linker=no ++ ;; ++ ++kfreebsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; ++ ++freebsd*) ++ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++ version_type=freebsd-$objformat ++ case $version_type in ++ freebsd-elf*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ need_version=no ++ need_lib_prefix=no ++ ;; ++ freebsd-*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' ++ need_version=yes ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_os in ++ freebsd2*) ++ shlibpath_overrides_runpath=yes ++ ;; ++ freebsd3.01* | freebsdelf3.01*) ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ *) # from 3.2 on ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ esac ++ ;; ++ ++gnu*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ ;; ++ ++hpux9* | hpux10* | hpux11*) ++ # Give a soname corresponding to the major version so that dld.sl refuses to ++ # link against other versions. ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ case "$host_cpu" in ++ ia64*) ++ shrext_cmds='.so' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.so" ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ if test "X$HPUX_IA64_MODE" = X32; then ++ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" ++ else ++ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" ++ fi ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ hppa*64*) ++ shrext_cmds='.sl' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ *) ++ shrext_cmds='.sl' ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=SHLIB_PATH ++ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ esac ++ # HP-UX runs *really* slowly unless shared libraries are mode 555. ++ postinstall_cmds='chmod 555 $lib' ++ ;; ++ ++irix5* | irix6* | nonstopux*) ++ case $host_os in ++ nonstopux*) version_type=nonstopux ;; ++ *) ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ version_type=linux ++ else ++ version_type=irix ++ fi ;; ++ esac ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' ++ case $host_os in ++ irix5* | nonstopux*) ++ libsuff= shlibsuff= ++ ;; ++ *) ++ case $LD in # libtool.m4 will add one of these switches to LD ++ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") ++ libsuff= shlibsuff= libmagic=32-bit;; ++ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") ++ libsuff=32 shlibsuff=N32 libmagic=N32;; ++ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") ++ libsuff=64 shlibsuff=64 libmagic=64-bit;; ++ *) libsuff= shlibsuff= libmagic=never-match;; ++ esac ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" ++ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ++ hardcode_into_libs=yes ++ ;; ++ ++# No shared lib support for Linux oldld, aout, or coff. ++linux*oldld* | linux*aout* | linux*coff*) ++ dynamic_linker=no ++ ;; ++ ++# This must be Linux ELF. ++linux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes ++ ++ # Append ld.so.conf contents to the search path ++ if test -f /etc/ld.so.conf; then ++ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` ++ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ fi ++ ++ case $host_cpu:$lt_cv_cc_64bit_output in ++ powerpc64:yes | s390x:yes | sparc64:yes | x86_64:yes) ++ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64" ++ sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64 /usr/X11R6/lib64" ++ ;; ++ esac ++ ++ # We used to test for /lib/ld.so.1 and disable shared libraries on ++ # powerpc, because MkLinux only supported shared libraries with the ++ # GNU dynamic linker. Since this was broken with cross compilers, ++ # most powerpc-linux boxes support dynamic linking these days and ++ # people can always --disable-shared, the test was removed, and we ++ # assume the GNU/Linux dynamic linker is in use. ++ dynamic_linker='GNU/Linux ld.so' ++ ++ # Find out which ABI we are using (multilib Linux x86_64 hack). ++ libsuff= ++ case "$host_cpu" in ++ x86_64*) ++ echo '#line 12075 "configure"' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ *) ++ ;; ++ esac ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ ;; ++ ++knetbsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; ++ ++netbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ dynamic_linker='NetBSD (a.out) ld.so' ++ else ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='NetBSD ld.elf_so' ++ fi ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ ++newsos6) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; ++ ++nto-qnx*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; ++ ++openbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ case $host_os in ++ openbsd2.[89] | openbsd2.[89].*) ++ shlibpath_overrides_runpath=no ++ ;; ++ *) ++ shlibpath_overrides_runpath=yes ++ ;; ++ esac ++ else ++ shlibpath_overrides_runpath=yes ++ fi ++ ;; ++ ++os2*) ++ libname_spec='$name' ++ shrext_cmds=".dll" ++ need_lib_prefix=no ++ library_names_spec='$libname${shared_ext} $libname.a' ++ dynamic_linker='OS/2 ld.exe' ++ shlibpath_var=LIBPATH ++ ;; ++ ++osf3* | osf4* | osf5*) ++ version_type=osf ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" ++ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ++ ;; ++ ++sco3.2v5*) ++ version_type=osf ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++solaris*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ # ldd complains unless libraries are executable ++ postinstall_cmds='chmod +x $lib' ++ ;; ++ ++sunos4*) ++ version_type=sunos ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ if test "$with_gnu_ld" = yes; then ++ need_lib_prefix=no ++ fi ++ need_version=yes ++ ;; ++ ++sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_vendor in ++ sni) ++ shlibpath_overrides_runpath=no ++ need_lib_prefix=no ++ export_dynamic_flag_spec='${wl}-Blargedynsym' ++ runpath_var=LD_RUN_PATH ++ ;; ++ siemens) ++ need_lib_prefix=no ++ ;; ++ motorola) ++ need_lib_prefix=no ++ need_version=no ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ++ ;; ++ esac ++ ;; ++ ++sysv4*MP*) ++ if test -d /usr/nec ;then ++ version_type=linux ++ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' ++ soname_spec='$libname${shared_ext}.$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ fi ++ ;; ++ ++uts4*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++*) ++ dynamic_linker=no ++ ;; ++esac ++echo "$as_me:$LINENO: result: $dynamic_linker" >&5 ++echo "${ECHO_T}$dynamic_linker" >&6 ++test "$dynamic_linker" = no && can_build_shared=no ++ ++echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 ++echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 ++hardcode_action_CXX= ++if test -n "$hardcode_libdir_flag_spec_CXX" || \ ++ test -n "$runpath_var_CXX" || \ ++ test "X$hardcode_automatic_CXX" = "Xyes" ; then ++ ++ # We can hardcode non-existant directories. ++ if test "$hardcode_direct_CXX" != no && ++ # If the only mechanism to avoid hardcoding is shlibpath_var, we ++ # have to relink, otherwise we might link with an installed library ++ # when we should be linking with a yet-to-be-installed one ++ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && ++ test "$hardcode_minus_L_CXX" != no; then ++ # Linking always hardcodes the temporary library directory. ++ hardcode_action_CXX=relink ++ else ++ # We can link without hardcoding, and we can hardcode nonexisting dirs. ++ hardcode_action_CXX=immediate ++ fi ++else ++ # We cannot hardcode anything, or else we can only hardcode existing ++ # directories. ++ hardcode_action_CXX=unsupported ++fi ++echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 ++echo "${ECHO_T}$hardcode_action_CXX" >&6 ++ ++if test "$hardcode_action_CXX" = relink; then ++ # Fast installation is not supported ++ enable_fast_install=no ++elif test "$shlibpath_overrides_runpath" = yes || ++ test "$enable_shared" = no; then ++ # Fast installation is not necessary ++ enable_fast_install=needless ++fi ++ ++striplib= ++old_striplib= ++echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 ++echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 ++if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then ++ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" ++ test -z "$striplib" && striplib="$STRIP --strip-unneeded" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++else ++# FIXME - insert some real tests, host_os isn't really good enough ++ case $host_os in ++ darwin*) ++ if test -n "$STRIP" ; then ++ striplib="$STRIP -x" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ;; ++ *) ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ ;; ++ esac ++fi ++ ++if test "x$enable_dlopen" != xyes; then ++ enable_dlopen=unknown ++ enable_dlopen_self=unknown ++ enable_dlopen_self_static=unknown ++else ++ lt_cv_dlopen=no ++ lt_cv_dlopen_libs= ++ ++ case $host_os in ++ beos*) ++ lt_cv_dlopen="load_add_on" ++ lt_cv_dlopen_libs= ++ lt_cv_dlopen_self=yes ++ ;; ++ ++ mingw* | pw32*) ++ lt_cv_dlopen="LoadLibrary" ++ lt_cv_dlopen_libs= ++ ;; ++ ++ cygwin*) ++ lt_cv_dlopen="dlopen" ++ lt_cv_dlopen_libs= ++ ;; ++ ++ darwin*) ++ # if libdl is installed we need to link against it ++ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 ++echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 ++if test "${ac_cv_lib_dl_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldl $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++int ++main () ++{ ++dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dl_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dl_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 ++if test $ac_cv_lib_dl_dlopen = yes; then ++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" ++else ++ ++ lt_cv_dlopen="dyld" ++ lt_cv_dlopen_libs= ++ lt_cv_dlopen_self=yes ++ ++fi ++ ++ ;; ++ ++ *) ++ echo "$as_me:$LINENO: checking for shl_load" >&5 ++echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 ++if test "${ac_cv_func_shl_load+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define shl_load to an innocuous variant, in case declares shl_load. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define shl_load innocuous_shl_load ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char shl_load (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef shl_load ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char shl_load (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_shl_load) || defined (__stub___shl_load) ++choke me ++#else ++char (*f) () = shl_load; ++#endif ++#ifdef __cplusplus ++} ++#endif ++ ++int ++main () ++{ ++return f != shl_load; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_shl_load=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_func_shl_load=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 ++echo "${ECHO_T}$ac_cv_func_shl_load" >&6 ++if test $ac_cv_func_shl_load = yes; then ++ lt_cv_dlopen="shl_load" ++else ++ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 ++echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 ++if test "${ac_cv_lib_dld_shl_load+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldld $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char shl_load (); ++int ++main () ++{ ++shl_load (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dld_shl_load=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dld_shl_load=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 ++echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 ++if test $ac_cv_lib_dld_shl_load = yes; then ++ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" ++else ++ echo "$as_me:$LINENO: checking for dlopen" >&5 ++echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 ++if test "${ac_cv_func_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define dlopen to an innocuous variant, in case declares dlopen. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define dlopen innocuous_dlopen ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char dlopen (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef dlopen ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_dlopen) || defined (__stub___dlopen) ++choke me ++#else ++char (*f) () = dlopen; ++#endif ++#ifdef __cplusplus ++} ++#endif ++ ++int ++main () ++{ ++return f != dlopen; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_func_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_func_dlopen" >&6 ++if test $ac_cv_func_dlopen = yes; then ++ lt_cv_dlopen="dlopen" ++else ++ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 ++echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 ++if test "${ac_cv_lib_dl_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldl $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++int ++main () ++{ ++dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dl_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dl_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 ++if test $ac_cv_lib_dl_dlopen = yes; then ++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" ++else ++ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 ++echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 ++if test "${ac_cv_lib_svld_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lsvld $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++int ++main () ++{ ++dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_svld_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_svld_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 ++if test $ac_cv_lib_svld_dlopen = yes; then ++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" ++else ++ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 ++echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 ++if test "${ac_cv_lib_dld_dld_link+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldld $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dld_link (); ++int ++main () ++{ ++dld_link (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dld_dld_link=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dld_dld_link=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 ++echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 ++if test $ac_cv_lib_dld_dld_link = yes; then ++ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ++fi ++ ++ ;; ++ esac ++ ++ if test "x$lt_cv_dlopen" != xno; then ++ enable_dlopen=yes ++ else ++ enable_dlopen=no ++ fi ++ ++ case $lt_cv_dlopen in ++ dlopen) ++ save_CPPFLAGS="$CPPFLAGS" ++ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" ++ ++ save_LDFLAGS="$LDFLAGS" ++ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" ++ ++ save_LIBS="$LIBS" ++ LIBS="$lt_cv_dlopen_libs $LIBS" ++ ++ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 ++echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 ++if test "${lt_cv_dlopen_self+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ lt_cv_dlopen_self=cross ++else ++ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 ++ lt_status=$lt_dlunknown ++ cat > conftest.$ac_ext < ++#endif ++ ++#include ++ ++#ifdef RTLD_GLOBAL ++# define LT_DLGLOBAL RTLD_GLOBAL ++#else ++# ifdef DL_GLOBAL ++# define LT_DLGLOBAL DL_GLOBAL ++# else ++# define LT_DLGLOBAL 0 ++# endif ++#endif ++ ++/* We may have to define LT_DLLAZY_OR_NOW in the command line if we ++ find out it does not work in some platform. */ ++#ifndef LT_DLLAZY_OR_NOW ++# ifdef RTLD_LAZY ++# define LT_DLLAZY_OR_NOW RTLD_LAZY ++# else ++# ifdef DL_LAZY ++# define LT_DLLAZY_OR_NOW DL_LAZY ++# else ++# ifdef RTLD_NOW ++# define LT_DLLAZY_OR_NOW RTLD_NOW ++# else ++# ifdef DL_NOW ++# define LT_DLLAZY_OR_NOW DL_NOW ++# else ++# define LT_DLLAZY_OR_NOW 0 ++# endif ++# endif ++# endif ++# endif ++#endif ++ ++#ifdef __cplusplus ++extern "C" void exit (int); ++#endif ++ ++void fnord() { int i=42;} ++int main () ++{ ++ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); ++ int status = $lt_dlunknown; ++ ++ if (self) ++ { ++ if (dlsym (self,"fnord")) status = $lt_dlno_uscore; ++ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ /* dlclose (self); */ ++ } ++ ++ exit (status); ++} ++EOF ++ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then ++ (./conftest; exit; ) 2>/dev/null ++ lt_status=$? ++ case x$lt_status in ++ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; ++ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; ++ x$lt_unknown|x*) lt_cv_dlopen_self=no ;; ++ esac ++ else : ++ # compilation failed ++ lt_cv_dlopen_self=no ++ fi ++fi ++rm -fr conftest* ++ ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 ++echo "${ECHO_T}$lt_cv_dlopen_self" >&6 ++ ++ if test "x$lt_cv_dlopen_self" = xyes; then ++ LDFLAGS="$LDFLAGS $link_static_flag" ++ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 ++echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 ++if test "${lt_cv_dlopen_self_static+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test "$cross_compiling" = yes; then : ++ lt_cv_dlopen_self_static=cross ++else ++ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 ++ lt_status=$lt_dlunknown ++ cat > conftest.$ac_ext < ++#endif ++ ++#include ++ ++#ifdef RTLD_GLOBAL ++# define LT_DLGLOBAL RTLD_GLOBAL ++#else ++# ifdef DL_GLOBAL ++# define LT_DLGLOBAL DL_GLOBAL ++# else ++# define LT_DLGLOBAL 0 ++# endif ++#endif ++ ++/* We may have to define LT_DLLAZY_OR_NOW in the command line if we ++ find out it does not work in some platform. */ ++#ifndef LT_DLLAZY_OR_NOW ++# ifdef RTLD_LAZY ++# define LT_DLLAZY_OR_NOW RTLD_LAZY ++# else ++# ifdef DL_LAZY ++# define LT_DLLAZY_OR_NOW DL_LAZY ++# else ++# ifdef RTLD_NOW ++# define LT_DLLAZY_OR_NOW RTLD_NOW ++# else ++# ifdef DL_NOW ++# define LT_DLLAZY_OR_NOW DL_NOW ++# else ++# define LT_DLLAZY_OR_NOW 0 ++# endif ++# endif ++# endif ++# endif ++#endif ++ ++#ifdef __cplusplus ++extern "C" void exit (int); ++#endif ++ ++void fnord() { int i=42;} ++int main () ++{ ++ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); ++ int status = $lt_dlunknown; ++ ++ if (self) ++ { ++ if (dlsym (self,"fnord")) status = $lt_dlno_uscore; ++ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; ++ /* dlclose (self); */ ++ } ++ ++ exit (status); ++} ++EOF ++ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then ++ (./conftest; exit; ) 2>/dev/null ++ lt_status=$? ++ case x$lt_status in ++ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; ++ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; ++ x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; ++ esac ++ else : ++ # compilation failed ++ lt_cv_dlopen_self_static=no ++ fi ++fi ++rm -fr conftest* ++ ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 ++echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 ++ fi ++ ++ CPPFLAGS="$save_CPPFLAGS" ++ LDFLAGS="$save_LDFLAGS" ++ LIBS="$save_LIBS" ++ ;; ++ esac ++ ++ case $lt_cv_dlopen_self in ++ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; ++ *) enable_dlopen_self=unknown ;; ++ esac ++ ++ case $lt_cv_dlopen_self_static in ++ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; ++ *) enable_dlopen_self_static=unknown ;; ++ esac ++fi ++ ++ ++# The else clause should only fire when bootstrapping the ++# libtool distribution, otherwise you forgot to ship ltmain.sh ++# with your package, and you will get complaints that there are ++# no rules to generate ltmain.sh. ++if test -f "$ltmain"; then ++ # See if we are running on zsh, and set the options which allow our commands through ++ # without removal of \ escapes. ++ if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++ fi ++ # Now quote all the things that may contain metacharacters while being ++ # careful not to overquote the AC_SUBSTed values. We take copies of the ++ # variables and quote the copies for generation of the libtool script. ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ SED SHELL STRIP \ ++ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ ++ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ ++ deplibs_check_method reload_flag reload_cmds need_locks \ ++ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ ++ lt_cv_sys_global_symbol_to_c_name_address \ ++ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ ++ old_postinstall_cmds old_postuninstall_cmds \ ++ compiler_CXX \ ++ CC_CXX \ ++ LD_CXX \ ++ lt_prog_compiler_wl_CXX \ ++ lt_prog_compiler_pic_CXX \ ++ lt_prog_compiler_static_CXX \ ++ lt_prog_compiler_no_builtin_flag_CXX \ ++ export_dynamic_flag_spec_CXX \ ++ thread_safe_flag_spec_CXX \ ++ whole_archive_flag_spec_CXX \ ++ enable_shared_with_static_runtimes_CXX \ ++ old_archive_cmds_CXX \ ++ old_archive_from_new_cmds_CXX \ ++ predep_objects_CXX \ ++ postdep_objects_CXX \ ++ predeps_CXX \ ++ postdeps_CXX \ ++ compiler_lib_search_path_CXX \ ++ archive_cmds_CXX \ ++ archive_expsym_cmds_CXX \ ++ postinstall_cmds_CXX \ ++ postuninstall_cmds_CXX \ ++ old_archive_from_expsyms_cmds_CXX \ ++ allow_undefined_flag_CXX \ ++ no_undefined_flag_CXX \ ++ export_symbols_cmds_CXX \ ++ hardcode_libdir_flag_spec_CXX \ ++ hardcode_libdir_flag_spec_ld_CXX \ ++ hardcode_libdir_separator_CXX \ ++ hardcode_automatic_CXX \ ++ module_cmds_CXX \ ++ module_expsym_cmds_CXX \ ++ lt_cv_prog_compiler_c_o_CXX \ ++ exclude_expsyms_CXX \ ++ include_expsyms_CXX; do ++ ++ case $var in ++ old_archive_cmds_CXX | \ ++ old_archive_from_new_cmds_CXX | \ ++ archive_cmds_CXX | \ ++ archive_expsym_cmds_CXX | \ ++ module_cmds_CXX | \ ++ module_expsym_cmds_CXX | \ ++ old_archive_from_expsyms_cmds_CXX | \ ++ export_symbols_cmds_CXX | \ ++ extract_expsyms_cmds | reload_cmds | finish_cmds | \ ++ postinstall_cmds | postuninstall_cmds | \ ++ old_postinstall_cmds | old_postuninstall_cmds | \ ++ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) ++ # Double-quote double-evaled strings. ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ++ ;; ++ *) ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ++ ;; ++ esac ++ done ++ ++ case $lt_echo in ++ *'\$0 --fallback-echo"') ++ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ++ ;; ++ esac ++ ++cfgfile="$ofile" ++ ++ cat <<__EOF__ >> "$cfgfile" ++# ### BEGIN LIBTOOL TAG CONFIG: $tagname ++ ++# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: ++ ++# Shell to use when invoking shell scripts. ++SHELL=$lt_SHELL ++ ++# Whether or not to build shared libraries. ++build_libtool_libs=$enable_shared ++ ++# Whether or not to build static libraries. ++build_old_libs=$enable_static ++ ++# Whether or not to add -lc for building shared libraries. ++build_libtool_need_lc=$archive_cmds_need_lc_CXX ++ ++# Whether or not to disallow shared libs when runtime libs are static ++allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX ++ ++# Whether or not to optimize for fast installation. ++fast_install=$enable_fast_install ++ ++# The host system. ++host_alias=$host_alias ++host=$host ++ ++# An echo program that does not interpret backslashes. ++echo=$lt_echo ++ ++# The archiver. ++AR=$lt_AR ++AR_FLAGS=$lt_AR_FLAGS ++ ++# A C compiler. ++LTCC=$lt_LTCC ++ ++# A language-specific compiler. ++CC=$lt_compiler_CXX ++ ++# Is the compiler the GNU C compiler? ++with_gcc=$GCC_CXX ++ ++# An ERE matcher. ++EGREP=$lt_EGREP ++ ++# The linker used to build libraries. ++LD=$lt_LD_CXX ++ ++# Whether we need hard or soft links. ++LN_S=$lt_LN_S ++ ++# A BSD-compatible nm program. ++NM=$lt_NM ++ ++# A symbol stripping program ++STRIP=$lt_STRIP ++ ++# Used to examine libraries when file_magic_cmd begins "file" ++MAGIC_CMD=$MAGIC_CMD ++ ++# Used on cygwin: DLL creation program. ++DLLTOOL="$DLLTOOL" ++ ++# Used on cygwin: object dumper. ++OBJDUMP="$OBJDUMP" ++ ++# Used on cygwin: assembler. ++AS="$AS" ++ ++# The name of the directory that contains temporary libtool files. ++objdir=$objdir ++ ++# How to create reloadable object files. ++reload_flag=$lt_reload_flag ++reload_cmds=$lt_reload_cmds ++ ++# How to pass a linker flag through the compiler. ++wl=$lt_lt_prog_compiler_wl_CXX ++ ++# Object file suffix (normally "o"). ++objext="$ac_objext" ++ ++# Old archive suffix (normally "a"). ++libext="$libext" ++ ++# Shared library suffix (normally ".so"). ++shrext_cmds='$shrext_cmds' ++ ++# Executable file suffix (normally ""). ++exeext="$exeext" ++ ++# Additional compiler flags for building library objects. ++pic_flag=$lt_lt_prog_compiler_pic_CXX ++pic_mode=$pic_mode ++ ++# What is the maximum length of a command? ++max_cmd_len=$lt_cv_sys_max_cmd_len ++ ++# Does compiler simultaneously support -c and -o options? ++compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX ++ ++# Must we lock files when doing compilation ? ++need_locks=$lt_need_locks ++ ++# Do we need the lib prefix for modules? ++need_lib_prefix=$need_lib_prefix ++ ++# Do we need a version for libraries? ++need_version=$need_version ++ ++# Whether dlopen is supported. ++dlopen_support=$enable_dlopen ++ ++# Whether dlopen of programs is supported. ++dlopen_self=$enable_dlopen_self ++ ++# Whether dlopen of statically linked programs is supported. ++dlopen_self_static=$enable_dlopen_self_static ++ ++# Compiler flag to prevent dynamic linking. ++link_static_flag=$lt_lt_prog_compiler_static_CXX ++ ++# Compiler flag to turn off builtin functions. ++no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX ++ ++# Compiler flag to allow reflexive dlopens. ++export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX ++ ++# Compiler flag to generate shared objects directly from archives. ++whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX ++ ++# Compiler flag to generate thread-safe objects. ++thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX ++ ++# Library versioning type. ++version_type=$version_type ++ ++# Format of library name prefix. ++libname_spec=$lt_libname_spec ++ ++# List of archive names. First name is the real one, the rest are links. ++# The last name is the one that the linker finds with -lNAME. ++library_names_spec=$lt_library_names_spec ++ ++# The coded name of the library, if different from the real name. ++soname_spec=$lt_soname_spec ++ ++# Commands used to build and install an old-style archive. ++RANLIB=$lt_RANLIB ++old_archive_cmds=$lt_old_archive_cmds_CXX ++old_postinstall_cmds=$lt_old_postinstall_cmds ++old_postuninstall_cmds=$lt_old_postuninstall_cmds ++ ++# Create an old-style archive from a shared archive. ++old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX ++ ++# Create a temporary old-style archive to link instead of a shared archive. ++old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX ++ ++# Commands used to build and install a shared archive. ++archive_cmds=$lt_archive_cmds_CXX ++archive_expsym_cmds=$lt_archive_expsym_cmds_CXX ++postinstall_cmds=$lt_postinstall_cmds ++postuninstall_cmds=$lt_postuninstall_cmds ++ ++# Commands used to build a loadable module (assumed same as above if empty) ++module_cmds=$lt_module_cmds_CXX ++module_expsym_cmds=$lt_module_expsym_cmds_CXX ++ ++# Commands to strip libraries. ++old_striplib=$lt_old_striplib ++striplib=$lt_striplib ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predep_objects=$lt_predep_objects_CXX ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdep_objects=$lt_postdep_objects_CXX ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predeps=$lt_predeps_CXX ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdeps=$lt_postdeps_CXX ++ ++# The library search path used internally by the compiler when linking ++# a shared library. ++compiler_lib_search_path=$lt_compiler_lib_search_path_CXX ++ ++# Method to check whether dependent libraries are shared objects. ++deplibs_check_method=$lt_deplibs_check_method ++ ++# Command to use when deplibs_check_method == file_magic. ++file_magic_cmd=$lt_file_magic_cmd ++ ++# Flag that allows shared libraries with undefined symbols to be built. ++allow_undefined_flag=$lt_allow_undefined_flag_CXX ++ ++# Flag that forces no undefined symbols. ++no_undefined_flag=$lt_no_undefined_flag_CXX ++ ++# Commands used to finish a libtool library installation in a directory. ++finish_cmds=$lt_finish_cmds ++ ++# Same as above, but a single script fragment to be evaled but not shown. ++finish_eval=$lt_finish_eval ++ ++# Take the output of nm and produce a listing of raw symbols and C names. ++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe ++ ++# Transform the output of nm in a proper C declaration ++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl ++ ++# Transform the output of nm in a C name address pair ++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address ++ ++# This is the shared library runtime path variable. ++runpath_var=$runpath_var ++ ++# This is the shared library path variable. ++shlibpath_var=$shlibpath_var ++ ++# Is shlibpath searched before the hard-coded library search path? ++shlibpath_overrides_runpath=$shlibpath_overrides_runpath ++ ++# How to hardcode a shared library path into an executable. ++hardcode_action=$hardcode_action_CXX ++ ++# Whether we should hardcode library paths into libraries. ++hardcode_into_libs=$hardcode_into_libs ++ ++# Flag to hardcode \$libdir into a binary during linking. ++# This must work even if \$libdir does not exist. ++hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX ++ ++# If ld is used when linking, flag to hardcode \$libdir into ++# a binary during linking. This must work even if \$libdir does ++# not exist. ++hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX ++ ++# Whether we need a single -rpath flag with a separated argument. ++hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX ++ ++# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the ++# resulting binary. ++hardcode_direct=$hardcode_direct_CXX ++ ++# Set to yes if using the -LDIR flag during linking hardcodes DIR into the ++# resulting binary. ++hardcode_minus_L=$hardcode_minus_L_CXX ++ ++# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into ++# the resulting binary. ++hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX ++ ++# Set to yes if building a shared library automatically hardcodes DIR into the library ++# and all subsequent libraries and executables linked against it. ++hardcode_automatic=$hardcode_automatic_CXX ++ ++# Variables whose values should be saved in libtool wrapper scripts and ++# restored at relink time. ++variables_saved_for_relink="$variables_saved_for_relink" ++ ++# Whether libtool must link a program against all its dependency libraries. ++link_all_deplibs=$link_all_deplibs_CXX ++ ++# Compile-time system search path for libraries ++sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++ ++# Run-time system search path for libraries ++sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec ++ ++# Fix the shell variable \$srcfile for the compiler. ++fix_srcfile_path="$fix_srcfile_path_CXX" ++ ++# Set to yes if exported symbols are required. ++always_export_symbols=$always_export_symbols_CXX ++ ++# The commands to list exported symbols. ++export_symbols_cmds=$lt_export_symbols_cmds_CXX ++ ++# The commands to extract the exported symbol list from a shared archive. ++extract_expsyms_cmds=$lt_extract_expsyms_cmds ++ ++# Symbols that should not be listed in the preloaded symbols. ++exclude_expsyms=$lt_exclude_expsyms_CXX ++ ++# Symbols that must always be exported. ++include_expsyms=$lt_include_expsyms_CXX ++ ++# ### END LIBTOOL TAG CONFIG: $tagname ++ ++__EOF__ ++ ++ ++else ++ # If there is no Makefile yet, we rely on a make rule to execute ++ # `config.status --recheck' to rerun these tests and create the ++ # libtool script then. ++ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` ++ if test -f "$ltmain_in"; then ++ test -f Makefile && make "$ltmain" ++ fi ++fi ++ ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++CC=$lt_save_CC ++LDCXX=$LD ++LD=$lt_save_LD ++GCC=$lt_save_GCC ++with_gnu_ldcxx=$with_gnu_ld ++with_gnu_ld=$lt_save_with_gnu_ld ++lt_cv_path_LDCXX=$lt_cv_path_LD ++lt_cv_path_LD=$lt_save_path_LD ++lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld ++lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ++ ++ else ++ tagname="" ++ fi ++ ;; ++ ++ F77) ++ if test -n "$F77" && test "X$F77" != "Xno"; then ++ ++ac_ext=f ++ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ++ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_f77_compiler_gnu ++ ++ ++archive_cmds_need_lc_F77=no ++allow_undefined_flag_F77= ++always_export_symbols_F77=no ++archive_expsym_cmds_F77= ++export_dynamic_flag_spec_F77= ++hardcode_direct_F77=no ++hardcode_libdir_flag_spec_F77= ++hardcode_libdir_flag_spec_ld_F77= ++hardcode_libdir_separator_F77= ++hardcode_minus_L_F77=no ++hardcode_automatic_F77=no ++module_cmds_F77= ++module_expsym_cmds_F77= ++link_all_deplibs_F77=unknown ++old_archive_cmds_F77=$old_archive_cmds ++no_undefined_flag_F77= ++whole_archive_flag_spec_F77= ++enable_shared_with_static_runtimes_F77=no ++ ++# Source file extension for f77 test sources. ++ac_ext=f ++ ++# Object file extension for compiled f77 test sources. ++objext=o ++objext_F77=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code=" subroutine t\n return\n end\n" ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code=" program t\n end\n" ++ ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. ++ ++# If no C compiler was specified, use CC. ++LTCC=${LTCC-"$CC"} ++ ++# Allow CC to be a program name with arguments. ++compiler=$CC ++ ++ ++# Allow CC to be a program name with arguments. ++lt_save_CC="$CC" ++CC=${F77-"f77"} ++compiler=$CC ++compiler_F77=$CC ++cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++ ++echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 ++echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 ++echo "$as_me:$LINENO: result: $can_build_shared" >&5 ++echo "${ECHO_T}$can_build_shared" >&6 ++ ++echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 ++echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 ++test "$can_build_shared" = "no" && enable_shared=no ++ ++# On AIX, shared libraries and static libraries use the same namespace, and ++# are all built from PIC. ++case "$host_os" in ++aix3*) ++ test "$enable_shared" = yes && enable_static=no ++ if test -n "$RANLIB"; then ++ archive_cmds="$archive_cmds~\$RANLIB \$lib" ++ postinstall_cmds='$RANLIB $lib' ++ fi ++ ;; ++aix4* | aix5*) ++ test "$enable_shared" = yes && enable_static=no ++ ;; ++esac ++echo "$as_me:$LINENO: result: $enable_shared" >&5 ++echo "${ECHO_T}$enable_shared" >&6 ++ ++echo "$as_me:$LINENO: checking whether to build static libraries" >&5 ++echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 ++# Make sure either enable_shared or enable_static is yes. ++test "$enable_shared" = yes || enable_static=yes ++echo "$as_me:$LINENO: result: $enable_static" >&5 ++echo "${ECHO_T}$enable_static" >&6 ++ ++test "$ld_shlibs_F77" = no && can_build_shared=no ++ ++GCC_F77="$G77" ++LD_F77="$LD" ++ ++lt_prog_compiler_wl_F77= ++lt_prog_compiler_pic_F77= ++lt_prog_compiler_static_F77= ++ ++echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 ++echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 ++ ++ if test "$GCC" = yes; then ++ lt_prog_compiler_wl_F77='-Wl,' ++ lt_prog_compiler_static_F77='-static' ++ ++ case $host_os in ++ aix*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ lt_prog_compiler_static_F77='-Bstatic' ++ fi ++ ;; ++ ++ amigaos*) ++ # FIXME: we need at least 68020 code to build shared libraries, but ++ # adding the `-m68020' flag to GCC prevents building anything better, ++ # like `-m68040'. ++ lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ++ ;; ++ ++ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) ++ # PIC is the default for these OSes. ++ ;; ++ ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ lt_prog_compiler_pic_F77='-DDLL_EXPORT' ++ ;; ++ ++ darwin* | rhapsody*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ lt_prog_compiler_pic_F77='-fno-common' ++ ;; ++ ++ msdosdjgpp*) ++ # Just because we use GCC doesn't mean we suddenly get shared libraries ++ # on systems that don't support them. ++ lt_prog_compiler_can_build_shared_F77=no ++ enable_shared=no ++ ;; ++ ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ lt_prog_compiler_pic_F77=-Kconform_pic ++ fi ++ ;; ++ ++ hpux*) ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ lt_prog_compiler_pic_F77='-fPIC' ++ ;; ++ esac ++ ;; ++ ++ *) ++ lt_prog_compiler_pic_F77='-fPIC' ++ ;; ++ esac ++ else ++ # PORTME Check for flag to pass linker flags through the system compiler. ++ case $host_os in ++ aix*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ lt_prog_compiler_static_F77='-Bstatic' ++ else ++ lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' ++ fi ++ ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case "$cc_basename" in ++ xlc*) ++ lt_prog_compiler_pic_F77='-qnocommon' ++ lt_prog_compiler_wl_F77='-Wl,' ++ ;; ++ esac ++ ;; ++ ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ lt_prog_compiler_pic_F77='-DDLL_EXPORT' ++ ;; ++ ++ hpux9* | hpux10* | hpux11*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ lt_prog_compiler_pic_F77='+Z' ++ ;; ++ esac ++ # Is there a better lt_prog_compiler_static that works with the bundled CC? ++ lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ++ ;; ++ ++ irix5* | irix6* | nonstopux*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ # PIC (with -KPIC) is the default. ++ lt_prog_compiler_static_F77='-non_shared' ++ ;; ++ ++ newsos6) ++ lt_prog_compiler_pic_F77='-KPIC' ++ lt_prog_compiler_static_F77='-Bstatic' ++ ;; ++ ++ linux*) ++ case $CC in ++ icc* | ecc*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ lt_prog_compiler_pic_F77='-KPIC' ++ lt_prog_compiler_static_F77='-static' ++ ;; ++ ccc*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ # All Alpha code is PIC. ++ lt_prog_compiler_static_F77='-non_shared' ++ ;; ++ esac ++ ;; ++ ++ osf3* | osf4* | osf5*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ # All OSF/1 code is PIC. ++ lt_prog_compiler_static_F77='-non_shared' ++ ;; ++ ++ sco3.2v5*) ++ lt_prog_compiler_pic_F77='-Kpic' ++ lt_prog_compiler_static_F77='-dn' ++ ;; ++ ++ solaris*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ lt_prog_compiler_pic_F77='-KPIC' ++ lt_prog_compiler_static_F77='-Bstatic' ++ ;; ++ ++ sunos4*) ++ lt_prog_compiler_wl_F77='-Qoption ld ' ++ lt_prog_compiler_pic_F77='-PIC' ++ lt_prog_compiler_static_F77='-Bstatic' ++ ;; ++ ++ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ lt_prog_compiler_pic_F77='-KPIC' ++ lt_prog_compiler_static_F77='-Bstatic' ++ ;; ++ ++ sysv4*MP*) ++ if test -d /usr/nec ;then ++ lt_prog_compiler_pic_F77='-Kconform_pic' ++ lt_prog_compiler_static_F77='-Bstatic' ++ fi ++ ;; ++ ++ uts4*) ++ lt_prog_compiler_pic_F77='-pic' ++ lt_prog_compiler_static_F77='-Bstatic' ++ ;; ++ ++ *) ++ lt_prog_compiler_can_build_shared_F77=no ++ ;; ++ esac ++ fi ++ ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 ++ ++# ++# Check to make sure the PIC flag actually works. ++# ++if test -n "$lt_prog_compiler_pic_F77"; then ++ ++echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 ++echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_pic_works_F77+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_pic_works_F77=no ++ ac_outfile=conftest.$ac_objext ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ lt_compiler_flag="$lt_prog_compiler_pic_F77" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ # The option is referenced via a variable to avoid confusing sed. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:13870: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>conftest.err) ++ ac_status=$? ++ cat conftest.err >&5 ++ echo "$as_me:13874: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s "$ac_outfile"; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s conftest.err; then ++ lt_prog_compiler_pic_works_F77=yes ++ fi ++ fi ++ $rm conftest* ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 ++ ++if test x"$lt_prog_compiler_pic_works_F77" = xyes; then ++ case $lt_prog_compiler_pic_F77 in ++ "" | " "*) ;; ++ *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; ++ esac ++else ++ lt_prog_compiler_pic_F77= ++ lt_prog_compiler_can_build_shared_F77=no ++fi ++ ++fi ++case "$host_os" in ++ # For platforms which do not support PIC, -DPIC is meaningless: ++ *djgpp*) ++ lt_prog_compiler_pic_F77= ++ ;; ++ *) ++ lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ++ ;; ++esac ++ ++echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 ++echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 ++if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_cv_prog_compiler_c_o_F77=no ++ $rm -r conftest 2>/dev/null ++ mkdir conftest ++ cd conftest ++ mkdir out ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ lt_compiler_flag="-o out/conftest2.$ac_objext" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:13930: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>out/conftest.err) ++ ac_status=$? ++ cat out/conftest.err >&5 ++ echo "$as_me:13934: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s out/conftest2.$ac_objext ++ then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s out/conftest.err; then ++ lt_cv_prog_compiler_c_o_F77=yes ++ fi ++ fi ++ chmod u+w . ++ $rm conftest* ++ # SGI C++ compiler will create directory out/ii_files/ for ++ # template instantiation ++ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files ++ $rm out/* && rmdir out ++ cd .. ++ rmdir conftest ++ $rm conftest* ++ ++fi ++echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 ++echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 ++ ++ ++hard_links="nottested" ++if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then ++ # do not overwrite the value of need_locks provided by the user ++ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 ++echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 ++ hard_links=yes ++ $rm conftest* ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ touch conftest.a ++ ln conftest.a conftest.b 2>&5 || hard_links=no ++ ln conftest.a conftest.b 2>/dev/null && hard_links=no ++ echo "$as_me:$LINENO: result: $hard_links" >&5 ++echo "${ECHO_T}$hard_links" >&6 ++ if test "$hard_links" = no; then ++ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 ++echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} ++ need_locks=warn ++ fi ++else ++ need_locks=no ++fi ++ ++echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 ++echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ++ ++ runpath_var= ++ allow_undefined_flag_F77= ++ enable_shared_with_static_runtimes_F77=no ++ archive_cmds_F77= ++ archive_expsym_cmds_F77= ++ old_archive_From_new_cmds_F77= ++ old_archive_from_expsyms_cmds_F77= ++ export_dynamic_flag_spec_F77= ++ whole_archive_flag_spec_F77= ++ thread_safe_flag_spec_F77= ++ hardcode_libdir_flag_spec_F77= ++ hardcode_libdir_flag_spec_ld_F77= ++ hardcode_libdir_separator_F77= ++ hardcode_direct_F77=no ++ hardcode_minus_L_F77=no ++ hardcode_shlibpath_var_F77=unsupported ++ link_all_deplibs_F77=unknown ++ hardcode_automatic_F77=no ++ module_cmds_F77= ++ module_expsym_cmds_F77= ++ always_export_symbols_F77=no ++ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ # include_expsyms should be a list of space-separated symbols to be *always* ++ # included in the symbol list ++ include_expsyms_F77= ++ # exclude_expsyms can be an extended regexp of symbols to exclude ++ # it will be wrapped by ` (' and `)$', so one must not match beginning or ++ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', ++ # as well as any symbol that contains `d'. ++ exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" ++ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out ++ # platforms (ab)use it in PIC code, but their linkers get confused if ++ # the symbol is explicitly referenced. Since portable code cannot ++ # rely on this symbol name, it's probably fine to never include it in ++ # preloaded symbol tables. ++ extract_expsyms_cmds= ++ ++ case $host_os in ++ cygwin* | mingw* | pw32*) ++ # FIXME: the MSVC++ port hasn't been tested in a loooong time ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ if test "$GCC" != yes; then ++ with_gnu_ld=no ++ fi ++ ;; ++ openbsd*) ++ with_gnu_ld=no ++ ;; ++ esac ++ ++ ld_shlibs_F77=yes ++ if test "$with_gnu_ld" = yes; then ++ # If archive_cmds runs LD, not CC, wlarc should be empty ++ wlarc='${wl}' ++ ++ # See if GNU ld supports shared libraries. ++ case $host_os in ++ aix3* | aix4* | aix5*) ++ # On AIX/PPC, the GNU linker is very broken ++ if test "$host_cpu" != ia64; then ++ ld_shlibs_F77=no ++ cat <&2 ++ ++*** Warning: the GNU linker, at least up to release 2.9.1, is reported ++*** to be unable to reliably create shared libraries on AIX. ++*** Therefore, libtool is disabling shared libraries support. If you ++*** really care for shared libraries, you may want to modify your PATH ++*** so that a non-GNU linker is found, and then restart. ++ ++EOF ++ fi ++ ;; ++ ++ amigaos*) ++ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_minus_L_F77=yes ++ ++ # Samuel A. Falvo II reports ++ # that the semantics of dynamic libraries on AmigaOS, at least up ++ # to version 4, is to share data among multiple programs linked ++ # with the same dynamic library. Since this doesn't match the ++ # behavior of shared libraries on other platforms, we can't use ++ # them. ++ ld_shlibs_F77=no ++ ;; ++ ++ beos*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ allow_undefined_flag_F77=unsupported ++ # Joseph Beckenbach says some releases of gcc ++ # support --undefined. This deserves some investigation. FIXME ++ archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ else ++ ld_shlibs_F77=no ++ fi ++ ;; ++ ++ cygwin* | mingw* | pw32*) ++ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, ++ # as there is no search path for DLLs. ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ allow_undefined_flag_F77=unsupported ++ always_export_symbols_F77=no ++ enable_shared_with_static_runtimes_F77=yes ++ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ ++ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then ++ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ # If the export-symbols file already is a .def file (1st line ++ # is EXPORTS), use it as is; otherwise, prepend... ++ archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ cp $export_symbols $output_objdir/$soname.def; ++ else ++ echo EXPORTS > $output_objdir/$soname.def; ++ cat $export_symbols >> $output_objdir/$soname.def; ++ fi~ ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' ++ wlarc= ++ else ++ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ fi ++ ;; ++ ++ solaris* | sysv5*) ++ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ++ ld_shlibs_F77=no ++ cat <&2 ++ ++*** Warning: The releases 2.8.* of the GNU linker cannot reliably ++*** create shared libraries on Solaris systems. Therefore, libtool ++*** is disabling shared libraries support. We urge you to upgrade GNU ++*** binutils to release 2.9.1 or newer. Another option is to modify ++*** your PATH or compiler configuration so that the native linker is ++*** used, and then restart. ++ ++EOF ++ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ else ++ ld_shlibs_F77=no ++ fi ++ ;; ++ ++ sunos4*) ++ archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ wlarc= ++ hardcode_direct_F77=yes ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_cmds_F77="$tmp_archive_cmds" ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ archive_expsym_cmds_F77="$tmp_archive_cmds" ++ fi ++ else ++ ld_shlibs_F77=no ++ fi ++ ;; ++ ++ *) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ else ++ ld_shlibs_F77=no ++ fi ++ ;; ++ esac ++ ++ if test "$ld_shlibs_F77" = yes; then ++ runpath_var=LD_RUN_PATH ++ hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec_F77='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ whole_archive_flag_spec_F77= ++ fi ++ fi ++ else ++ # PORTME fill in a description of your system's linker (not GNU ld) ++ case $host_os in ++ aix3*) ++ allow_undefined_flag_F77=unsupported ++ always_export_symbols_F77=yes ++ archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' ++ # Note: this linker hardcodes the directories in LIBPATH if there ++ # are no directories specified by -L. ++ hardcode_minus_L_F77=yes ++ if test "$GCC" = yes && test -z "$link_static_flag"; then ++ # Neither direct hardcoding nor static linking is supported with a ++ # broken collect2. ++ hardcode_direct_F77=unsupported ++ fi ++ ;; ++ ++ aix4* | aix5*) ++ if test "$host_cpu" = ia64; then ++ # On IA64, the linker does run time linking by default, so we don't ++ # have to do anything special. ++ aix_use_runtimelinking=no ++ exp_sym_flag='-Bexport' ++ no_entry_flag="" ++ else ++ # If we're using GNU nm, then we don't want the "-C" option. ++ # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then ++ export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' ++ else ++ export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' ++ fi ++ aix_use_runtimelinking=no ++ ++ # Test if we are trying to use run time linking or normal ++ # AIX style linking. If -brtl is somewhere in LDFLAGS, we ++ # need to do runtime linking. ++ case $host_os in aix4.[23]|aix4.[23].*|aix5*) ++ for ld_flag in $LDFLAGS; do ++ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then ++ aix_use_runtimelinking=yes ++ break ++ fi ++ done ++ esac ++ ++ exp_sym_flag='-bexport' ++ no_entry_flag='-bnoentry' ++ fi ++ ++ # When large executables or shared objects are built, AIX ld can ++ # have problems creating the table of contents. If linking a library ++ # or program results in "error TOC overflow" add -mminimal-toc to ++ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not ++ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. ++ ++ archive_cmds_F77='' ++ hardcode_direct_F77=yes ++ hardcode_libdir_separator_F77=':' ++ link_all_deplibs_F77=yes ++ ++ if test "$GCC" = yes; then ++ case $host_os in aix4.012|aix4.012.*) ++ # We only want to do this on AIX 4.2 and lower, the check ++ # below for broken collect2 doesn't work under 4.3+ ++ collect2name=`${CC} -print-prog-name=collect2` ++ if test -f "$collect2name" && \ ++ strings "$collect2name" | grep resolve_lib_name >/dev/null ++ then ++ # We have reworked collect2 ++ hardcode_direct_F77=yes ++ else ++ # We have old collect2 ++ hardcode_direct_F77=unsupported ++ # It fails to find uninstalled libraries when the uninstalled ++ # path is not listed in the libpath. Setting hardcode_minus_L ++ # to unsupported forces relinking ++ hardcode_minus_L_F77=yes ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_libdir_separator_F77= ++ fi ++ esac ++ shared_flag='-shared' ++ else ++ # not using gcc ++ if test "$host_cpu" = ia64; then ++ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release ++ # chokes on -Wl,-G. The following line is correct: ++ shared_flag='-G' ++ else ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag='${wl}-G' ++ else ++ shared_flag='${wl}-bM:SRE' ++ fi ++ fi ++ fi ++ ++ # It seems that -bexpall does not export symbols beginning with ++ # underscore (_), so it is better to generate a list of symbols to export. ++ always_export_symbols_F77=yes ++ if test "$aix_use_runtimelinking" = yes; then ++ # Warning - without using the other runtime loading flags (-brtl), ++ # -berok will link without error, but may produce a broken library. ++ allow_undefined_flag_F77='-berok' ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++ program main ++ ++ end ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_f77_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" ++ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ else ++ if test "$host_cpu" = ia64; then ++ hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' ++ allow_undefined_flag_F77="-z nodefs" ++ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ else ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++ program main ++ ++ end ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_f77_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" ++ # Warning - without using the other run time loading flags, ++ # -berok will link without error, but may produce a broken library. ++ no_undefined_flag_F77=' ${wl}-bernotok' ++ allow_undefined_flag_F77=' ${wl}-berok' ++ # -bexpall does not export symbols beginning with underscore (_) ++ always_export_symbols_F77=yes ++ # Exported symbols can be pulled into shared objects from archives ++ whole_archive_flag_spec_F77=' ' ++ archive_cmds_need_lc_F77=yes ++ # This is similar to how AIX traditionally builds it's shared libraries. ++ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ fi ++ fi ++ ;; ++ ++ amigaos*) ++ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_minus_L_F77=yes ++ # see comment about different semantics on the GNU ld section ++ ld_shlibs_F77=no ++ ;; ++ ++ bsdi[45]*) ++ export_dynamic_flag_spec_F77=-rdynamic ++ ;; ++ ++ cygwin* | mingw* | pw32*) ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ # hardcode_libdir_flag_spec is actually meaningless, as there is ++ # no search path for DLLs. ++ hardcode_libdir_flag_spec_F77=' ' ++ allow_undefined_flag_F77=unsupported ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' ++ # The linker will automatically build a .lib file if we build a DLL. ++ old_archive_From_new_cmds_F77='true' ++ # FIXME: Should let the user specify the lib program. ++ old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' ++ fix_srcfile_path='`cygpath -w "$srcfile"`' ++ enable_shared_with_static_runtimes_F77=yes ++ ;; ++ ++ darwin* | rhapsody*) ++ case "$host_os" in ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac ++ archive_cmds_need_lc_F77=no ++ hardcode_direct_F77=no ++ hardcode_automatic_F77=yes ++ hardcode_shlibpath_var_F77=unsupported ++ whole_archive_flag_spec_F77='' ++ link_all_deplibs_F77=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case "$cc_basename" in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs_F77=no ++ ;; ++ esac ++ fi ++ ;; ++ ++ dgux*) ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ freebsd1*) ++ ld_shlibs_F77=no ++ ;; ++ ++ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor ++ # support. Future versions do this automatically, but an explicit c++rt0.o ++ # does not break anything, and helps significantly (at the cost of a little ++ # extra space). ++ freebsd2.2*) ++ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' ++ hardcode_libdir_flag_spec_F77='-R$libdir' ++ hardcode_direct_F77=yes ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ # Unfortunately, older versions of FreeBSD 2 do not have this feature. ++ freebsd2*) ++ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_F77=yes ++ hardcode_minus_L_F77=yes ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ # FreeBSD 3 and greater uses gcc -shared to do shared libraries. ++ freebsd* | kfreebsd*-gnu) ++ archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' ++ hardcode_libdir_flag_spec_F77='-R$libdir' ++ hardcode_direct_F77=yes ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ hpux9*) ++ if test "$GCC" = yes; then ++ archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ else ++ archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ fi ++ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_F77=: ++ hardcode_direct_F77=yes ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_F77=yes ++ export_dynamic_flag_spec_F77='${wl}-E' ++ ;; ++ ++ hpux10* | hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac ++ else ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ *) ++ archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ esac ++ fi ++ if test "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*) ++ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec_ld_F77='+b $libdir' ++ hardcode_libdir_separator_F77=: ++ hardcode_direct_F77=no ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ia64*) ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_direct_F77=no ++ hardcode_shlibpath_var_F77=no ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_F77=yes ++ ;; ++ *) ++ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_F77=: ++ hardcode_direct_F77=yes ++ export_dynamic_flag_spec_F77='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_F77=yes ++ ;; ++ esac ++ fi ++ ;; ++ ++ irix5* | irix6* | nonstopux*) ++ if test "$GCC" = yes; then ++ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' ++ fi ++ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_F77=: ++ link_all_deplibs_F77=yes ++ ;; ++ ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out ++ else ++ archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF ++ fi ++ hardcode_libdir_flag_spec_F77='-R$libdir' ++ hardcode_direct_F77=yes ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ newsos6) ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_F77=yes ++ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_F77=: ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ openbsd*) ++ hardcode_direct_F77=yes ++ hardcode_shlibpath_var_F77=no ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' ++ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec_F77='${wl}-E' ++ else ++ case $host_os in ++ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) ++ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec_F77='-R$libdir' ++ ;; ++ *) ++ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ++ ;; ++ esac ++ fi ++ ;; ++ ++ os2*) ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_minus_L_F77=yes ++ allow_undefined_flag_F77=unsupported ++ archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' ++ old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ++ ;; ++ ++ osf3*) ++ if test "$GCC" = yes; then ++ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ allow_undefined_flag_F77=' -expect_unresolved \*' ++ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ fi ++ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_F77=: ++ ;; ++ ++ osf4* | osf5*) # as osf3* with the addition of -msym flag ++ if test "$GCC" = yes; then ++ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' ++ else ++ allow_undefined_flag_F77=' -expect_unresolved \*' ++ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' ++ ++ # Both c and cxx compiler support -rpath directly ++ hardcode_libdir_flag_spec_F77='-rpath $libdir' ++ fi ++ hardcode_libdir_separator_F77=: ++ ;; ++ ++ sco3.2v5*) ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var_F77=no ++ export_dynamic_flag_spec_F77='${wl}-Bexport' ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ ;; ++ ++ solaris*) ++ no_undefined_flag_F77=' -z text' ++ if test "$GCC" = yes; then ++ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' ++ else ++ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ fi ++ hardcode_libdir_flag_spec_F77='-R$libdir' ++ hardcode_shlibpath_var_F77=no ++ case $host_os in ++ solaris2.[0-5] | solaris2.[0-5].*) ;; ++ *) # Supported since Solaris 2.6 (maybe 2.5.1?) ++ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; ++ esac ++ link_all_deplibs_F77=yes ++ ;; ++ ++ sunos4*) ++ if test "x$host_vendor" = xsequent; then ++ # Use $CC to link under sequent, because it throws in some extra .o ++ # files that make .init and .fini sections work. ++ archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_direct_F77=yes ++ hardcode_minus_L_F77=yes ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ sysv4) ++ case $host_vendor in ++ sni) ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_F77=yes # is this really true??? ++ ;; ++ siemens) ++ ## LD is ld it makes a PLAMLIB ++ ## CC just makes a GrossModule. ++ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ reload_cmds_F77='$CC -r -o $output$reload_objs' ++ hardcode_direct_F77=no ++ ;; ++ motorola) ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ++ ;; ++ esac ++ runpath_var='LD_RUN_PATH' ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ sysv4.3*) ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var_F77=no ++ export_dynamic_flag_spec_F77='-Bexport' ++ ;; ++ ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var_F77=no ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ ld_shlibs_F77=yes ++ fi ++ ;; ++ ++ sysv4.2uw2*) ++ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_F77=yes ++ hardcode_minus_L_F77=no ++ hardcode_shlibpath_var_F77=no ++ hardcode_runpath_var=yes ++ runpath_var=LD_RUN_PATH ++ ;; ++ ++ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ++ no_undefined_flag_F77='${wl}-z ${wl}text' ++ if test "$GCC" = yes; then ++ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi ++ runpath_var='LD_RUN_PATH' ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ sysv5*) ++ no_undefined_flag_F77=' -z text' ++ # $CC -shared without GNU ld will not create a library from C++ ++ # object files and a static libstdc++, better avoid it by now ++ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ hardcode_libdir_flag_spec_F77= ++ hardcode_shlibpath_var_F77=no ++ runpath_var='LD_RUN_PATH' ++ ;; ++ ++ uts4*) ++ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec_F77='-L$libdir' ++ hardcode_shlibpath_var_F77=no ++ ;; ++ ++ *) ++ ld_shlibs_F77=no ++ ;; ++ esac ++ fi ++ ++echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 ++echo "${ECHO_T}$ld_shlibs_F77" >&6 ++test "$ld_shlibs_F77" = no && can_build_shared=no ++ ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi ++ ++# ++# Do we need to explicitly link libc? ++# ++case "x$archive_cmds_need_lc_F77" in ++x|xyes) ++ # Assume -lc should be added ++ archive_cmds_need_lc_F77=yes ++ ++ if test "$enable_shared" = yes && test "$GCC" = yes; then ++ case $archive_cmds_F77 in ++ *'~'*) ++ # FIXME: we may have to deal with multi-command sequences. ++ ;; ++ '$CC '*) ++ # Test whether the compiler implicitly links with -lc since on some ++ # systems, -lgcc has to come before -lc. If gcc already passes -lc ++ # to ld, don't add -lc before -lgcc. ++ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 ++echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 ++ $rm conftest* ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } 2>conftest.err; then ++ soname=conftest ++ lib=conftest ++ libobjs=conftest.$ac_objext ++ deplibs= ++ wl=$lt_prog_compiler_wl_F77 ++ compiler_flags=-v ++ linker_flags=-v ++ verstring= ++ output_objdir=. ++ libname=conftest ++ lt_save_allow_undefined_flag=$allow_undefined_flag_F77 ++ allow_undefined_flag_F77= ++ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 ++ (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++ then ++ archive_cmds_need_lc_F77=no ++ else ++ archive_cmds_need_lc_F77=yes ++ fi ++ allow_undefined_flag_F77=$lt_save_allow_undefined_flag ++ else ++ cat conftest.err 1>&5 ++ fi ++ $rm conftest* ++ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 ++echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 ++ ;; ++ esac ++ fi ++ ;; ++esac ++ ++echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 ++echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 ++library_names_spec= ++libname_spec='lib$name' ++soname_spec= ++shrext_cmds=".so" ++postinstall_cmds= ++postuninstall_cmds= ++finish_cmds= ++finish_eval= ++shlibpath_var= ++shlibpath_overrides_runpath=unknown ++version_type=none ++dynamic_linker="$host_os ld.so" ++sys_lib_dlsearch_path_spec="/lib /usr/lib" ++if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then ++ # if the path contains ";" then we assume it to be the separator ++ # otherwise default to the standard path separator (i.e. ":") - it is ++ # assumed that no part of a normal pathname contains ";" but that should ++ # okay in the real world where ";" in dirpaths is itself problematic. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++else ++ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" ++fi ++need_lib_prefix=unknown ++hardcode_into_libs=no ++ ++# when you set need_version to no, make sure it does not cause -set_version ++# flags to be left without arguments ++need_version=unknown ++ ++case $host_os in ++aix3*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' ++ shlibpath_var=LIBPATH ++ ++ # AIX 3 has no versioning support, so we append a major version to the name. ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ ++aix4* | aix5*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ hardcode_into_libs=yes ++ if test "$host_cpu" = ia64; then ++ # AIX 5 supports IA64 ++ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ else ++ # With GCC up to 2.95.x, collect2 would create an import file ++ # for dependence libraries. The import file would start with ++ # the line `#! .'. This would cause the generated library to ++ # depend on `.', always an invalid library. This was fixed in ++ # development snapshots of GCC prior to 3.0. ++ case $host_os in ++ aix4 | aix4.[01] | aix4.[01].*) ++ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' ++ echo ' yes ' ++ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then ++ : ++ else ++ can_build_shared=no ++ fi ++ ;; ++ esac ++ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct ++ # soname into executable. Probably we can add versioning support to ++ # collect2, so additional links can be useful in future. ++ if test "$aix_use_runtimelinking" = yes; then ++ # If using run time linking (on AIX 4.2 or later) use lib.so ++ # instead of lib.a to let people know that these are not ++ # typical AIX shared libraries. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ else ++ # We preserve .a as extension for shared libraries through AIX4.2 ++ # and later when we are not doing run time linking. ++ library_names_spec='${libname}${release}.a $libname.a' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ fi ++ shlibpath_var=LIBPATH ++ fi ++ ;; ++ ++amigaos*) ++ library_names_spec='$libname.ixlibrary $libname.a' ++ # Create ${libname}_ixlibrary.a entries in /sys/libs. ++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ++ ;; ++ ++beos*) ++ library_names_spec='${libname}${shared_ext}' ++ dynamic_linker="$host_os ld.so" ++ shlibpath_var=LIBRARY_PATH ++ ;; ++ ++bsdi[45]*) ++ version_type=linux ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" ++ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" ++ # the default ld.so.conf also contains /usr/contrib/lib and ++ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow ++ # libtool to hard-code these into programs ++ ;; ++ ++cygwin* | mingw* | pw32*) ++ version_type=windows ++ shrext_cmds=".dll" ++ need_version=no ++ need_lib_prefix=no ++ ++ case $GCC,$host_os in ++ yes,cygwin* | yes,mingw* | yes,pw32*) ++ library_names_spec='$libname.dll.a' ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ ++ dldir=$destdir/`dirname \$dlpath`~ ++ test -d \$dldir || mkdir -p \$dldir~ ++ $install_prog $dir/$dlname \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ dlpath=$dir/\$dldll~ ++ $rm \$dlpath' ++ shlibpath_overrides_runpath=yes ++ ++ case $host_os in ++ cygwin*) ++ # Cygwin DLLs use 'cyg' prefix rather than 'lib' ++ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ++ ;; ++ mingw*) ++ # MinGW DLLs use traditional 'lib' prefix ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then ++ # It is most probably a Windows format PATH printed by ++ # mingw gcc, but we are running on Cygwin. Gcc prints its search ++ # path with ; separators, and with drive letters. We can handle the ++ # drive letters (cygwin fileutils understands them), so leave them, ++ # especially as we might pass files found there to a mingw objdump, ++ # which wouldn't understand a cygwinified path. Ahh. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++ ;; ++ pw32*) ++ # pw32 DLLs use 'pw' prefix rather than 'lib' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ++ ;; ++ esac ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ $archive_expsym_cmds="$archive_cmds" ++ fi ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ *) ++ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ++ ;; ++ esac ++ dynamic_linker='Win32 ld.exe' ++ # FIXME: first we should search . and the directory the executable is in ++ shlibpath_var=PATH ++ ;; ++ ++darwin* | rhapsody*) ++ dynamic_linker="$host_os dyld" ++ version_type=darwin ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' ++ soname_spec='${libname}${release}${major}$shared_ext' ++ shlibpath_overrides_runpath=yes ++ shlibpath_var=DYLD_LIBRARY_PATH ++ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. ++ if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` ++ else ++ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' ++ fi ++ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ++ ;; ++ ++dgux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++freebsd1*) ++ dynamic_linker=no ++ ;; ++ ++kfreebsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; ++ ++freebsd*) ++ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++ version_type=freebsd-$objformat ++ case $version_type in ++ freebsd-elf*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ need_version=no ++ need_lib_prefix=no ++ ;; ++ freebsd-*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' ++ need_version=yes ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_os in ++ freebsd2*) ++ shlibpath_overrides_runpath=yes ++ ;; ++ freebsd3.01* | freebsdelf3.01*) ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ *) # from 3.2 on ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ esac ++ ;; ++ ++gnu*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ ;; ++ ++hpux9* | hpux10* | hpux11*) ++ # Give a soname corresponding to the major version so that dld.sl refuses to ++ # link against other versions. ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ case "$host_cpu" in ++ ia64*) ++ shrext_cmds='.so' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.so" ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ if test "X$HPUX_IA64_MODE" = X32; then ++ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" ++ else ++ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" ++ fi ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ hppa*64*) ++ shrext_cmds='.sl' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ *) ++ shrext_cmds='.sl' ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=SHLIB_PATH ++ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ esac ++ # HP-UX runs *really* slowly unless shared libraries are mode 555. ++ postinstall_cmds='chmod 555 $lib' ++ ;; ++ ++irix5* | irix6* | nonstopux*) ++ case $host_os in ++ nonstopux*) version_type=nonstopux ;; ++ *) ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ version_type=linux ++ else ++ version_type=irix ++ fi ;; ++ esac ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' ++ case $host_os in ++ irix5* | nonstopux*) ++ libsuff= shlibsuff= ++ ;; ++ *) ++ case $LD in # libtool.m4 will add one of these switches to LD ++ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") ++ libsuff= shlibsuff= libmagic=32-bit;; ++ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") ++ libsuff=32 shlibsuff=N32 libmagic=N32;; ++ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") ++ libsuff=64 shlibsuff=64 libmagic=64-bit;; ++ *) libsuff= shlibsuff= libmagic=never-match;; ++ esac ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" ++ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ++ hardcode_into_libs=yes ++ ;; ++ ++# No shared lib support for Linux oldld, aout, or coff. ++linux*oldld* | linux*aout* | linux*coff*) ++ dynamic_linker=no ++ ;; ++ ++# This must be Linux ELF. ++linux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes ++ ++ # Append ld.so.conf contents to the search path ++ if test -f /etc/ld.so.conf; then ++ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` ++ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ fi ++ ++ case $host_cpu:$lt_cv_cc_64bit_output in ++ powerpc64:yes | s390x:yes | sparc64:yes | x86_64:yes) ++ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64" ++ sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64 /usr/X11R6/lib64" ++ ;; ++ esac ++ ++ # We used to test for /lib/ld.so.1 and disable shared libraries on ++ # powerpc, because MkLinux only supported shared libraries with the ++ # GNU dynamic linker. Since this was broken with cross compilers, ++ # most powerpc-linux boxes support dynamic linking these days and ++ # people can always --disable-shared, the test was removed, and we ++ # assume the GNU/Linux dynamic linker is in use. ++ dynamic_linker='GNU/Linux ld.so' ++ ++ # Find out which ABI we are using (multilib Linux x86_64 hack). ++ libsuff= ++ case "$host_cpu" in ++ x86_64*) ++ echo '#line 15290 "configure"' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ *) ++ ;; ++ esac ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ ;; ++ ++knetbsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; ++ ++netbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ dynamic_linker='NetBSD (a.out) ld.so' ++ else ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='NetBSD ld.elf_so' ++ fi ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ ++newsos6) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; ++ ++nto-qnx*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; ++ ++openbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ case $host_os in ++ openbsd2.[89] | openbsd2.[89].*) ++ shlibpath_overrides_runpath=no ++ ;; ++ *) ++ shlibpath_overrides_runpath=yes ++ ;; ++ esac ++ else ++ shlibpath_overrides_runpath=yes ++ fi ++ ;; ++ ++os2*) ++ libname_spec='$name' ++ shrext_cmds=".dll" ++ need_lib_prefix=no ++ library_names_spec='$libname${shared_ext} $libname.a' ++ dynamic_linker='OS/2 ld.exe' ++ shlibpath_var=LIBPATH ++ ;; ++ ++osf3* | osf4* | osf5*) ++ version_type=osf ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" ++ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ++ ;; ++ ++sco3.2v5*) ++ version_type=osf ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++solaris*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ # ldd complains unless libraries are executable ++ postinstall_cmds='chmod +x $lib' ++ ;; ++ ++sunos4*) ++ version_type=sunos ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ if test "$with_gnu_ld" = yes; then ++ need_lib_prefix=no ++ fi ++ need_version=yes ++ ;; ++ ++sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_vendor in ++ sni) ++ shlibpath_overrides_runpath=no ++ need_lib_prefix=no ++ export_dynamic_flag_spec='${wl}-Blargedynsym' ++ runpath_var=LD_RUN_PATH ++ ;; ++ siemens) ++ need_lib_prefix=no ++ ;; ++ motorola) ++ need_lib_prefix=no ++ need_version=no ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ++ ;; ++ esac ++ ;; ++ ++sysv4*MP*) ++ if test -d /usr/nec ;then ++ version_type=linux ++ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' ++ soname_spec='$libname${shared_ext}.$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ fi ++ ;; ++ ++uts4*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++*) ++ dynamic_linker=no ++ ;; ++esac ++echo "$as_me:$LINENO: result: $dynamic_linker" >&5 ++echo "${ECHO_T}$dynamic_linker" >&6 ++test "$dynamic_linker" = no && can_build_shared=no ++ ++echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 ++echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 ++hardcode_action_F77= ++if test -n "$hardcode_libdir_flag_spec_F77" || \ ++ test -n "$runpath_var_F77" || \ ++ test "X$hardcode_automatic_F77" = "Xyes" ; then ++ ++ # We can hardcode non-existant directories. ++ if test "$hardcode_direct_F77" != no && ++ # If the only mechanism to avoid hardcoding is shlibpath_var, we ++ # have to relink, otherwise we might link with an installed library ++ # when we should be linking with a yet-to-be-installed one ++ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && ++ test "$hardcode_minus_L_F77" != no; then ++ # Linking always hardcodes the temporary library directory. ++ hardcode_action_F77=relink ++ else ++ # We can link without hardcoding, and we can hardcode nonexisting dirs. ++ hardcode_action_F77=immediate ++ fi ++else ++ # We cannot hardcode anything, or else we can only hardcode existing ++ # directories. ++ hardcode_action_F77=unsupported ++fi ++echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 ++echo "${ECHO_T}$hardcode_action_F77" >&6 ++ ++if test "$hardcode_action_F77" = relink; then ++ # Fast installation is not supported ++ enable_fast_install=no ++elif test "$shlibpath_overrides_runpath" = yes || ++ test "$enable_shared" = no; then ++ # Fast installation is not necessary ++ enable_fast_install=needless ++fi ++ ++striplib= ++old_striplib= ++echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 ++echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 ++if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then ++ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" ++ test -z "$striplib" && striplib="$STRIP --strip-unneeded" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++else ++# FIXME - insert some real tests, host_os isn't really good enough ++ case $host_os in ++ darwin*) ++ if test -n "$STRIP" ; then ++ striplib="$STRIP -x" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ;; ++ *) ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ ;; ++ esac ++fi ++ ++ ++ ++# The else clause should only fire when bootstrapping the ++# libtool distribution, otherwise you forgot to ship ltmain.sh ++# with your package, and you will get complaints that there are ++# no rules to generate ltmain.sh. ++if test -f "$ltmain"; then ++ # See if we are running on zsh, and set the options which allow our commands through ++ # without removal of \ escapes. ++ if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++ fi ++ # Now quote all the things that may contain metacharacters while being ++ # careful not to overquote the AC_SUBSTed values. We take copies of the ++ # variables and quote the copies for generation of the libtool script. ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ SED SHELL STRIP \ ++ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ ++ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ ++ deplibs_check_method reload_flag reload_cmds need_locks \ ++ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ ++ lt_cv_sys_global_symbol_to_c_name_address \ ++ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ ++ old_postinstall_cmds old_postuninstall_cmds \ ++ compiler_F77 \ ++ CC_F77 \ ++ LD_F77 \ ++ lt_prog_compiler_wl_F77 \ ++ lt_prog_compiler_pic_F77 \ ++ lt_prog_compiler_static_F77 \ ++ lt_prog_compiler_no_builtin_flag_F77 \ ++ export_dynamic_flag_spec_F77 \ ++ thread_safe_flag_spec_F77 \ ++ whole_archive_flag_spec_F77 \ ++ enable_shared_with_static_runtimes_F77 \ ++ old_archive_cmds_F77 \ ++ old_archive_from_new_cmds_F77 \ ++ predep_objects_F77 \ ++ postdep_objects_F77 \ ++ predeps_F77 \ ++ postdeps_F77 \ ++ compiler_lib_search_path_F77 \ ++ archive_cmds_F77 \ ++ archive_expsym_cmds_F77 \ ++ postinstall_cmds_F77 \ ++ postuninstall_cmds_F77 \ ++ old_archive_from_expsyms_cmds_F77 \ ++ allow_undefined_flag_F77 \ ++ no_undefined_flag_F77 \ ++ export_symbols_cmds_F77 \ ++ hardcode_libdir_flag_spec_F77 \ ++ hardcode_libdir_flag_spec_ld_F77 \ ++ hardcode_libdir_separator_F77 \ ++ hardcode_automatic_F77 \ ++ module_cmds_F77 \ ++ module_expsym_cmds_F77 \ ++ lt_cv_prog_compiler_c_o_F77 \ ++ exclude_expsyms_F77 \ ++ include_expsyms_F77; do ++ ++ case $var in ++ old_archive_cmds_F77 | \ ++ old_archive_from_new_cmds_F77 | \ ++ archive_cmds_F77 | \ ++ archive_expsym_cmds_F77 | \ ++ module_cmds_F77 | \ ++ module_expsym_cmds_F77 | \ ++ old_archive_from_expsyms_cmds_F77 | \ ++ export_symbols_cmds_F77 | \ ++ extract_expsyms_cmds | reload_cmds | finish_cmds | \ ++ postinstall_cmds | postuninstall_cmds | \ ++ old_postinstall_cmds | old_postuninstall_cmds | \ ++ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) ++ # Double-quote double-evaled strings. ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ++ ;; ++ *) ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ++ ;; ++ esac ++ done ++ ++ case $lt_echo in ++ *'\$0 --fallback-echo"') ++ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ++ ;; ++ esac ++ ++cfgfile="$ofile" ++ ++ cat <<__EOF__ >> "$cfgfile" ++# ### BEGIN LIBTOOL TAG CONFIG: $tagname ++ ++# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: ++ ++# Shell to use when invoking shell scripts. ++SHELL=$lt_SHELL ++ ++# Whether or not to build shared libraries. ++build_libtool_libs=$enable_shared ++ ++# Whether or not to build static libraries. ++build_old_libs=$enable_static ++ ++# Whether or not to add -lc for building shared libraries. ++build_libtool_need_lc=$archive_cmds_need_lc_F77 ++ ++# Whether or not to disallow shared libs when runtime libs are static ++allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 ++ ++# Whether or not to optimize for fast installation. ++fast_install=$enable_fast_install ++ ++# The host system. ++host_alias=$host_alias ++host=$host ++ ++# An echo program that does not interpret backslashes. ++echo=$lt_echo ++ ++# The archiver. ++AR=$lt_AR ++AR_FLAGS=$lt_AR_FLAGS ++ ++# A C compiler. ++LTCC=$lt_LTCC ++ ++# A language-specific compiler. ++CC=$lt_compiler_F77 ++ ++# Is the compiler the GNU C compiler? ++with_gcc=$GCC_F77 ++ ++# An ERE matcher. ++EGREP=$lt_EGREP ++ ++# The linker used to build libraries. ++LD=$lt_LD_F77 ++ ++# Whether we need hard or soft links. ++LN_S=$lt_LN_S ++ ++# A BSD-compatible nm program. ++NM=$lt_NM ++ ++# A symbol stripping program ++STRIP=$lt_STRIP ++ ++# Used to examine libraries when file_magic_cmd begins "file" ++MAGIC_CMD=$MAGIC_CMD ++ ++# Used on cygwin: DLL creation program. ++DLLTOOL="$DLLTOOL" ++ ++# Used on cygwin: object dumper. ++OBJDUMP="$OBJDUMP" ++ ++# Used on cygwin: assembler. ++AS="$AS" ++ ++# The name of the directory that contains temporary libtool files. ++objdir=$objdir ++ ++# How to create reloadable object files. ++reload_flag=$lt_reload_flag ++reload_cmds=$lt_reload_cmds ++ ++# How to pass a linker flag through the compiler. ++wl=$lt_lt_prog_compiler_wl_F77 ++ ++# Object file suffix (normally "o"). ++objext="$ac_objext" ++ ++# Old archive suffix (normally "a"). ++libext="$libext" ++ ++# Shared library suffix (normally ".so"). ++shrext_cmds='$shrext_cmds' ++ ++# Executable file suffix (normally ""). ++exeext="$exeext" ++ ++# Additional compiler flags for building library objects. ++pic_flag=$lt_lt_prog_compiler_pic_F77 ++pic_mode=$pic_mode ++ ++# What is the maximum length of a command? ++max_cmd_len=$lt_cv_sys_max_cmd_len ++ ++# Does compiler simultaneously support -c and -o options? ++compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 ++ ++# Must we lock files when doing compilation ? ++need_locks=$lt_need_locks ++ ++# Do we need the lib prefix for modules? ++need_lib_prefix=$need_lib_prefix ++ ++# Do we need a version for libraries? ++need_version=$need_version ++ ++# Whether dlopen is supported. ++dlopen_support=$enable_dlopen ++ ++# Whether dlopen of programs is supported. ++dlopen_self=$enable_dlopen_self ++ ++# Whether dlopen of statically linked programs is supported. ++dlopen_self_static=$enable_dlopen_self_static ++ ++# Compiler flag to prevent dynamic linking. ++link_static_flag=$lt_lt_prog_compiler_static_F77 ++ ++# Compiler flag to turn off builtin functions. ++no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 ++ ++# Compiler flag to allow reflexive dlopens. ++export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 ++ ++# Compiler flag to generate shared objects directly from archives. ++whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 ++ ++# Compiler flag to generate thread-safe objects. ++thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 ++ ++# Library versioning type. ++version_type=$version_type ++ ++# Format of library name prefix. ++libname_spec=$lt_libname_spec ++ ++# List of archive names. First name is the real one, the rest are links. ++# The last name is the one that the linker finds with -lNAME. ++library_names_spec=$lt_library_names_spec ++ ++# The coded name of the library, if different from the real name. ++soname_spec=$lt_soname_spec ++ ++# Commands used to build and install an old-style archive. ++RANLIB=$lt_RANLIB ++old_archive_cmds=$lt_old_archive_cmds_F77 ++old_postinstall_cmds=$lt_old_postinstall_cmds ++old_postuninstall_cmds=$lt_old_postuninstall_cmds ++ ++# Create an old-style archive from a shared archive. ++old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 ++ ++# Create a temporary old-style archive to link instead of a shared archive. ++old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 ++ ++# Commands used to build and install a shared archive. ++archive_cmds=$lt_archive_cmds_F77 ++archive_expsym_cmds=$lt_archive_expsym_cmds_F77 ++postinstall_cmds=$lt_postinstall_cmds ++postuninstall_cmds=$lt_postuninstall_cmds ++ ++# Commands used to build a loadable module (assumed same as above if empty) ++module_cmds=$lt_module_cmds_F77 ++module_expsym_cmds=$lt_module_expsym_cmds_F77 ++ ++# Commands to strip libraries. ++old_striplib=$lt_old_striplib ++striplib=$lt_striplib ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predep_objects=$lt_predep_objects_F77 ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdep_objects=$lt_postdep_objects_F77 ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predeps=$lt_predeps_F77 ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdeps=$lt_postdeps_F77 ++ ++# The library search path used internally by the compiler when linking ++# a shared library. ++compiler_lib_search_path=$lt_compiler_lib_search_path_F77 ++ ++# Method to check whether dependent libraries are shared objects. ++deplibs_check_method=$lt_deplibs_check_method ++ ++# Command to use when deplibs_check_method == file_magic. ++file_magic_cmd=$lt_file_magic_cmd ++ ++# Flag that allows shared libraries with undefined symbols to be built. ++allow_undefined_flag=$lt_allow_undefined_flag_F77 ++ ++# Flag that forces no undefined symbols. ++no_undefined_flag=$lt_no_undefined_flag_F77 ++ ++# Commands used to finish a libtool library installation in a directory. ++finish_cmds=$lt_finish_cmds ++ ++# Same as above, but a single script fragment to be evaled but not shown. ++finish_eval=$lt_finish_eval ++ ++# Take the output of nm and produce a listing of raw symbols and C names. ++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe ++ ++# Transform the output of nm in a proper C declaration ++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl ++ ++# Transform the output of nm in a C name address pair ++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address ++ ++# This is the shared library runtime path variable. ++runpath_var=$runpath_var ++ ++# This is the shared library path variable. ++shlibpath_var=$shlibpath_var ++ ++# Is shlibpath searched before the hard-coded library search path? ++shlibpath_overrides_runpath=$shlibpath_overrides_runpath ++ ++# How to hardcode a shared library path into an executable. ++hardcode_action=$hardcode_action_F77 ++ ++# Whether we should hardcode library paths into libraries. ++hardcode_into_libs=$hardcode_into_libs ++ ++# Flag to hardcode \$libdir into a binary during linking. ++# This must work even if \$libdir does not exist. ++hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 ++ ++# If ld is used when linking, flag to hardcode \$libdir into ++# a binary during linking. This must work even if \$libdir does ++# not exist. ++hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 ++ ++# Whether we need a single -rpath flag with a separated argument. ++hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 ++ ++# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the ++# resulting binary. ++hardcode_direct=$hardcode_direct_F77 + +- test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +-fi +-fi +-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +-if test -n "$ac_ct_STRIP"; then +- echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +-echo "${ECHO_T}$ac_ct_STRIP" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi ++# Set to yes if using the -LDIR flag during linking hardcodes DIR into the ++# resulting binary. ++hardcode_minus_L=$hardcode_minus_L_F77 + +- STRIP=$ac_ct_STRIP +-else +- STRIP="$ac_cv_prog_STRIP" +-fi ++# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into ++# the resulting binary. ++hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + ++# Set to yes if building a shared library automatically hardcodes DIR into the library ++# and all subsequent libraries and executables linked against it. ++hardcode_automatic=$hardcode_automatic_F77 + +-enable_dlopen=no +-enable_win32_dll=no ++# Variables whose values should be saved in libtool wrapper scripts and ++# restored at relink time. ++variables_saved_for_relink="$variables_saved_for_relink" + +-# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +-if test "${enable_libtool_lock+set}" = set; then +- enableval="$enable_libtool_lock" ++# Whether libtool must link a program against all its dependency libraries. ++link_all_deplibs=$link_all_deplibs_F77 + +-fi; +-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes ++# Compile-time system search path for libraries ++sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +-# Some flags need to be propagated to the compiler or linker for good +-# libtool support. +-case $host in +-*-*-irix6*) +- # Find out which ABI we are using. +- echo '#line 4866 "configure"' > conftest.$ac_ext +- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; then +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -32" +- ;; +- *N32*) +- LD="${LD-ld} -n32" +- ;; +- *64-bit*) +- LD="${LD-ld} -64" +- ;; +- esac +- fi +- rm -rf conftest* +- ;; ++# Run-time system search path for libraries ++sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +-*-*-sco3.2v5*) +- # On SCO OpenServer 5, we need -belf to get full-featured binaries. +- SAVE_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -belf" +- echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +-if test "${lt_cv_cc_needs_belf+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else ++# Fix the shell variable \$srcfile for the compiler. ++fix_srcfile_path="$fix_srcfile_path_F77" + ++# Set to yes if exported symbols are required. ++always_export_symbols=$always_export_symbols_F77 + +- ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu ++# The commands to list exported symbols. ++export_symbols_cmds=$lt_export_symbols_cmds_F77 + +- cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++# The commands to extract the exported symbol list from a shared archive. ++extract_expsyms_cmds=$lt_extract_expsyms_cmds ++ ++# Symbols that should not be listed in the preloaded symbols. ++exclude_expsyms=$lt_exclude_expsyms_F77 ++ ++# Symbols that must always be exported. ++include_expsyms=$lt_include_expsyms_F77 ++ ++# ### END LIBTOOL TAG CONFIG: $tagname ++ ++__EOF__ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ + +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- lt_cv_cc_needs_belf=yes + else +- echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 +-lt_cv_cc_needs_belf=no ++ # If there is no Makefile yet, we rely on a make rule to execute ++ # `config.status --recheck' to rerun these tests and create the ++ # libtool script then. ++ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` ++ if test -f "$ltmain_in"; then ++ test -f Makefile && make "$ltmain" ++ fi + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +- ac_ext=c ++ ++ ++ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + +-fi +-echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 +- if test x"$lt_cv_cc_needs_belf" != x"yes"; then +- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf +- CFLAGS="$SAVE_CFLAGS" +- fi +- ;; ++CC="$lt_save_CC" ++ ++ else ++ tagname="" ++ fi ++ ;; + ++ GCJ) ++ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + +-esac + +-# Sed substitution that helps us do robust quoting. It backslashifies +-# metacharacters that are still active within double-quoted strings. +-Xsed='sed -e s/^X//' +-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +-# Same as above, but do not quote variable references. +-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' ++# Source file extension for Java test sources. ++ac_ext=java + +-# Sed substitution to delay expansion of an escaped shell variable in a +-# double_quote_subst'ed string. +-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' ++# Object file extension for compiled Java test sources. ++objext=o ++objext_GCJ=$objext + +-# Constants: +-rm="rm -f" ++# Code to be used in simple compile tests ++lt_simple_compile_test_code="class foo {}\n" + +-# Global variables: +-default_ofile=libtool +-can_build_shared=yes ++# Code to be used in simple link tests ++lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' + +-# All known linkers require a `.a' archive for static linking (except M$VC, +-# which needs '.lib'). +-libext=a +-ltmain="$ac_aux_dir/ltmain.sh" +-ofile="$default_ofile" +-with_gnu_ld="$lt_cv_prog_gnu_ld" +-need_locks="$enable_libtool_lock" ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +-old_CC="$CC" +-old_CFLAGS="$CFLAGS" ++# If no C compiler was specified, use CC. ++LTCC=${LTCC-"$CC"} + +-# Set sane defaults for various variables +-test -z "$AR" && AR=ar +-test -z "$AR_FLAGS" && AR_FLAGS=cru +-test -z "$AS" && AS=as +-test -z "$CC" && CC=cc +-test -z "$DLLTOOL" && DLLTOOL=dlltool +-test -z "$LD" && LD=ld +-test -z "$LN_S" && LN_S="ln -s" +-test -z "$MAGIC_CMD" && MAGIC_CMD=file +-test -z "$NM" && NM=nm +-test -z "$OBJDUMP" && OBJDUMP=objdump +-test -z "$RANLIB" && RANLIB=: +-test -z "$STRIP" && STRIP=: +-test -z "$ac_objext" && ac_objext=o ++# Allow CC to be a program name with arguments. ++compiler=$CC + +-if test x"$host" != x"$build"; then +- ac_tool_prefix=${host_alias}- +-else +- ac_tool_prefix= +-fi + +-# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +-case $host_os in +-linux-gnu*) ;; +-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +-esac ++# Allow CC to be a program name with arguments. ++lt_save_CC="$CC" ++CC=${GCJ-"gcj"} ++compiler=$CC ++compiler_GCJ=$CC + +-case $host_os in +-aix3*) +- # AIX sometimes has problems with the GCC collect2 program. For some +- # reason, if we set the COLLECT_NAMES environment variable, the problems +- # vanish in a puff of smoke. +- if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +- fi +- ;; +-esac ++# GCJ did not exist at the time GCC didn't implicitly link libc in. ++archive_cmds_need_lc_GCJ=no + +-# Determine commands to create old-style static archives. +-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +-old_postinstall_cmds='chmod 644 $oldlib' +-old_postuninstall_cmds= + +-if test -n "$RANLIB"; then +- case $host_os in +- openbsd*) +- old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" +- ;; +- *) +- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +- ;; +- esac +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +-fi ++lt_prog_compiler_no_builtin_flag_GCJ= + +-# Allow CC to be a program name with arguments. +-set dummy $CC +-compiler="$2" ++if test "$GCC" = yes; then ++ lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + +-echo "$as_me:$LINENO: checking for objdir" >&5 +-echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +-rm -f .libs 2>/dev/null +-mkdir .libs 2>/dev/null +-if test -d .libs; then +- objdir=.libs ++ ++echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 ++echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 ++if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- # MS-DOS does not allow filenames that begin with a dot. +- objdir=_libs ++ lt_cv_prog_compiler_rtti_exceptions=no ++ ac_outfile=conftest.$ac_objext ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ lt_compiler_flag="-fno-rtti -fno-exceptions" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ # The option is referenced via a variable to avoid confusing sed. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:16020: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>conftest.err) ++ ac_status=$? ++ cat conftest.err >&5 ++ echo "$as_me:16024: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s "$ac_outfile"; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s conftest.err; then ++ lt_cv_prog_compiler_rtti_exceptions=yes ++ fi ++ fi ++ $rm conftest* ++ + fi +-rmdir .libs 2>/dev/null +-echo "$as_me:$LINENO: result: $objdir" >&5 +-echo "${ECHO_T}$objdir" >&6 ++echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 ++echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + ++if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then ++ lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" ++else ++ : ++fi + ++fi + +-# Check whether --with-pic or --without-pic was given. +-if test "${with_pic+set}" = set; then +- withval="$with_pic" +- pic_mode="$withval" +-else +- pic_mode=default +-fi; +-test -z "$pic_mode" && pic_mode=default ++lt_prog_compiler_wl_GCJ= ++lt_prog_compiler_pic_GCJ= ++lt_prog_compiler_static_GCJ= + +-# We assume here that the value for lt_cv_prog_cc_pic will not be cached +-# in isolation, and that seeing it set (from the cache) indicates that +-# the associated values are set (in the cache) correctly too. + echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 + echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +-if test "${lt_cv_prog_cc_pic+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- lt_cv_prog_cc_pic= +- lt_cv_prog_cc_shlib= +- lt_cv_prog_cc_wl= +- lt_cv_prog_cc_static= +- lt_cv_prog_cc_no_builtin= +- lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static='-static' ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ lt_prog_compiler_static_GCJ='-static' + + case $host_os in +- aix*) +- # Below there is a dirty hack to force normal static linking with -ldl +- # The problem is because libdl dynamically linked with both libc and +- # libC (AIX C++ library), which obviously doesn't included in libraries +- # list by gcc. This cause undefined symbols with -static flags. +- # This hack allows C programs to be linked with "-static -ldl", but +- # not sure about C++ programs. +- lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" ++ aix*) ++ # All AIX code is PIC. ++ if test "$host_cpu" = ia64; then ++ # AIX 5 now supports IA64 processor ++ lt_prog_compiler_static_GCJ='-Bstatic' ++ fi + ;; ++ + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. +- lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' ++ lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; +- beos* | irix5* | irix6* | osf3* | osf4* | osf5*) ++ ++ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; ++ ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ++ ;; ++ + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files +- lt_cv_prog_cc_pic='-fno-common' ++ lt_prog_compiler_pic_GCJ='-fno-common' + ;; +- cygwin* | mingw* | pw32* | os2*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_cv_prog_cc_pic='-DDLL_EXPORT' ++ ++ msdosdjgpp*) ++ # Just because we use GCC doesn't mean we suddenly get shared libraries ++ # on systems that don't support them. ++ lt_prog_compiler_can_build_shared_GCJ=no ++ enable_shared=no + ;; ++ + sysv4*MP*) + if test -d /usr/nec; then +- lt_cv_prog_cc_pic=-Kconform_pic ++ lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; ++ ++ hpux*) ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ lt_prog_compiler_pic_GCJ='-fPIC' ++ ;; ++ esac ++ ;; ++ + *) +- lt_cv_prog_cc_pic='-fPIC' ++ lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else +- # PORTME Check for PIC flags for the system compiler. ++ # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in +- aix3* | aix4* | aix5*) +- lt_cv_prog_cc_wl='-Wl,' +- # All AIX code is PIC. ++ aix*) ++ lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor +- lt_cv_prog_cc_static='-Bstatic' ++ lt_prog_compiler_static_GCJ='-Bstatic' + else +- lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' ++ lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case "$cc_basename" in ++ xlc*) ++ lt_prog_compiler_pic_GCJ='-qnocommon' ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ ;; ++ esac ++ ;; ++ ++ mingw* | pw32* | os2*) ++ # This hack is so that the source file can tell whether it is being ++ # built for inclusion in a dll (and should export symbols for example). ++ lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ++ ;; + + hpux9* | hpux10* | hpux11*) +- # Is there a better lt_cv_prog_cc_static that works with the bundled CC? +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" +- lt_cv_prog_cc_pic='+Z' ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but ++ # not for PA HP-UX. ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ # +Z the default ++ ;; ++ *) ++ lt_prog_compiler_pic_GCJ='+Z' ++ ;; ++ esac ++ # Is there a better lt_prog_compiler_static that works with the bundled CC? ++ lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + +- irix5* | irix6*) +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static='-non_shared' ++ irix5* | irix6* | nonstopux*) ++ lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. ++ lt_prog_compiler_static_GCJ='-non_shared' + ;; + +- cygwin* | mingw* | pw32* | os2*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_cv_prog_cc_pic='-DDLL_EXPORT' ++ newsos6) ++ lt_prog_compiler_pic_GCJ='-KPIC' ++ lt_prog_compiler_static_GCJ='-Bstatic' + ;; + +- newsos6) +- lt_cv_prog_cc_pic='-KPIC' +- lt_cv_prog_cc_static='-Bstatic' ++ linux*) ++ case $CC in ++ icc* | ecc*) ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ lt_prog_compiler_pic_GCJ='-KPIC' ++ lt_prog_compiler_static_GCJ='-static' ++ ;; ++ ccc*) ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ # All Alpha code is PIC. ++ lt_prog_compiler_static_GCJ='-non_shared' ++ ;; ++ esac + ;; + + osf3* | osf4* | osf5*) ++ lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. +- lt_cv_prog_cc_wl='-Wl,' +- lt_cv_prog_cc_static='-non_shared' ++ lt_prog_compiler_static_GCJ='-non_shared' + ;; + + sco3.2v5*) +- lt_cv_prog_cc_pic='-Kpic' +- lt_cv_prog_cc_static='-dn' +- lt_cv_prog_cc_shlib='-belf' ++ lt_prog_compiler_pic_GCJ='-Kpic' ++ lt_prog_compiler_static_GCJ='-dn' + ;; + + solaris*) +- lt_cv_prog_cc_pic='-KPIC' +- lt_cv_prog_cc_static='-Bstatic' +- lt_cv_prog_cc_wl='-Wl,' ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ lt_prog_compiler_pic_GCJ='-KPIC' ++ lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sunos4*) +- lt_cv_prog_cc_pic='-PIC' +- lt_cv_prog_cc_static='-Bstatic' +- lt_cv_prog_cc_wl='-Qoption ld ' ++ lt_prog_compiler_wl_GCJ='-Qoption ld ' ++ lt_prog_compiler_pic_GCJ='-PIC' ++ lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- lt_cv_prog_cc_pic='-KPIC' +- lt_cv_prog_cc_static='-Bstatic' +- if test "x$host_vendor" = xsni; then +- lt_cv_prog_cc_wl='-LD' +- else +- lt_cv_prog_cc_wl='-Wl,' +- fi +- ;; +- +- uts4*) +- lt_cv_prog_cc_pic='-pic' +- lt_cv_prog_cc_static='-Bstatic' ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ lt_prog_compiler_pic_GCJ='-KPIC' ++ lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then +- lt_cv_prog_cc_pic='-Kconform_pic' +- lt_cv_prog_cc_static='-Bstatic' ++ lt_prog_compiler_pic_GCJ='-Kconform_pic' ++ lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + ++ uts4*) ++ lt_prog_compiler_pic_GCJ='-pic' ++ lt_prog_compiler_static_GCJ='-Bstatic' ++ ;; ++ + *) +- lt_cv_prog_cc_can_build_shared=no ++ lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +-fi +- +-if test -z "$lt_cv_prog_cc_pic"; then +- echo "$as_me:$LINENO: result: none" >&5 +-echo "${ECHO_T}none" >&6 +-else +- echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5 +-echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6 +- +- # Check to make sure the pic_flag actually works. +- echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5 +-echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6 +- if test "${lt_cv_prog_cc_pic_works+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" +- cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext +-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- case $host_os in +- hpux9* | hpux10* | hpux11*) +- # On HP-UX, both CC and GCC only warn that PIC is supported... then +- # they create non-PIC objects. So, if there were any warnings, we +- # assume that PIC is not supported. +- if test -s conftest.err; then +- lt_cv_prog_cc_pic_works=no +- else +- lt_cv_prog_cc_pic_works=yes +- fi +- ;; +- *) +- lt_cv_prog_cc_pic_works=yes +- ;; +- esac +- +-else +- echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 +- lt_cv_prog_cc_pic_works=no +- +-fi +-rm -f conftest.$ac_objext conftest.$ac_ext +- CFLAGS="$save_CFLAGS" +- +-fi +- ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 + +- if test "X$lt_cv_prog_cc_pic_works" = Xno; then +- lt_cv_prog_cc_pic= +- lt_cv_prog_cc_can_build_shared=no +- else +- lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" +- fi ++# ++# Check to make sure the PIC flag actually works. ++# ++if test -n "$lt_prog_compiler_pic_GCJ"; then + +- echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5 +-echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6 +-fi ++echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 ++echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_pic_works_GCJ=no ++ ac_outfile=conftest.$ac_objext ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ lt_compiler_flag="$lt_prog_compiler_pic_GCJ" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ # The option is referenced via a variable to avoid confusing sed. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:16263: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>conftest.err) ++ ac_status=$? ++ cat conftest.err >&5 ++ echo "$as_me:16267: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s "$ac_outfile"; then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s conftest.err; then ++ lt_prog_compiler_pic_works_GCJ=yes ++ fi ++ fi ++ $rm conftest* + +-# Check for any special shared library compilation flags. +-if test -n "$lt_cv_prog_cc_shlib"; then +- { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5 +-echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;} +- if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then : +- else +- { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +-echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} +- lt_cv_prog_cc_can_build_shared=no +- fi + fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 ++echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 + +-echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5 +-echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6 +-if test "${lt_cv_prog_cc_static_works+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- lt_cv_prog_cc_static_works=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" +- cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- lt_cv_prog_cc_static_works=yes ++if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then ++ case $lt_prog_compiler_pic_GCJ in ++ "" | " "*) ;; ++ *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; ++ esac + else +- echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++ lt_prog_compiler_pic_GCJ= ++ lt_prog_compiler_can_build_shared_GCJ=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +- LDFLAGS="$save_LDFLAGS" + + fi ++case "$host_os" in ++ # For platforms which do not support PIC, -DPIC is meaningless: ++ *djgpp*) ++ lt_prog_compiler_pic_GCJ= ++ ;; ++ *) ++ lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ++ ;; ++esac + +- +-# Belt *and* braces to stop my trousers falling down: +-test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +-echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5 +-echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6 +- +-pic_flag="$lt_cv_prog_cc_pic" +-special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +-wl="$lt_cv_prog_cc_wl" +-link_static_flag="$lt_cv_prog_cc_static" +-no_builtin_flag="$lt_cv_prog_cc_no_builtin" +-can_build_shared="$lt_cv_prog_cc_can_build_shared" +- +- +-# Check to see if options -o and -c are simultaneously supported by compiler + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +-if test "${lt_cv_compiler_c_o+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- +-$rm -r conftest 2>/dev/null +-mkdir conftest +-cd conftest +-echo "int some_variable = 0;" > conftest.$ac_ext +-mkdir out +-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +-# that will create temporary files in the current directory regardless of +-# the output directory. Thus, making CWD read-only will cause this test +-# to fail, enabling locking or at least warning the user not to do parallel +-# builds. +-chmod -w . +-save_CFLAGS="$CFLAGS" +-CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +-compiler_c_o=no +-if { (eval echo configure:5402: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s out/conftest.err; then +- lt_cv_compiler_c_o=no +- else +- lt_cv_compiler_c_o=yes +- fi +-else +- # Append any errors to the config.log. +- cat out/conftest.err 1>&5 +- lt_cv_compiler_c_o=no +-fi +-CFLAGS="$save_CFLAGS" +-chmod u+w . +-$rm conftest* out/* +-rmdir out +-cd .. +-rmdir conftest +-$rm -r conftest 2>/dev/null +- +-fi +- +-compiler_c_o=$lt_cv_compiler_c_o +-echo "$as_me:$LINENO: result: $compiler_c_o" >&5 +-echo "${ECHO_T}$compiler_c_o" >&6 +- +-if test x"$compiler_c_o" = x"yes"; then +- # Check to see if we can write to a .lo +- echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5 +-echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6 +- if test "${lt_cv_compiler_o_lo+set}" = set; then ++if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- +- lt_cv_compiler_o_lo=no +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -c -o conftest.lo" +- save_objext="$ac_objext" +- ac_objext=lo +- cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ +-int some_variable = 0; +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext +-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- lt_cv_compiler_o_lo=no +- else +- lt_cv_compiler_o_lo=yes +- fi +- +-else +- echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 +-fi +-rm -f conftest.$ac_objext conftest.$ac_ext +- ac_objext="$save_objext" +- CFLAGS="$save_CFLAGS" ++ lt_cv_prog_compiler_c_o_GCJ=no ++ $rm -r conftest 2>/dev/null ++ mkdir conftest ++ cd conftest ++ mkdir out ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ lt_compiler_flag="-o out/conftest2.$ac_objext" ++ # Insert the option either (1) after the last *FLAGS variable, or ++ # (2) before a word containing "conftest.", or (3) at the end. ++ # Note that $ac_compile itself does not contain backslashes and begins ++ # with a dollar sign (not a hyphen), so the echo should work correctly. ++ lt_compile=`echo "$ac_compile" | $SED \ ++ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ ++ -e 's:$: $lt_compiler_flag:'` ++ (eval echo "\"\$as_me:16323: $lt_compile\"" >&5) ++ (eval "$lt_compile" 2>out/conftest.err) ++ ac_status=$? ++ cat out/conftest.err >&5 ++ echo "$as_me:16327: \$? = $ac_status" >&5 ++ if (exit $ac_status) && test -s out/conftest2.$ac_objext ++ then ++ # The compiler can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test ! -s out/conftest.err; then ++ lt_cv_prog_compiler_c_o_GCJ=yes ++ fi ++ fi ++ chmod u+w . ++ $rm conftest* ++ # SGI C++ compiler will create directory out/ii_files/ for ++ # template instantiation ++ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files ++ $rm out/* && rmdir out ++ cd .. ++ rmdir conftest ++ $rm conftest* + + fi ++echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 ++echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 + +- compiler_o_lo=$lt_cv_compiler_o_lo +- echo "$as_me:$LINENO: result: $compiler_o_lo" >&5 +-echo "${ECHO_T}$compiler_o_lo" >&6 +-else +- compiler_o_lo=no +-fi + +-# Check to see if we can do hard links to lock some files if needed + hard_links="nottested" +-if test "$compiler_c_o" = no && test "$need_locks" != no; then ++if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 + echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 +@@ -5517,136 +16370,72 @@ + need_locks=no + fi + +-if test "$GCC" = yes; then +- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler +- echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +- echo "int some_variable = 0;" > conftest.$ac_ext +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" +- compiler_rtti_exceptions=no +- cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ +-int some_variable = 0; +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext +-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- compiler_rtti_exceptions=no +- else +- compiler_rtti_exceptions=yes +- fi +- +-else +- echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 +-fi +-rm -f conftest.$ac_objext conftest.$ac_ext +- CFLAGS="$save_CFLAGS" +- echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5 +-echo "${ECHO_T}$compiler_rtti_exceptions" >&6 +- +- if test "$compiler_rtti_exceptions" = "yes"; then +- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' +- else +- no_builtin_flag=' -fno-builtin' +- fi +-fi +- +-# See if the linker supports building shared libraries. +-echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5 +-echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6 ++echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 ++echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + +-allow_undefined_flag= +-no_undefined_flag= +-need_lib_prefix=unknown +-need_version=unknown +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-archive_cmds= +-archive_expsym_cmds= +-old_archive_from_new_cmds= +-old_archive_from_expsyms_cmds= +-export_dynamic_flag_spec= +-whole_archive_flag_spec= +-thread_safe_flag_spec= +-hardcode_into_libs=no +-hardcode_libdir_flag_spec= +-hardcode_libdir_separator= +-hardcode_direct=no +-hardcode_minus_L=no +-hardcode_shlibpath_var=unsupported +-runpath_var= +-link_all_deplibs=unknown +-always_export_symbols=no +-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +-# include_expsyms should be a list of space-separated symbols to be *always* +-# included in the symbol list +-include_expsyms= +-# exclude_expsyms can be an egrep regular expression of symbols to exclude +-# it will be wrapped by ` (' and `)$', so one must not match beginning or +-# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +-# as well as any symbol that contains `d'. +-exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +-# platforms (ab)use it in PIC code, but their linkers get confused if +-# the symbol is explicitly referenced. Since portable code cannot +-# rely on this symbol name, it's probably fine to never include it in +-# preloaded symbol tables. +-extract_expsyms_cmds= ++ runpath_var= ++ allow_undefined_flag_GCJ= ++ enable_shared_with_static_runtimes_GCJ=no ++ archive_cmds_GCJ= ++ archive_expsym_cmds_GCJ= ++ old_archive_From_new_cmds_GCJ= ++ old_archive_from_expsyms_cmds_GCJ= ++ export_dynamic_flag_spec_GCJ= ++ whole_archive_flag_spec_GCJ= ++ thread_safe_flag_spec_GCJ= ++ hardcode_libdir_flag_spec_GCJ= ++ hardcode_libdir_flag_spec_ld_GCJ= ++ hardcode_libdir_separator_GCJ= ++ hardcode_direct_GCJ=no ++ hardcode_minus_L_GCJ=no ++ hardcode_shlibpath_var_GCJ=unsupported ++ link_all_deplibs_GCJ=unknown ++ hardcode_automatic_GCJ=no ++ module_cmds_GCJ= ++ module_expsym_cmds_GCJ= ++ always_export_symbols_GCJ=no ++ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ++ # include_expsyms should be a list of space-separated symbols to be *always* ++ # included in the symbol list ++ include_expsyms_GCJ= ++ # exclude_expsyms can be an extended regexp of symbols to exclude ++ # it will be wrapped by ` (' and `)$', so one must not match beginning or ++ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', ++ # as well as any symbol that contains `d'. ++ exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" ++ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out ++ # platforms (ab)use it in PIC code, but their linkers get confused if ++ # the symbol is explicitly referenced. Since portable code cannot ++ # rely on this symbol name, it's probably fine to never include it in ++ # preloaded symbol tables. ++ extract_expsyms_cmds= + +-case $host_os in +-cygwin* | mingw* | pw32*) +- # FIXME: the MSVC++ port hasn't been tested in a loooong time +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- if test "$GCC" != yes; then ++ case $host_os in ++ cygwin* | mingw* | pw32*) ++ # FIXME: the MSVC++ port hasn't been tested in a loooong time ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ if test "$GCC" != yes; then ++ with_gnu_ld=no ++ fi ++ ;; ++ openbsd*) + with_gnu_ld=no +- fi +- ;; +-openbsd*) +- with_gnu_ld=no +- ;; +-esac ++ ;; ++ esac + +-ld_shlibs=yes +-if test "$with_gnu_ld" = yes; then +- # If archive_cmds runs LD, not CC, wlarc should be empty +- wlarc='${wl}' ++ ld_shlibs_GCJ=yes ++ if test "$with_gnu_ld" = yes; then ++ # If archive_cmds runs LD, not CC, wlarc should be empty ++ wlarc='${wl}' + +- # See if GNU ld supports shared libraries. +- case $host_os in +- aix3* | aix4* | aix5*) +- # On AIX, the GNU linker is very broken +- # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. +- ld_shlibs=no +- cat <&2 ++ # See if GNU ld supports shared libraries. ++ case $host_os in ++ aix3* | aix4* | aix5*) ++ # On AIX/PPC, the GNU linker is very broken ++ if test "$host_cpu" != ia64; then ++ ld_shlibs_GCJ=no ++ cat <&2 + + *** Warning: the GNU linker, at least up to release 2.9.1, is reported + *** to be unable to reliably create shared libraries on AIX. +@@ -5655,124 +16444,73 @@ + *** so that a non-GNU linker is found, and then restart. + + EOF +- ;; +- +- amigaos*) +- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- +- # Samuel A. Falvo II reports +- # that the semantics of dynamic libraries on AmigaOS, at least up +- # to version 4, is to share data among multiple programs linked +- # with the same dynamic library. Since this doesn't match the +- # behavior of shared libraries on other platforms, we can use +- # them. +- ld_shlibs=no +- ;; +- +- beos*) +- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- allow_undefined_flag=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- +- cygwin* | mingw* | pw32*) +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec='-L$libdir' +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- +- extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ +- sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ +- test -f $output_objdir/impgen.exe || (cd $output_objdir && \ +- if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ +- else $CC -o impgen impgen.c ; fi)~ +- $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' +- +- old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' +- +- # cygwin and mingw dlls have different entry points and sets of symbols +- # to exclude. +- # FIXME: what about values for MSVC? +- dll_entry=__cygwin_dll_entry@12 +- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ +- case $host_os in +- mingw*) +- # mingw values +- dll_entry=_DllMainCRTStartup@12 +- dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ ++ fi + ;; +- esac + +- # mingw and cygwin differ, and it's simplest to just exclude the union +- # of the two symbol sets. +- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 +- +- # recent cygwin and mingw systems supply a stub DllMain which the user +- # can override, but on older systems we have to supply one (in ltdll.c) +- if test "x$lt_cv_need_dllmain" = "xyes"; then +- ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " +- ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ +- test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' +- else +- ltdll_obj= +- ltdll_cmds= +- fi ++ amigaos*) ++ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_minus_L_GCJ=yes ++ ++ # Samuel A. Falvo II reports ++ # that the semantics of dynamic libraries on AmigaOS, at least up ++ # to version 4, is to share data among multiple programs linked ++ # with the same dynamic library. Since this doesn't match the ++ # behavior of shared libraries on other platforms, we can't use ++ # them. ++ ld_shlibs_GCJ=no ++ ;; + +- # Extract the symbol export list from an `--export-all' def file, +- # then regenerate the def file from the symbol export list, so that +- # the compiled dll only exports the symbol export list. +- # Be careful not to strip the DATA tag left be newer dlltools. +- export_symbols_cmds="$ltdll_cmds"' +- $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ +- sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' +- +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is. +- # If DATA tags from a recent dlltool are present, honour them! +- archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname-def; +- else +- echo EXPORTS > $output_objdir/$soname-def; +- _lt_hint=1; +- cat $export_symbols | while read symbol; do +- set dummy \$symbol; +- case \$# in +- 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; +- *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;; +- esac; +- _lt_hint=`expr 1 + \$_lt_hint`; +- done; +- fi~ +- '"$ltdll_cmds"' +- $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ +- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ +- $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ +- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ +- $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' +- ;; ++ beos*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ allow_undefined_flag_GCJ=unsupported ++ # Joseph Beckenbach says some releases of gcc ++ # support --undefined. This deserves some investigation. FIXME ++ archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ else ++ ld_shlibs_GCJ=no ++ fi ++ ;; + +- netbsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' +- wlarc= +- else +- archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- fi +- ;; ++ cygwin* | mingw* | pw32*) ++ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, ++ # as there is no search path for DLLs. ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ allow_undefined_flag_GCJ=unsupported ++ always_export_symbols_GCJ=no ++ enable_shared_with_static_runtimes_GCJ=yes ++ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ ++ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then ++ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ # If the export-symbols file already is a .def file (1st line ++ # is EXPORTS), use it as is; otherwise, prepend... ++ archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then ++ cp $export_symbols $output_objdir/$soname.def; ++ else ++ echo EXPORTS > $output_objdir/$soname.def; ++ cat $export_symbols >> $output_objdir/$soname.def; ++ fi~ ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; + +- solaris* | sysv5*) +- if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then +- ld_shlibs=no +- cat <&2 ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' ++ wlarc= ++ else ++ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ fi ++ ;; ++ ++ solaris* | sysv5*) ++ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ++ ld_shlibs_GCJ=no ++ cat <&2 + + *** Warning: The releases 2.8.* of the GNU linker cannot reliably + *** create shared libraries on Solaris systems. Therefore, libtool +@@ -5782,539 +16520,782 @@ + *** used, and then restart. + + EOF +- elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; ++ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ else ++ ld_shlibs_GCJ=no ++ fi ++ ;; + +- sunos4*) +- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- wlarc= +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; ++ sunos4*) ++ archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ wlarc= ++ hardcode_direct_GCJ=yes ++ hardcode_shlibpath_var_GCJ=no ++ ;; + +- *) +- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_cmds_GCJ="$tmp_archive_cmds" ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ archive_expsym_cmds_GCJ="$tmp_archive_cmds" ++ fi + else +- ld_shlibs=no ++ ld_shlibs_GCJ=no + fi + ;; +- esac + +- if test "$ld_shlibs" = yes; then +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec='${wl}--export-dynamic' +- case $host_os in +- cygwin* | mingw* | pw32*) +- # dlltool doesn't understand --whole-archive et. al. +- whole_archive_flag_spec= +- ;; + *) +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else +- whole_archive_flag_spec= ++ ld_shlibs_GCJ=no + fi + ;; + esac +- fi +-else +- # PORTME fill in a description of your system's linker (not GNU ld) +- case $host_os in +- aix3*) +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' +- # Note: this linker hardcodes the directories in LIBPATH if there +- # are no directories specified by -L. +- hardcode_minus_L=yes +- if test "$GCC" = yes && test -z "$link_static_flag"; then +- # Neither direct hardcoding nor static linking is supported with a +- # broken collect2. +- hardcode_direct=unsupported +- fi +- ;; +- +- aix4* | aix5*) +- if test "$host_cpu" = ia64; then +- # On IA64, the linker does run time linking by default, so we don't +- # have to do anything special. +- aix_use_runtimelinking=no +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- else +- aix_use_runtimelinking=no + +- # Test if we are trying to use run time linking or normal +- # AIX style linking. If -brtl is somewhere in LDFLAGS, we +- # need to do runtime linking. +- case $host_os in aix4.[23]|aix4.[23].*|aix5*) +- for ld_flag in $LDFLAGS; do +- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then +- aix_use_runtimelinking=yes +- break +- fi +- done +- esac +- +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' ++ if test "$ld_shlibs_GCJ" = yes; then ++ runpath_var=LD_RUN_PATH ++ hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ whole_archive_flag_spec_GCJ= ++ fi + fi ++ else ++ # PORTME fill in a description of your system's linker (not GNU ld) ++ case $host_os in ++ aix3*) ++ allow_undefined_flag_GCJ=unsupported ++ always_export_symbols_GCJ=yes ++ archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' ++ # Note: this linker hardcodes the directories in LIBPATH if there ++ # are no directories specified by -L. ++ hardcode_minus_L_GCJ=yes ++ if test "$GCC" = yes && test -z "$link_static_flag"; then ++ # Neither direct hardcoding nor static linking is supported with a ++ # broken collect2. ++ hardcode_direct_GCJ=unsupported ++ fi ++ ;; + +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. +- +- hardcode_direct=yes +- archive_cmds='' +- hardcode_libdir_separator=':' +- if test "$GCC" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) +- collect2name=`${CC} -print-prog-name=collect2` +- if test -f "$collect2name" && \ +- strings "$collect2name" | grep resolve_lib_name >/dev/null +- then +- # We have reworked collect2 +- hardcode_direct=yes ++ aix4* | aix5*) ++ if test "$host_cpu" = ia64; then ++ # On IA64, the linker does run time linking by default, so we don't ++ # have to do anything special. ++ aix_use_runtimelinking=no ++ exp_sym_flag='-Bexport' ++ no_entry_flag="" ++ else ++ # If we're using GNU nm, then we don't want the "-C" option. ++ # -C means demangle to AIX nm, but means don't demangle with GNU nm ++ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then ++ export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else +- # We have old collect2 +- hardcode_direct=unsupported +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- hardcode_minus_L=yes +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_libdir_separator= ++ export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi +- esac ++ aix_use_runtimelinking=no + +- shared_flag='-shared' +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- shared_flag='${wl}-G' ++ # Test if we are trying to use run time linking or normal ++ # AIX style linking. If -brtl is somewhere in LDFLAGS, we ++ # need to do runtime linking. ++ case $host_os in aix4.[23]|aix4.[23].*|aix5*) ++ for ld_flag in $LDFLAGS; do ++ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then ++ aix_use_runtimelinking=yes ++ break ++ fi ++ done ++ esac ++ ++ exp_sym_flag='-bexport' ++ no_entry_flag='-bnoentry' ++ fi ++ ++ # When large executables or shared objects are built, AIX ld can ++ # have problems creating the table of contents. If linking a library ++ # or program results in "error TOC overflow" add -mminimal-toc to ++ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not ++ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. ++ ++ archive_cmds_GCJ='' ++ hardcode_direct_GCJ=yes ++ hardcode_libdir_separator_GCJ=':' ++ link_all_deplibs_GCJ=yes ++ ++ if test "$GCC" = yes; then ++ case $host_os in aix4.012|aix4.012.*) ++ # We only want to do this on AIX 4.2 and lower, the check ++ # below for broken collect2 doesn't work under 4.3+ ++ collect2name=`${CC} -print-prog-name=collect2` ++ if test -f "$collect2name" && \ ++ strings "$collect2name" | grep resolve_lib_name >/dev/null ++ then ++ # We have reworked collect2 ++ hardcode_direct_GCJ=yes ++ else ++ # We have old collect2 ++ hardcode_direct_GCJ=unsupported ++ # It fails to find uninstalled libraries when the uninstalled ++ # path is not listed in the libpath. Setting hardcode_minus_L ++ # to unsupported forces relinking ++ hardcode_minus_L_GCJ=yes ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_libdir_separator_GCJ= ++ fi ++ esac ++ shared_flag='-shared' + else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' ++ # not using gcc ++ if test "$host_cpu" = ia64; then ++ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release ++ # chokes on -Wl,-G. The following line is correct: ++ shared_flag='-G' + else +- shared_flag='${wl}-bM:SRE' ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag='${wl}-G' ++ else ++ shared_flag='${wl}-bM:SRE' ++ fi + fi + fi +- fi + +- # It seems that -bexpall can do strange things, so it is better to +- # generate a list of symbols to export. +- always_export_symbols=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- allow_undefined_flag='-berok' +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' +- archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' +- allow_undefined_flag="-z nodefs" +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" +- else +- hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' +- # Warning - without using the other run time loading flags, ++ # It seems that -bexpall does not export symbols beginning with ++ # underscore (_), so it is better to generate a list of symbols to export. ++ always_export_symbols_GCJ=yes ++ if test "$aix_use_runtimelinking" = yes; then ++ # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. +- allow_undefined_flag='${wl}-berok' +- # This is a bit strange, but is similar to how AIX traditionally builds +- # it's shared libraries. +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' +- fi +- fi +- ;; ++ allow_undefined_flag_GCJ='-berok' ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +- amigaos*) +- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- # see comment about different semantics on the GNU ld section +- ld_shlibs=no +- ;; ++int ++main () ++{ + +- cygwin* | mingw* | pw32*) +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- old_archive_from_new_cmds='true' +- # FIXME: Should let the user specify the lib program. +- old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' +- fix_srcfile_path='`cygpath -w "$srcfile"`' +- ;; +- +- darwin* | rhapsody*) +- case "$host_os" in +- rhapsody* | darwin1.[012]) +- allow_undefined_flag='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- allow_undefined_flag='-flat_namespace -undefined suppress' +- ;; +- esac +- # FIXME: Relying on posixy $() will cause problems for +- # cross-compilation, but unfortunately the echo tests do not +- # yet detect zsh echo's removal of \ escapes. +- archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' +- # We need to add '_' to the symbols in $export_symbols first +- #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- whole_archive_flag_spec='-all_load $convenience' +- ;; +- +- freebsd1*) +- ld_shlibs=no +- ;; +- +- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor +- # support. Future versions do this automatically, but an explicit c++rt0.o +- # does not break anything, and helps significantly (at the cost of a little +- # extra space). +- freebsd2.2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + +- # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" ++ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ else ++ if test "$host_cpu" = ia64; then ++ hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' ++ allow_undefined_flag_GCJ="-z nodefs" ++ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ else ++ # Determine the default libpath from the value encoded in an empty executable. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +- # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd*) +- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; ++int ++main () ++{ + +- hpux9* | hpux10* | hpux11*) +- case $host_os in +- hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; +- *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; +- esac +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_direct=yes +- hardcode_minus_L=yes # Not in the search PATH, but as the default +- # location of the library. +- export_dynamic_flag_spec='${wl}-E' +- ;; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + +- irix5* | irix6*) +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' +- fi +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- link_all_deplibs=yes +- ;; ++aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'` ++# Check for a 64-bit object if we didn't find anything. ++if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } ++}'`; fi ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ++ ++ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" ++ # Warning - without using the other run time loading flags, ++ # -berok will link without error, but may produce a broken library. ++ no_undefined_flag_GCJ=' ${wl}-bernotok' ++ allow_undefined_flag_GCJ=' ${wl}-berok' ++ # -bexpall does not export symbols beginning with underscore (_) ++ always_export_symbols_GCJ=yes ++ # Exported symbols can be pulled into shared objects from archives ++ whole_archive_flag_spec_GCJ=' ' ++ archive_cmds_need_lc_GCJ=yes ++ # This is similar to how AIX traditionally builds it's shared libraries. ++ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ fi ++ fi ++ ;; + +- netbsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out +- else +- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF +- fi +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; ++ amigaos*) ++ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_minus_L_GCJ=yes ++ # see comment about different semantics on the GNU ld section ++ ld_shlibs_GCJ=no ++ ;; + +- newsos6) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_shlibpath_var=no +- ;; ++ bsdi[45]*) ++ export_dynamic_flag_spec_GCJ=-rdynamic ++ ;; + +- openbsd*) +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- export_dynamic_flag_spec='${wl}-E' +- else ++ cygwin* | mingw* | pw32*) ++ # When not using gcc, we currently assume that we are using ++ # Microsoft Visual C++. ++ # hardcode_libdir_flag_spec is actually meaningless, as there is ++ # no search path for DLLs. ++ hardcode_libdir_flag_spec_GCJ=' ' ++ allow_undefined_flag_GCJ=unsupported ++ # Tell ltmain to make .lib files, not .a files. ++ libext=lib ++ # Tell ltmain to make .dll files, not .so files. ++ shrext_cmds=".dll" ++ # FIXME: Setting linknames here is a bad hack. ++ archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' ++ # The linker will automatically build a .lib file if we build a DLL. ++ old_archive_From_new_cmds_GCJ='true' ++ # FIXME: Should let the user specify the lib program. ++ old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' ++ fix_srcfile_path='`cygpath -w "$srcfile"`' ++ enable_shared_with_static_runtimes_GCJ=yes ++ ;; ++ ++ darwin* | rhapsody*) + case "$host_os" in +- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- ;; +- *) +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- ;; ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac ++ archive_cmds_need_lc_GCJ=no ++ hardcode_direct_GCJ=no ++ hardcode_automatic_GCJ=yes ++ hardcode_shlibpath_var_GCJ=unsupported ++ whole_archive_flag_spec_GCJ='' ++ link_all_deplibs_GCJ=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case "$cc_basename" in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's ++ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs_GCJ=no ++ ;; + esac + fi +- ;; ++ ;; + +- os2*) +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- allow_undefined_flag=unsupported +- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' +- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' +- ;; ++ dgux*) ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_shlibpath_var_GCJ=no ++ ;; + +- osf3*) +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' +- fi +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; ++ freebsd1*) ++ ld_shlibs_GCJ=no ++ ;; + +- osf4* | osf5*) # as osf3* with the addition of -msym flag +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ +- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' ++ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor ++ # support. Future versions do this automatically, but an explicit c++rt0.o ++ # does not break anything, and helps significantly (at the cost of a little ++ # extra space). ++ freebsd2.2*) ++ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' ++ hardcode_libdir_flag_spec_GCJ='-R$libdir' ++ hardcode_direct_GCJ=yes ++ hardcode_shlibpath_var_GCJ=no ++ ;; + +- #Both c and cxx compiler support -rpath directly +- hardcode_libdir_flag_spec='-rpath $libdir' +- fi +- hardcode_libdir_separator=: +- ;; ++ # Unfortunately, older versions of FreeBSD 2 do not have this feature. ++ freebsd2*) ++ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_GCJ=yes ++ hardcode_minus_L_GCJ=yes ++ hardcode_shlibpath_var_GCJ=no ++ ;; ++ ++ # FreeBSD 3 and greater uses gcc -shared to do shared libraries. ++ freebsd* | kfreebsd*-gnu) ++ archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' ++ hardcode_libdir_flag_spec_GCJ='-R$libdir' ++ hardcode_direct_GCJ=yes ++ hardcode_shlibpath_var_GCJ=no ++ ;; ++ ++ hpux9*) ++ if test "$GCC" = yes; then ++ archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ else ++ archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ++ fi ++ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_GCJ=: ++ hardcode_direct_GCJ=yes ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_GCJ=yes ++ export_dynamic_flag_spec_GCJ='${wl}-E' ++ ;; ++ ++ hpux10* | hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac ++ else ++ case "$host_cpu" in ++ hppa*64*|ia64*) ++ archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ *) ++ archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ ;; ++ esac ++ fi ++ if test "$with_gnu_ld" = no; then ++ case "$host_cpu" in ++ hppa*64*) ++ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' ++ hardcode_libdir_separator_GCJ=: ++ hardcode_direct_GCJ=no ++ hardcode_shlibpath_var_GCJ=no ++ ;; ++ ia64*) ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_direct_GCJ=no ++ hardcode_shlibpath_var_GCJ=no ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_GCJ=yes ++ ;; ++ *) ++ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_GCJ=: ++ hardcode_direct_GCJ=yes ++ export_dynamic_flag_spec_GCJ='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_GCJ=yes ++ ;; ++ esac ++ fi ++ ;; ++ ++ irix5* | irix6* | nonstopux*) ++ if test "$GCC" = yes; then ++ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' ++ fi ++ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_GCJ=: ++ link_all_deplibs_GCJ=yes ++ ;; ++ ++ netbsd*) ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out ++ else ++ archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF ++ fi ++ hardcode_libdir_flag_spec_GCJ='-R$libdir' ++ hardcode_direct_GCJ=yes ++ hardcode_shlibpath_var_GCJ=no ++ ;; ++ ++ newsos6) ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_GCJ=yes ++ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_GCJ=: ++ hardcode_shlibpath_var_GCJ=no ++ ;; ++ ++ openbsd*) ++ hardcode_direct_GCJ=yes ++ hardcode_shlibpath_var_GCJ=no ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' ++ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec_GCJ='${wl}-E' ++ else ++ case $host_os in ++ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) ++ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec_GCJ='-R$libdir' ++ ;; ++ *) ++ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ++ ;; ++ esac ++ fi ++ ;; ++ ++ os2*) ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_minus_L_GCJ=yes ++ allow_undefined_flag_GCJ=unsupported ++ archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' ++ old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ++ ;; ++ ++ osf3*) ++ if test "$GCC" = yes; then ++ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ else ++ allow_undefined_flag_GCJ=' -expect_unresolved \*' ++ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ fi ++ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' ++ hardcode_libdir_separator_GCJ=: ++ ;; + +- sco3.2v5*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- export_dynamic_flag_spec='${wl}-Bexport' +- ;; ++ osf4* | osf5*) # as osf3* with the addition of -msym flag ++ if test "$GCC" = yes; then ++ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' ++ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ++ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' ++ else ++ allow_undefined_flag_GCJ=' -expect_unresolved \*' ++ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' ++ archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + +- solaris*) +- # gcc --version < 3.0 without binutils cannot create self contained +- # shared libraries reliably, requiring libgcc.a to resolve some of +- # the object symbols generated in some cases. Libraries that use +- # assert need libgcc.a to resolve __eprintf, for example. Linking +- # a copy of libgcc.a into every shared library to guarantee resolving +- # such symbols causes other problems: According to Tim Van Holder +- # , C++ libraries end up with a separate +- # (to the application) exception stack for one thing. +- no_undefined_flag=' -z defs' +- if test "$GCC" = yes; then +- case `$CC --version 2>/dev/null` in +- [12].*) +- cat <&2 ++ # Both c and cxx compiler support -rpath directly ++ hardcode_libdir_flag_spec_GCJ='-rpath $libdir' ++ fi ++ hardcode_libdir_separator_GCJ=: ++ ;; + +-*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +-*** create self contained shared libraries on Solaris systems, without +-*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +-*** -no-undefined support, which will at least allow you to build shared +-*** libraries. However, you may find that when you link such libraries +-*** into an application without using GCC, you have to manually add +-*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +-*** upgrade to a newer version of GCC. Another option is to rebuild your +-*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. ++ sco3.2v5*) ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var_GCJ=no ++ export_dynamic_flag_spec_GCJ='${wl}-Bexport' ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ ;; + +-EOF +- no_undefined_flag= +- ;; ++ solaris*) ++ no_undefined_flag_GCJ=' -z text' ++ if test "$GCC" = yes; then ++ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' ++ else ++ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ fi ++ hardcode_libdir_flag_spec_GCJ='-R$libdir' ++ hardcode_shlibpath_var_GCJ=no ++ case $host_os in ++ solaris2.[0-5] | solaris2.[0-5].*) ;; ++ *) # Supported since Solaris 2.6 (maybe 2.5.1?) ++ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + esac +- fi +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_shlibpath_var=no +- case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; +- esac +- link_all_deplibs=yes +- ;; ++ link_all_deplibs_GCJ=yes ++ ;; + +- sunos4*) +- if test "x$host_vendor" = xsequent; then +- # Use $CC to link under sequent, because it throws in some extra .o +- # files that make .init and .fini sections work. +- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' +- fi +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; ++ sunos4*) ++ if test "x$host_vendor" = xsequent; then ++ # Use $CC to link under sequent, because it throws in some extra .o ++ # files that make .init and .fini sections work. ++ archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_direct_GCJ=yes ++ hardcode_minus_L_GCJ=yes ++ hardcode_shlibpath_var_GCJ=no ++ ;; + +- sysv4) +- if test "x$host_vendor" = xsno; then +- archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes # is this really true??? +- else +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=no #Motorola manual says yes, but my tests say they lie +- fi +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- ;; ++ sysv4) ++ case $host_vendor in ++ sni) ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_GCJ=yes # is this really true??? ++ ;; ++ siemens) ++ ## LD is ld it makes a PLAMLIB ++ ## CC just makes a GrossModule. ++ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ reload_cmds_GCJ='$CC -r -o $output$reload_objs' ++ hardcode_direct_GCJ=no ++ ;; ++ motorola) ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ++ ;; ++ esac ++ runpath_var='LD_RUN_PATH' ++ hardcode_shlibpath_var_GCJ=no ++ ;; + +- sysv4.3*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- export_dynamic_flag_spec='-Bexport' +- ;; +- +- sysv5*) +- no_undefined_flag=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- hardcode_libdir_flag_spec= +- hardcode_shlibpath_var=no +- runpath_var='LD_RUN_PATH' +- ;; +- +- uts4*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; ++ sysv4.3*) ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var_GCJ=no ++ export_dynamic_flag_spec_GCJ='-Bexport' ++ ;; + +- dgux*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; ++ sysv4*MP*) ++ if test -d /usr/nec; then ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_shlibpath_var_GCJ=no ++ runpath_var=LD_RUN_PATH ++ hardcode_runpath_var=yes ++ ld_shlibs_GCJ=yes ++ fi ++ ;; + +- sysv4*MP*) +- if test -d /usr/nec; then +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH ++ sysv4.2uw2*) ++ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_direct_GCJ=yes ++ hardcode_minus_L_GCJ=no ++ hardcode_shlibpath_var_GCJ=no + hardcode_runpath_var=yes +- ld_shlibs=yes +- fi +- ;; +- +- sysv4.2uw2*) +- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_minus_L=no +- hardcode_shlibpath_var=no +- hardcode_runpath_var=yes +- runpath_var=LD_RUN_PATH +- ;; ++ runpath_var=LD_RUN_PATH ++ ;; + +- sysv5uw7* | unixware7*) +- no_undefined_flag='${wl}-z ${wl}text' +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- ;; ++ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ++ no_undefined_flag_GCJ='${wl}-z ${wl}text' ++ if test "$GCC" = yes; then ++ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi ++ runpath_var='LD_RUN_PATH' ++ hardcode_shlibpath_var_GCJ=no ++ ;; + +- *) +- ld_shlibs=no +- ;; +- esac +-fi +-echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +-echo "${ECHO_T}$ld_shlibs" >&6 +-test "$ld_shlibs" = no && can_build_shared=no ++ sysv5*) ++ no_undefined_flag_GCJ=' -z text' ++ # $CC -shared without GNU ld will not create a library from C++ ++ # object files and a static libstdc++, better avoid it by now ++ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ ++ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' ++ hardcode_libdir_flag_spec_GCJ= ++ hardcode_shlibpath_var_GCJ=no ++ runpath_var='LD_RUN_PATH' ++ ;; + +-# Check hardcoding attributes. +-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +-hardcode_action= +-if test -n "$hardcode_libdir_flag_spec" || \ +- test -n "$runpath_var"; then ++ uts4*) ++ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' ++ hardcode_libdir_flag_spec_GCJ='-L$libdir' ++ hardcode_shlibpath_var_GCJ=no ++ ;; + +- # We can hardcode non-existant directories. +- if test "$hardcode_direct" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$hardcode_shlibpath_var" != no && +- test "$hardcode_minus_L" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action=immediate ++ *) ++ ld_shlibs_GCJ=no ++ ;; ++ esac + fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action=unsupported +-fi +-echo "$as_me:$LINENO: result: $hardcode_action" >&5 +-echo "${ECHO_T}$hardcode_action" >&6 + +-striplib= +-old_striplib= +-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- echo "$as_me:$LINENO: result: yes" >&5 +-echo "${ECHO_T}yes" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 ++echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 ++echo "${ECHO_T}$ld_shlibs_GCJ" >&6 ++test "$ld_shlibs_GCJ" = no && can_build_shared=no ++ ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + fi + +-reload_cmds='$LD$reload_flag -o $output$reload_objs' +-test -z "$deplibs_check_method" && deplibs_check_method=unknown ++# ++# Do we need to explicitly link libc? ++# ++case "x$archive_cmds_need_lc_GCJ" in ++x|xyes) ++ # Assume -lc should be added ++ archive_cmds_need_lc_GCJ=yes ++ ++ if test "$enable_shared" = yes && test "$GCC" = yes; then ++ case $archive_cmds_GCJ in ++ *'~'*) ++ # FIXME: we may have to deal with multi-command sequences. ++ ;; ++ '$CC '*) ++ # Test whether the compiler implicitly links with -lc since on some ++ # systems, -lgcc has to come before -lc. If gcc already passes -lc ++ # to ld, don't add -lc before -lgcc. ++ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 ++echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 ++ $rm conftest* ++ printf "$lt_simple_compile_test_code" > conftest.$ac_ext ++ ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } 2>conftest.err; then ++ soname=conftest ++ lib=conftest ++ libobjs=conftest.$ac_objext ++ deplibs= ++ wl=$lt_prog_compiler_wl_GCJ ++ compiler_flags=-v ++ linker_flags=-v ++ verstring= ++ output_objdir=. ++ libname=conftest ++ lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ ++ allow_undefined_flag_GCJ= ++ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 ++ (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++ then ++ archive_cmds_need_lc_GCJ=no ++ else ++ archive_cmds_need_lc_GCJ=yes ++ fi ++ allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag ++ else ++ cat conftest.err 1>&5 ++ fi ++ $rm conftest* ++ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 ++echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 ++ ;; ++ esac ++ fi ++ ;; ++esac + +-# PORTME Fill in your ld.so characteristics + echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 + echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 + library_names_spec= + libname_spec='lib$name' + soname_spec= ++shrext_cmds=".so" + postinstall_cmds= + postuninstall_cmds= + finish_cmds= +@@ -6324,23 +17305,45 @@ + version_type=none + dynamic_linker="$host_os ld.so" + sys_lib_dlsearch_path_spec="/lib /usr/lib" +-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" ++if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then ++ # if the path contains ";" then we assume it to be the separator ++ # otherwise default to the standard path separator (i.e. ":") - it is ++ # assumed that no part of a normal pathname contains ";" but that should ++ # okay in the real world where ";" in dirpaths is itself problematic. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++else ++ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" ++fi ++need_lib_prefix=unknown ++hardcode_into_libs=no ++ ++# when you set need_version to no, make sure it does not cause -set_version ++# flags to be left without arguments ++need_version=unknown + + case $host_os in + aix3*) + version_type=linux +- library_names_spec='${libname}${release}.so$versuffix $libname.a' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + +- # AIX has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}.so$major' ++ # AIX 3 has no versioning support, so we append a major version to the name. ++ soname_spec='${libname}${release}${shared_ext}$major' + ;; + + aix4* | aix5*) + version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 +- library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' ++ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file +@@ -6350,29 +17353,28 @@ + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) +- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' +- echo ' yes ' +- echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then +- : +- else +- can_build_shared=no +- fi +- ;; ++ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' ++ echo ' yes ' ++ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then ++ : ++ else ++ can_build_shared=no ++ fi ++ ;; + esac +- # AIX (on Power*) has no versioning support, so currently we can +- # not hardcode correct soname into executable. Probably we can +- # add versioning support to collect2, so additional links can +- # be useful in future. ++ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct ++ # soname into executable. Probably we can add versioning support to ++ # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' +- soname_spec='${libname}${release}.so$major' ++ soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi +@@ -6381,25 +17383,24 @@ + amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' ++ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + + beos*) +- library_names_spec='${libname}.so' ++ library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +-bsdi4*) ++bsdi[45]*) + version_type=linux + need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs +@@ -6407,29 +17408,79 @@ + + cygwin* | mingw* | pw32*) + version_type=windows ++ shrext_cmds=".dll" + need_version=no + need_lib_prefix=no ++ + case $GCC,$host_os in +- yes,cygwin*) ++ yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' +- postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ +- $install_prog .libs/$dlname \$dldir/$dlname' +- postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ $install_prog $dir/$dlname \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' ++ shlibpath_overrides_runpath=yes ++ ++ case $host_os in ++ cygwin*) ++ # Cygwin DLLs use 'cyg' prefix rather than 'lib' ++ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ++ ;; ++ mingw*) ++ # MinGW DLLs use traditional 'lib' prefix ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then ++ # It is most probably a Windows format PATH printed by ++ # mingw gcc, but we are running on Cygwin. Gcc prints its search ++ # path with ; separators, and with drive letters. We can handle the ++ # drive letters (cygwin fileutils understands them), so leave them, ++ # especially as we might pass files found there to a mingw objdump, ++ # which wouldn't understand a cygwinified path. Ahh. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++ ;; ++ pw32*) ++ # pw32 DLLs use 'pw' prefix rather than 'lib' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ++ ;; ++ esac + ;; +- yes,mingw*) +- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' +- sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` +- ;; +- yes,pw32*) +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll' ++ ++ linux*) ++ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ ++cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++$echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ else ++ $archive_expsym_cmds="$archive_cmds" ++ fi ++ else ++ ld_shlibs=no ++ fi + ;; ++ + *) +- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' ++ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' +@@ -6442,30 +17493,56 @@ + version_type=darwin + need_lib_prefix=no + need_version=no +- # FIXME: Relying on posixy $() will cause problems for +- # cross-compilation, but unfortunately the echo tests do not +- # yet detect zsh echo's removal of \ escapes. +- library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' +- soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' ++ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' ++ soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH ++ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. ++ if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` ++ else ++ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' ++ fi ++ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ++ ;; ++ ++dgux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH + ;; + + freebsd1*) + dynamic_linker=no + ;; + ++kfreebsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; ++ + freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) +- library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac +@@ -6474,7 +17551,11 @@ + freebsd2*) + shlibpath_overrides_runpath=yes + ;; +- *) ++ freebsd3.01* | freebsdelf3.01*) ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; +@@ -6485,8 +17566,8 @@ + version_type=linux + need_lib_prefix=no + need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' +- soname_spec='${libname}${release}.so$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; +@@ -6494,33 +17575,75 @@ + hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. +- dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' +- soname_spec='${libname}${release}.sl$major' ++ case "$host_cpu" in ++ ia64*) ++ shrext_cmds='.so' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.so" ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ if test "X$HPUX_IA64_MODE" = X32; then ++ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" ++ else ++ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" ++ fi ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ hppa*64*) ++ shrext_cmds='.sl' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ *) ++ shrext_cmds='.sl' ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=SHLIB_PATH ++ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +-irix5* | irix6*) +- version_type=irix ++irix5* | irix6* | nonstopux*) ++ case $host_os in ++ nonstopux*) version_type=nonstopux ;; ++ *) ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ version_type=linux ++ else ++ version_type=irix ++ fi ;; ++ esac + need_lib_prefix=no + need_version=no +- soname_spec='${libname}${release}.so$major' +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in +- irix5*) ++ irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; ++ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") ++ libsuff= shlibsuff= libmagic=32-bit;; ++ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") ++ libsuff=32 shlibsuff=N32 libmagic=N32;; ++ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") ++ libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; +@@ -6529,20 +17652,21 @@ + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ++ hardcode_into_libs=yes + ;; + + # No shared lib support for Linux oldld, aout, or coff. +-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) ++linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + version_type=linux + need_lib_prefix=no + need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no +@@ -6551,6 +17675,19 @@ + # before this can be enabled. + hardcode_into_libs=yes + ++ # Append ld.so.conf contents to the search path ++ if test -f /etc/ld.so.conf; then ++ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` ++ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ fi ++ ++ case $host_cpu:$lt_cv_cc_64bit_output in ++ powerpc64:yes | s390x:yes | sparc64:yes | x86_64:yes) ++ sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64" ++ sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64 /usr/X11R6/lib64" ++ ;; ++ esac ++ + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, +@@ -6558,6 +17695,42 @@ + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' ++ ++ # Find out which ABI we are using (multilib Linux x86_64 hack). ++ libsuff= ++ case "$host_cpu" in ++ x86_64*) ++ echo '#line 17703 "configure"' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ *) ++ ;; ++ esac ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ ;; ++ ++knetbsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' + ;; + + netbsd*) +@@ -6565,12 +17738,12 @@ + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' +- soname_spec='${libname}${release}.so$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH +@@ -6580,7 +17753,17 @@ + + newsos6) + version_type=linux +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; ++ ++nto-qnx*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; +@@ -6589,36 +17772,38 @@ + version_type=sunos + need_lib_prefix=no + need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case "$host_os" in +- openbsd2.[89] | openbsd2.[89].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac ++ case $host_os in ++ openbsd2.[89] | openbsd2.[89].*) ++ shlibpath_overrides_runpath=no ++ ;; ++ *) ++ shlibpath_overrides_runpath=yes ++ ;; ++ esac + else + shlibpath_overrides_runpath=yes + fi +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH + ;; + + os2*) + libname_spec='$name' ++ shrext_cmds=".dll" + need_lib_prefix=no +- library_names_spec='$libname.dll $libname.a' ++ library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + + osf3* | osf4* | osf5*) + version_type=osf ++ need_lib_prefix=no + need_version=no +- soname_spec='${libname}${release}.so' +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +@@ -6626,8 +17811,8 @@ + + sco3.2v5*) + version_type=osf +- soname_spec='${libname}${release}.so$major' +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +@@ -6635,8 +17820,8 @@ + version_type=linux + need_lib_prefix=no + need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes +@@ -6646,7 +17831,7 @@ + + sunos4*) + version_type=sunos +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes +@@ -6658,12 +17843,18 @@ + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no ++ need_lib_prefix=no ++ export_dynamic_flag_spec='${wl}-Blargedynsym' ++ runpath_var=LD_RUN_PATH ++ ;; ++ siemens) ++ need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no +@@ -6674,31 +17865,22 @@ + esac + ;; + +-uts4*) +- version_type=linux +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-dgux*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- + sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux +- library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' +- soname_spec='$libname.so.$major' ++ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' ++ soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + ++uts4*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ + *) + dynamic_linker=no + ;; +@@ -6707,44 +17889,35 @@ + echo "${ECHO_T}$dynamic_linker" >&6 + test "$dynamic_linker" = no && can_build_shared=no + +-# Report the final consequences. +-echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +-echo "$as_me:$LINENO: result: $can_build_shared" >&5 +-echo "${ECHO_T}$can_build_shared" >&6 +- +-echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +-test "$can_build_shared" = "no" && enable_shared=no +- +-# On AIX, shared libraries and static libraries use the same namespace, and +-# are all built from PIC. +-case "$host_os" in +-aix3*) +- test "$enable_shared" = yes && enable_static=no +- if test -n "$RANLIB"; then +- archive_cmds="$archive_cmds~\$RANLIB \$lib" +- postinstall_cmds='$RANLIB $lib' +- fi +- ;; ++echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 ++echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 ++hardcode_action_GCJ= ++if test -n "$hardcode_libdir_flag_spec_GCJ" || \ ++ test -n "$runpath_var_GCJ" || \ ++ test "X$hardcode_automatic_GCJ" = "Xyes" ; then + +-aix4*) +- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then +- test "$enable_shared" = yes && enable_static=no ++ # We can hardcode non-existant directories. ++ if test "$hardcode_direct_GCJ" != no && ++ # If the only mechanism to avoid hardcoding is shlibpath_var, we ++ # have to relink, otherwise we might link with an installed library ++ # when we should be linking with a yet-to-be-installed one ++ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && ++ test "$hardcode_minus_L_GCJ" != no; then ++ # Linking always hardcodes the temporary library directory. ++ hardcode_action_GCJ=relink ++ else ++ # We can link without hardcoding, and we can hardcode nonexisting dirs. ++ hardcode_action_GCJ=immediate + fi +- ;; +-esac +-echo "$as_me:$LINENO: result: $enable_shared" >&5 +-echo "${ECHO_T}$enable_shared" >&6 +- +-echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +-# Make sure either enable_shared or enable_static is yes. +-test "$enable_shared" = yes || enable_static=yes +-echo "$as_me:$LINENO: result: $enable_static" >&5 +-echo "${ECHO_T}$enable_static" >&6 ++else ++ # We cannot hardcode anything, or else we can only hardcode existing ++ # directories. ++ hardcode_action_GCJ=unsupported ++fi ++echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 ++echo "${ECHO_T}$hardcode_action_GCJ" >&6 + +-if test "$hardcode_action" = relink; then ++if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no + elif test "$shlibpath_overrides_runpath" = yes || +@@ -6753,9 +17926,33 @@ + enable_fast_install=needless + fi + +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++striplib= ++old_striplib= ++echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 ++echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 ++if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then ++ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" ++ test -z "$striplib" && striplib="$STRIP --strip-unneeded" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++else ++# FIXME - insert some real tests, host_os isn't really good enough ++ case $host_os in ++ darwin*) ++ if test -n "$STRIP" ; then ++ striplib="$STRIP -x" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ;; ++ *) ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ ;; ++ esac + fi + + if test "x$enable_dlopen" != xyes; then +@@ -6773,11 +17970,94 @@ + lt_cv_dlopen_self=yes + ;; + +- cygwin* | mingw* | pw32*) ++ mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + ++ cygwin*) ++ lt_cv_dlopen="dlopen" ++ lt_cv_dlopen_libs= ++ ;; ++ ++ darwin*) ++ # if libdl is installed we need to link against it ++ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 ++echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 ++if test "${ac_cv_lib_dl_dlopen+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-ldl $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dlopen (); ++int ++main () ++{ ++dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dl_dlopen=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dl_dlopen=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 ++echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 ++if test $ac_cv_lib_dl_dlopen = yes; then ++ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" ++else ++ ++ lt_cv_dlopen="dyld" ++ lt_cv_dlopen_libs= ++ lt_cv_dlopen_self=yes ++ ++fi ++ ++ ;; ++ + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 + echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +@@ -6785,49 +18065,73 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define shl_load to an innocuous variant, in case declares shl_load. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define shl_load innocuous_shl_load ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char shl_load (); below. */ +-#include ++ which can conflict with char shl_load (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef shl_load ++ + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" ++{ + #endif + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char shl_load (); +-char (*f) (); +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_shl_load) || defined (__stub___shl_load) + choke me + #else +-f = shl_load; ++char (*f) () = shl_load; ++#endif ++#ifdef __cplusplus ++} + #endif + ++int ++main () ++{ ++return f != shl_load; + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -6836,10 +18140,12 @@ + ac_cv_func_shl_load=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_func_shl_load=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 + echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +@@ -6854,8 +18160,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldld $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -6864,12 +18173,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char shl_load (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -6880,11 +18183,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -6893,10 +18206,12 @@ + ac_cv_lib_dld_shl_load=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_dld_shl_load=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +@@ -6910,49 +18225,73 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define dlopen to an innocuous variant, in case declares dlopen. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define dlopen innocuous_dlopen ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char dlopen (); below. */ +-#include ++ which can conflict with char dlopen (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef dlopen ++ + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" ++{ + #endif + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char dlopen (); +-char (*f) (); +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_dlopen) || defined (__stub___dlopen) + choke me + #else +-f = dlopen; ++char (*f) () = dlopen; ++#endif ++#ifdef __cplusplus ++} + #endif + ++int ++main () ++{ ++return f != dlopen; + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -6961,10 +18300,12 @@ + ac_cv_func_dlopen=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_func_dlopen=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 + echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +@@ -6979,8 +18320,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldl $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -6989,12 +18333,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char dlopen (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -7005,11 +18343,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -7018,10 +18366,12 @@ + ac_cv_lib_dl_dlopen=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_dl_dlopen=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +@@ -7037,8 +18387,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lsvld $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -7047,12 +18400,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char dlopen (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -7063,11 +18410,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -7076,10 +18433,12 @@ + ac_cv_lib_svld_dlopen=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_svld_dlopen=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +@@ -7095,8 +18454,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldld $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -7105,12 +18467,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char dld_link (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -7121,11 +18477,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -7134,10 +18500,12 @@ + ac_cv_lib_dld_dld_link=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_dld_dld_link=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +@@ -7173,7 +18541,7 @@ + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" +- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" ++ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +@@ -7189,10 +18557,10 @@ + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross + else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 ++ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < conftest.$ac_ext <&5 +-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +- fi ++fi ++echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 ++echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 ++ fi ++ ++ CPPFLAGS="$save_CPPFLAGS" ++ LDFLAGS="$save_LDFLAGS" ++ LIBS="$save_LIBS" ++ ;; ++ esac ++ ++ case $lt_cv_dlopen_self in ++ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; ++ *) enable_dlopen_self=unknown ;; ++ esac ++ ++ case $lt_cv_dlopen_self_static in ++ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; ++ *) enable_dlopen_self_static=unknown ;; ++ esac ++fi ++ ++ ++# The else clause should only fire when bootstrapping the ++# libtool distribution, otherwise you forgot to ship ltmain.sh ++# with your package, and you will get complaints that there are ++# no rules to generate ltmain.sh. ++if test -f "$ltmain"; then ++ # See if we are running on zsh, and set the options which allow our commands through ++ # without removal of \ escapes. ++ if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++ fi ++ # Now quote all the things that may contain metacharacters while being ++ # careful not to overquote the AC_SUBSTed values. We take copies of the ++ # variables and quote the copies for generation of the libtool script. ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ SED SHELL STRIP \ ++ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ ++ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ ++ deplibs_check_method reload_flag reload_cmds need_locks \ ++ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ ++ lt_cv_sys_global_symbol_to_c_name_address \ ++ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ ++ old_postinstall_cmds old_postuninstall_cmds \ ++ compiler_GCJ \ ++ CC_GCJ \ ++ LD_GCJ \ ++ lt_prog_compiler_wl_GCJ \ ++ lt_prog_compiler_pic_GCJ \ ++ lt_prog_compiler_static_GCJ \ ++ lt_prog_compiler_no_builtin_flag_GCJ \ ++ export_dynamic_flag_spec_GCJ \ ++ thread_safe_flag_spec_GCJ \ ++ whole_archive_flag_spec_GCJ \ ++ enable_shared_with_static_runtimes_GCJ \ ++ old_archive_cmds_GCJ \ ++ old_archive_from_new_cmds_GCJ \ ++ predep_objects_GCJ \ ++ postdep_objects_GCJ \ ++ predeps_GCJ \ ++ postdeps_GCJ \ ++ compiler_lib_search_path_GCJ \ ++ archive_cmds_GCJ \ ++ archive_expsym_cmds_GCJ \ ++ postinstall_cmds_GCJ \ ++ postuninstall_cmds_GCJ \ ++ old_archive_from_expsyms_cmds_GCJ \ ++ allow_undefined_flag_GCJ \ ++ no_undefined_flag_GCJ \ ++ export_symbols_cmds_GCJ \ ++ hardcode_libdir_flag_spec_GCJ \ ++ hardcode_libdir_flag_spec_ld_GCJ \ ++ hardcode_libdir_separator_GCJ \ ++ hardcode_automatic_GCJ \ ++ module_cmds_GCJ \ ++ module_expsym_cmds_GCJ \ ++ lt_cv_prog_compiler_c_o_GCJ \ ++ exclude_expsyms_GCJ \ ++ include_expsyms_GCJ; do ++ ++ case $var in ++ old_archive_cmds_GCJ | \ ++ old_archive_from_new_cmds_GCJ | \ ++ archive_cmds_GCJ | \ ++ archive_expsym_cmds_GCJ | \ ++ module_cmds_GCJ | \ ++ module_expsym_cmds_GCJ | \ ++ old_archive_from_expsyms_cmds_GCJ | \ ++ export_symbols_cmds_GCJ | \ ++ extract_expsyms_cmds | reload_cmds | finish_cmds | \ ++ postinstall_cmds | postuninstall_cmds | \ ++ old_postinstall_cmds | old_postuninstall_cmds | \ ++ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) ++ # Double-quote double-evaled strings. ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ++ ;; ++ *) ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ++ ;; ++ esac ++ done ++ ++ case $lt_echo in ++ *'\$0 --fallback-echo"') ++ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ++ ;; ++ esac ++ ++cfgfile="$ofile" ++ ++ cat <<__EOF__ >> "$cfgfile" ++# ### BEGIN LIBTOOL TAG CONFIG: $tagname ++ ++# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: ++ ++# Shell to use when invoking shell scripts. ++SHELL=$lt_SHELL ++ ++# Whether or not to build shared libraries. ++build_libtool_libs=$enable_shared ++ ++# Whether or not to build static libraries. ++build_old_libs=$enable_static ++ ++# Whether or not to add -lc for building shared libraries. ++build_libtool_need_lc=$archive_cmds_need_lc_GCJ ++ ++# Whether or not to disallow shared libs when runtime libs are static ++allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ ++ ++# Whether or not to optimize for fast installation. ++fast_install=$enable_fast_install ++ ++# The host system. ++host_alias=$host_alias ++host=$host ++ ++# An echo program that does not interpret backslashes. ++echo=$lt_echo ++ ++# The archiver. ++AR=$lt_AR ++AR_FLAGS=$lt_AR_FLAGS ++ ++# A C compiler. ++LTCC=$lt_LTCC ++ ++# A language-specific compiler. ++CC=$lt_compiler_GCJ ++ ++# Is the compiler the GNU C compiler? ++with_gcc=$GCC_GCJ ++ ++# An ERE matcher. ++EGREP=$lt_EGREP ++ ++# The linker used to build libraries. ++LD=$lt_LD_GCJ ++ ++# Whether we need hard or soft links. ++LN_S=$lt_LN_S ++ ++# A BSD-compatible nm program. ++NM=$lt_NM ++ ++# A symbol stripping program ++STRIP=$lt_STRIP ++ ++# Used to examine libraries when file_magic_cmd begins "file" ++MAGIC_CMD=$MAGIC_CMD ++ ++# Used on cygwin: DLL creation program. ++DLLTOOL="$DLLTOOL" ++ ++# Used on cygwin: object dumper. ++OBJDUMP="$OBJDUMP" ++ ++# Used on cygwin: assembler. ++AS="$AS" ++ ++# The name of the directory that contains temporary libtool files. ++objdir=$objdir ++ ++# How to create reloadable object files. ++reload_flag=$lt_reload_flag ++reload_cmds=$lt_reload_cmds ++ ++# How to pass a linker flag through the compiler. ++wl=$lt_lt_prog_compiler_wl_GCJ ++ ++# Object file suffix (normally "o"). ++objext="$ac_objext" ++ ++# Old archive suffix (normally "a"). ++libext="$libext" ++ ++# Shared library suffix (normally ".so"). ++shrext_cmds='$shrext_cmds' ++ ++# Executable file suffix (normally ""). ++exeext="$exeext" ++ ++# Additional compiler flags for building library objects. ++pic_flag=$lt_lt_prog_compiler_pic_GCJ ++pic_mode=$pic_mode ++ ++# What is the maximum length of a command? ++max_cmd_len=$lt_cv_sys_max_cmd_len ++ ++# Does compiler simultaneously support -c and -o options? ++compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ ++ ++# Must we lock files when doing compilation ? ++need_locks=$lt_need_locks ++ ++# Do we need the lib prefix for modules? ++need_lib_prefix=$need_lib_prefix ++ ++# Do we need a version for libraries? ++need_version=$need_version ++ ++# Whether dlopen is supported. ++dlopen_support=$enable_dlopen ++ ++# Whether dlopen of programs is supported. ++dlopen_self=$enable_dlopen_self ++ ++# Whether dlopen of statically linked programs is supported. ++dlopen_self_static=$enable_dlopen_self_static ++ ++# Compiler flag to prevent dynamic linking. ++link_static_flag=$lt_lt_prog_compiler_static_GCJ ++ ++# Compiler flag to turn off builtin functions. ++no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ ++ ++# Compiler flag to allow reflexive dlopens. ++export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ ++ ++# Compiler flag to generate shared objects directly from archives. ++whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ ++ ++# Compiler flag to generate thread-safe objects. ++thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ ++ ++# Library versioning type. ++version_type=$version_type ++ ++# Format of library name prefix. ++libname_spec=$lt_libname_spec ++ ++# List of archive names. First name is the real one, the rest are links. ++# The last name is the one that the linker finds with -lNAME. ++library_names_spec=$lt_library_names_spec ++ ++# The coded name of the library, if different from the real name. ++soname_spec=$lt_soname_spec ++ ++# Commands used to build and install an old-style archive. ++RANLIB=$lt_RANLIB ++old_archive_cmds=$lt_old_archive_cmds_GCJ ++old_postinstall_cmds=$lt_old_postinstall_cmds ++old_postuninstall_cmds=$lt_old_postuninstall_cmds ++ ++# Create an old-style archive from a shared archive. ++old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ ++ ++# Create a temporary old-style archive to link instead of a shared archive. ++old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ ++ ++# Commands used to build and install a shared archive. ++archive_cmds=$lt_archive_cmds_GCJ ++archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ ++postinstall_cmds=$lt_postinstall_cmds ++postuninstall_cmds=$lt_postuninstall_cmds ++ ++# Commands used to build a loadable module (assumed same as above if empty) ++module_cmds=$lt_module_cmds_GCJ ++module_expsym_cmds=$lt_module_expsym_cmds_GCJ ++ ++# Commands to strip libraries. ++old_striplib=$lt_old_striplib ++striplib=$lt_striplib ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predep_objects=$lt_predep_objects_GCJ ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdep_objects=$lt_postdep_objects_GCJ ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predeps=$lt_predeps_GCJ ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdeps=$lt_postdeps_GCJ ++ ++# The library search path used internally by the compiler when linking ++# a shared library. ++compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ ++ ++# Method to check whether dependent libraries are shared objects. ++deplibs_check_method=$lt_deplibs_check_method ++ ++# Command to use when deplibs_check_method == file_magic. ++file_magic_cmd=$lt_file_magic_cmd ++ ++# Flag that allows shared libraries with undefined symbols to be built. ++allow_undefined_flag=$lt_allow_undefined_flag_GCJ ++ ++# Flag that forces no undefined symbols. ++no_undefined_flag=$lt_no_undefined_flag_GCJ ++ ++# Commands used to finish a libtool library installation in a directory. ++finish_cmds=$lt_finish_cmds ++ ++# Same as above, but a single script fragment to be evaled but not shown. ++finish_eval=$lt_finish_eval ++ ++# Take the output of nm and produce a listing of raw symbols and C names. ++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe ++ ++# Transform the output of nm in a proper C declaration ++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl ++ ++# Transform the output of nm in a C name address pair ++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address ++ ++# This is the shared library runtime path variable. ++runpath_var=$runpath_var ++ ++# This is the shared library path variable. ++shlibpath_var=$shlibpath_var ++ ++# Is shlibpath searched before the hard-coded library search path? ++shlibpath_overrides_runpath=$shlibpath_overrides_runpath ++ ++# How to hardcode a shared library path into an executable. ++hardcode_action=$hardcode_action_GCJ ++ ++# Whether we should hardcode library paths into libraries. ++hardcode_into_libs=$hardcode_into_libs ++ ++# Flag to hardcode \$libdir into a binary during linking. ++# This must work even if \$libdir does not exist. ++hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ ++ ++# If ld is used when linking, flag to hardcode \$libdir into ++# a binary during linking. This must work even if \$libdir does ++# not exist. ++hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ ++ ++# Whether we need a single -rpath flag with a separated argument. ++hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ ++ ++# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the ++# resulting binary. ++hardcode_direct=$hardcode_direct_GCJ ++ ++# Set to yes if using the -LDIR flag during linking hardcodes DIR into the ++# resulting binary. ++hardcode_minus_L=$hardcode_minus_L_GCJ ++ ++# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into ++# the resulting binary. ++hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ ++ ++# Set to yes if building a shared library automatically hardcodes DIR into the library ++# and all subsequent libraries and executables linked against it. ++hardcode_automatic=$hardcode_automatic_GCJ ++ ++# Variables whose values should be saved in libtool wrapper scripts and ++# restored at relink time. ++variables_saved_for_relink="$variables_saved_for_relink" ++ ++# Whether libtool must link a program against all its dependency libraries. ++link_all_deplibs=$link_all_deplibs_GCJ + +- CPPFLAGS="$save_CPPFLAGS" +- LDFLAGS="$save_LDFLAGS" +- LIBS="$save_LIBS" +- ;; +- esac ++# Compile-time system search path for libraries ++sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +- case $lt_cv_dlopen_self in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac ++# Run-time system search path for libraries ++sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +- case $lt_cv_dlopen_self_static in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac +-fi ++# Fix the shell variable \$srcfile for the compiler. ++fix_srcfile_path="$fix_srcfile_path_GCJ" + ++# Set to yes if exported symbols are required. ++always_export_symbols=$always_export_symbols_GCJ + +-if test "$enable_shared" = yes && test "$GCC" = yes; then +- case $archive_cmds in +- *'~'*) +- # FIXME: we may have to deal with multi-command sequences. +- ;; +- '$CC '*) +- # Test whether the compiler implicitly links with -lc since on some +- # systems, -lgcc has to come before -lc. If gcc already passes -lc +- # to ld, don't add -lc before -lgcc. +- echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 +- if test "${lt_cv_archive_cmds_need_lc+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- $rm conftest* +- echo 'static int dummy;' > conftest.$ac_ext ++# The commands to list exported symbols. ++export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$lt_cv_prog_cc_wl +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- save_allow_undefined_flag=$allow_undefined_flag +- allow_undefined_flag= +- if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 +- (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } +- then +- lt_cv_archive_cmds_need_lc=no +- else +- lt_cv_archive_cmds_need_lc=yes +- fi +- allow_undefined_flag=$save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +-fi ++# The commands to extract the exported symbol list from a shared archive. ++extract_expsyms_cmds=$lt_extract_expsyms_cmds ++ ++# Symbols that should not be listed in the preloaded symbols. ++exclude_expsyms=$lt_exclude_expsyms_GCJ ++ ++# Symbols that must always be exported. ++include_expsyms=$lt_include_expsyms_GCJ ++ ++# ### END LIBTOOL TAG CONFIG: $tagname ++ ++__EOF__ + +- echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5 +-echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6 +- ;; +- esac +-fi +-need_lc=${lt_cv_archive_cmds_need_lc-yes} + +-# The second clause should only fire when bootstrapping the +-# libtool distribution, otherwise you forgot to ship ltmain.sh +-# with your package, and you will get complaints that there are +-# no rules to generate ltmain.sh. +-if test -f "$ltmain"; then +- : + else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. +- test -f Makefile && make "$ltmain" ++ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` ++ if test -f "$ltmain_in"; then ++ test -f Makefile && make "$ltmain" ++ fi + fi + +-if test -f "$ltmain"; then +- trap "$rm \"${ofile}T\"; exit 1" 1 2 15 +- $rm -f "${ofile}T" + +- echo creating $ofile ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++CC="$lt_save_CC" ++ ++ else ++ tagname="" ++ fi ++ ;; ++ ++ RC) ++ ++ ++ ++# Source file extension for RC test sources. ++ac_ext=rc + ++# Object file extension for compiled RC test sources. ++objext=o ++objext_RC=$objext ++ ++# Code to be used in simple compile tests ++lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' ++ ++# Code to be used in simple link tests ++lt_simple_link_test_code="$lt_simple_compile_test_code" ++ ++# ltmain only uses $CC for tagged configurations so make sure $CC is set. ++ ++# If no C compiler was specified, use CC. ++LTCC=${LTCC-"$CC"} ++ ++# Allow CC to be a program name with arguments. ++compiler=$CC ++ ++ ++# Allow CC to be a program name with arguments. ++lt_save_CC="$CC" ++CC=${RC-"windres"} ++compiler=$CC ++compiler_RC=$CC ++lt_cv_prog_compiler_c_o_RC=yes ++ ++# The else clause should only fire when bootstrapping the ++# libtool distribution, otherwise you forgot to ship ltmain.sh ++# with your package, and you will get complaints that there are ++# no rules to generate ltmain.sh. ++if test -f "$ltmain"; then ++ # See if we are running on zsh, and set the options which allow our commands through ++ # without removal of \ escapes. ++ if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++ fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS \ +- AR AR_FLAGS CC LD LN_S NM SHELL \ +- reload_flag reload_cmds wl \ +- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ +- thread_safe_flag_spec whole_archive_flag_spec libname_spec \ +- library_names_spec soname_spec \ +- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ +- old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ +- postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ +- old_striplib striplib file_magic_cmd export_symbols_cmds \ +- deplibs_check_method allow_undefined_flag no_undefined_flag \ +- finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ +- global_symbol_to_c_name_address \ +- hardcode_libdir_flag_spec hardcode_libdir_separator \ ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ SED SHELL STRIP \ ++ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ ++ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ ++ deplibs_check_method reload_flag reload_cmds need_locks \ ++ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ ++ lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ +- compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do ++ old_postinstall_cmds old_postuninstall_cmds \ ++ compiler_RC \ ++ CC_RC \ ++ LD_RC \ ++ lt_prog_compiler_wl_RC \ ++ lt_prog_compiler_pic_RC \ ++ lt_prog_compiler_static_RC \ ++ lt_prog_compiler_no_builtin_flag_RC \ ++ export_dynamic_flag_spec_RC \ ++ thread_safe_flag_spec_RC \ ++ whole_archive_flag_spec_RC \ ++ enable_shared_with_static_runtimes_RC \ ++ old_archive_cmds_RC \ ++ old_archive_from_new_cmds_RC \ ++ predep_objects_RC \ ++ postdep_objects_RC \ ++ predeps_RC \ ++ postdeps_RC \ ++ compiler_lib_search_path_RC \ ++ archive_cmds_RC \ ++ archive_expsym_cmds_RC \ ++ postinstall_cmds_RC \ ++ postuninstall_cmds_RC \ ++ old_archive_from_expsyms_cmds_RC \ ++ allow_undefined_flag_RC \ ++ no_undefined_flag_RC \ ++ export_symbols_cmds_RC \ ++ hardcode_libdir_flag_spec_RC \ ++ hardcode_libdir_flag_spec_ld_RC \ ++ hardcode_libdir_separator_RC \ ++ hardcode_automatic_RC \ ++ module_cmds_RC \ ++ module_expsym_cmds_RC \ ++ lt_cv_prog_compiler_c_o_RC \ ++ exclude_expsyms_RC \ ++ include_expsyms_RC; do + + case $var in +- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ +- old_postinstall_cmds | old_postuninstall_cmds | \ +- export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ +- extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ ++ old_archive_cmds_RC | \ ++ old_archive_from_new_cmds_RC | \ ++ archive_cmds_RC | \ ++ archive_expsym_cmds_RC | \ ++ module_cmds_RC | \ ++ module_expsym_cmds_RC | \ ++ old_archive_from_expsyms_cmds_RC | \ ++ export_symbols_cmds_RC | \ ++ extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ +- finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) ++ old_postinstall_cmds | old_postuninstall_cmds | \ ++ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; +@@ -7506,43 +19287,16 @@ + esac + done + +- cat <<__EOF__ > "${ofile}T" +-#! $SHELL +- +-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +-# NOTE: Changes made to this file will be lost: look at ltmain.sh. +-# +-# Copyright (C) 1996-2000 Free Software Foundation, Inc. +-# Originally by Gordon Matzigkeit , 1996 +-# +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. +-# +-# This program 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 this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +-# +-# As a special exception to the GNU General Public License, if you +-# distribute this file as part of a program that contains a +-# configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. +- +-# Sed that helps us avoid accidentally triggering echo(1) options like -n. +-Xsed="sed -e s/^X//" ++ case $lt_echo in ++ *'\$0 --fallback-echo"') ++ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ++ ;; ++ esac + +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi ++cfgfile="$ofile" + +-# ### BEGIN LIBTOOL CONFIG ++ cat <<__EOF__ >> "$cfgfile" ++# ### BEGIN LIBTOOL TAG CONFIG: $tagname + + # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +@@ -7556,7 +19310,10 @@ + build_old_libs=$enable_static + + # Whether or not to add -lc for building shared libraries. +-build_libtool_need_lc=$need_lc ++build_libtool_need_lc=$archive_cmds_need_lc_RC ++ ++# Whether or not to disallow shared libs when runtime libs are static ++allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + + # Whether or not to optimize for fast installation. + fast_install=$enable_fast_install +@@ -7572,14 +19329,20 @@ + AR=$lt_AR + AR_FLAGS=$lt_AR_FLAGS + +-# The default C compiler. +-CC=$lt_CC ++# A C compiler. ++LTCC=$lt_LTCC ++ ++# A language-specific compiler. ++CC=$lt_compiler_RC + + # Is the compiler the GNU C compiler? +-with_gcc=$GCC ++with_gcc=$GCC_RC ++ ++# An ERE matcher. ++EGREP=$lt_EGREP + + # The linker used to build libraries. +-LD=$lt_LD ++LD=$lt_LD_RC + + # Whether we need hard or soft links. + LN_S=$lt_LN_S +@@ -7588,7 +19351,7 @@ + NM=$lt_NM + + # A symbol stripping program +-STRIP=$STRIP ++STRIP=$lt_STRIP + + # Used to examine libraries when file_magic_cmd begins "file" + MAGIC_CMD=$MAGIC_CMD +@@ -7610,7 +19373,7 @@ + reload_cmds=$lt_reload_cmds + + # How to pass a linker flag through the compiler. +-wl=$lt_wl ++wl=$lt_lt_prog_compiler_wl_RC + + # Object file suffix (normally "o"). + objext="$ac_objext" +@@ -7618,18 +19381,21 @@ + # Old archive suffix (normally "a"). + libext="$libext" + ++# Shared library suffix (normally ".so"). ++shrext_cmds='$shrext_cmds' ++ + # Executable file suffix (normally ""). + exeext="$exeext" + + # Additional compiler flags for building library objects. +-pic_flag=$lt_pic_flag ++pic_flag=$lt_lt_prog_compiler_pic_RC + pic_mode=$pic_mode + +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$lt_compiler_c_o ++# What is the maximum length of a command? ++max_cmd_len=$lt_cv_sys_max_cmd_len + +-# Can we write directly to a .lo ? +-compiler_o_lo=$lt_compiler_o_lo ++# Does compiler simultaneously support -c and -o options? ++compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + + # Must we lock files when doing compilation ? + need_locks=$lt_need_locks +@@ -7650,19 +19416,19 @@ + dlopen_self_static=$enable_dlopen_self_static + + # Compiler flag to prevent dynamic linking. +-link_static_flag=$lt_link_static_flag ++link_static_flag=$lt_lt_prog_compiler_static_RC + + # Compiler flag to turn off builtin functions. +-no_builtin_flag=$lt_no_builtin_flag ++no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + + # Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec ++export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + + # Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$lt_whole_archive_flag_spec ++whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + + # Compiler flag to generate thread-safe objects. +-thread_safe_flag_spec=$lt_thread_safe_flag_spec ++thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + + # Library versioning type. + version_type=$version_type +@@ -7679,26 +19445,50 @@ + + # Commands used to build and install an old-style archive. + RANLIB=$lt_RANLIB +-old_archive_cmds=$lt_old_archive_cmds ++old_archive_cmds=$lt_old_archive_cmds_RC + old_postinstall_cmds=$lt_old_postinstall_cmds + old_postuninstall_cmds=$lt_old_postuninstall_cmds + + # Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds ++old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + + # Create a temporary old-style archive to link instead of a shared archive. +-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds ++old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + + # Commands used to build and install a shared archive. +-archive_cmds=$lt_archive_cmds +-archive_expsym_cmds=$lt_archive_expsym_cmds ++archive_cmds=$lt_archive_cmds_RC ++archive_expsym_cmds=$lt_archive_expsym_cmds_RC + postinstall_cmds=$lt_postinstall_cmds + postuninstall_cmds=$lt_postuninstall_cmds + ++# Commands used to build a loadable module (assumed same as above if empty) ++module_cmds=$lt_module_cmds_RC ++module_expsym_cmds=$lt_module_expsym_cmds_RC ++ + # Commands to strip libraries. + old_striplib=$lt_old_striplib + striplib=$lt_striplib + ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predep_objects=$lt_predep_objects_RC ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdep_objects=$lt_postdep_objects_RC ++ ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predeps=$lt_predeps_RC ++ ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdeps=$lt_postdeps_RC ++ ++# The library search path used internally by the compiler when linking ++# a shared library. ++compiler_lib_search_path=$lt_compiler_lib_search_path_RC ++ + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method + +@@ -7706,10 +19496,10 @@ + file_magic_cmd=$lt_file_magic_cmd + + # Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$lt_allow_undefined_flag ++allow_undefined_flag=$lt_allow_undefined_flag_RC + + # Flag that forces no undefined symbols. +-no_undefined_flag=$lt_no_undefined_flag ++no_undefined_flag=$lt_no_undefined_flag_RC + + # Commands used to finish a libtool library installation in a directory. + finish_cmds=$lt_finish_cmds +@@ -7718,13 +19508,13 @@ + finish_eval=$lt_finish_eval + + # Take the output of nm and produce a listing of raw symbols and C names. +-global_symbol_pipe=$lt_global_symbol_pipe ++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + + # Transform the output of nm in a proper C declaration +-global_symbol_to_cdecl=$lt_global_symbol_to_cdecl ++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + + # Transform the output of nm in a C name address pair +-global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address ++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + + # This is the shared library runtime path variable. + runpath_var=$runpath_var +@@ -7736,36 +19526,45 @@ + shlibpath_overrides_runpath=$shlibpath_overrides_runpath + + # How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action ++hardcode_action=$hardcode_action_RC + + # Whether we should hardcode library paths into libraries. + hardcode_into_libs=$hardcode_into_libs + + # Flag to hardcode \$libdir into a binary during linking. + # This must work even if \$libdir does not exist. +-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec ++hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC ++ ++# If ld is used when linking, flag to hardcode \$libdir into ++# a binary during linking. This must work even if \$libdir does ++# not exist. ++hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + + # Whether we need a single -rpath flag with a separated argument. +-hardcode_libdir_separator=$lt_hardcode_libdir_separator ++hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the ++# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the + # resulting binary. +-hardcode_direct=$hardcode_direct ++hardcode_direct=$hardcode_direct_RC + + # Set to yes if using the -LDIR flag during linking hardcodes DIR into the + # resulting binary. +-hardcode_minus_L=$hardcode_minus_L ++hardcode_minus_L=$hardcode_minus_L_RC + + # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into + # the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var ++hardcode_shlibpath_var=$hardcode_shlibpath_var_RC ++ ++# Set to yes if building a shared library automatically hardcodes DIR into the library ++# and all subsequent libraries and executables linked against it. ++hardcode_automatic=$hardcode_automatic_RC + + # Variables whose values should be saved in libtool wrapper scripts and + # restored at relink time. + variables_saved_for_relink="$variables_saved_for_relink" + + # Whether libtool must link a program against all its dependency libraries. +-link_all_deplibs=$link_all_deplibs ++link_all_deplibs=$link_all_deplibs_RC + + # Compile-time system search path for libraries + sys_lib_search_path_spec=$lt_sys_lib_search_path_spec +@@ -7774,234 +19573,75 @@ + sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + + # Fix the shell variable \$srcfile for the compiler. +-fix_srcfile_path="$fix_srcfile_path" ++fix_srcfile_path="$fix_srcfile_path_RC" + + # Set to yes if exported symbols are required. +-always_export_symbols=$always_export_symbols ++always_export_symbols=$always_export_symbols_RC + + # The commands to list exported symbols. +-export_symbols_cmds=$lt_export_symbols_cmds ++export_symbols_cmds=$lt_export_symbols_cmds_RC + + # The commands to extract the exported symbol list from a shared archive. + extract_expsyms_cmds=$lt_extract_expsyms_cmds + + # Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$lt_exclude_expsyms ++exclude_expsyms=$lt_exclude_expsyms_RC + + # Symbols that must always be exported. +-include_expsyms=$lt_include_expsyms ++include_expsyms=$lt_include_expsyms_RC + +-# ### END LIBTOOL CONFIG ++# ### END LIBTOOL TAG CONFIG: $tagname + + __EOF__ + +- case $host_os in +- aix3*) +- cat <<\EOF >> "${ofile}T" + +-# AIX sometimes has problems with the GCC collect2 program. For some +-# reason, if we set the COLLECT_NAMES environment variable, the problems +-# vanish in a puff of smoke. +-if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES ++else ++ # If there is no Makefile yet, we rely on a make rule to execute ++ # `config.status --recheck' to rerun these tests and create the ++ # libtool script then. ++ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` ++ if test -f "$ltmain_in"; then ++ test -f Makefile && make "$ltmain" ++ fi + fi +-EOF +- ;; +- esac + +- case $host_os in +- cygwin* | mingw* | pw32* | os2*) +- cat <<'EOF' >> "${ofile}T" +- # This is a source program that is used to create dlls on Windows +- # Don't remove nor modify the starting and closing comments +-# /* ltdll.c starts here */ +-# #define WIN32_LEAN_AND_MEAN +-# #include +-# #undef WIN32_LEAN_AND_MEAN +-# #include +-# +-# #ifndef __CYGWIN__ +-# # ifdef __CYGWIN32__ +-# # define __CYGWIN__ __CYGWIN32__ +-# # endif +-# #endif +-# +-# #ifdef __cplusplus +-# extern "C" { +-# #endif +-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +-# #ifdef __cplusplus +-# } +-# #endif +-# +-# #ifdef __CYGWIN__ +-# #include +-# DECLARE_CYGWIN_DLL( DllMain ); +-# #endif +-# HINSTANCE __hDllInstance_base; +-# +-# BOOL APIENTRY +-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +-# { +-# __hDllInstance_base = hInst; +-# return TRUE; +-# } +-# /* ltdll.c ends here */ +- # This is a source program that is used to create import libraries +- # on Windows for dlls which lack them. Don't remove nor modify the +- # starting and closing comments +-# /* impgen.c starts here */ +-# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +-# +-# This file is part of GNU libtool. +-# +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. +-# +-# This program 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 this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +-# */ +-# +-# #include /* for printf() */ +-# #include /* for open(), lseek(), read() */ +-# #include /* for O_RDONLY, O_BINARY */ +-# #include /* for strdup() */ +-# +-# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +-# #ifndef O_BINARY +-# #define O_BINARY 0 +-# #endif +-# +-# static unsigned int +-# pe_get16 (fd, offset) +-# int fd; +-# int offset; +-# { +-# unsigned char b[2]; +-# lseek (fd, offset, SEEK_SET); +-# read (fd, b, 2); +-# return b[0] + (b[1]<<8); +-# } +-# +-# static unsigned int +-# pe_get32 (fd, offset) +-# int fd; +-# int offset; +-# { +-# unsigned char b[4]; +-# lseek (fd, offset, SEEK_SET); +-# read (fd, b, 4); +-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +-# } +-# +-# static unsigned int +-# pe_as32 (ptr) +-# void *ptr; +-# { +-# unsigned char *b = ptr; +-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +-# } +-# +-# int +-# main (argc, argv) +-# int argc; +-# char *argv[]; +-# { +-# int dll; +-# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +-# unsigned long export_rva, export_size, nsections, secptr, expptr; +-# unsigned long name_rvas, nexp; +-# unsigned char *expdata, *erva; +-# char *filename, *dll_name; +-# +-# filename = argv[1]; +-# +-# dll = open(filename, O_RDONLY|O_BINARY); +-# if (dll < 1) +-# return 1; +-# +-# dll_name = filename; +-# +-# for (i=0; filename[i]; i++) +-# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +-# dll_name = filename + i +1; +-# +-# pe_header_offset = pe_get32 (dll, 0x3c); +-# opthdr_ofs = pe_header_offset + 4 + 20; +-# num_entries = pe_get32 (dll, opthdr_ofs + 92); +-# +-# if (num_entries < 1) /* no exports */ +-# return 1; +-# +-# export_rva = pe_get32 (dll, opthdr_ofs + 96); +-# export_size = pe_get32 (dll, opthdr_ofs + 100); +-# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +-# secptr = (pe_header_offset + 4 + 20 + +-# pe_get16 (dll, pe_header_offset + 4 + 16)); +-# +-# expptr = 0; +-# for (i = 0; i < nsections; i++) +-# { +-# char sname[8]; +-# unsigned long secptr1 = secptr + 40 * i; +-# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +-# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +-# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +-# lseek(dll, secptr1, SEEK_SET); +-# read(dll, sname, 8); +-# if (vaddr <= export_rva && vaddr+vsize > export_rva) +-# { +-# expptr = fptr + (export_rva - vaddr); +-# if (export_rva + export_size > vaddr + vsize) +-# export_size = vsize - (export_rva - vaddr); +-# break; +-# } +-# } +-# +-# expdata = (unsigned char*)malloc(export_size); +-# lseek (dll, expptr, SEEK_SET); +-# read (dll, expdata, export_size); +-# erva = expdata - export_rva; +-# +-# nexp = pe_as32 (expdata+24); +-# name_rvas = pe_as32 (expdata+32); +-# +-# printf ("EXPORTS\n"); +-# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) ++CC="$lt_save_CC" + +- mv -f "${ofile}T" "$ofile" || \ +- (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") +- chmod +x "$ofile" +-fi ++ ;; ++ ++ *) ++ { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 ++echo "$as_me: error: Unsupported tag name: $tagname" >&2;} ++ { (exit 1); exit 1; }; } ++ ;; ++ esac + ++ # Append the new tag name to the list of available tags. ++ if test -n "$tagname" ; then ++ available_tags="$available_tags $tagname" ++ fi ++ fi ++ done ++ IFS="$lt_save_ifs" + ++ # Now substitute the updated list of available tags. ++ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then ++ mv "${ofile}T" "$ofile" ++ chmod +x "$ofile" ++ else ++ rm -f "${ofile}T" ++ { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 ++echo "$as_me: error: unable to update list of available tagged configurations." >&2;} ++ { (exit 1); exit 1; }; } ++ fi ++fi + + + +@@ -8014,6 +19654,24 @@ + # Prevent multiple expansion + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + echo "$as_me:$LINENO: checking for long long int" >&5 + echo $ECHO_N "checking for long long int... $ECHO_C" >&6 + if test "${ac_cv_c_long_long+set}" = set; then +@@ -8023,15 +19681,12 @@ + ac_cv_c_long_long=yes + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -8042,11 +19697,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8055,10 +19720,11 @@ + ac_cv_c_long_long=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_c_long_long=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + fi + echo "$as_me:$LINENO: result: $ac_cv_c_long_long" >&5 +@@ -8089,6 +19755,7 @@ + # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag + # AFS /usr/afsws/bin/install, which mishandles nonexistent args + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic + # ./install, which can be erroneously created by make from ./install.sh. + echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 + echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +@@ -8105,6 +19772,7 @@ + case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. +@@ -8112,20 +19780,20 @@ + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then +- if test $ac_prog = install && +- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # AIX install. It has an incompatible calling convention. +- : +- elif test $ac_prog = install && +- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # program-specific install script used by HP pwplus--don't use. +- : +- else +- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" +- break 3 +- fi +- fi ++ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then ++ if test $ac_prog = install && ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : ++ else ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 ++ fi ++ fi + done + done + ;; +@@ -8181,7 +19849,6 @@ + + + +- + for ac_header in exception string + do + as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +@@ -8198,18 +19865,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8218,10 +19898,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -8229,20 +19910,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -8253,7 +19938,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -8261,26 +19947,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -8317,18 +20020,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8337,10 +20053,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -8348,20 +20065,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -8372,7 +20093,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -8380,26 +20102,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -8432,18 +20171,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8452,10 +20204,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -8463,20 +20216,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -8487,7 +20244,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -8495,26 +20253,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -8548,18 +20323,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8568,10 +20356,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -8579,20 +20368,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -8603,7 +20396,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -8611,26 +20405,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -8664,18 +20475,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8684,10 +20508,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -8695,20 +20520,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -8719,7 +20548,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -8727,26 +20557,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -8781,18 +20628,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8801,10 +20661,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -8812,20 +20673,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -8836,7 +20701,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -8844,26 +20710,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -8908,18 +20791,31 @@ + echo "$as_me:$LINENO: checking pthread.h usability" >&5 + echo $ECHO_N "checking pthread.h usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -8928,10 +20824,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -8939,20 +20836,24 @@ + echo "$as_me:$LINENO: checking pthread.h presence" >&5 + echo $ECHO_N "checking pthread.h presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -8963,7 +20864,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -8971,19 +20873,36 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: pthread.h: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: pthread.h: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: pthread.h: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: pthread.h: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: pthread.h: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: pthread.h: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: pthread.h: present but cannot be compiled" >&5 + echo "$as_me: WARNING: pthread.h: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: pthread.h: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: pthread.h: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: pthread.h: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: pthread.h: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: pthread.h: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: pthread.h: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: pthread.h: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: pthread.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: pthread.h: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: pthread.h: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: pthread.h: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: pthread.h: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: pthread.h: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for pthread.h" >&5 + echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6 +@@ -9023,49 +20942,73 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case declares $ac_func. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $ac_func (); below. */ +-#include ++ which can conflict with char $ac_func (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef $ac_func ++ + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" ++{ + #endif + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char $ac_func (); +-char (*f) (); +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_$ac_func) || defined (__stub___$ac_func) + choke me + #else +-f = $ac_func; ++char (*f) () = $ac_func; ++#endif ++#ifdef __cplusplus ++} + #endif + ++int ++main () ++{ ++return f != $ac_func; + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9074,10 +21017,12 @@ + eval "$as_ac_var=yes" + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + eval "$as_ac_var=no" + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +@@ -9104,8 +21049,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lpthread $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -9114,12 +21062,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char pthread_create (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -9130,11 +21072,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9143,10 +21095,12 @@ + ac_cv_lib_pthread_pthread_create=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_pthread_pthread_create=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 +@@ -9162,6 +21116,82 @@ + + if test "x$pthreads_ok" != xyes + then ++# hpux 11 uses macros for pthread_create so test another function ++echo "$as_me:$LINENO: checking for pthread_join in -lpthread" >&5 ++echo $ECHO_N "checking for pthread_join in -lpthread... $ECHO_C" >&6 ++if test "${ac_cv_lib_pthread_pthread_join+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lpthread $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char pthread_join (); ++int ++main () ++{ ++pthread_join (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_pthread_pthread_join=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_pthread_pthread_join=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_join" >&5 ++echo "${ECHO_T}$ac_cv_lib_pthread_pthread_join" >&6 ++if test $ac_cv_lib_pthread_pthread_join = yes; then ++ pthreads_ok=yes ++ THREAD_LIBS="-lpthread" ++else ++ pthreads_ok=no ++fi ++ ++fi ++ ++if test "x$pthreads_ok" != xyes ++then + + # try libc_r (*BSD) + echo "$as_me:$LINENO: checking for pthread_create in -lc_r" >&5 +@@ -9172,8 +21202,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lc_r $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -9182,12 +21215,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char pthread_create (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -9198,11 +21225,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9211,10 +21248,12 @@ + ac_cv_lib_c_r_pthread_create=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_c_r_pthread_create=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_c_r_pthread_create" >&5 +@@ -9265,49 +21304,73 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case declares $ac_func. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $ac_func (); below. */ +-#include ++ which can conflict with char $ac_func (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef $ac_func ++ + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" ++{ + #endif + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char $ac_func (); +-char (*f) (); +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_$ac_func) || defined (__stub___$ac_func) + choke me + #else +-f = $ac_func; ++char (*f) () = $ac_func; ++#endif ++#ifdef __cplusplus ++} + #endif + ++int ++main () ++{ ++return f != $ac_func; + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9316,10 +21379,12 @@ + eval "$as_ac_var=yes" + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + eval "$as_ac_var=no" + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +@@ -9357,49 +21422,73 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case declares $ac_func. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $ac_func (); below. */ +-#include ++ which can conflict with char $ac_func (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef $ac_func ++ + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" ++{ + #endif + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char $ac_func (); +-char (*f) (); +- +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif +-int +-main () +-{ + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_$ac_func) || defined (__stub___$ac_func) + choke me + #else +-f = $ac_func; ++char (*f) () = $ac_func; ++#endif ++#ifdef __cplusplus ++} + #endif + ++int ++main () ++{ ++return f != $ac_func; + ; + return 0; + } + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9408,10 +21497,12 @@ + eval "$as_ac_var=yes" + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + eval "$as_ac_var=no" + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +@@ -9447,6 +21538,8 @@ + odbc_libraries_dir="$odbc_dir/lib" + odbc_includes_dir="$odbc_dir/include" + ++else ++ odbc_dir=yes + fi; + + +@@ -9465,18 +21558,19 @@ + + fi; + +-save_CPPFLAGS="$CPPFLAGS" +-save_LIBS="$LIBS" +- +-if test "x$odbc_includes_dir" != "x" -a "x$odbc_includes_dir" != "x/usr/include" +-then +- CPPFLAGS="$CPPFLAGS -I$odbc_includes_dir" +-fi ++if test "x$odbc_dir" != "xno"; then ++ save_CPPFLAGS="$CPPFLAGS" ++ save_LIBS="$LIBS" ++ ++ if test "x$odbc_includes_dir" != "x" -a "x$odbc_includes_dir" != "x/usr/include" ++ then ++ CPPFLAGS="$CPPFLAGS -I$odbc_includes_dir" ++ fi + +-if test "x$odbc_libraries_dir" != "x" +-then +- LIBS="$LIBS -L$odbc_libraries_dir" +-fi ++ if test "x$odbc_libraries_dir" != "x" ++ then ++ LIBS="$LIBS -L$odbc_libraries_dir" ++ fi + + + +@@ -9497,18 +21591,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9517,10 +21624,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -9528,20 +21636,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -9552,7 +21664,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -9560,26 +21673,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -9598,9 +21728,9 @@ + done + + +-if test "x$odbc_ok" = "xyes" +-then +- echo "$as_me:$LINENO: checking for SQLConnect in -lodbc" >&5 ++ if test "x$odbc_ok" = "xyes" ++ then ++ echo "$as_me:$LINENO: checking for SQLConnect in -lodbc" >&5 + echo $ECHO_N "checking for SQLConnect in -lodbc... $ECHO_C" >&6 + if test "${ac_cv_lib_odbc_SQLConnect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +@@ -9608,8 +21738,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lodbc $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -9618,12 +21751,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char SQLConnect (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -9634,11 +21761,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9647,10 +21784,12 @@ + ac_cv_lib_odbc_SQLConnect=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_odbc_SQLConnect=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_odbc_SQLConnect" >&5 +@@ -9661,6 +21800,9 @@ + odbc_ok=no + fi + ++ fi ++else ++ odbc_ok=no + fi + + echo "$as_me:$LINENO: checking whether unixODBC should be used" >&5 +@@ -9771,18 +21913,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9791,10 +21946,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -9802,20 +21958,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -9826,7 +21986,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -9834,26 +21995,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -9881,8 +22059,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-liodbc $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -9891,12 +22072,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char SQLConnect (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -9907,11 +22082,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -9920,10 +22105,12 @@ + ac_cv_lib_iodbc_SQLConnect=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_iodbc_SQLConnect=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_iodbc_SQLConnect" >&5 +@@ -10009,18 +22196,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10029,10 +22229,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -10040,20 +22241,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -10064,7 +22269,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -10072,26 +22278,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -10113,15 +22336,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10135,11 +22355,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10148,10 +22378,11 @@ + ac_cv_type_int=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_type_int=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 + echo "${ECHO_T}$ac_cv_type_int" >&6 +@@ -10169,15 +22400,12 @@ + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10190,11 +22418,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10203,15 +22441,12 @@ + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10224,11 +22459,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10237,29 +22482,28 @@ + ac_hi=$ac_mid; break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo=`expr $ac_mid + 1` +- if test $ac_lo -le $ac_mid; then +- ac_lo= ac_hi= +- break +- fi +- ac_mid=`expr 2 '*' $ac_mid + 1` ++ if test $ac_lo -le $ac_mid; then ++ ac_lo= ac_hi= ++ break ++ fi ++ ac_mid=`expr 2 '*' $ac_mid + 1` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10272,11 +22516,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10285,15 +22539,12 @@ + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10306,11 +22557,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10319,37 +22580,36 @@ + ac_lo=$ac_mid; break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_hi=`expr '(' $ac_mid ')' - 1` +- if test $ac_mid -le $ac_hi; then +- ac_lo= ac_hi= +- break +- fi +- ac_mid=`expr 2 '*' $ac_mid` ++ if test $ac_mid -le $ac_hi; then ++ ac_lo= ac_hi= ++ break ++ fi ++ ac_mid=`expr 2 '*' $ac_mid` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo= ac_hi= + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + # Binary search between lo and hi bounds. + while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10362,11 +22622,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10375,37 +22645,39 @@ + ac_hi=$ac_mid + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo=`expr '(' $ac_mid ')' + 1` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + case $ac_lo in + ?*) ac_cv_sizeof_int=$ac_lo;; +-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5 +-echo "$as_me: error: cannot compute sizeof (int), 77" >&2;} ++'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute sizeof (int), 77 ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } ;; + esac + else + if test "$cross_compiling" = yes; then +- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5 +-echo "$as_me: error: cannot run test program while cross compiling" >&2;} ++ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot run test program while cross compiling ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + long longval () { return (long) (sizeof (int)); } + unsigned long ulongval () { return (long) (sizeof (int)); } + #include + #include +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10448,13 +22720,16 @@ + else + echo "$as_me: program exited with status $ac_status" >&5 + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ( exit $ac_status ) +-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5 +-echo "$as_me: error: cannot compute sizeof (int), 77" >&2;} ++{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute sizeof (int), 77 ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi +-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + fi + rm -f conftest.val +@@ -10475,15 +22750,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10497,11 +22769,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10510,10 +22792,11 @@ + ac_cv_type_long=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_type_long=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 + echo "${ECHO_T}$ac_cv_type_long" >&6 +@@ -10531,15 +22814,12 @@ + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10552,11 +22832,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10565,15 +22855,12 @@ + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10586,11 +22873,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10599,29 +22896,28 @@ + ac_hi=$ac_mid; break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo=`expr $ac_mid + 1` +- if test $ac_lo -le $ac_mid; then +- ac_lo= ac_hi= +- break +- fi +- ac_mid=`expr 2 '*' $ac_mid + 1` ++ if test $ac_lo -le $ac_mid; then ++ ac_lo= ac_hi= ++ break ++ fi ++ ac_mid=`expr 2 '*' $ac_mid + 1` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10634,11 +22930,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10647,15 +22953,12 @@ + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10668,11 +22971,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10681,37 +22994,36 @@ + ac_lo=$ac_mid; break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_hi=`expr '(' $ac_mid ')' - 1` +- if test $ac_mid -le $ac_hi; then +- ac_lo= ac_hi= +- break +- fi +- ac_mid=`expr 2 '*' $ac_mid` ++ if test $ac_mid -le $ac_hi; then ++ ac_lo= ac_hi= ++ break ++ fi ++ ac_mid=`expr 2 '*' $ac_mid` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo= ac_hi= + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + # Binary search between lo and hi bounds. + while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10724,11 +23036,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10737,37 +23059,39 @@ + ac_hi=$ac_mid + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo=`expr '(' $ac_mid ')' + 1` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + case $ac_lo in + ?*) ac_cv_sizeof_long=$ac_lo;; +-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5 +-echo "$as_me: error: cannot compute sizeof (long), 77" >&2;} ++'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute sizeof (long), 77 ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } ;; + esac + else + if test "$cross_compiling" = yes; then +- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5 +-echo "$as_me: error: cannot run test program while cross compiling" >&2;} ++ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot run test program while cross compiling ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + long longval () { return (long) (sizeof (long)); } + unsigned long ulongval () { return (long) (sizeof (long)); } + #include + #include +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10810,13 +23134,16 @@ + else + echo "$as_me: program exited with status $ac_status" >&5 + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ( exit $ac_status ) +-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5 +-echo "$as_me: error: cannot compute sizeof (long), 77" >&2;} ++{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute sizeof (long), 77 ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi +-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + fi + rm -f conftest.val +@@ -10837,15 +23164,12 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10859,11 +23183,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10872,10 +23206,11 @@ + ac_cv_type_long_long=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_type_long_long=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5 + echo "${ECHO_T}$ac_cv_type_long_long" >&6 +@@ -10893,15 +23228,12 @@ + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10914,11 +23246,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10927,15 +23269,12 @@ + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10948,11 +23287,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -10961,29 +23310,28 @@ + ac_hi=$ac_mid; break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo=`expr $ac_mid + 1` +- if test $ac_lo -le $ac_mid; then +- ac_lo= ac_hi= +- break +- fi +- ac_mid=`expr 2 '*' $ac_mid + 1` ++ if test $ac_lo -le $ac_mid; then ++ ac_lo= ac_hi= ++ break ++ fi ++ ac_mid=`expr 2 '*' $ac_mid + 1` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -10996,11 +23344,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -11009,15 +23367,12 @@ + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -11030,11 +23385,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -11043,37 +23408,36 @@ + ac_lo=$ac_mid; break + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_hi=`expr '(' $ac_mid ')' - 1` +- if test $ac_mid -le $ac_hi; then +- ac_lo= ac_hi= +- break +- fi +- ac_mid=`expr 2 '*' $ac_mid` ++ if test $ac_mid -le $ac_hi; then ++ ac_lo= ac_hi= ++ break ++ fi ++ ac_mid=`expr 2 '*' $ac_mid` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo= ac_hi= + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + # Binary search between lo and hi bounds. + while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -11086,11 +23450,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -11099,37 +23473,39 @@ + ac_hi=$ac_mid + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_lo=`expr '(' $ac_mid ')' + 1` + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + case $ac_lo in + ?*) ac_cv_sizeof_long_long=$ac_lo;; +-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77" >&5 +-echo "$as_me: error: cannot compute sizeof (long long), 77" >&2;} ++'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77 ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute sizeof (long long), 77 ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } ;; + esac + else + if test "$cross_compiling" = yes; then +- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5 +-echo "$as_me: error: cannot run test program while cross compiling" >&2;} ++ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot run test program while cross compiling ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + long longval () { return (long) (sizeof (long long)); } + unsigned long ulongval () { return (long) (sizeof (long long)); } + #include + #include +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -11172,13 +23548,16 @@ + else + echo "$as_me: program exited with status $ac_status" >&5 + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ( exit $ac_status ) +-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77" >&5 +-echo "$as_me: error: cannot compute sizeof (long long), 77" >&2;} ++{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77 ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute sizeof (long long), 77 ++See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi +-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + fi + rm -f conftest.val +@@ -11233,18 +23612,31 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + $ac_includes_default + #include <$ac_header> + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -11253,10 +23645,11 @@ + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -11264,20 +23657,24 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <$ac_header> + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? +- egrep -v '^ *\+' conftest.er1 >conftest.err ++ grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +@@ -11288,7 +23685,8 @@ + ac_header_preproc=yes + else + echo "$as_me: failed program was:" >&5 +- cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_header_preproc=no + fi + rm -f conftest.err conftest.$ac_ext +@@ -11296,26 +23694,43 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +- no:yes ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------ ## ++## Report this to freeodbc++@orcane.net ## ++## ------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; + esac + echo "$as_me:$LINENO: checking for $ac_header" >&5 + echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -11344,8 +23759,11 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lreadline -ltermcap $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus +@@ -11354,12 +23772,6 @@ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char readline (); +-#ifdef F77_DUMMY_MAIN +-# ifdef __cplusplus +- extern "C" +-# endif +- int F77_DUMMY_MAIN() { return 1; } +-#endif + int + main () + { +@@ -11370,11 +23782,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -11383,10 +23805,12 @@ + ac_cv_lib_readline_readline=yes + else + echo "$as_me: failed program was:" >&5 +-cat conftest.$ac_ext >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + ac_cv_lib_readline_readline=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_readline_readline" >&5 +@@ -11819,7 +24243,7 @@ + CXXFLAGS="-DIN_ODBCXX $CXXFLAGS" + + +-ac_config_files="$ac_config_files Makefile include/Makefile include/odbc++/Makefile src/Makefile tests/Makefile isql++/Makefile qtsql++/Makefile doc/Makefile doc/progref/Makefile win32/Makefile win32/tests/Makefile libodbc++.spec libodbc++.pc" ++ ac_config_files="$ac_config_files Makefile include/Makefile include/odbc++/Makefile src/Makefile tests/Makefile isql++/Makefile qtsql++/Makefile doc/Makefile doc/progref/Makefile win32/Makefile win32/tests/Makefile libodbc++.spec libodbc++.pc" + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure + # tests run on this system so they can be shared between configure +@@ -11830,7 +24254,7 @@ + # config.status only pays attention to the cache file if you give it + # the --recheck option to rerun configure. + # +-# `ac_cv_env_foo' variables (set or unset) will be overriden when ++# `ac_cv_env_foo' variables (set or unset) will be overridden when + # loading this file, other *unset* `ac_cv_foo' will be assigned the + # following values. + +@@ -11848,13 +24272,13 @@ + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ +- "s/'/'\\\\''/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ++ "s/'/'\\\\''/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ +- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ++ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; + } | +@@ -11865,7 +24289,7 @@ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +-if cmp -s $cache_file confcache; then :; else ++if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file +@@ -11884,18 +24308,33 @@ + # trailing colons and then remove the whole line if VPATH becomes empty + # (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=/{ ++ ac_vpsub='/^[ ]*VPATH[ ]*=/{ + s/:*\$(srcdir):*/:/; + s/:*\${srcdir}:*/:/; + s/:*@srcdir@:*/:/; +-s/^\([^=]*=[ ]*\):*/\1/; ++s/^\([^=]*=[ ]*\):*/\1/; + s/:*$//; +-s/^[^=]*=[ ]*$//; ++s/^[^=]*=[ ]*$//; + }' + fi + + DEFS=-DHAVE_CONFIG_H + ++ac_libobjs= ++ac_ltlibobjs= ++for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue ++ # 1. Remove the extension, and $U if already installed. ++ ac_i=`echo "$ac_i" | ++ sed 's/\$U\././;s/\.o$//;s/\.obj$//'` ++ # 2. Add them. ++ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ++ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' ++done ++LIBOBJS=$ac_libobjs ++ ++LTLIBOBJS=$ac_ltlibobjs ++ ++ + if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. + Usually this means the macro was only invoked conditionally." >&5 +@@ -11903,6 +24342,20 @@ + Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } + fi ++if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then ++ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. ++Usually this means the macro was only invoked conditionally." >&5 ++echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. ++Usually this means the macro was only invoked conditionally." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then ++ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. ++Usually this means the macro was only invoked conditionally." >&5 ++echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. ++Usually this means the macro was only invoked conditionally." >&2;} ++ { (exit 1); exit 1; }; } ++fi + if test -z "${THREADS_TRUE}" && test -z "${THREADS_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"THREADS\" was never defined. + Usually this means the macro was only invoked conditionally." >&5 +@@ -11952,11 +24405,12 @@ + # configure, is in config.log if it exists. + + debug=false ++ac_cs_recheck=false ++ac_cs_silent=false + SHELL=\${CONFIG_SHELL-$SHELL} + _ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF +- + ## --------------------- ## + ## M4sh Initialization. ## + ## --------------------- ## +@@ -11965,46 +24419,57 @@ + if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' + elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix + fi ++DUALCASE=1; export DUALCASE # for MKS sh + +-# NLS nuisances. + # Support unset when possible. +-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset + else + as_unset=false + fi + +-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && +- { $as_unset LANG || test "${LANG+set}" != set; } || +- { LANG=C; export LANG; } +-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && +- { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || +- { LC_ALL=C; export LC_ALL; } +-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && +- { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || +- { LC_TIME=C; export LC_TIME; } +-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && +- { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || +- { LC_CTYPE=C; export LC_CTYPE; } +-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && +- { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || +- { LANGUAGE=C; export LANGUAGE; } +-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && +- { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || +- { LC_COLLATE=C; export LC_COLLATE; } +-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && +- { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || +- { LC_NUMERIC=C; export LC_NUMERIC; } +-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && +- { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || +- { LC_MESSAGES=C; export LC_MESSAGES; } ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++$as_unset ENV MAIL MAILPATH ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi + + + # Name of the executable. +-as_me=`(basename "$0") 2>/dev/null || ++as_me=`$as_basename "$0" || + $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ +@@ -12015,6 +24480,7 @@ + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + ++ + # PATH needs CR, and LINENO needs CR and PATH. + # Avoid depending upon Character Ranges. + as_cr_letters='abcdefghijklmnopqrstuvwxyz' +@@ -12025,15 +24491,15 @@ + + # The user is always right. + if test "${PATH_SEPARATOR+set}" != set; then +- echo "#! /bin/sh" >conftest.sh +- echo "exit 0" >>conftest.sh +- chmod +x conftest.sh +- if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi +- rm -f conftest.sh ++ rm -f conf$$.sh + fi + + +@@ -12082,6 +24548,8 @@ + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then ++ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } ++ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} +@@ -12155,13 +24623,20 @@ + fi + rm -f conf$$ conf$$.exe conf$$.file + ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ + as_executable_p="test -f" + + # Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + + # Sed expression to map a string onto a valid variable name. +-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + # IFS +@@ -12171,7 +24646,7 @@ + IFS=" $as_nl" + + # CDPATH. +-$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } ++$as_unset CDPATH + + exec 6>&1 + +@@ -12187,8 +24662,8 @@ + } >&5 + cat >&5 <<_CSEOF + +-This file was extended by libodbcxx $as_me 0.2.3, which was +-generated by GNU Autoconf 2.53. Invocation command line was ++This file was extended by libodbcxx $as_me 0.2.3-20050404, which was ++generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS +@@ -12228,12 +24703,13 @@ + + -h, --help print this help, then exit + -V, --version print version number, then exit ++ -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] +- instantiate the configuration file FILE ++ instantiate the configuration file FILE + --header=FILE[:TEMPLATE] +- instantiate the configuration header FILE ++ instantiate the configuration header FILE + + Configuration files: + $config_files +@@ -12249,12 +24725,11 @@ + + cat >>$CONFIG_STATUS <<_ACEOF + ac_cs_version="\\ +-libodbcxx config.status 0.2.3 +-configured by $0, generated by GNU Autoconf 2.53, ++libodbcxx config.status 0.2.3-20050404 ++configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +-Free Software Foundation, Inc. ++Copyright (C) 2003 Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + srcdir=$srcdir +@@ -12271,25 +24746,25 @@ + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` +- shift +- set dummy "$ac_option" "$ac_optarg" ${1+"$@"} +- shift ++ ac_shift=: ++ ;; ++ -*) ++ ac_option=$1 ++ ac_optarg=$2 ++ ac_shift=shift + ;; +- -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. ++ ac_option=$1 + ac_need_defaults=false;; + esac + +- case $1 in ++ case $ac_option in + # Handling of the options. + _ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF +- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) +- echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" +- exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; +-_ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) +@@ -12304,13 +24779,16 @@ + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) +- shift +- CONFIG_FILES="$CONFIG_FILES $1" ++ $ac_shift ++ CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) +- shift +- CONFIG_HEADERS="$CONFIG_HEADERS $1" ++ $ac_shift ++ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil | --si | --s) ++ ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +@@ -12325,6 +24803,20 @@ + shift + done + ++ac_configure_extra_args= ++ ++if $ac_cs_silent; then ++ exec 6>/dev/null ++ ac_configure_extra_args="$ac_configure_extra_args --silent" ++fi ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++if \$ac_cs_recheck; then ++ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 ++ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion ++fi ++ + _ACEOF + + cat >>$CONFIG_STATUS <<_ACEOF +@@ -12374,6 +24866,9 @@ + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + fi + ++# Have a temporary directory for convenience. Make it in the build tree ++# simply because there is no reason to put it here, and in addition, ++# creating and moving files from /tmp can sometimes cause problems. + # Create a temporary directory, and hook for its removal unless debugging. + $debug || + { +@@ -12382,17 +24877,17 @@ + } + + # Create a (secure) tmp directory for tmp files. +-: ${TMPDIR=/tmp} ++ + { +- tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && ++ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" + } || + { +- tmp=$TMPDIR/cs$$-$RANDOM ++ tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) + } || + { +- echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ++ echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } + } + +@@ -12443,6 +24938,7 @@ + s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t + s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t + s,@INSTALL_DATA@,$INSTALL_DATA,;t t ++s,@CYGPATH_W@,$CYGPATH_W,;t t + s,@PACKAGE@,$PACKAGE,;t t + s,@VERSION@,$VERSION,;t t + s,@ACLOCAL@,$ACLOCAL,;t t +@@ -12457,6 +24953,7 @@ + s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t + s,@AWK@,$AWK,;t t + s,@SET_MAKE@,$SET_MAKE,;t t ++s,@am__leading_dot@,$am__leading_dot,;t t + s,@lib_version@,$lib_version,;t t + s,@build@,$build,;t t + s,@build_cpu@,$build_cpu,;t t +@@ -12481,16 +24978,26 @@ + s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t + s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t + s,@CXXDEPMODE@,$CXXDEPMODE,;t t ++s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t ++s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t + s,@CXXCPP@,$CXXCPP,;t t + s,@CC@,$CC,;t t + s,@CFLAGS@,$CFLAGS,;t t + s,@ac_ct_CC@,$ac_ct_CC,;t t + s,@CCDEPMODE@,$CCDEPMODE,;t t ++s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t ++s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t ++s,@EGREP@,$EGREP,;t t + s,@LN_S@,$LN_S,;t t + s,@ECHO@,$ECHO,;t t ++s,@AR@,$AR,;t t ++s,@ac_ct_AR@,$ac_ct_AR,;t t + s,@RANLIB@,$RANLIB,;t t + s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t + s,@CPP@,$CPP,;t t ++s,@F77@,$F77,;t t ++s,@FFLAGS@,$FFLAGS,;t t ++s,@ac_ct_F77@,$ac_ct_F77,;t t + s,@LIBTOOL@,$LIBTOOL,;t t + s,@docdir@,$docdir,;t t + s,@THREAD_LIBS@,$THREAD_LIBS,;t t +@@ -12515,6 +25022,8 @@ + s,@BUILD_ISQLXX_FALSE@,$BUILD_ISQLXX_FALSE,;t t + s,@BUILD_TESTS_TRUE@,$BUILD_TESTS_TRUE,;t t + s,@BUILD_TESTS_FALSE@,$BUILD_TESTS_FALSE,;t t ++s,@LIBOBJS@,$LIBOBJS,;t t ++s,@LTLIBOBJS@,$LTLIBOBJS,;t t + CEOF + + _ACEOF +@@ -12544,9 +25053,9 @@ + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then +- ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" ++ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else +- ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" ++ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end +@@ -12564,46 +25073,51 @@ + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin +- cat >$tmp/stdin +- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ cat >$tmp/stdin ++ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || + $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_file" : 'X\(//\)[^/]' \| \ +- X"$ac_file" : 'X\(//\)$' \| \ +- X"$ac_file" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` +- { case "$ac_dir" in +- [\\/]* | ?:[\\/]* ) as_incr_dir=;; +- *) as_incr_dir=.;; +-esac +-as_dummy="$ac_dir" +-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do +- case $as_mkdir_dir in +- # Skip DOS drivespec +- ?:) as_incr_dir=$as_mkdir_dir ;; +- *) +- as_incr_dir=$as_incr_dir/$as_mkdir_dir +- test -d "$as_incr_dir" || +- mkdir "$as_incr_dir" || +- { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5 +-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;} +- { (exit 1); exit 1; }; } +- ;; +- esac +-done; } ++ { if $as_mkdir_p; then ++ mkdir -p "$ac_dir" ++ else ++ as_dir="$ac_dir" ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 ++echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} ++ { (exit 1); exit 1; }; }; } + + ac_builddir=. + +@@ -12630,12 +25144,45 @@ + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac +-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +-# absolute. +-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac + + + case $INSTALL in +@@ -12657,7 +25204,7 @@ + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | +- sed 's,.*/,,'` by configure." ++ sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. +@@ -12666,24 +25213,24 @@ + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) +- # Absolute (can't be DOS-style, as IFS=:) +- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ # Absolute (can't be DOS-style, as IFS=:) ++ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- echo $f;; ++ echo "$f";; + *) # Relative +- if test -f "$f"; then +- # Build tree +- echo $f +- elif test -f "$srcdir/$f"; then +- # Source tree +- echo $srcdir/$f +- else +- # /dev/null tree +- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ if test -f "$f"; then ++ # Build tree ++ echo "$f" ++ elif test -f "$srcdir/$f"; then ++ # Source tree ++ echo "$srcdir/$f" ++ else ++ # /dev/null tree ++ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- fi;; ++ fi;; + esac + done` || { (exit 1); exit 1; } + _ACEOF +@@ -12725,12 +25272,12 @@ + # NAME is the cpp macro being defined and VALUE is the value it is being given. + # + # ac_d sets the value in "#define NAME VALUE" lines. +-ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +-ac_dB='[ ].*$,\1#\2' ++ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ++ac_dB='[ ].*$,\1#\2' + ac_dC=' ' + ac_dD=',;t' + # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +-ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ++ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' + ac_uB='$,\1#\2define\3' + ac_uC=' ' + ac_uD=',;t' +@@ -12739,11 +25286,11 @@ + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin +- cat >$tmp/stdin +- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ cat >$tmp/stdin ++ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + +@@ -12757,28 +25304,29 @@ + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) +- # Absolute (can't be DOS-style, as IFS=:) +- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ # Absolute (can't be DOS-style, as IFS=:) ++ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- echo $f;; ++ # Do quote $f, to prevent DOS paths from being IFS'd. ++ echo "$f";; + *) # Relative +- if test -f "$f"; then +- # Build tree +- echo $f +- elif test -f "$srcdir/$f"; then +- # Source tree +- echo $srcdir/$f +- else +- # /dev/null tree +- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ if test -f "$f"; then ++ # Build tree ++ echo "$f" ++ elif test -f "$srcdir/$f"; then ++ # Source tree ++ echo "$srcdir/$f" ++ else ++ # /dev/null tree ++ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- fi;; ++ fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. +- sed 's/[ ]*$//' $ac_file_inputs >$tmp/in ++ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + + _ACEOF + +@@ -12801,9 +25349,9 @@ + s,[\\$`],\\&,g + t clear + : clear +-s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp ++s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp + t end +-s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp ++s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp + : end + _ACEOF + # If some macros were called several times there might be several times +@@ -12817,13 +25365,13 @@ + # example, in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + cat >>conftest.undefs <<\_ACEOF +-s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, ++s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, + _ACEOF + + # Break up conftest.defines because some shells have a limit on the size + # of here documents, and old seds have small limits too (100 cmds). + echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +-echo ' if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS ++echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS + echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS + echo ' :' >>$CONFIG_STATUS + rm -f conftest.tail +@@ -12832,7 +25380,7 @@ + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. +- echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS ++ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS +@@ -12847,7 +25395,7 @@ + mv conftest.tail conftest.defines + done + rm -f conftest.defines +-echo ' fi # egrep' >>$CONFIG_STATUS ++echo ' fi # grep' >>$CONFIG_STATUS + echo >>$CONFIG_STATUS + + # Break up conftest.undefs because some shells have a limit on the size +@@ -12859,7 +25407,7 @@ + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' +- echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS ++ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS +@@ -12887,41 +25435,46 @@ + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then +- if cmp -s $ac_file $tmp/config.h 2>/dev/null; then ++ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 + echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || + $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_file" : 'X\(//\)[^/]' \| \ +- X"$ac_file" : 'X\(//\)$' \| \ +- X"$ac_file" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` +- { case "$ac_dir" in +- [\\/]* | ?:[\\/]* ) as_incr_dir=;; +- *) as_incr_dir=.;; +-esac +-as_dummy="$ac_dir" +-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do +- case $as_mkdir_dir in +- # Skip DOS drivespec +- ?:) as_incr_dir=$as_mkdir_dir ;; +- *) +- as_incr_dir=$as_incr_dir/$as_mkdir_dir +- test -d "$as_incr_dir" || +- mkdir "$as_incr_dir" || +- { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5 +-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;} +- { (exit 1); exit 1; }; } +- ;; +- esac +-done; } ++ { if $as_mkdir_p; then ++ mkdir -p "$ac_dir" ++ else ++ as_dir="$ac_dir" ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 ++echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} ++ { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file +@@ -12930,13 +25483,29 @@ + cat $tmp/config.h + rm -f $tmp/config.h + fi +- # Run the commands associated with the file. +- case $ac_file in +- config.h ) # update the timestamp +-echo 'timestamp for config.h' >"./stamp-h1" +- ;; ++# Compute $ac_file's index in $config_headers. ++_am_stamp_count=1 ++for _am_header in $config_headers :; do ++ case $_am_header in ++ $ac_file | $ac_file:* ) ++ break ;; ++ * ) ++ _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac + done ++echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || ++$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X$ac_file : 'X\(//\)[^/]' \| \ ++ X$ac_file : 'X\(//\)$' \| \ ++ X$ac_file : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X$ac_file | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'`/stamp-h$_am_stamp_count ++done + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF + +@@ -12948,16 +25517,41 @@ + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || + $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_dest" : 'X\(//\)[^/]' \| \ +- X"$ac_dest" : 'X\(//\)$' \| \ +- X"$ac_dest" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$ac_dest" : 'X\(//\)[^/]' \| \ ++ X"$ac_dest" : 'X\(//\)$' \| \ ++ X"$ac_dest" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` ++ { if $as_mkdir_p; then ++ mkdir -p "$ac_dir" ++ else ++ as_dir="$ac_dir" ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 ++echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} ++ { (exit 1); exit 1; }; }; } ++ + ac_builddir=. + + if test "$ac_dir" != .; then +@@ -12983,12 +25577,45 @@ + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac +-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +-# absolute. +-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +@@ -13006,10 +25633,10 @@ + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || + $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$mf" : 'X\(//\)[^/]' \| \ +- X"$mf" : 'X\(//\)$' \| \ +- X"$mf" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$mf" : 'X\(//\)[^/]' \| \ ++ X"$mf" : 'X\(//\)$' \| \ ++ X"$mf" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -13045,35 +25672,40 @@ + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || + $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$file" : 'X\(//\)[^/]' \| \ +- X"$file" : 'X\(//\)$' \| \ +- X"$file" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$file" : 'X\(//\)[^/]' \| \ ++ X"$file" : 'X\(//\)$' \| \ ++ X"$file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` +- { case $dirpart/$fdir in +- [\\/]* | ?:[\\/]* ) as_incr_dir=;; +- *) as_incr_dir=.;; +-esac +-as_dummy=$dirpart/$fdir +-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do +- case $as_mkdir_dir in +- # Skip DOS drivespec +- ?:) as_incr_dir=$as_mkdir_dir ;; +- *) +- as_incr_dir=$as_incr_dir/$as_mkdir_dir +- test -d "$as_incr_dir" || +- mkdir "$as_incr_dir" || +- { { echo "$as_me:$LINENO: error: cannot create $dirpart/$fdir" >&5 +-echo "$as_me: error: cannot create $dirpart/$fdir" >&2;} +- { (exit 1); exit 1; }; } +- ;; +- esac +-done; } ++ { if $as_mkdir_p; then ++ mkdir -p $dirpart/$fdir ++ else ++ as_dir=$dirpart/$fdir ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 ++echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} ++ { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" +@@ -13102,8 +25734,11 @@ + # need to make the FD available again. + if test "$no_create" != yes; then + ac_cs_success=: ++ ac_config_status_args= ++ test "$silent" = yes && ++ ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null +- $SHELL $CONFIG_STATUS || ac_cs_success=false ++ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. +diff -Naur libodbc++-0.2.3/configure.ac libodbc++-0.2.3-20050404/configure.ac +--- libodbc++-0.2.3/configure.ac 2003-06-17 12:20:32.000000000 +0200 ++++ libodbc++-0.2.3-20050404/configure.ac 2005-04-04 18:12:42.000000000 +0200 +@@ -18,7 +18,7 @@ + # Boston, MA 02111-1307, USA. + + AC_PREREQ(2.53) +-AC_INIT(libodbcxx,0.2.3,freeodbc++@orcane.net,libodbc++) ++AC_INIT(libodbcxx,0.2.3-20050404,freeodbc++@orcane.net,libodbc++) + AC_CONFIG_SRCDIR(src/connection.cpp) + AM_INIT_AUTOMAKE + AM_CONFIG_HEADER(config.h) +diff -Naur libodbc++-0.2.3/depcomp libodbc++-0.2.3-20050404/depcomp +--- libodbc++-0.2.3/depcomp 2003-03-28 16:40:16.000000000 +0100 ++++ libodbc++-0.2.3-20050404/depcomp 2005-04-04 18:10:28.000000000 +0200 +@@ -1,7 +1,7 @@ + #! /bin/sh + + # depcomp - compile a program generating dependencies as side-effects +-# Copyright 1999, 2000 Free Software Foundation, Inc. ++# Copyright 1999, 2000, 2003 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by +@@ -172,19 +172,25 @@ + + aix) + # The C for AIX Compiler uses -M and outputs the dependencies +- # in a .u file. This file always lives in the current directory. +- # Also, the AIX compiler puts `$object:' at the start of each line; +- # $object doesn't have directory information. +- stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` ++ # in a .u file. In older versions, this file always lives in the ++ # current directory. Also, the AIX compiler puts `$object:' at the ++ # start of each line; $object doesn't have directory information. ++ # Version 6 uses the directory in both cases. ++ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" +- outname="$stripped.o" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi +- + stat=$? ++ ++ if test -f "$tmpdepfile"; then : ++ else ++ stripped=`echo "$stripped" | sed 's,^.*/,,'` ++ tmpdepfile="$stripped.u" ++ fi ++ + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" +@@ -192,6 +198,7 @@ + fi + + if test -f "$tmpdepfile"; then ++ outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. +@@ -206,6 +213,44 @@ + rm -f "$tmpdepfile" + ;; + ++icc) ++ # Intel's C compiler understands `-MD -MF file'. However on ++ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c ++ # ICC 7.0 will fill foo.d with something like ++ # foo.o: sub/foo.c ++ # foo.o: sub/foo.h ++ # which is wrong. We want: ++ # sub/foo.o: sub/foo.c ++ # sub/foo.o: sub/foo.h ++ # sub/foo.c: ++ # sub/foo.h: ++ # ICC 7.1 will output ++ # foo.o: sub/foo.c sub/foo.h ++ # and will wrap long lines using \ : ++ # foo.o: sub/foo.c ... \ ++ # sub/foo.h ... \ ++ # ... ++ ++ "$@" -MD -MF "$tmpdepfile" ++ stat=$? ++ if test $stat -eq 0; then : ++ else ++ rm -f "$tmpdepfile" ++ exit $stat ++ fi ++ rm -f "$depfile" ++ # Each line is of the form `foo.o: dependent.h', ++ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. ++ # Do two passes, one to just change these to ++ # `$object: dependent.h' and one to simply `dependent.h:'. ++ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" ++ # Some versions of the HPUX 10.20 sed can't process this invocation ++ # correctly. Breaking it into two sed invocations is a workaround. ++ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | ++ sed -e 's/$/ :/' >> "$depfile" ++ rm -f "$tmpdepfile" ++ ;; ++ + tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. +@@ -240,8 +285,8 @@ + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" +- # That's a space and a tab in the []. +- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" ++ # That's a tab and a space in the []. ++ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi +@@ -254,7 +299,7 @@ + + dashmstdout) + # Important note: in order to support this mode, a compiler *must* +- # always write the proprocessed file to stdout, regardless of -o. ++ # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. +@@ -265,9 +310,7 @@ + shift + fi + +- # Remove `-o $object'. We will use -o /dev/null later, +- # however we can't do the remplacement now because +- # `-o $object' might simply not be used ++ # Remove `-o $object'. + IFS=" " + for arg + do +@@ -287,7 +330,11 @@ + done + + test -z "$dashmflag" && dashmflag=-M +- "$@" -o /dev/null $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" ++ # Require at least two characters before searching for `:' ++ # in the target name. This is to cope with DOS-style filenames: ++ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. ++ "$@" $dashmflag | ++ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +@@ -306,6 +353,13 @@ + + makedepend) + "$@" || exit $? ++ # Remove any Libtool call ++ if test "$libtool" = yes; then ++ while test $1 != '--mode=compile'; do ++ shift ++ done ++ shift ++ fi + # X makedepend + shift + cleared=no +@@ -318,7 +372,9 @@ + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; +- -*) ++ # Strip any option that makedepend may not understand. Remove ++ # the object too, otherwise makedepend will parse it as a source file. ++ -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; +@@ -339,7 +395,7 @@ + + cpp) + # Important note: in order to support this mode, a compiler *must* +- # always write the proprocessed file to stdout. ++ # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. +@@ -381,7 +437,7 @@ + + msvisualcpp) + # Important note: in order to support this mode, a compiler *must* +- # always write the proprocessed file to stdout, regardless of -o, ++ # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " +diff -Naur libodbc++-0.2.3/doc/INSTALL/book1.html libodbc++-0.2.3-20050404/doc/INSTALL/book1.html +--- libodbc++-0.2.3/doc/INSTALL/book1.html 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/book1.html 1970-01-01 01:00:00.000000000 +0100 +@@ -1,194 +0,0 @@ +- +-Libodbc++ Installation

Libodbc++ Installation

Manush Dodunekov

manush@stendahls.net

Version 0.2.3


  Next >>>
  Software requirements
+\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/c18.html libodbc++-0.2.3-20050404/doc/INSTALL/c18.html +--- libodbc++-0.2.3/doc/INSTALL/c18.html 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/c18.html 1970-01-01 01:00:00.000000000 +0100 +@@ -1,166 +0,0 @@ +- +-Software requirements
Libodbc++ Installation
<<< PreviousNext >>>

Software requirements

C++ compiler

To compile libodbc++, you'll need a c++ compiler that supports +- exceptions, templates and namespaces and +- has a reasonable standard c++ library. On free unices, +- your best choice is GCC 2.95.2 or later, which can be +- obtained from the GCC homepage. +- If you already have egcs 1.1.2 or later, it will do.

On win32, success has been reported with MSVC 5.0 and 6.0, with +- and without QT.


<<< PreviousHomeNext >>>
Libodbc++ Installation ODBC Driver Manager
+\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/c70.html libodbc++-0.2.3-20050404/doc/INSTALL/c70.html +--- libodbc++-0.2.3/doc/INSTALL/c70.html 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/c70.html 1970-01-01 01:00:00.000000000 +0100 +@@ -1,663 +0,0 @@ +- +-Installation
Libodbc++ Installation
<<< PreviousNext >>>

Installation

UNIX

The following information applies for installing libodbc++ on unices.

Configuration

First, you need to configure libodbc++ for your system. +- Go into the source directory and do: +- +-
$ ./configure
+- +- or, if iODBC isn't installed in it's default location +- /usr/local, do: +-
$ ./configure --with-iodbc=DIR
+- +- This will make ./configure look for iODBC in +- DIR/include and +- DIR/lib.

If you aren't using iODBC, try +- +-
$ ./configure --with-odbc=DIR
+- This works the same as above, except it looks for standard ODBC headers and libraries +- instead of the iODBC-specific ones. This should be used with for example +- unixODBC and Merant driver manager.

If you wish to install libodbc++ in a location other than +- /usr/local, add +- --prefix=PREFIX to the ./configure arguments.

If the c++ compiler you wish to use to compile this package isn't the system +- default one, you will need to set the environment variable CXX to +- the name of it's executable. For example, if you have an old gcc or +- egcs as a system default compiler, but installed a newer +- gcc in /usr/local/gcc, do like this: +-
$ CXX=/usr/local/egcs/bin/c++ ./configure --with-iodbc
+-

If you wish to enable support for multithreaded programs, add +- --enable-threads to the ./configure arguments. +- On UNIX, this requires pthreads and will probably not yet work on anything else +- than linux and solaris. The library built will have suffix '-mt' appended +- to it's name if threads are enabled.

If you wish to enable support for QT, +- use the --with-qt +- argument. You can optionally specify where your QT lives by using +- --with-qt=QTDIR. The +- --with-qt-includes=DIR, +- --with-qt-libs=DIR and +- --with-qt-moc=PATH options might be handy if you have +- a strange QT installation. This will compile a second version of the library +- named libodbc++_qt in the subdirectory qt. +- Note that you must define ODBCXX_QT when compiling a program +- that links with libodbc++_qt.

The two "demo" programs that come with libodbc++ aren't +- built by default. To enable them, use --with-isqlxx and/or +- --with-qtsqlxx to build isql++ +- respectively qtsql++.

By default, a number of test programs are built with the library. If you do not wish +- to build them, use --without-tests.

You can control the ODBC version libodbc++ uses by specifying: +- --with-odbc-version=ODBCVER, +- where ODBCVER should be a +- four-digit hexadecimal value representing the ODBC version. For example: +-
$ ./configure --with-odbc-version=0x0250
+- would make libodbc++ use ODBC version 2.50.

Compilation

Just type: +-
$ make
+-

If it all goes well, you can try a couple of the test programs in +- tests/. You'll need to configure some datasources before +- running most of the tests. For simply reality-checking your current ODBC +- setup, you can try running tests/dmtest, which lists +- all available datasources and drivers.

Installing libodbc++

If you have write privileges in PREFIX, just do: +-
$ make install
+- Otherwise, you'll have to use: +-
$ su root -c 'make install'

+\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/caution.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/caution.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/caution.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/caution.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3 +0,0 @@ +-GIF87a!!11BBZZcckkss{{sss{s{cZcc19B191,uH_@Ȑ 6DHB +-$N$ +-4>pиa (e|QGE(YaD`P 8j,XEJt@P?MeHL)%d)؝ JCgep`-[ tYb 16|o "ؕd=H)UDFW4  热-XċBݐ'ơ:o ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/home.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/home.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/home.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/home.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF87a#!!))11BBJJccssƌΔΥ޵,#%H*\ȰC4p A24 @`42D@` P J F` I(%X`@p@ XAPJ``@:H:)֜\ E٠$P6-Y傐`U{ ֔&d@HAA+^!A.la\ͺ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/important.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/important.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/important.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/important.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3 +0,0 @@ +-GIF87a)))999BB1BBBJJJRRRZZ)ccccRccckkBkkkssR{{{9{ZZc{c!9k{JRZZsRck!19R!)1Zc{1B19J!,HpA*ܲĆ ""Bae!A+3,|ҤcG,0$WRTC dd͔ML9& +-|ܰs 5WR@ARM< $J rSG +-8Pܼ"i'c9,""LdOW`+D2ͫ2$>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~, HA*ثR:[1F{1J&R<(Zʓ[Hi&L5 :+ub)LS`QzRAJ5kr͚3F Ftn9 +-<Ҙ9Mu lFQE=5k-5Szҿw=QbsT¸$eJ{Jq\ǫ=@W˚Z!l3ƦR<-%3!c[B*'{ƚxyǨ^Sj lĊQ9o;6$H; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/prev.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/prev.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/prev.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/prev.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,2 +0,0 @@ +-GIF87a#!!))11BBJJRRkkssƌΔΥ֭,#)H*\ȰCH|bP(@":(P`D@ 4 +-  Ӟ>A,J$ (u U0"A zh@#XA@ H@W߿; ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/tip.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/tip.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/tip.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/tip.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,6 +0,0 @@ +-GIF87a +- +- +-  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~, HA*xX)J"Btvoa{&!%J,2M3QUQsj)TK!s +-W&tV{{BYTI7yFЛх*^Uh +-k`֔x˞ )Hv[?]m&V'^BxpBÀ#DẂV2 g-Oz3& kQ«k='ۘɔ=x"m|_@; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/toc-blank.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/toc-blank.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/toc-blank.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/toc-blank.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF89a , ɇ8۪`%_ƕtf; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/toc-minus.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/toc-minus.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/toc-minus.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/toc-minus.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF89a , 08P*LPÆ641:ܘPč?V"A; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/toc-plus.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/toc-plus.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/toc-plus.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/toc-plus.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF89a , 38P*LPC6tx0hH1LJ)6)qD ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/up.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/up.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/up.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/up.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF87a#!!))11BBcckkƌΔ޵,##H*\p Dh` @ D(d ,(`KF@Pq̩PB "0PTrL jNjjMsB|4˶m€; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/stylesheet-images/warning.gif libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/warning.gif +--- libodbc++-0.2.3/doc/INSTALL/stylesheet-images/warning.gif 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/stylesheet-images/warning.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF87a!)1BJRZks{{{RRZZ{{99JJ11))))))!!,yC p`6Da p#ǏQ\̈#E S@q#PL"K"NJSpT9@2C^!3 3sh@7 z {5kdeKv5+͚C рJYg0@,Sjuf 8@a@3T G;P}@NNI2C"t́ag}Q;m7fD>ou;w ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/x185.html libodbc++-0.2.3-20050404/doc/INSTALL/x185.html +--- libodbc++-0.2.3/doc/INSTALL/x185.html 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/x185.html 1970-01-01 01:00:00.000000000 +0100 +@@ -1,354 +0,0 @@ +- +-Win32
Libodbc++ Installation
<<< PreviousInstallation 

Win32

MSVC

A makefile for MSVC is provided in the win32 directory of the source distribution. Use +-
nmake /f makefile.w32 CFG=config
+- where config is one of: +-

  • debug-lib - Static library with debugging information. Builds +- odbc++sd.lib in the debug-lib subdirectory.

  • debug-dll - Shared library with debugging information. Builds +- odbc++d.lib and odbc++d.dll in the debug-dll +- subdirectory.

  • prod-lib - Production static library. Builds odbc++s.lib +- in the prod-lib subdirectory.

  • prod-dll - Production shared library. Builds odbc++.lib +- and odbc++.dll in the prod-dll subdirectory.

  • qt-debug-lib - Static library with QT and debugging information. +- Builds odbc++qtsd.lib in the qt-debug-lib subdirectory.

  • qt-debug-dll - Shared library with QT and debugging information. +- Builds odbc++qtd.lib and odbc++qtd.dll in the +- qt-debug-dll subdirectory.

  • qt-prod-lib - Production static library with QT. Builds +- odbc++qts.lib in the qt-prod-lib subdirectory.

  • qt-prod-dll - Production shared library with QT. Builds +- odbc++qt.lib and odbc++qt.dll in the +- qt-prod-dll subdirectory.

When building with QT, make sure you have your environment set up right. QTDIR +- must point to a directory that contains the include and +- lib subdirectories for QT. The makefile will assume version 202 (2.0.2) of QT. +- To override that, pass QT_VERSION=nnn to nmake, for +- example: +-
nmake /f makefile.w32 CFG=qt-debug-dll QT_VERSION=201
+- will build libodbc++ against QT version 2.0.1.

The library is always built with multithreading support on win32.


<<< PreviousHome 
InstallationUp 
+\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/x27.html libodbc++-0.2.3-20050404/doc/INSTALL/x27.html +--- libodbc++-0.2.3/doc/INSTALL/x27.html 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/x27.html 1970-01-01 01:00:00.000000000 +0100 +@@ -1,188 +0,0 @@ +- +-ODBC Driver Manager
Libodbc++ Installation
<<< PreviousSoftware requirementsNext >>>

ODBC Driver Manager

The ODBC Driver Manager is the software layer between +- applications and ODBC drivers. You must have one installed +- in order to use this library. +- The free choices on UNIX are: +-

  • iODBC. +- Version 2.50.3 or later is recommended.

  • unixODBC. +- Version 1.8.4 or later is recommended.

+- Among the commercial driver managers, libodbc++ has been reported to work fine +- with the Merant driver manager.


<<< PreviousHomeNext >>>
Software requirementsUpDrivers
+\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/x41.html libodbc++-0.2.3-20050404/doc/INSTALL/x41.html +--- libodbc++-0.2.3/doc/INSTALL/x41.html 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/x41.html 1970-01-01 01:00:00.000000000 +0100 +@@ -1,239 +0,0 @@ +- +-Drivers
Libodbc++ Installation
<<< PreviousSoftware requirementsNext >>>

Drivers

To actually use libodbc++, you will need +- one or more ODBC drivers. Examples of free database engines +- with ODBC drivers are: +-

+-

MyODBC version 2.50.28 contains a bug that prevents +- it from working (at all). +- This +- patch solves the problem. +-

+-

Several vendors provide commercial drivers for unix: +-

+-


<<< PreviousHomeNext >>>
ODBC Driver ManagerUpQT
+\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/INSTALL/x65.html libodbc++-0.2.3-20050404/doc/INSTALL/x65.html +--- libodbc++-0.2.3/doc/INSTALL/x65.html 2003-06-17 12:25:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/INSTALL/x65.html 1970-01-01 01:00:00.000000000 +0100 +@@ -1,156 +0,0 @@ +- +-QT
Libodbc++ Installation
<<< PreviousSoftware requirementsNext >>>

QT

Libodbc++ can be built with support for +- the QT library version 2.0 or later, +- both on UNIX and win32.


<<< PreviousHomeNext >>>
DriversUpInstallation
+\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/Makefile.in libodbc++-0.2.3-20050404/doc/Makefile.in +--- libodbc++-0.2.3/doc/Makefile.in 2003-06-17 12:20:50.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/Makefile.in 2005-04-04 18:21:26.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,92 +32,146 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = .. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + instdoc_dir = @docdir@/@PACKAGE@-@VERSION@/INSTALL +@@ -128,16 +182,18 @@ + + EXTRA_DIST = $(instdoc_name).sgml + subdir = doc ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = + DIST_SOURCES = + +-RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ +- uninstall-info-recursive all-recursive install-data-recursive \ +- install-exec-recursive installdirs-recursive install-recursive \ +- uninstall-recursive check-recursive installcheck-recursive +-DIST_COMMON = Makefile.am Makefile.in ++RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ++ ps-recursive install-info-recursive uninstall-info-recursive \ ++ all-recursive install-data-recursive install-exec-recursive \ ++ installdirs-recursive install-recursive uninstall-recursive \ ++ check-recursive installcheck-recursive ++DIST_COMMON = $(srcdir)/Makefile.in Makefile.am + DIST_SUBDIRS = $(SUBDIRS) + all: all-recursive + +@@ -212,10 +268,17 @@ + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done ++ctags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ ++ done + + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -231,9 +294,15 @@ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ ++ if (etags --etags-include --version) >/dev/null 2>&1; then \ ++ include_option=--etags-include; \ ++ else \ ++ include_option=--include; \ ++ fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ +- test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ ++ test -f $$subdir/TAGS && \ ++ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +@@ -246,20 +315,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = .. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -293,7 +383,7 @@ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ +- top_distdir="${top_distdir}" distdir="$(distdir)" \ ++ top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + check-am: all-am + check: check-recursive +@@ -312,7 +402,7 @@ + installcheck: installcheck-recursive + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -320,7 +410,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -330,7 +420,7 @@ + clean-am: clean-generic clean-libtool clean-local mostlyclean-am + + distclean: distclean-recursive +- ++ -rm -f Makefile + distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +@@ -353,7 +443,7 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-recursive +- ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +@@ -361,25 +451,34 @@ + + mostlyclean-am: mostlyclean-generic mostlyclean-libtool + ++pdf: pdf-recursive ++ ++pdf-am: ++ ++ps: ps-recursive ++ ++ps-am: ++ + uninstall-am: uninstall-info-am uninstall-local + + uninstall-info: uninstall-info-recursive + +-.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am all-local check check-am \ +- clean clean-generic clean-libtool clean-local clean-recursive \ +- distclean distclean-generic distclean-libtool \ +- distclean-recursive distclean-tags distdir dvi dvi-am \ +- dvi-recursive info info-am info-recursive install install-am \ +- install-data install-data-am install-data-local \ +- install-data-recursive install-exec install-exec-am \ +- install-exec-recursive install-info install-info-am \ +- install-info-recursive install-man install-recursive \ +- install-strip installcheck installcheck-am installdirs \ +- installdirs-am installdirs-recursive maintainer-clean \ +- maintainer-clean-generic maintainer-clean-local \ +- maintainer-clean-recursive mostlyclean mostlyclean-generic \ +- mostlyclean-libtool mostlyclean-recursive tags tags-recursive \ +- uninstall uninstall-am uninstall-info-am \ ++.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am all-local check \ ++ check-am clean clean-generic clean-libtool clean-local \ ++ clean-recursive ctags ctags-recursive distclean \ ++ distclean-generic distclean-libtool distclean-recursive \ ++ distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ ++ info-recursive install install-am install-data install-data-am \ ++ install-data-local install-data-recursive install-exec \ ++ install-exec-am install-exec-recursive install-info \ ++ install-info-am install-info-recursive install-man \ ++ install-recursive install-strip installcheck installcheck-am \ ++ installdirs installdirs-am installdirs-recursive \ ++ maintainer-clean maintainer-clean-generic \ ++ maintainer-clean-local maintainer-clean-recursive mostlyclean \ ++ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ ++ pdf pdf-am pdf-recursive ps ps-am ps-recursive tags \ ++ tags-recursive uninstall uninstall-am uninstall-info-am \ + uninstall-info-recursive uninstall-local uninstall-recursive + + +diff -Naur libodbc++-0.2.3/doc/progref/annotated.html libodbc++-0.2.3-20050404/doc/progref/annotated.html +--- libodbc++-0.2.3/doc/progref/annotated.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/annotated.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,31 +1,30 @@ +- ++ + +-Annotated Index ++libodbc++: Class List + + +- +-
+-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
+-

libodbc++ Compound List

Here are the classes, structs, unions and interfaces with brief descriptions: +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

libodbc++ Class List

Here are the classes, structs, unions and interfaces with brief descriptions:
odbc::BytesA chunk of bytes
odbc::CallableStatementA prepared statement suited for stored procedure calls
odbc::ConnectionA database connection
odbc::DatabaseMetaDataProvides several tons of information about a data source
odbc::DataSourceA Data Source
odbc::DateAn SQL DATE
odbc::DriverAn ODBC Driver with it's information
odbc::DriverManagerThe DriverManager
odbc::DriverMessageUsed internally - represents the result of an SQLError call
odbc::ErrorHandlerBase class for everything that might contain warnings
odbc::PreparedStatementA prepared statement
odbc::ResultSetA result set
odbc::ResultSetMetaDataProvides meta data about a result set
odbc::SQLExceptionThe exception thrown when errors occur inside the library
odbc::SQLWarningRepresents an SQL warning
odbc::StatementA simple non-prepared statement
odbc::TimeAn SQL TIME
odbc::TimestampAn SQL TIMESTAMP
odbc::TypesSQL type constants
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
odbc::BytesA chunk of bytes
odbc::CallableStatementA prepared statement suited for stored procedure calls
odbc::ConnectionA database connection
odbc::DatabaseMetaDataProvides several tons of information about a data source
odbc::DataSourceA Data Source
odbc::DateAn SQL DATE
odbc::DriverAn ODBC Driver with it's information
odbc::DriverManagerThe DriverManager
odbc::DriverMessageUsed internally - represents the result of an SQLError call
odbc::ErrorHandlerBase class for everything that might contain warnings
odbc::PreparedStatementA prepared statement
odbc::ResultSetA result set
odbc::ResultSetMetaDataProvides meta data about a result set
odbc::SQLExceptionThe exception thrown when errors occur inside the library
odbc::SQLWarningRepresents an SQL warning
odbc::StatementA simple non-prepared statement
odbc::TimeAn SQL TIME
odbc::TimestampAn SQL TIMESTAMP
odbc::TypesSQL type constants
+
+
+diff -Naur libodbc++-0.2.3/doc/progref/callablestatement_8h-source.html libodbc++-0.2.3-20050404/doc/progref/callablestatement_8h-source.html +--- libodbc++-0.2.3/doc/progref/callablestatement_8h-source.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/callablestatement_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,100 +1,99 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/callablestatement.h Source File ++libodbc++: odbc++/callablestatement.h Source File + + +- +-
+-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
+-

/trees/alex/src/libodbc++/include/odbc++/callablestatement.h

00001 /* 
+-00002    This file is part of libodbc++.
+-00003    
+-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
+-00005    
+-00006    This library is free software; you can redistribute it and/or
+-00007    modify it under the terms of the GNU Library General Public
+-00008    License as published by the Free Software Foundation; either
+-00009    version 2 of the License, or (at your option) any later version.
+-00010    
+-00011    This library is distributed in the hope that it will be useful,
+-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
+-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-00014    Library General Public License for more details.
+-00015    
+-00016    You should have received a copy of the GNU Library General Public License
+-00017    along with this library; see the file COPYING.  If not, write to
+-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+-00019    Boston, MA 02111-1307, USA.
+-00020 */
++
++
++

odbc++/callablestatement.h

00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_CALLABLESTATEMENT_H +-00023 #define __ODBCXX_CALLABLESTATEMENT_H +-00024 +-00025 #include <odbc++/setup.h> +-00026 #include <odbc++/types.h> +-00027 #include <odbc++/preparedstatement.h> ++00022 #ifndef __ODBCXX_CALLABLESTATEMENT_H ++00023 #define __ODBCXX_CALLABLESTATEMENT_H ++00024 ++00025 #include <odbc++/setup.h> ++00026 #include <odbc++/types.h> ++00027 #include <odbc++/preparedstatement.h> + 00028 +-00029 namespace odbc { ++00029 namespace odbc { + 00030 +-00057 class ODBCXX_EXPORT CallableStatement : public PreparedStatement { +-00058 friend class Connection; ++00057 class ODBCXX_EXPORT CallableStatement : public PreparedStatement { ++00058 friend class Connection; + 00059 +-00060 private: +-00061 bool lastWasNull_; ++00060 private: ++00061 bool lastWasNull_; + 00062 +-00063 protected: +-00064 CallableStatement(Connection* con, ++00063 protected: ++00064 CallableStatement(Connection* con, + 00065 SQLHSTMT hstmt, +-00066 const ODBCXX_STRING& sql, +-00067 int resultSetType, +-00068 int resultSetConcurrency); ++00066 const ODBCXX_STRING& sql, ++00067 int resultSetType, ++00068 int resultSetConcurrency); + 00069 +-00070 public: +-00072 virtual ~CallableStatement(); ++00070 public: ++00072 virtual ~CallableStatement(); + 00073 +-00077 double getDouble(int idx); ++00077 double getDouble(int idx); + 00078 +-00082 bool getBoolean(int idx); ++00082 bool getBoolean(int idx); + 00083 +-00087 signed char getByte(int idx); ++00087 signed char getByte(int idx); + 00088 +-00092 ODBCXX_BYTES getBytes(int idx); ++00092 ODBCXX_BYTES getBytes(int idx); + 00093 +-00097 Date getDate(int idx); ++00097 Date getDate(int idx); + 00098 +-00102 float getFloat(int idx); ++00102 float getFloat(int idx); + 00103 +-00107 int getInt(int idx); ++00107 int getInt(int idx); + 00108 +-00112 Long getLong(int idx); ++00112 Long getLong(int idx); + 00113 +-00117 short getShort(int idx); ++00117 short getShort(int idx); + 00118 +-00122 ODBCXX_STRING getString(int idx); ++00122 ODBCXX_STRING getString(int idx); + 00123 +-00127 Time getTime(int idx); ++00127 Time getTime(int idx); + 00128 +-00132 Timestamp getTimestamp(int idx); ++00132 Timestamp getTimestamp(int idx); + 00133 +-00139 void registerOutParameter(int idx, int sqlType) { ++00139 void registerOutParameter(int idx, int sqlType) { + 00140 this->registerOutParameter(idx,sqlType,0); + 00141 } + 00142 +-00149 void registerOutParameter(int idx, int sqlType, int scale); ++00149 void registerOutParameter(int idx, int sqlType, int scale); + 00150 +-00154 void registerInParameter(int idx); ++00154 void registerInParameter(int idx); + 00155 +-00157 bool wasNull() { +-00158 return lastWasNull_; ++00157 bool wasNull() { ++00158 return lastWasNull_; + 00159 } + 00160 }; + 00161 + 00162 +-00163 }; // namespace odbc ++00163 }; // namespace odbc + 00164 + 00165 +-00166 #endif // __ODBCXX_CALLABLESTATEMENT_H +-

++00166 #endif // __ODBCXX_CALLABLESTATEMENT_H ++

+ +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_bytes.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_bytes.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_bytes.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_bytes.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,42 +1,42 @@ +- ++ + +-odbc::Bytes class Reference ++libodbc++: odbc::Bytes Class Reference + + +- +-
+-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
+-

odbc::Bytes Class Reference

A chunk of bytes. ++ ++ ++

odbc::Bytes Class Reference

A chunk of bytes. + More... +

+ #include <types.h> +

+-List of all members.

Public Methods

++List of all members.

Public Member Functions

+
    +-
  • ++
  • + Bytes () +-
    Default constructor.

  • ++
    Default constructor.
  • + Bytes (const signed char *data, size_t dataLen) +-
    Constructor.

  • +-Bytes (const Bytes &b) +-
    Copy constructor.

  • +-Bytes & operator= (const Bytes &b) +-
    Assignment.

  • +-~Bytes () +-
    Destructor.

  • +-const signed char * getData () const +-
    Returns a pointer to the data.

  • +-size_t getSize () const +-
    Returns the size of the data.

++
Constructor.
  • ++Bytes (const Bytes &b) ++
    Copy constructor.
  • ++Bytes & operator= (const Bytes &b) ++
    Assignment.
  • ++bool operator== (const Bytes &b) ++
    Comparison.
  • ++~Bytes () ++
    Destructor.
  • ++const signed char * getData () const ++
    Returns a pointer to the data.
  • ++size_t getSize () const ++
    Returns the size of the data.
    +

    Detailed Description

    +-A chunk of bytes. ++A chunk of bytes. +

    +-Used for setting and getting binary values.

    +-Warning:
    +-This class uses reference counting. An instance that is referred to from different threads is likely to cause trouble.
    ++Used for setting and getting binary values.
    Warning:
    This class uses reference counting. An instance that is referred to from different threads is likely to cause trouble.
    ++ +

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_bytes-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_bytes-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_bytes-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_bytes-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,19 +1,19 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Bytes Member List

    This is the complete list of members for odbc::Bytes, including all inherited members. +- +- +- +- +- +- +- ++ ++ ++

    odbc::Bytes Member List

    This is the complete list of members for odbc::Bytes, including all inherited members.

    Bytes()odbc::Bytes
    Bytes(const signed char *data, size_t dataLen)odbc::Bytes
    Bytes(const Bytes &b)odbc::Bytes
    getData() constodbc::Bytes
    getSize() constodbc::Bytes
    operator=(const Bytes &b)odbc::Bytes
    ~Bytes()odbc::Bytes
    ++ ++ ++ ++ ++ ++ ++ ++ +
    Bytes()odbc::Bytes
    Bytes(const signed char *data, size_t dataLen)odbc::Bytes
    Bytes(const Bytes &b)odbc::Bytes
    getData() constodbc::Bytes
    getSize() constodbc::Bytes
    operator=(const Bytes &b)odbc::Bytes
    operator==(const Bytes &b)odbc::Bytes
    ~Bytes()odbc::Bytes

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement.gif libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement.gif +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,8 +0,0 @@ +-GIF89a`!,80I8`(dihp,eKx\/H,I]tPZ3]5J?^7>=gK5 cQ&u<1x~k~comTs2%Pyto,0 {'e)c$hȣ1b{nЫ׆Ѯt}v|ߺ趢q̓3G:. ("  "\O!ÇFBC"ŋ84hǏIɓ(S\˗0cʜIM.oɳϔJђAs]ʴˤBJRXך\ ٳHѪ5v[mew]uw_+pKÈgNƈC.,yrʖbάw3g? --jO>z5֮F ۸5b܍"+|nB8!#_Ag*̸ֽ|Ţ/c i7KeUƨN3yizaLW)H}N"gJ;W5 +-v片d ̗a-!}*^9A^}\Gz%M{"2#@#($[F^d-CN>PRەXfygU^bTIfPUjj_`Ikٙwʼn'^{Υg> (_VZjSh2= +-)LNRWnzRV*R:z*+UJIe݊?O #?xG,^XTaNlA##PWΨܦ7.;%"*brJ !#0XnJϋIXsP"-0D'r|r'lM9~(qa %0|pb,"pƊ`p5Y4,Cu.fWuvF-w\iwUQMW~/fsy~3nB>Rިb~r>瀂ާ{vNrm®gN)/F=|Q/?T}/{@5 +-^=p +-<T_a,Ta Є$KP(0b qC"ް{3b m$B +-|? +-OO,8$rъC%oPg0: E2ЎPd82"სVD +-}HHVXcDIOd&3 r&7)ܑ;%*hV򕰌,M; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,77 +1,72 @@ +- ++ + +-odbc::CallableStatement class Reference ++libodbc++: odbc::CallableStatement Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::CallableStatement Class Reference

    A prepared statement suited for stored procedure calls. ++ ++ ++

    odbc::CallableStatement Class Reference

    A prepared statement suited for stored procedure calls. + More... +

    + #include <callablestatement.h> +

    +

    Inheritance diagram for odbc::CallableStatement: +-

    ++

    + + odbc::PreparedStatement + odbc::Statement + odbc::ErrorHandler + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    + ++
    Returns true if the last fetched parameter was NULL.
    +

    Detailed Description

    +-A prepared statement suited for stored procedure calls. ++A prepared statement suited for stored procedure calls. +

    +-A CallableStatement extends the functionality of a PreparedStatement, by allowing output parameters. +-

    +-The ODBC escapes for calling stored procedures and functions should be used. A procedure call is prepared like this:

    +- CallableStatement* cstmt=con->prepareCall
    ++A CallableStatement extends the functionality of a PreparedStatement, by allowing output parameters.

    ++The ODBC escapes for calling stored procedures and functions should be used. A procedure call is prepared like this:

    ++ CallableStatement* cstmt=con->prepareCall
    +      ("{call my_procedure(?,?,?)}");
    +- 
    +-

    ++

    + And for a function call (a procedure that returns a value), the following syntax should be used:

    +- CallableStatement* cstmt=con->prepareCall
    ++ CallableStatement* cstmt=con->prepareCall
    +      ("{?=call my_function(?,?)}"); 
    +- 
    +-

    +-All parameters in a CallableStatement are treated as input/output parameters, unless they are registered as output-only parameters with registerOutParameter(). Note that output-only parameters must be registered with their proper SQL type prior to executing a CallableStatement. ++

    ++All parameters in a CallableStatement are treated as input/output parameters, unless they are registered as output-only parameters with registerOutParameter(). Note that output-only parameters must be registered with their proper SQL type prior to executing a CallableStatement. +

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -84,31 +79,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::CallableStatement::getBoolean bool odbc::CallableStatement::getBoolean int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a bool. ++Fetches a parameter as a bool. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -121,31 +114,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    signed char odbc::CallableStatement::getByte signed char odbc::CallableStatement::getByte int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a signed char. ++Fetches a parameter as a signed char. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -158,31 +149,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Bytes odbc::CallableStatement::getBytes Bytes odbc::CallableStatement::getBytes int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a Bytes object. ++Fetches a parameter as a Bytes object. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -195,31 +184,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Date odbc::CallableStatement::getDate Date odbc::CallableStatement::getDate int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a Date. ++Fetches a parameter as a Date. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -232,31 +219,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    double odbc::CallableStatement::getDouble double odbc::CallableStatement::getDouble int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a double. ++Fetches a parameter as a double. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -269,31 +254,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    float odbc::CallableStatement::getFloat float odbc::CallableStatement::getFloat int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a float. ++Fetches a parameter as a float. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -306,31 +289,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::CallableStatement::getInt int odbc::CallableStatement::getInt int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as an int. ++Fetches a parameter as an int. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -343,31 +324,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Long odbc::CallableStatement::getLong Long odbc::CallableStatement::getLong int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a Long. ++Fetches a parameter as a Long. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -380,31 +359,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    short odbc::CallableStatement::getShort short odbc::CallableStatement::getShort int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a short. ++Fetches a parameter as a short. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -417,31 +394,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::CallableStatement::getString std::string odbc::CallableStatement::getString int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a string. ++Fetches a parameter as a string. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -454,31 +429,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Time odbc::CallableStatement::getTime Time odbc::CallableStatement::getTime int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a Time. ++Fetches a parameter as a Time. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -491,31 +464,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Timestamp odbc::CallableStatement::getTimestamp Timestamp odbc::CallableStatement::getTimestamp int   idx idx  ) 
    +
    + +

    +-Fetches a parameter as a Timestamp. ++Fetches a parameter as a Timestamp. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -528,46 +499,44 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    void odbc::CallableStatement::registerInParameter void odbc::CallableStatement::registerInParameter int   idx idx  ) 
    +
    + +

    +-Registers an input only parameter. ++Registers an input only parameter. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The parameter index, starting at 1
    +-
    ++ ++
    idx The parameter index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -580,46 +549,41 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::CallableStatement::registerOutParameter void odbc::CallableStatement::registerOutParameter int   idx, idx,
    int   sqlType, sqlType,
    int   scale scale
    +
    + +

    +-Registers an output parameter with a given scale. ++Registers an output parameter with a given scale. +

    +-

    +-Parameters:
    +- +- +- +- +-
    idx  +-The parameter index, starting at 1
    sqlType  +-The SQL type of the parameter
    scale  +-The scale of the parameter.
    +-
    +-See also:
    +-Types
    ++ ++ ++ ++
    idx The parameter index, starting at 1
    sqlType The SQL type of the parameter
    scale The scale of the parameter.
    ++ ++

    See also:
    Types
    ++ + + +-

    +- ++

    ++

    + +- + +@@ -632,23 +596,20 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::CallableStatement::registerOutParameter void odbc::CallableStatement::registerOutParameter int   idx, idx,
    int   sqlType sqlType
    +
    + +

    +-Registers an output parameter. ++Registers an output parameter. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    sqlType  +-The SQL type of the parameter
    +-
    +-See also:
    +-Types
    ++ ++ ++
    idx The parameter index, starting at 1
    sqlType The SQL type of the parameter
    ++ ++

    See also:
    Types
    ++ + + +
    The documentation for this class was generated from the following file: ++
  • odbc++/callablestatement.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,76 +1,75 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::CallableStatement Member List

    This is the complete list of members for odbc::CallableStatement, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::CallableStatement Member List

    This is the complete list of members for odbc::CallableStatement, including all inherited members.

    cancel()odbc::Statement
    clearParameters()odbc::PreparedStatement
    clearWarnings()odbc::ErrorHandler
    close()odbc::Statement
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    execute()odbc::PreparedStatement
    odbc::Statement::execute(const std::string &sql)odbc::Statement [virtual]
    executeQuery()odbc::PreparedStatement
    odbc::Statement::executeQuery(const std::string &sql)odbc::Statement [virtual]
    executeUpdate()odbc::PreparedStatement
    odbc::Statement::executeUpdate(const std::string &sql)odbc::Statement [virtual]
    getBoolean(int idx)odbc::CallableStatement
    getByte(int idx)odbc::CallableStatement
    getBytes(int idx)odbc::CallableStatement
    getConnection()odbc::Statement
    getDate(int idx)odbc::CallableStatement
    getDouble(int idx)odbc::CallableStatement
    getEscapeProcessing()odbc::Statement
    getFetchSize()odbc::Statement
    getFloat(int idx)odbc::CallableStatement
    getInt(int idx)odbc::CallableStatement
    getLong(int idx)odbc::CallableStatement
    getMaxFieldSize()odbc::Statement
    getMaxRows()odbc::Statement
    getMoreResults()odbc::Statement
    getQueryTimeout()odbc::Statement
    getResultSet()odbc::Statement
    getResultSetConcurrency()odbc::Statement
    getResultSetType()odbc::Statement
    getShort(int idx)odbc::CallableStatement
    getString(int idx)odbc::CallableStatement
    getTime(int idx)odbc::CallableStatement
    getTimestamp(int idx)odbc::CallableStatement
    getUpdateCount()odbc::Statement
    getWarnings()odbc::ErrorHandler
    registerInParameter(int idx)odbc::CallableStatement
    registerOutParameter(int idx, int sqlType)odbc::CallableStatement
    registerOutParameter(int idx, int sqlType, int scale)odbc::CallableStatement
    setAsciiStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBinaryStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBoolean(int idx, bool val)odbc::PreparedStatement
    setByte(int idx, signed char val)odbc::PreparedStatement
    setBytes(int idx, const Bytes &val)odbc::PreparedStatement
    setCursorName(const std::string &name)odbc::Statement
    setDate(int idx, const Date &val)odbc::PreparedStatement
    setDouble(int idx, double val)odbc::PreparedStatement
    setEscapeProcessing(bool on)odbc::Statement
    setFetchSize(int size)odbc::Statement
    setFloat(int idx, float val)odbc::PreparedStatement
    setInt(int idx, int val)odbc::PreparedStatement
    setLong(int idx, Long val)odbc::PreparedStatement
    setMaxFieldSize(int maxFieldSize)odbc::Statement
    setMaxRows(int maxRows)odbc::Statement
    setNull(int idx, int sqlType)odbc::PreparedStatement
    setQueryTimeout(int seconds)odbc::Statement
    setShort(int idx, short val)odbc::PreparedStatement
    setString(int idx, const std::string &val)odbc::PreparedStatement
    setTime(int idx, const Time &val)odbc::PreparedStatement
    setTimestamp(int idx, const Timestamp &val)odbc::PreparedStatement
    wasNull()odbc::CallableStatement
    ~CallableStatement()odbc::CallableStatement [virtual]
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~PreparedStatement()odbc::PreparedStatement [virtual]
    ~Statement()odbc::Statement [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    cancel()odbc::Statement
    clearParameters()odbc::PreparedStatement
    clearWarnings()odbc::ErrorHandler
    close()odbc::Statement
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    execute()odbc::PreparedStatement
    odbc::Statement::execute(const std::string &sql)odbc::Statement [virtual]
    executeQuery()odbc::PreparedStatement
    odbc::Statement::executeQuery(const std::string &sql)odbc::Statement [virtual]
    executeUpdate()odbc::PreparedStatement
    odbc::Statement::executeUpdate(const std::string &sql)odbc::Statement [virtual]
    getBoolean(int idx)odbc::CallableStatement
    getByte(int idx)odbc::CallableStatement
    getBytes(int idx)odbc::CallableStatement
    getConnection()odbc::Statement
    getDate(int idx)odbc::CallableStatement
    getDouble(int idx)odbc::CallableStatement
    getEscapeProcessing()odbc::Statement
    getFetchSize()odbc::Statement
    getFloat(int idx)odbc::CallableStatement
    getInt(int idx)odbc::CallableStatement
    getLong(int idx)odbc::CallableStatement
    getMaxFieldSize()odbc::Statement
    getMaxRows()odbc::Statement
    getMoreResults()odbc::Statement
    getQueryTimeout()odbc::Statement
    getResultSet()odbc::Statement
    getResultSetConcurrency()odbc::Statement
    getResultSetType()odbc::Statement
    getShort(int idx)odbc::CallableStatement
    getString(int idx)odbc::CallableStatement
    getTime(int idx)odbc::CallableStatement
    getTimestamp(int idx)odbc::CallableStatement
    getUpdateCount()odbc::Statement
    getWarnings()odbc::ErrorHandler
    registerInParameter(int idx)odbc::CallableStatement
    registerOutParameter(int idx, int sqlType)odbc::CallableStatement
    registerOutParameter(int idx, int sqlType, int scale)odbc::CallableStatement
    setAsciiStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBinaryStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBoolean(int idx, bool val)odbc::PreparedStatement
    setByte(int idx, signed char val)odbc::PreparedStatement
    setBytes(int idx, const Bytes &val)odbc::PreparedStatement
    setCursorName(const std::string &name)odbc::Statement
    setDate(int idx, const Date &val)odbc::PreparedStatement
    setDouble(int idx, double val)odbc::PreparedStatement
    setEscapeProcessing(bool on)odbc::Statement
    setFetchSize(int size)odbc::Statement
    setFloat(int idx, float val)odbc::PreparedStatement
    setInt(int idx, int val)odbc::PreparedStatement
    setLong(int idx, Long val)odbc::PreparedStatement
    setMaxFieldSize(int maxFieldSize)odbc::Statement
    setMaxRows(int maxRows)odbc::Statement
    setNull(int idx, int sqlType)odbc::PreparedStatement
    setQueryTimeout(int seconds)odbc::Statement
    setShort(int idx, short val)odbc::PreparedStatement
    setString(int idx, const std::string &val)odbc::PreparedStatement
    setTime(int idx, const Time &val)odbc::PreparedStatement
    setTimestamp(int idx, const Timestamp &val)odbc::PreparedStatement
    wasNull()odbc::CallableStatement
    ~CallableStatement()odbc::CallableStatement [virtual]
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~PreparedStatement()odbc::PreparedStatement [virtual]
    ~Statement()odbc::Statement [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_callable_statement.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_callable_statement.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,3 @@ ++PNG ++ ++ IHDRܶPLTE`{tRNS@fIDATxQ H7'ڧE`l8Ɲ11c߉M!կoHK"QҸA,$dYz!В9ȟ<ΞF@F +‘o;K% o(]bN>4YBӕ.4|'o'4:[:2NiAQn$WtY\\}DM B*=P:>dC7>"pJhUfq+t}kiBVcu-)/QT*{9zVgkhWissrLhF3ьfo\O-@^-NmmJyJ4<ԑ7;=S-sq uTKm2/A_^-Z>hy޵WYWÞ@} ++ + +-odbc::Connection class Reference ++libodbc++: odbc::Connection Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Connection Class Reference

    A database connection. ++ ++ ++

    odbc::Connection Class Reference

    A database connection. + More... +

    + #include <connection.h> +

    +

    Inheritance diagram for odbc::Connection: +-

    ++

    + + odbc::ErrorHandler + + List of all members.

    Public Types

    + +-

    Public Methods

    ++
    Transaction isolation constants. More...
    ++

    Public Member Functions

    + ++
    Translate a given SQL string into this data sources' own SQL grammar.
    +

    Detailed Description

    +-A database connection. ++A database connection. +

    +


    Member Enumeration Documentation

    +-

    +- ++

    ++

    + +- + +@@ -92,40 +92,38 @@ + + +
    ++ + + +- ++ +
    enum odbc::Connection::TransactionIsolation ++ enum odbc::Connection::TransactionIsolation
    +
    + +

    +-Transaction isolation constants. ++Transaction isolation constants. +

    +-

    +-Enumeration values:
    ++
    Enumeration values:
    + +- +- +- +- +- ++ ++ ++ ++ ++ +
    TRANSACTION_NONE  +-The data source does not support transactions.
    TRANSACTION_READ_UNCOMMITTED  +-Dirty reads, non-repeatable reads and phantom reads can occur.
    TRANSACTION_READ_COMMITTED  +-Non-repeatable and phantom reads can occur.
    TRANSACTION_REPEATABLE_READ  +-Phantom reads can occur.
    TRANSACTION_SERIALIZABLE  +-Simply no problems.
    TRANSACTION_NONE  ++The data source does not support transactions.
    TRANSACTION_READ_UNCOMMITTED  ++Dirty reads, non-repeatable reads and phantom reads can occur.
    TRANSACTION_READ_COMMITTED  ++Non-repeatable and phantom reads can occur.
    TRANSACTION_REPEATABLE_READ  ++Phantom reads can occur.
    TRANSACTION_SERIALIZABLE  ++Simply no problems.
    +
    +
    +


    Constructor & Destructor Documentation

    +-

    +- ++

    ++

    + +- + +@@ -138,35 +136,34 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    virtual odbc::Connection::~Connection virtual odbc::Connection::~Connection    )  [virtual]
    +
    + +

    +-Destructor. ++Destructor. +

    + Closes the connection

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -179,32 +176,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    Statement* odbc::Connection::createStatement Statement* odbc::Connection::createStatement int   resultSetType, resultSetType,
    int   resultSetConcurrency resultSetConcurrency
    +
    + +

    +-Creates a non-prepared statement. ++Creates a non-prepared statement. +

    +-

    +-Parameters:
    +- +- +- +-
    resultSetType  +-The type for ResultSets created by this statement
    resultSetConcurrency  +-The concurrency for ResultSets created by this statement
    +-
    ++ ++ ++
    resultSetType The type for ResultSets created by this statement
    resultSetConcurrency The concurrency for ResultSets created by this statement
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -217,40 +211,39 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    DatabaseMetaData* odbc::Connection::getMetaData DatabaseMetaData* odbc::Connection::getMetaData    ) 
    +
    + +

    +-Returns meta information for this connection. ++Returns meta information for this connection. +

    + Note that the returned object is 'owned' by this connection and should in no way be deleted by the caller.

    +-

    +- ++

    ++

    + +- + +@@ -263,35 +256,31 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    CallableStatement* odbc::Connection::prepareCall CallableStatement* odbc::Connection::prepareCall const std::string &   sql, sql,
    int   resultSetType, resultSetType,
    int   resultSetConcurrency resultSetConcurrency
    +
    + +

    +-Create a callable prepared statement. ++Create a callable prepared statement. +

    +-

    +-Parameters:
    +- +- +- +- +-
    sql  +-The string to prepare, optionally containing parameter markers for input and/or output parameters
    resultSetType  +-The type for ResultSets created by this statement
    resultSetConcurrency  +-The concurrency for ResultSets created by this statement
    +-
    ++ ++ ++ ++
    sql The string to prepare, optionally containing parameter markers for input and/or output parameters
    resultSetType The type for ResultSets created by this statement
    resultSetConcurrency The concurrency for ResultSets created by this statement
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -304,46 +293,44 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    CallableStatement* odbc::Connection::prepareCall CallableStatement* odbc::Connection::prepareCall const std::string &   sql sql  ) 
    +
    + +

    +-Create a callable prepared statement. ++Create a callable prepared statement. +

    +-

    +-Parameters:
    +- +- +-
    sql  +-The string to prepare, optionally containing parameter markers for input and/or output parameters
    +-
    ++ ++
    sql The string to prepare, optionally containing parameter markers for input and/or output parameters
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -356,35 +343,31 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    PreparedStatement* odbc::Connection::prepareStatement PreparedStatement* odbc::Connection::prepareStatement const std::string &   sql, sql,
    int   resultSetType, resultSetType,
    int   resultSetConcurrency resultSetConcurrency
    +
    + +

    +-Create a prepared statement. ++Create a prepared statement. +

    +-

    +-Parameters:
    +- +- +- +- +-
    sql  +-The string to prepare, optionally containing parameter markers.
    resultSetType  +-The type for ResultSets created by this statement
    resultSetConcurrency  +-The concurrency for ResultSets created by this statement
    +-
    ++ ++ ++ ++
    sql The string to prepare, optionally containing parameter markers.
    resultSetType The type for ResultSets created by this statement
    resultSetConcurrency The concurrency for ResultSets created by this statement
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -397,31 +380,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    PreparedStatement* odbc::Connection::prepareStatement PreparedStatement* odbc::Connection::prepareStatement const std::string &   sql sql  ) 
    +
    + +

    +-Create a prepared statement. ++Create a prepared statement. +

    +-

    +-Parameters:
    +- +- +-
    sql  +-The string to prepare, optionally containing parameter markers (?).
    +-
    ++ ++
    sql The string to prepare, optionally containing parameter markers (?).
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -434,19 +415,18 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    void odbc::Connection::setAutoCommit void odbc::Connection::setAutoCommit bool   autoCommit autoCommit  ) 
    +
    + +

    +-Sets the autocommit state of this connection. ++Sets the autocommit state of this connection. +

    +-

    +-Parameters:
    +- +- +-
    autoCommit  +-true for on, false for off
    +-
    ++ ++
    autoCommit true for on, false for off
    ++ ++ + + +


    The documentation for this class was generated from the following file: ++
  • odbc++/connection.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_connection-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_connection-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_connection-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_connection-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,45 +1,44 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Connection Member List

    This is the complete list of members for odbc::Connection, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::Connection Member List

    This is the complete list of members for odbc::Connection, including all inherited members.

    clearWarnings()odbc::ErrorHandler
    commit()odbc::Connection
    createStatement()odbc::Connection
    createStatement(int resultSetType, int resultSetConcurrency)odbc::Connection
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    getAutoCommit()odbc::Connection
    getCatalog()odbc::Connection
    getMetaData()odbc::Connection
    getTrace()odbc::Connection
    getTraceFile()odbc::Connection
    getTransactionIsolation()odbc::Connection
    getWarnings()odbc::ErrorHandler
    isReadOnly()odbc::Connection
    nativeSQL(const std::string &sql)odbc::Connection
    prepareCall(const std::string &sql)odbc::Connection
    prepareCall(const std::string &sql, int resultSetType, int resultSetConcurrency)odbc::Connection
    prepareStatement(const std::string &sql)odbc::Connection
    prepareStatement(const std::string &sql, int resultSetType, int resultSetConcurrency)odbc::Connection
    rollback()odbc::Connection
    setAutoCommit(bool autoCommit)odbc::Connection
    setCatalog(const std::string &catalog)odbc::Connection
    setReadOnly(bool readOnly)odbc::Connection
    setTrace(bool on)odbc::Connection
    setTraceFile(const std::string &s)odbc::Connection
    setTransactionIsolation(TransactionIsolation isolation)odbc::Connection
    TRANSACTION_NONE enum valueodbc::Connection
    TRANSACTION_READ_COMMITTED enum valueodbc::Connection
    TRANSACTION_READ_UNCOMMITTED enum valueodbc::Connection
    TRANSACTION_REPEATABLE_READ enum valueodbc::Connection
    TRANSACTION_SERIALIZABLE enum valueodbc::Connection
    TransactionIsolation enum nameodbc::Connection
    ~Connection()odbc::Connection [virtual]
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    clearWarnings()odbc::ErrorHandler
    commit()odbc::Connection
    createStatement()odbc::Connection
    createStatement(int resultSetType, int resultSetConcurrency)odbc::Connection
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    getAutoCommit()odbc::Connection
    getCatalog()odbc::Connection
    getMetaData()odbc::Connection
    getTrace()odbc::Connection
    getTraceFile()odbc::Connection
    getTransactionIsolation()odbc::Connection
    getWarnings()odbc::ErrorHandler
    isReadOnly()odbc::Connection
    nativeSQL(const std::string &sql)odbc::Connection
    prepareCall(const std::string &sql)odbc::Connection
    prepareCall(const std::string &sql, int resultSetType, int resultSetConcurrency)odbc::Connection
    prepareStatement(const std::string &sql)odbc::Connection
    prepareStatement(const std::string &sql, int resultSetType, int resultSetConcurrency)odbc::Connection
    rollback()odbc::Connection
    setAutoCommit(bool autoCommit)odbc::Connection
    setCatalog(const std::string &catalog)odbc::Connection
    setReadOnly(bool readOnly)odbc::Connection
    setTrace(bool on)odbc::Connection
    setTraceFile(const std::string &s)odbc::Connection
    setTransactionIsolation(TransactionIsolation isolation)odbc::Connection
    TRANSACTION_NONE enum valueodbc::Connection
    TRANSACTION_READ_COMMITTED enum valueodbc::Connection
    TRANSACTION_READ_UNCOMMITTED enum valueodbc::Connection
    TRANSACTION_REPEATABLE_READ enum valueodbc::Connection
    TRANSACTION_SERIALIZABLE enum valueodbc::Connection
    TransactionIsolation enum nameodbc::Connection
    ~Connection()odbc::Connection [virtual]
    ~ErrorHandler()odbc::ErrorHandler [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_connection.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_connection.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_connection.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_connection.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,3 @@ ++PNG ++ ++ IHDRyPwDŽPLTE`{tRNS@f6IDATxQr  BjM6utgL$9`CI q2"mDl׎n8u'&b +a5bu(ӺԌiԞ]Ihwli!6K.mVJ{+[:IQmR9{K|3z|n'_ߖe]F_IOzғ8`1ā&~FCث*KwJ)V]z#1:tt?ǖk,5VO y.]ϝ{WGtTG{CyO?g~=zc׼SIENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_database_meta_data.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_database_meta_data.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_database_meta_data.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_database_meta_data.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,12 +1,11 @@ +- ++ + +-odbc::DatabaseMetaData class Reference ++libodbc++: odbc::DatabaseMetaData Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DatabaseMetaData Class Reference

    Provides several tons of information about a data source. ++ ++ ++

    odbc::DatabaseMetaData Class Reference

    Provides several tons of information about a data source. + More... +

    + #include <databasemetadata.h> +@@ -14,283 +13,283 @@ + List of all members.

    Public Types

    + +-

    Public Methods

    ++
    Searchability constants. More...
  • enum ++
    Imported key UPDATE_RULE and DELETE_RULE constants. More...
  • enum ++
    Index type constants.
  • enum ++
    Procedure column type constants for getProcedureColumns(). More...
  • enum ++
    Procedure column nullability constants for getProcedureColumns(). More...
  • enum ++
    Procedure type constants for PROCEDURE_TYPE in getProcedures(). More...
    ++

    Public Member Functions

    +
      +-
    • ++
    • + Connection * getConnection () +-
      Returns the Connection this came from.

    • ++
      Returns the Connection this came from.
    • + std::string getDatabaseProductName () +-
      Returns the name of the database product.

    • ++
      Returns the name of the database product.
    • + std::string getDatabaseProductVersion () +-
      Returns the version of the database product as a string.

    • ++
      Returns the version of the database product as a string.
    • + std::string getDriverName () +-
      Returns the name of the ODBC driver used.

    • ++
      Returns the name of the ODBC driver used.
    • + std::string getDriverVersion () +-
      Returns the version of the ODBC driver used.

    • ++
      Returns the version of the ODBC driver used.
    • + int getDriverMajorVersion () +-
      Returns the major ODBC version of the driver used.

    • ++
      Returns the major ODBC version of the driver used.
    • + int getDriverMinorVersion () +-
      Returns the minor ODBC version of the driver used.

    • std::string getIdentifierQuoteString () +-
      Returns the string that can be used to quote identifiers. More...

    • std::string getCatalogTerm () +-
      Returns the term for catalog used by the data source. More...

    • ++
      Returns the minor ODBC version of the driver used.
    • std::string getIdentifierQuoteString () ++
      Returns the string that can be used to quote identifiers.
    • std::string getCatalogTerm () ++
      Returns the term for catalog used by the data source.
    • + std::string getSchemaTerm () +-
      Returns the term for schema used by the data source, for example "owner" or just "schema".

    • ++
      Returns the term for schema used by the data source, for example "owner" or just "schema".
    • + std::string getTableTerm () +-
      Returns the term for table used by the data source.

    • ++
      Returns the term for table used by the data source.
    • + std::string getProcedureTerm () +-
      Returns the term the data source uses for a procedure, for example "stored procedure".

    • ++
      Returns the term the data source uses for a procedure, for example "stored procedure".
    • + std::string getUserName () +-
      Returns the user name of the connection.

    • std::string getCatalogSeparator () +-
      Returns the string used to separate a catalog in a fully qualified identifier. More...

    • bool isCatalogAtStart () +-
      Returns true if the catalog is positioned at the beginning of a fully qualified identifier. More...

    • ++
      Returns the user name of the connection.
    • std::string getCatalogSeparator () ++
      Returns the string used to separate a catalog in a fully qualified identifier.
    • bool isCatalogAtStart () ++
      Returns true if the catalog is positioned at the beginning of a fully qualified identifier.
    • + std::string getSQLKeywords () +-
      Returns a comma-separated list of all non-ODBC keywords specific to this data source.

    • ++
      Returns a comma-separated list of all non-ODBC keywords specific to this data source.
    • + bool supportsTransactions () +-
      Returns true if the data source supports transactions.

    • int getDefaultTransactionIsolation () +-
      Returns the default transaction isolation level. More...

    • bool supportsTransactionIsolationLevel (int lev) +-
      Returns true if the data source supports the specified transaction isolation level. More...

    • bool supportsDataDefinitionAndDataManipulationTransactions () +-
      Checks if the data source supports both DML and DDL in transactions. More...

    • bool supportsDataManipulationTransactionsOnly () +-
      Checks if the data source only supports DML in transactions. More...

    • bool dataDefinitionCausesTransactionCommit () +-
      Checks if DDL in a transaction will cause the transaction to be committed. More...

    • bool dataDefinitionIgnoredInTransactions () +-
      Checks if DDL in a transaction is ignored. More...

    • bool supportsOpenCursorsAcrossCommit () +-
      Returns true if the data source and the driver can handle open cursors (eg. More...

    • bool supportsOpenCursorsAcrossRollback () +-
      Returns true if the data source and the driver can handle open cursors (eg. More...

    • ++
      Returns true if the data source supports transactions.
    • int getDefaultTransactionIsolation () ++
      Returns the default transaction isolation level.
    • bool supportsTransactionIsolationLevel (int lev) ++
      Returns true if the data source supports the specified transaction isolation level.
    • bool supportsDataDefinitionAndDataManipulationTransactions () ++
      Checks if the data source supports both DML and DDL in transactions.
    • bool supportsDataManipulationTransactionsOnly () ++
      Checks if the data source only supports DML in transactions.
    • bool dataDefinitionCausesTransactionCommit () ++
      Checks if DDL in a transaction will cause the transaction to be committed.
    • bool dataDefinitionIgnoredInTransactions () ++
      Checks if DDL in a transaction is ignored.
    • bool supportsOpenCursorsAcrossCommit () ++
      Returns true if the data source and the driver can handle open cursors (eg.
    • bool supportsOpenCursorsAcrossRollback () ++
      Returns true if the data source and the driver can handle open cursors (eg.
    • + bool supportsOpenStatementsAcrossCommit () +-
      Returns true if the data source and the driver can handle open statements across a commit, or false if they are invalidated.

    • ++
      Returns true if the data source and the driver can handle open statements across a commit, or false if they are invalidated.
    • + bool supportsOpenStatementsAcrossRollback () +-
      Returns true if the data source and the driver can handle open statements across a rollback, or false if they are invalidated.

    • bool supportsResultSetType (int type) +-
      Returns true if the data source supports the given result set type. More...

    • bool supportsResultSetConcurrency (int type, int concurrency) +-
      Returns true if the data source supports the given result set concurrency for the given result set type. More...

    • ++
      Returns true if the data source and the driver can handle open statements across a rollback, or false if they are invalidated.
    • bool supportsResultSetType (int type) ++
      Returns true if the data source supports the given result set type.
    • bool supportsResultSetConcurrency (int type, int concurrency) ++
      Returns true if the data source supports the given result set concurrency for the given result set type.
    • + bool supportsCatalogsInDataManipulation () +-
      Returns true if catalogs are supported in DML.

    • ++
      Returns true if catalogs are supported in DML.
    • + bool supportsCatalogsInProcedureCalls () +-
      Returns true if catalogs are supported in procedure call statements.

    • ++
      Returns true if catalogs are supported in procedure call statements.
    • + bool supportsCatalogsInTableDefinitions () +-
      Returns true if catalogs are supported in CREATE/ALTER TABLE statements.

    • ++
      Returns true if catalogs are supported in CREATE/ALTER TABLE statements.
    • + bool supportsCatalogsInIndexDefinitions () +-
      Returns true if catalogs are supported in index definitions.

    • ++
      Returns true if catalogs are supported in index definitions.
    • + bool supportsCatalogsInPrivilegeDefinitions () +-
      Returns true if catalogs are supported in privilege definition statements.

    • ++
      Returns true if catalogs are supported in privilege definition statements.
    • + bool supportsSchemasInDataManipulation () +-
      Returns true if schemas are supported in DML.

    • ++
      Returns true if schemas are supported in DML.
    • + bool supportsSchemasInProcedureCalls () +-
      Returns true if schemas are supported in procedure call statements.

    • ++
      Returns true if schemas are supported in procedure call statements.
    • + bool supportsSchemasInTableDefinitions () +-
      Returns true if schemas are supported in CREATE/ALTER TABLE statements.

    • ++
      Returns true if schemas are supported in CREATE/ALTER TABLE statements.
    • + bool supportsSchemasInIndexDefinitions () +-
      Returns true if schemas are supported in index definitions.

    • ++
      Returns true if schemas are supported in index definitions.
    • + bool supportsSchemasInPrivilegeDefinitions () +-
      Returns true if schemas are supported in privilege definition statements.

    • ++
      Returns true if schemas are supported in privilege definition statements.
    • + bool nullPlusNonNullIsNull () +-
      Returns true if NULL plus a non-NULL value yields NULL.

    • ++
      Returns true if NULL plus a non-NULL value yields NULL.
    • + bool supportsColumnAliasing () +-
      Returns true if the data source supports column aliasing, for example SELECT COLUMN1 [AS] C1 FROM TABLE.

    • ++
      Returns true if the data source supports column aliasing, for example SELECT COLUMN1 [AS] C1 FROM TABLE.
    • + bool supportsConvert () +-
      Returns true if the CONVERT function is supported by the data source.

    • ++
      Returns true if the CONVERT function is supported by the data source.
    • + bool supportsConvert (int fromType, int toType) +-
      Returns true if CONVERT between fromType and toType is supported.

    • ++
      Returns true if CONVERT between fromType and toType is supported.
    • + bool supportsAlterTableWithDropColumn () +-
      Returns true if ALTER TABLE with drop column is supported.

    • ++
      Returns true if ALTER TABLE with drop column is supported.
    • + bool supportsAlterTableWithAddColumn () +-
      Returns true if ALTER TABLE with add column is supported.

    • ++
      Returns true if ALTER TABLE with add column is supported.
    • + std::string getExtraNameCharacters () +-
      Returns the extra characters beyond A-Z, a-z, 0-9 and _ that can be used in unquoted identifier names.

    • ++
      Returns the extra characters beyond A-Z, a-z, 0-9 and _ that can be used in unquoted identifier names.
    • + std::string getSearchStringEscape () +-
      Returns the string that can be used to escape wildcard characters.

    • ++
      Returns the string that can be used to escape wildcard characters.
    • + std::string getTimeDateFunctions () +-
      Returns a comma-separated list of all time and date functions supported.

    • ++
      Returns a comma-separated list of all time and date functions supported.
    • + std::string getSystemFunctions () +-
      Returns a comma-separated list of all system functions supported.

    • ++
      Returns a comma-separated list of all system functions supported.
    • + std::string getStringFunctions () +-
      Returns a comma-separated list of all string functions supported.

    • ++
      Returns a comma-separated list of all string functions supported.
    • + std::string getNumericFunctions () +-
      Returns a comma-separated list of all numeric functions supported.

    • ++
      Returns a comma-separated list of all numeric functions supported.
    • + bool supportsLikeEscapeClause () +-
      Returns true if the escape character is supported in LIKE clauses.

    • ++
      Returns true if the escape character is supported in LIKE clauses.
    • + bool supportsMultipleResultSets () +-
      Returns true if a query can return multiple ResultSets.

    • ++
      Returns true if a query can return multiple ResultSets.
    • + bool supportsMultipleTransactions () +-
      Returns true if multiple transactions can be open at once on different connections.

    • ++
      Returns true if multiple transactions can be open at once on different connections.
    • + bool supportsNonNullableColumns () +-
      Returns true if columns can be defined as non-nullable.

    • ++
      Returns true if columns can be defined as non-nullable.
    • + bool supportsMinimumSQLGrammar () +-
      Returns true if the data source supports ODBC minimum SQL grammar.

    • ++
      Returns true if the data source supports ODBC minimum SQL grammar.
    • + bool supportsCoreSQLGrammar () +-
      Returns true if the data source supports the core ODBC SQL grammar.

    • ++
      Returns true if the data source supports the core ODBC SQL grammar.
    • + bool supportsExtendedSQLGrammar () +-
      Returns true if the data source supports the ODBC extended SQL grammar.

    • ++
      Returns true if the data source supports the ODBC extended SQL grammar.
    • + bool supportsANSI92EntryLevelSQL () +-
      Returns true if the data source supports the ANSI92 entry level SQL grammar.

    • ++
      Returns true if the data source supports the ANSI92 entry level SQL grammar.
    • + bool supportsANSI92IntermediateSQL () +-
      Returns true if the data source supports the ANSI92 intermediate level SQL grammar.

    • ++
      Returns true if the data source supports the ANSI92 intermediate level SQL grammar.
    • + bool supportsANSI92FullSQL () +-
      Returns true if the data source supports the full ANSI92 SQL grammar.

    • bool supportsPositionedDelete () +-
      Checks if the data source supports positioned delete. More...

    • bool supportsPositionedUpdate () +-
      Checks if the data source supports positioned update. More...

    • bool supportsSelectForUpdate () +-
      Checks if the data source supports. More...

    • ++
      Returns true if the data source supports the full ANSI92 SQL grammar.
    • bool supportsPositionedDelete () ++
      Checks if the data source supports positioned delete.
    • bool supportsPositionedUpdate () ++
      Checks if the data source supports positioned update.
    • bool supportsSelectForUpdate () ++
      Checks if the data source supports.
    • + bool supportsIntegrityEnhancementFacility () +-
      Returns true if the data source supports the SQL Integrity Enhancement Facility.

    • ++
      Returns true if the data source supports the SQL Integrity Enhancement Facility.
    • + bool supportsBatchUpdates () +-
      Whether the data source supports batch updates.

    • ++
      Whether the data source supports batch updates.
    • + bool supportsSubqueriesInComparisons () +-
      Returns true if the data source supports subqueries in comparisons.

    • ++
      Returns true if the data source supports subqueries in comparisons.
    • + bool supportsSubqueriesInExists () +-
      Returns true if the data source supports subqueries in "EXISTS" expressions.

    • ++
      Returns true if the data source supports subqueries in "EXISTS" expressions.
    • + bool supportsSubqueriesInIns () +-
      Returns true if the data source supports subqueries in "IN" expressions.

    • ++
      Returns true if the data source supports subqueries in "IN" expressions.
    • + bool supportsSubqueriesInQuantifieds () +-
      Returns true if the data source supports subqueries in quantified expressions.

    • ++
      Returns true if the data source supports subqueries in quantified expressions.
    • + bool supportsCorrelatedSubqueries () +-
      Returns true if the data source supports correlated subqueries.

    • bool ownUpdatesAreVisible (int type) +-
      Returns true if updated rows are available with their new values in the ResultSet. More...

    • bool ownDeletesAreVisible (int type) +-
      Returns true if deleted rows dissapear from a ResultSet. More...

    • bool ownInsertsAreVisible (int type) +-
      Returns true if inserted rows become available in a ResultSet. More...

    • bool othersUpdatesAreVisible (int type) +-
      Returns true if rows updated by others are visible with their new values. More...

    • bool othersDeletesAreVisible (int type) +-
      Returns true if rows deleted by others disapear from a ResultSet. More...

    • bool othersInsertsAreVisible (int type) +-
      Returns true if rows inserted by others become available in a ResultSet. More...

    • bool deletesAreDetected (int type) +-
      Returns true if a deleted row can be detected with ResultSet::rowDeleted(). More...

    • bool insertsAreDetected (int type) +-
      Returns true if an inserted row can be detected with ResultSet::rowInserted(). More...

    • bool updatesAreDetected (int type) +-
      Returns true if ResultSet::rowUpdated can determine whether a row has been updated. More...

    • ++
      Returns true if the data source supports correlated subqueries.
    • bool ownUpdatesAreVisible (int type) ++
      Returns true if updated rows are available with their new values in the ResultSet.
    • bool ownDeletesAreVisible (int type) ++
      Returns true if deleted rows dissapear from a ResultSet.
    • bool ownInsertsAreVisible (int type) ++
      Returns true if inserted rows become available in a ResultSet.
    • bool othersUpdatesAreVisible (int type) ++
      Returns true if rows updated by others are visible with their new values.
    • bool othersDeletesAreVisible (int type) ++
      Returns true if rows deleted by others disapear from a ResultSet.
    • bool othersInsertsAreVisible (int type) ++
      Returns true if rows inserted by others become available in a ResultSet.
    • bool deletesAreDetected (int type) ++
      Returns true if a deleted row can be detected with ResultSet::rowDeleted().
    • bool insertsAreDetected (int type) ++
      Returns true if an inserted row can be detected with ResultSet::rowInserted().
    • bool updatesAreDetected (int type) ++
      Returns true if ResultSet::rowUpdated can determine whether a row has been updated.
    • + int getMaxBinaryLiteralLength () +-
      Returns the max number of hex characters allowed in an inline binary literal.

    • ++
      Returns the max number of hex characters allowed in an inline binary literal.
    • + int getMaxCharLiteralLength () +-
      Returns the maximum length of an inline character string.

    • ++
      Returns the maximum length of an inline character string.
    • + int getMaxColumnNameLength () +-
      Returns the maximum length of a column name.

    • ++
      Returns the maximum length of a column name.
    • + int getMaxColumnsInGroupBy () +-
      Returns the maximum number of columns this data source can have in a GROUP BY clause.

    • ++
      Returns the maximum number of columns this data source can have in a GROUP BY clause.
    • + int getMaxColumnsInIndex () +-
      Returns the maximum number of columns allowed in an index.

    • ++
      Returns the maximum number of columns allowed in an index.
    • + int getMaxColumnsInOrderBy () +-
      Returns the maximum number of columns this data source can have in an ORDER BY clause.

    • ++
      Returns the maximum number of columns this data source can have in an ORDER BY clause.
    • + int getMaxColumnsInSelect () +-
      Returns the maximum number of columns this data source can SELECT.

    • ++
      Returns the maximum number of columns this data source can SELECT.
    • + int getMaxColumnsInTable () +-
      Returns the maximum number of columns a table can consist of.

    • ++
      Returns the maximum number of columns a table can consist of.
    • + int getMaxCursorNameLength () +-
      Returns the maximum length of a cursor name.

    • ++
      Returns the maximum length of a cursor name.
    • + int getMaxIndexLength () +-
      Returns the maximum length of an index in bytes.

    • ++
      Returns the maximum length of an index in bytes.
    • + int getMaxSchemaNameLength () +-
      Returns the maximum length of a schema name.

    • ++
      Returns the maximum length of a schema name.
    • + int getMaxProcedureNameLength () +-
      Returns the maximum length of a procedure name.

    • ++
      Returns the maximum length of a procedure name.
    • + int getMaxCatalogNameLength () +-
      Returns the maximum length of a catalog name.

    • ++
      Returns the maximum length of a catalog name.
    • + int getMaxRowSize () +-
      Returns the maximum size of a row in bytes.

    • ++
      Returns the maximum size of a row in bytes.
    • + bool doesMaxRowSizeIncludeBlobs () +-
      Returns true if the value returned by getMaxRowSize() includes BLOBs.

    • ++
      Returns true if the value returned by getMaxRowSize() includes BLOBs.
    • + int getMaxStatementLength () +-
      Returns the maximum length of a statement (query).

    • ++
      Returns the maximum length of a statement (query).
    • + int getMaxTableNameLength () +-
      Returns the maximum length of a table name.

    • int getMaxTablesInSelect () +-
      Returns the maximum number of tables that can be joined at once. More...

    • ++
      Returns the maximum length of a table name.
    • int getMaxTablesInSelect () ++
      Returns the maximum number of tables that can be joined at once.
    • + int getMaxUserNameLength () +-
      Returns the maximum length of a username.

    • ++
      Returns the maximum length of a username.
    • + int getMaxConnections () +-
      Returns the maximum number of connections we can have open to this data source.

    • ++
      Returns the maximum number of connections we can have open to this data source.
    • + int getMaxStatements () +-
      Returns the maximim number of statements that can be open on this connection.

    • ++
      Returns the maximim number of statements that can be open on this connection.
    • + bool supportsMixedCaseIdentifiers () +-
      Returns true if the data source supports case sensitive mixed case identifiers.

    • ++
      Returns true if the data source supports case sensitive mixed case identifiers.
    • + bool supportsMixedCaseQuotedIdentifiers () +-
      Returns true if the data source supports case sensitive mixed case quoted identifiers.

    • ++
      Returns true if the data source supports case sensitive mixed case quoted identifiers.
    • + bool supportsStoredProcedures () +-
      Returns true if the data source supports some form of stored procedures.

    • ++
      Returns true if the data source supports some form of stored procedures.
    • + bool supportsGroupBy () +-
      Returns true if the data source supports the GROUP BY clause.

    • ++
      Returns true if the data source supports the GROUP BY clause.
    • + bool supportsGroupByUnrelated () +-
      Returns true if the columns in a GROUP BY clause are independent of the selected ones.

    • ++
      Returns true if the columns in a GROUP BY clause are independent of the selected ones.
    • + bool supportsGroupByBeyondSelect () +-
      Returns true if the columns in a GROUP BY don't have to be selected.

    • ++
      Returns true if the columns in a GROUP BY don't have to be selected.
    • + bool supportsUnion () +-
      Returns true if the data source supports UNION joins.

    • ++
      Returns true if the data source supports UNION joins.
    • + bool supportsUnionAll () +-
      Returns true if the data source supports UNION ALL joins.

    • ++
      Returns true if the data source supports UNION ALL joins.
    • + bool supportsOuterJoins () +-
      Returns true if the data source supports some form of outer joins.

    • ++
      Returns true if the data source supports some form of outer joins.
    • + bool supportsFullOuterJoins () +-
      Returns true if the data source fully supports outer joins.

    • ++
      Returns true if the data source fully supports outer joins.
    • + bool supportsLimitedOuterJoins () +-
      Returns true if the data source only supports certain types of outer joins.

    • ++
      Returns true if the data source only supports certain types of outer joins.
    • + bool usesLocalFilePerTable () +-
      Returns true if the data source uses a file for each table.

    • ++
      Returns true if the data source uses a file for each table.
    • + bool usesLocalFiles () +-
      Returns true if the data source uses local files.

    • ++
      Returns true if the data source uses local files.
    • + bool nullsAreSortedAtStart () +-
      Returns true if NULL values are sorted first, regardless of the sort order.

    • ++
      Returns true if NULL values are sorted first, regardless of the sort order.
    • + bool nullsAreSortedAtEnd () +-
      Returns true if NULL values are sorted last, regardless of the sort order.

    • ++
      Returns true if NULL values are sorted last, regardless of the sort order.
    • + bool nullsAreSortedHigh () +-
      Returns true if NULL values are sorted high.

    • ++
      Returns true if NULL values are sorted high.
    • + bool nullsAreSortedLow () +-
      Returns true if NULL values are sorted low.

    • ++
      Returns true if NULL values are sorted low.
    • + bool allProceduresAreCallable () +-
      Returns true if all procedures returned by getProcedures() are callable by the current user.

    • ++
      Returns true if all procedures returned by getProcedures() are callable by the current user.
    • + bool allTablesAreSelectable () +-
      Returns true if all tables returned by getTables() are selectable by the current user.

    • ++
      Returns true if all tables returned by getTables() are selectable by the current user.
    • + bool isReadOnly () +-
      Returns true if the data source or the current connection is in read-only mode.

    • ++
      Returns true if the data source or the current connection is in read-only mode.
    • + bool storesLowerCaseIdentifiers () +-
      Returns true if the data source treats identifiers as case insensitive and stores them in lower case.

    • ++
      Returns true if the data source treats identifiers as case insensitive and stores them in lower case.
    • + bool storesLowerCaseQuotedIdentifiers () +-
      Returns true if the data source treats quoted identifiers as case insensitive and stores them in lower case.

    • ++
      Returns true if the data source treats quoted identifiers as case insensitive and stores them in lower case.
    • + bool storesMixedCaseIdentifiers () +-
      Returns true if the data source treats identifiers as case insensitive and stores them in mixed case.

    • ++
      Returns true if the data source treats identifiers as case insensitive and stores them in mixed case.
    • + bool storesMixedCaseQuotedIdentifiers () +-
      Returns true if the data source treats quoted identifiers as case insensitive and stores them in mixed case.

    • ++
      Returns true if the data source treats quoted identifiers as case insensitive and stores them in mixed case.
    • + bool storesUpperCaseIdentifiers () +-
      Returns true if the data source treats identifiers as case insensitive and stores them in upper case.

    • ++
      Returns true if the data source treats identifiers as case insensitive and stores them in upper case.
    • + bool storesUpperCaseQuotedIdentifiers () +-
      Returns true if the data source treats quoted identifiers as case insensitive and stores them in upper case.

    • ResultSet * getTypeInfo () +-
      Fetches a list of data types supported by this data source. More...

    • ResultSet * getColumns (const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::string &columnNamePattern) +-
      Fetches the available columns in a catalog. More...

    • ResultSet * getTables (const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::vector< std::string > &types) +-
      Fetches the available tables in the data source. More...

    • ResultSet * getTablePrivileges (const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern) +-
      Fetches a list of access rights for tables in a catalog. More...

    • ResultSet * getColumnPrivileges (const std::string &catalog, const std::string &schema, const std::string &table, const std::string &columnNamePattern) +-
      Fetches a list of access rights for a table's columns. More...

    • ResultSet * getPrimaryKeys (const std::string &catalog, const std::string &schema, const std::string &table) +-
      Fetches a list of primary keys for a table. More...

    • ResultSet * getIndexInfo (const std::string &catalog, const std::string &schema, const std::string &table, bool unique, bool approximate) +-
      Fetches a list of indices and statistics for a table. More...

    • ResultSet * getCrossReference (const std::string &primaryCatalog, const std::string &primarySchema, const std::string &primaryTable, const std::string &foreignCatalog, const std::string &foreignSchema, const std::string &foreignTable) +-
      Figures out in which way a foreign key table references a primary key table. More...

    • ResultSet * getImportedKeys (const std::string &catalog, const std::string &schema, const std::string &table) +-
      Fetches a list of columns that are foreign keys to other tables' primary keys. More...

    • ResultSet * getExportedKeys (const std::string &catalog, const std::string &schema, const std::string &table) +-
      Fetches a list of columns that reference a table's primary keys. More...

    • ResultSet * getProcedures (const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern) +-
      Returns available procedures in a catalog. More...

    • ResultSet * getProcedureColumns (const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern, const std::string &columnNamePattern) +-
      Returns available procedure columns in a catalog. More...

    • ResultSet * getBestRowIdentifier (const std::string &catalog, const std::string &schema, const std::string &table, int scope, bool nullable) +-
      Returns the optimal set of columns that identifies a row. More...

    • ResultSet * getVersionColumns (const std::string &catalog, const std::string &schema, const std::string &table) +-
      Returns a list of columns for a table that are automatically updated when anything in a row is updated. More...

    • ResultSet * getTableTypes () +-
      Fetches the table types the database supports. More...

    • ResultSet * getSchemas () +-
      Returns a list of available schemas in the database. More...

    • ResultSet * getCatalogs () +-
      Returns a list of available catalogs in the database. More...

    ++
    Returns true if the data source treats quoted identifiers as case insensitive and stores them in upper case.
  • ResultSet * getTypeInfo () ++
    Fetches a list of data types supported by this data source.
  • ResultSet * getColumns (const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::string &columnNamePattern) ++
    Fetches the available columns in a catalog.
  • ResultSet * getTables (const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::vector< std::string > &types) ++
    Fetches the available tables in the data source.
  • ResultSet * getTablePrivileges (const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern) ++
    Fetches a list of access rights for tables in a catalog.
  • ResultSet * getColumnPrivileges (const std::string &catalog, const std::string &schema, const std::string &table, const std::string &columnNamePattern) ++
    Fetches a list of access rights for a table's columns.
  • ResultSet * getPrimaryKeys (const std::string &catalog, const std::string &schema, const std::string &table) ++
    Fetches a list of primary keys for a table.
  • ResultSet * getIndexInfo (const std::string &catalog, const std::string &schema, const std::string &table, bool unique, bool approximate) ++
    Fetches a list of indices and statistics for a table.
  • ResultSet * getCrossReference (const std::string &primaryCatalog, const std::string &primarySchema, const std::string &primaryTable, const std::string &foreignCatalog, const std::string &foreignSchema, const std::string &foreignTable) ++
    Figures out in which way a foreign key table references a primary key table.
  • ResultSet * getImportedKeys (const std::string &catalog, const std::string &schema, const std::string &table) ++
    Fetches a list of columns that are foreign keys to other tables' primary keys.
  • ResultSet * getExportedKeys (const std::string &catalog, const std::string &schema, const std::string &table) ++
    Fetches a list of columns that reference a table's primary keys.
  • ResultSet * getProcedures (const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern) ++
    Returns available procedures in a catalog.
  • ResultSet * getProcedureColumns (const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern, const std::string &columnNamePattern) ++
    Returns available procedure columns in a catalog.
  • ResultSet * getBestRowIdentifier (const std::string &catalog, const std::string &schema, const std::string &table, int scope, bool nullable) ++
    Returns the optimal set of columns that identifies a row.
  • ResultSet * getVersionColumns (const std::string &catalog, const std::string &schema, const std::string &table) ++
    Returns a list of columns for a table that are automatically updated when anything in a row is updated.
  • ResultSet * getTableTypes () ++
    Fetches the table types the database supports.
  • ResultSet * getSchemas () ++
    Returns a list of available schemas in the database.
  • ResultSet * getCatalogs () ++
    Returns a list of available catalogs in the database.
    +

    Detailed Description

    +-Provides several tons of information about a data source. ++Provides several tons of information about a data source. +

    +-

    +-Warning:
    +-The column names in ResultSets returned by methods of DatabaseMetaData can differ depending on what ODBC version the current driver supports. To avoid problems, columns should be referenced by number, and not by name. Also note that ODBC version 2 drivers do not return some of the specified columns.
    ++
    Warning:
    The column names in ResultSets returned by methods of DatabaseMetaData can differ depending on what ODBC version the current driver supports. To avoid problems, columns should be referenced by number, and not by name. Also note that ODBC version 2 drivers do not return some of the specified columns.
    ++ +

    +


    Member Enumeration Documentation

    +-

    +- ++

    ++

    + +- + +@@ -303,20 +302,20 @@ + ++
    See also:
    getProcedures()
    ++ + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Procedure type constants for PROCEDURE_TYPE in getProcedures(). ++Procedure type constants for PROCEDURE_TYPE in getProcedures(). +

    +-

    +-See also:
    +-getProcedures()
    +-

    +- ++

    ++

    + +- + +@@ -329,20 +328,20 @@ + ++
    See also:
    getVersionColumns()
    ++ + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Version column constants for getVersionColumns(). ++Version column constants for getVersionColumns(). +

    +-

    +-See also:
    +-getVersionColumns()
    +-

    +- ++

    ++

    + +- + +@@ -355,20 +354,20 @@ + ++
    See also:
    getTypes()
    ++ + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Nullability constants for the resultset returned by getTypes(). ++Nullability constants for the resultset returned by getTypes(). +

    +-

    +-See also:
    +-getTypes()
    +-

    +- ++

    ++

    + +- + +@@ -381,20 +380,20 @@ + ++
    See also:
    getColumns()
    ++ + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Nullability constants for the resultset returned by getColumns(). ++Nullability constants for the resultset returned by getColumns(). +

    +-

    +-See also:
    +-getColumns()
    +-

    +- ++

    ++

    + +- + +@@ -407,31 +406,31 @@ + + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Searchability constants. ++Searchability constants. +

    +-

    +-Enumeration values:
    ++
    Enumeration values:
    + +- +- +- +- ++ ++ ++ ++ +
    typePredNone  +-Column is unsearchable.
    typePredChar  +-Column can only be used in a LIKE clause.
    typePredBasic  +-Column can be used in searches, except in LIKE.
    typeSearchable  +-Column is searchable.
    typePredNone  ++Column is unsearchable.
    typePredChar  ++Column can only be used in a LIKE clause.
    typePredBasic  ++Column can be used in searches, except in LIKE.
    typeSearchable  ++Column is searchable.
    +
    +
    +-

    +- ++

    ++

    + +- + +@@ -444,20 +443,20 @@ + ++
    See also:
    getImportedKeys()
    ++ + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Imported key UPDATE_RULE and DELETE_RULE constants. ++Imported key UPDATE_RULE and DELETE_RULE constants. +

    +-

    +-See also:
    +-getImportedKeys()
    +-

    +- ++

    ++

    + +- + +@@ -470,20 +469,20 @@ + ++
    See also:
    getProcedureColumns()
    ++ + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Procedure column type constants for getProcedureColumns(). ++Procedure column type constants for getProcedureColumns(). +

    +-

    +-See also:
    +-getProcedureColumns()
    +-

    +- ++

    ++

    + +- + +@@ -496,27 +495,25 @@ + ++
    See also:
    getProcedureColumns()
    ++ + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-Procedure column nullability constants for getProcedureColumns(). ++Procedure column nullability constants for getProcedureColumns(). +

    +-

    +-See also:
    +-getProcedureColumns()
    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -529,26 +526,24 @@ + ++
    Returns:
    true if the data source only supports data manipulation (eg. UPDATE, INSERT) within a transaction and any data definition (eg. CREATE TABLE) will cause the transaction to be committed.
    ++If this method returns true, supportsDataDefinitionAndDataManipulationTransactions(), supportsDataManipulationTransactionsOnly() and dataDefinitionIgnoredInTransactions() all return false. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::dataDefinitionCausesTransactionCommit bool odbc::DatabaseMetaData::dataDefinitionCausesTransactionCommit    ) 
    +
    + +

    +-Checks if DDL in a transaction will cause the transaction to be committed. ++Checks if DDL in a transaction will cause the transaction to be committed. +

    +-

    +-Returns:
    +-true if the data source only supports data manipulation (eg. UPDATE, INSERT) within a transaction and any data definition (eg. CREATE TABLE) will cause the transaction to be committed.
    If this method returns true, supportsDataDefinitionAndDataManipulationTransactions(), supportsDataManipulationTransactionsOnly() and dataDefinitionIgnoredInTransactions() all return false.
    +-

    +- ++

    ++

    + +- + +@@ -561,27 +556,25 @@ + ++
    Returns:
    true if the data source only supports data manipulation (eg. UPDATE, INSERT) within a transaction and any data definition (eg. CREATE TABLE) will be ignored.
    ++If this method returns true, supportsDataDefinitionAndDataManipulationTransactions(), supportsDataManipulationTransactionsOnly() and dataDefinitionCausesTransactionCommit() all return false. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::dataDefinitionIgnoredInTransactions bool odbc::DatabaseMetaData::dataDefinitionIgnoredInTransactions    ) 
    +
    + +

    +-Checks if DDL in a transaction is ignored. ++Checks if DDL in a transaction is ignored. +

    +-

    +-Returns:
    +-true if the data source only supports data manipulation (eg. UPDATE, INSERT) within a transaction and any data definition (eg. CREATE TABLE) will be ignored.
    If this method returns true, supportsDataDefinitionAndDataManipulationTransactions(), supportsDataManipulationTransactionsOnly() and dataDefinitionCausesTransactionCommit() all return false.
    +-

    +- ++

    ++

    + +- + +@@ -594,58 +587,56 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::deletesAreDetected bool odbc::DatabaseMetaData::deletesAreDetected int   type type  ) 
    +
    + +

    +-Returns true if a deleted row can be detected with ResultSet::rowDeleted(). ++Returns true if a deleted row can be detected with ResultSet::rowDeleted(). +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -658,44 +649,66 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getBestRowIdentifier ResultSet* odbc::DatabaseMetaData::getBestRowIdentifier const std::string &   catalog, catalog,
    const std::string &   schema, schema,
    const std::string &   table, table,
    int   scope, scope,
    bool   nullable nullable
    +
    + +

    +-Returns the optimal set of columns that identifies a row. ++Returns the optimal set of columns that identifies a row. +

    + The returned ResultSet is ordered by SCOPE and has the following columns:

      +-
    1. SCOPE - short - scope of this result:
        +-
      • bestRowTemporary - temporary, only while a ResultSet is using the row
      • bestRowTransaction - valid until the current transaction ends
      • bestRowSession - valid through the whole session - until the connection is closed
      +-
    2. COLUMN_NAME - string - the column name
    3. DATA_TYPE - short - the type of the column from Types
    4. TYPE_NAME - string - native type name (data source dependent)
    5. COLUMN_SIZE - int - the size (precision) of the column.
    6. BUFFER_LENGTH - int - unused
    7. DECIMAL_DIGITS - short - scale if applicable. Can be NULL.
    8. PSEUDO_COLUMN - short - whether this is a pseudo column:
        +-
      • bestRowUnknown - it is unknown whether this is a pseudo column
      • bestRowNotPseudo - it is definitely not a pseudo column
      • bestRowPseudo - it is definitely a pseudo column
      ++
    9. ++SCOPE - short - scope of this result:
        ++
      • ++bestRowTemporary - temporary, only while a ResultSet is using the row
      • ++
      • ++bestRowTransaction - valid until the current transaction ends
      • ++
      • ++bestRowSession - valid through the whole session - until the connection is closed
      • ++
      ++
    10. ++
    11. ++COLUMN_NAME - string - the column name
    12. ++
    13. ++DATA_TYPE - short - the type of the column from Types
    14. ++
    15. ++TYPE_NAME - string - native type name (data source dependent)
    16. ++
    17. ++COLUMN_SIZE - int - the size (precision) of the column.
    18. ++
    19. ++BUFFER_LENGTH - int - unused
    20. ++
    21. ++DECIMAL_DIGITS - short - scale if applicable. Can be NULL.
    22. ++
    23. ++PSEUDO_COLUMN - short - whether this is a pseudo column:
        ++
      • ++bestRowUnknown - it is unknown whether this is a pseudo column
      • ++
      • ++bestRowNotPseudo - it is definitely not a pseudo column
      • ++
      • ++bestRowPseudo - it is definitely a pseudo column
      • ++
      ++
    24. +
    +-
    +-Parameters:
    +- +- +- +- +- +- +-
    catalog  +-the catalog name
    schema  +-the schema name
    table  +-the table name
    scope  +-the scope of interest, same values as the SCOPE column.
    nullable  +-whether nullable columns should be included
    +-
    ++ ++ ++ ++ ++ ++
    catalog the catalog name
    schema the schema name
    table the table name
    scope the scope of interest, same values as the SCOPE column.
    nullable whether nullable columns should be included
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -708,24 +721,23 @@ + ++The returned ResultSet is the same as with getTables(), except that all columns but TABLE_CAT are NULL values. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    ResultSet* odbc::DatabaseMetaData::getCatalogs ResultSet* odbc::DatabaseMetaData::getCatalogs    ) 
    +
    + +

    +-Returns a list of available catalogs in the database. ++Returns a list of available catalogs in the database. +

    +-The returned ResultSet is the same as with getTables(), except that all columns but TABLE_CAT are NULL values.

    +-

    +- ++

    ++

    + +- + +@@ -738,24 +750,23 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    std::string odbc::DatabaseMetaData::getCatalogSeparator std::string odbc::DatabaseMetaData::getCatalogSeparator    ) 
    +
    + +

    +-Returns the string used to separate a catalog in a fully qualified identifier. ++Returns the string used to separate a catalog in a fully qualified identifier. +

    + For example Oracle would return a "@", while mysql would say ".".

    +-

    +- ++

    ++

    + +- + +@@ -768,46 +779,45 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    std::string odbc::DatabaseMetaData::getCatalogTerm std::string odbc::DatabaseMetaData::getCatalogTerm    ) 
    +
    + +

    +-Returns the term for catalog used by the data source. ++Returns the term for catalog used by the data source. +

    + Can be for example "directory" or "database".

    +-

    +- ++

    ++

    + +- + +@@ -820,48 +830,63 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getColumnPrivileges ResultSet* odbc::DatabaseMetaData::getColumnPrivileges const std::string &   catalog, catalog,
    const std::string &   schema, schema,
    const std::string &   table, table,
    const std::string &   columnNamePattern columnNamePattern
    +
    + +

    +-Fetches a list of access rights for a table's columns. ++Fetches a list of access rights for a table's columns. +

    + The returned ResultSet is ordered by COLUMN_NAME and PRIVILEGE. It contains the following columns:

      +-
    1. TABLE_CAT - string - table catalog (can be NULL)
    2. TABLE_SCHEM - string - table schema (can be NULL)
    3. TABLE_NAME - string - table name
    4. COLUMN_NAME - string - column name
    5. GRANTOR - string - grantor (can be NULL). If GRANTEE owns the object, GRANTOR is "SYSTEM".
    6. GRANTEE - string - grantee
    7. PRIVILEGE - string - one of "SELECT", "INSERT", "UPDATE", "DELETE", "REFERENCES" or a data source specific value
    8. IS_GRANTABLE - string - "YES" if GRANTEE can grant this privilege to other users. "NO" if not. NULL if unknown.
    ++
  • ++TABLE_CAT - string - table catalog (can be NULL)
  • ++
  • ++TABLE_SCHEM - string - table schema (can be NULL)
  • ++
  • ++TABLE_NAME - string - table name
  • ++
  • ++COLUMN_NAME - string - column name
  • ++
  • ++GRANTOR - string - grantor (can be NULL). If GRANTEE owns the object, GRANTOR is "SYSTEM".
  • ++
  • ++GRANTEE - string - grantee
  • ++
  • ++PRIVILEGE - string - one of "SELECT", "INSERT", "UPDATE", "DELETE", "REFERENCES" or a data source specific value
  • ++
  • ++IS_GRANTABLE - string - "YES" if GRANTEE can grant this privilege to other users. "NO" if not. NULL if unknown.
  • ++ +
    +-

    +- ++

    ++

    + +- + +@@ -874,62 +899,103 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getColumns ResultSet* odbc::DatabaseMetaData::getColumns const std::string &   catalog, catalog,
    const std::string &   schemaPattern, schemaPattern,
    const std::string &   tableNamePattern, tableNamePattern,
    const std::string &   columnNamePattern columnNamePattern
    +
    + +

    +-Fetches the available columns in a catalog. ++Fetches the available columns in a catalog. +

    + The returned ResultSet has the following columns:

      +-
    1. TABLE_CAT - string - table catalog (can be NULL)
    2. TABLE_SCHEM - string - table schema (can be NULL)
    3. TABLE_NAME - string - table name
    4. COLUMN_NAME - string - column name
    5. COLUMN_TYPE - short - see Types
    6. TYPE_NAME - string - the name of the type. Data source dependent.
    7. COLUMN_SIZE - int - column size. For character and date types, this is the maximum number of characters. For numeric types this is the precision.
    8. BUFFER_LENGTH - not used
    9. DECIMAL_DIGITS - int - the number of fractional digits.
    10. NUM_PREC_RADIX - int - radix
    11. NULLABLE - int - whether the column allows NULLs
        +-
      • columnNoNulls - might not allow NULLs
      • columnNullable - definitely allows NULLs
      • columnNullableUnknown - nullability is unknown
      +-
    12. REMARKS - string - comments on the column (can be NULL)
    13. COLUMN_DEF - string - default value (can be NULL)
    14. SQL_DATA_TYPE - short -
    15. SQL_DATETIME_SUB - short -
    16. CHAR_OCTET_LENGTH - int - for character data types the maximum number of bytes in the column
    17. ORDINAL_POSITION - int - 1-based index in the table
    18. IS_NULLABLE - string - "NO" means in no way nullable, "YES" means possibly nullable. Empty string means nobody knows.
    ++
  • ++TABLE_CAT - string - table catalog (can be NULL)
  • ++
  • ++TABLE_SCHEM - string - table schema (can be NULL)
  • ++
  • ++TABLE_NAME - string - table name
  • ++
  • ++COLUMN_NAME - string - column name
  • ++
  • ++COLUMN_TYPE - short - see Types
  • ++
  • ++TYPE_NAME - string - the name of the type. Data source dependent.
  • ++
  • ++COLUMN_SIZE - int - column size. For character and date types, this is the maximum number of characters. For numeric types this is the precision.
  • ++
  • ++BUFFER_LENGTH - not used
  • ++
  • ++DECIMAL_DIGITS - int - the number of fractional digits.
  • ++
  • ++NUM_PREC_RADIX - int - radix
  • ++
  • ++NULLABLE - int - whether the column allows NULLs
      ++
    • ++columnNoNulls - might not allow NULLs
    • ++
    • ++columnNullable - definitely allows NULLs
    • ++
    • ++columnNullableUnknown - nullability is unknown
    • ++
    ++
  • ++
  • ++REMARKS - string - comments on the column (can be NULL)
  • ++
  • ++COLUMN_DEF - string - default value (can be NULL)
  • ++
  • ++SQL_DATA_TYPE - short -
  • ++
  • ++SQL_DATETIME_SUB - short -
  • ++
  • ++CHAR_OCTET_LENGTH - int - for character data types the maximum number of bytes in the column
  • ++
  • ++ORDINAL_POSITION - int - 1-based index in the table
  • ++
  • ++IS_NULLABLE - string - "NO" means in no way nullable, "YES" means possibly nullable. Empty string means nobody knows.
  • ++ +
    +-

    +- ++

    ++

    + +- + +@@ -942,30 +1008,71 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getCrossReference ResultSet* odbc::DatabaseMetaData::getCrossReference const std::string &   primaryCatalog, primaryCatalog,
    const std::string &   primarySchema, primarySchema,
    const std::string &   primaryTable, primaryTable,
    const std::string &   foreignCatalog, foreignCatalog,
    const std::string &   foreignSchema, foreignSchema,
    const std::string &   foreignTable foreignTable
    +
    + +

    +-Figures out in which way a foreign key table references a primary key table. ++Figures out in which way a foreign key table references a primary key table. +

    +-Returns it's findings in a ResultSet, ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME and KEY_SEQ. The ResultSet contains the following columns:

      +-
    1. PKTABLE_CAT - string - primary key table catalog
    2. PKTABLE_SCHEM - string - primary key table schema
    3. PKTABLE_NAME - string - primary key table name
    4. PKCOLUMN_NAME - string - primary key column name
    5. FKTABLE_CAT - string - foreign key table catalog
    6. FKTABLE_SCHEM - string - foreign key table schema
    7. FKTABLE_NAME - string - foreign key table name
    8. FKCOLUMN_NAME - string - foreign key column name
    9. KEY_SEQ - short - column sequence number in key (1-based)
    10. UPDATE_RULE - short - what happens to the foreign key when the primary is updated:
        +-
      • importedKeyNoAction - nothing happends since the primary key can not be updated
      • importedKeyCascade - change imported key to match the primary key
      • importedKeySetNull - update the imported key to NULL
      • importedKeySetDefault - update the impored key to it's default value
      • importedKeyRestrict - same as importedKeyNoAction
      +-
    11. DELETE_RULE - short - what happens to the foreign key when the primary is deleted:
        +-
      • importedKeyNoAction - nothing happends since the primary key can not be deleted
      • importedKeyCascade - imported key is deleted as well
      • importedKeySetNull - imported key is set to NULL
      • importedKeySetDefault - imported key is set to it's default value
      • importedKeyRestrict - same as importedKeyNoAction
      ++Returns it's findings in a ResultSet, ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME and KEY_SEQ. The ResultSet contains the following columns:
        ++
      1. ++PKTABLE_CAT - string - primary key table catalog
      2. ++
      3. ++PKTABLE_SCHEM - string - primary key table schema
      4. ++
      5. ++PKTABLE_NAME - string - primary key table name
      6. ++
      7. ++PKCOLUMN_NAME - string - primary key column name
      8. ++
      9. ++FKTABLE_CAT - string - foreign key table catalog
      10. ++
      11. ++FKTABLE_SCHEM - string - foreign key table schema
      12. ++
      13. ++FKTABLE_NAME - string - foreign key table name
      14. ++
      15. ++FKCOLUMN_NAME - string - foreign key column name
      16. ++
      17. ++KEY_SEQ - short - column sequence number in key (1-based)
      18. ++
      19. ++UPDATE_RULE - short - what happens to the foreign key when the primary is updated:
          ++
        • ++importedKeyNoAction - nothing happends since the primary key can not be updated
        • ++
        • ++importedKeyCascade - change imported key to match the primary key
        • ++
        • ++importedKeySetNull - update the imported key to NULL
        • ++
        • ++importedKeySetDefault - update the impored key to it's default value
        • ++
        • ++importedKeyRestrict - same as importedKeyNoAction
        • ++
        ++
      20. ++
      21. ++DELETE_RULE - short - what happens to the foreign key when the primary is deleted:
          ++
        • ++importedKeyNoAction - nothing happends since the primary key can not be deleted
        • ++
        • ++importedKeyCascade - imported key is deleted as well
        • ++
        • ++importedKeySetNull - imported key is set to NULL
        • ++
        • ++importedKeySetDefault - imported key is set to it's default value
        • ++
        • ++importedKeyRestrict - same as importedKeyNoAction
        • ++
        ++
      22. +
      +
    +-

    +- ++

    ++

    + +- + +@@ -978,42 +1085,40 @@ + ++
    See also:
    Connection
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    int odbc::DatabaseMetaData::getDefaultTransactionIsolation int odbc::DatabaseMetaData::getDefaultTransactionIsolation    ) 
    +
    + +

    +-Returns the default transaction isolation level. ++Returns the default transaction isolation level. +

    +-

    +-See also:
    +-Connection
    +-

    +- ++

    ++

    + +- + +@@ -1026,24 +1131,23 @@ + ++The returned ResultSet is identical to the one returned by getCrossReference(). + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getExportedKeys ResultSet* odbc::DatabaseMetaData::getExportedKeys const std::string &   catalog, catalog,
    const std::string &   schema, schema,
    const std::string &   table table
    +
    + +

    +-Fetches a list of columns that reference a table's primary keys. ++Fetches a list of columns that reference a table's primary keys. +

    +-The returned ResultSet is identical to the one returned by getCrossReference().

    +-

    +- ++

    ++

    + +- + +@@ -1056,40 +1160,39 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    std::string odbc::DatabaseMetaData::getIdentifierQuoteString std::string odbc::DatabaseMetaData::getIdentifierQuoteString    ) 
    +
    + +

    +-Returns the string that can be used to quote identifiers. ++Returns the string that can be used to quote identifiers. +

    + If the data source doesn't support it, returns an empty string.

    +-

    +- ++

    ++

    + +- + +@@ -1102,52 +1205,51 @@ + ++The returned ResultSet is identical to the one returned by getCrossReference(), except it's ordered by PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME and KEY_SEQ. + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getImportedKeys ResultSet* odbc::DatabaseMetaData::getImportedKeys const std::string &   catalog, catalog,
    const std::string &   schema, schema,
    const std::string &   table table
    +
    + +

    +-Fetches a list of columns that are foreign keys to other tables' primary keys. ++Fetches a list of columns that are foreign keys to other tables' primary keys. +

    +-The returned ResultSet is identical to the one returned by getCrossReference(), except it's ordered by PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME and KEY_SEQ.

    +-

    +- ++

    ++

    + +- + +@@ -1160,42 +1262,70 @@ + ++
  • ++TABLE_CAT - string - table catalog (can be NULL)
  • ++
  • ++TABLE_SCHEM - string - table schema (can be NULL)
  • ++
  • ++TABLE_NAME - string - table name
  • ++
  • ++NON_UNIQUE - bool - true if index values can be non-unique. NULL if TYPE is tableIndexStatistic
  • ++
  • ++INDEX_QUALIFIER - string - index catalog, NULL if TYPE is tableIndexStatistic
  • ++
  • ++INDEX_NAME - string - index name, NULL if TYPE is tableIndexStatistic
  • ++
  • ++TYPE - short - index type:
      ++
    • ++tableIndexStatistic - no real index - a statistic for the table
    • ++
    • ++tableIndexClustered - this index is clustered
    • ++
    • ++tableIndexHashed - this index is hashed
    • ++
    • ++tableIndexOther - this is some other kind of index
    • ++
    ++
  • ++
  • ++ORDINAL_POSITION - short - column sequence number in index (1-based). NULL if TYPE is tableIndexStatistic.
  • ++
  • ++COLUMN_NAME - string - column name. NULL if TYPE is tableIndexStatistic.
  • ++
  • ++ASC_OR_DESC - string - "A" for ascending, "D" for descending index. NULL if TYPE is tableIndexStatistic.
  • ++
  • ++CARDINALITY - int - If TYPE is tableIndexStatistic, the number of rows in the table. Otherwise, the number of unique values in the index.
  • ++
  • ++PAGES - int - Number of pages used for the table if TYPE is tableIndexStatistic. Otherwise the number of pages used for the index.
  • ++
  • ++FILTER_CONDITION - string - filter condition (if any)
  • ++ ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getIndexInfo ResultSet* odbc::DatabaseMetaData::getIndexInfo const std::string &   catalog, catalog,
    const std::string &   schema, schema,
    const std::string &   table, table,
    bool   unique, unique,
    bool   approximate approximate
    +
    + +

    +-Fetches a list of indices and statistics for a table. ++Fetches a list of indices and statistics for a table. +

    + The returned ResultSet is ordered by NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME and ORDINAL_POSITION. It contains the following columns:

      +-
    1. TABLE_CAT - string - table catalog (can be NULL)
    2. TABLE_SCHEM - string - table schema (can be NULL)
    3. TABLE_NAME - string - table name
    4. NON_UNIQUE - bool - true if index values can be non-unique. NULL if TYPE is tableIndexStatistic
    5. INDEX_QUALIFIER - string - index catalog, NULL if TYPE is tableIndexStatistic
    6. INDEX_NAME - string - index name, NULL if TYPE is tableIndexStatistic
    7. TYPE - short - index type:
        +-
      • tableIndexStatistic - no real index - a statistic for the table
      • tableIndexClustered - this index is clustered
      • tableIndexHashed - this index is hashed
      • tableIndexOther - this is some other kind of index
      +-
    8. ORDINAL_POSITION - short - column sequence number in index (1-based). NULL if TYPE is tableIndexStatistic.
    9. COLUMN_NAME - string - column name. NULL if TYPE is tableIndexStatistic.
    10. ASC_OR_DESC - string - "A" for ascending, "D" for descending index. NULL if TYPE is tableIndexStatistic.
    11. CARDINALITY - int - If TYPE is tableIndexStatistic, the number of rows in the table. Otherwise, the number of unique values in the index.
    12. PAGES - int - Number of pages used for the table if TYPE is tableIndexStatistic. Otherwise the number of pages used for the index.
    13. FILTER_CONDITION - string - filter condition (if any)
    +-
    +-Parameters:
    +- +- +- +- +- +- +-
    catalog  +-the catalog name
    schema  +-the schema name
    table  +-the table name
    unique  +-whether only unique indices should be looked at
    approximate  +-whether only accurate values should be retrieved
    +-
    ++ ++ ++ ++ ++ ++
    catalog the catalog name
    schema the schema name
    table the table name
    unique whether only unique indices should be looked at
    approximate whether only accurate values should be retrieved
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1208,42 +1338,40 @@ + ++
    Returns:
    zero if unknown.
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    int odbc::DatabaseMetaData::getMaxTablesInSelect int odbc::DatabaseMetaData::getMaxTablesInSelect    ) 
    +
    + +

    +-Returns the maximum number of tables that can be joined at once. ++Returns the maximum number of tables that can be joined at once. +

    +-

    +-Returns:
    +-zero if unknown.
    +-

    +- ++

    ++

    + +- + +@@ -1256,48 +1384,59 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getPrimaryKeys ResultSet* odbc::DatabaseMetaData::getPrimaryKeys const std::string &   catalog, catalog,
    const std::string &   schema, schema,
    const std::string &   table table
    +
    + +

    +-Fetches a list of primary keys for a table. ++Fetches a list of primary keys for a table. +

    +-The returned ResultSet is ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME and KEY_SEQ. It contains the following columns:

      +-
    1. TABLE_CAT - string - table catalog (can be NULL)
    2. TABLE_SCHEM - string - table schema (can be NULL)
    3. TABLE_NAME - string - table name
    4. COLUMN_NAME - string - column name
    5. KEY_SEQ - string - sequence number in primary key (1-based)
    6. PK_NAME - string - primary key (constraint) name. Can be NULL.
    ++The returned ResultSet is ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME and KEY_SEQ. It contains the following columns:
      ++
    1. ++TABLE_CAT - string - table catalog (can be NULL)
    2. ++
    3. ++TABLE_SCHEM - string - table schema (can be NULL)
    4. ++
    5. ++TABLE_NAME - string - table name
    6. ++
    7. ++COLUMN_NAME - string - column name
    8. ++
    9. ++KEY_SEQ - string - sequence number in primary key (1-based)
    10. ++
    11. ++PK_NAME - string - primary key (constraint) name. Can be NULL.
    12. ++
    +
    +-

    +- ++

    ++

    + +- + +@@ -1310,46 +1449,90 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getProcedureColumns ResultSet* odbc::DatabaseMetaData::getProcedureColumns const std::string &   catalog, catalog,
    const std::string &   schemaPattern, schemaPattern,
    const std::string &   procedureNamePattern, procedureNamePattern,
    const std::string &   columnNamePattern columnNamePattern
    +
    + +

    +-Returns available procedure columns in a catalog. ++Returns available procedure columns in a catalog. ++

    ++The returned ResultSet is ordered by PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME and COLUMN_NAME. It contains the following columns:

      ++
    1. ++PROCEDURE_CAT - string - the procedure catalog
    2. ++
    3. ++PROCEDURE_SCHEM - string - the procedure schema
    4. ++
    5. ++PROCEDURE_NAME - string - the procedure name
    6. ++
    7. ++COLUMN_NAME - string - the column name
    8. ++
    9. ++COLUMN_TYPE - short - the column type
        ++
      • ++procedureColumnUnknown - beats the driver
      • ++
      • ++procedureColumnIn - IN parameter
      • ++
      • ++procedureColumnInOut - IN OUT parameter
      • ++
      • ++procedureColumnOut - OUT parameter
      • ++
      • ++procedureColumnReturn - procedure return value (eg. this procedure is actually a function)
      • ++
      • ++procedureColumnResult - this column is part of a ResultSet this procedure returns
      • ++
      ++
    10. ++
    11. ++DATA_TYPE - int - SQL type of the column
    12. ++
    13. ++TYPE_NAME - string - native type name
    14. ++
    15. ++COLUMN_SIZE - int - the precision of the column
    16. ++
    17. ++BUFFER_LENGTH - int - nothing of interest
    18. ++
    19. ++DECIMAL_DIGITS - short - scale, if applicable
    20. ++
    21. ++NUM_PREC_RADIX - short - radix, if applicable
    22. ++
    23. ++NULLABLE - short - whether the column is nullable
        ++
      • ++procedureNoNulls - not nullable
      • ++
      • ++procedureNullable - nullable
      • ++
      • ++procedureNullableUnknown - nobody knows
      • ++
      ++
    24. ++
    25. ++REMARKS - string - comments on the column
    26. ++
    +

    +-The returned ResultSet is ordered by PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME and COLUMN_NAME. It contains the following columns:

      +-
    1. PROCEDURE_CAT - string - the procedure catalog
    2. PROCEDURE_SCHEM - string - the procedure schema
    3. PROCEDURE_NAME - string - the procedure name
    4. COLUMN_NAME - string - the column name
    5. COLUMN_TYPE - short - the column type
        +-
      • procedureColumnUnknown - beats the driver
      • procedureColumnIn - IN parameter
      • procedureColumnInOut - IN OUT parameter
      • procedureColumnOut - OUT parameter
      • procedureColumnReturn - procedure return value (eg. this procedure is actually a function)
      • procedureColumnResult - this column is part of a ResultSet this procedure returns
      +-
    6. DATA_TYPE - int - SQL type of the column
    7. TYPE_NAME - string - native type name
    8. COLUMN_SIZE - int - the precision of the column
    9. BUFFER_LENGTH - int - nothing of interest
    10. DECIMAL_DIGITS - short - scale, if applicable
    11. NUM_PREC_RADIX - short - radix, if applicable
    12. NULLABLE - short - whether the column is nullable
        +-
      • procedureNoNulls - not nullable
      • procedureNullable - nullable
      • procedureNullableUnknown - nobody knows
      +-
    13. REMARKS - string - comments on the column
    + Note: more columns can be returned depending on the driver.
    +-

    +- ++

    ++

    + +- + +@@ -1362,28 +1545,49 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getProcedures ResultSet* odbc::DatabaseMetaData::getProcedures const std::string &   catalog, catalog,
    const std::string &   schemaPattern, schemaPattern,
    const std::string &   procedureNamePattern procedureNamePattern
    +
    + +

    +-Returns available procedures in a catalog. ++Returns available procedures in a catalog. +

    + The returned ResultSet is ordered by PROCEDURE_CAT, PROCEDURE_SCHEM and PROCEDURE_NAME. It contains the following columns:

      +-
    1. PROCEDURE_CAT - string - the procedure catalog
    2. PROCEDURE_SCHEM - string - the procedure schema
    3. PROCEDURE_NAME - string - the procedure name
    4. NUM_INPUT_PARAMS - reserved for future use
    5. NUM_OUTPUT_PARAMS - reserved for future use
    6. NUM_RESULT_SETS - reserved for future use
    7. REMARKS - string - comments on the procedure
    8. PROCEDURE_TYPE - short - the procedure type:
        +-
      • procedureResultUnknown - can possibly return a result, but nobody is sure
      • procedureNoResult - does not return a result
      • procedureReturnsResult - returns a result
      ++
    9. ++PROCEDURE_CAT - string - the procedure catalog
    10. ++
    11. ++PROCEDURE_SCHEM - string - the procedure schema
    12. ++
    13. ++PROCEDURE_NAME - string - the procedure name
    14. ++
    15. ++NUM_INPUT_PARAMS - reserved for future use
    16. ++
    17. ++NUM_OUTPUT_PARAMS - reserved for future use
    18. ++
    19. ++NUM_RESULT_SETS - reserved for future use
    20. ++
    21. ++REMARKS - string - comments on the procedure
    22. ++
    23. ++PROCEDURE_TYPE - short - the procedure type:
        ++
      • ++procedureResultUnknown - can possibly return a result, but nobody is sure
      • ++
      • ++procedureNoResult - does not return a result
      • ++
      • ++procedureReturnsResult - returns a result
      • ++
      ++
    24. +
    +
    +-

    +- ++

    ++

    + +- + +@@ -1396,40 +1600,39 @@ + ++The returned ResultSet is the same as with getTables(), except that all columns but TABLE_SCHEM contain NULL values. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    ResultSet* odbc::DatabaseMetaData::getSchemas ResultSet* odbc::DatabaseMetaData::getSchemas    ) 
    +
    + +

    +-Returns a list of available schemas in the database. ++Returns a list of available schemas in the database. +

    +-The returned ResultSet is the same as with getTables(), except that all columns but TABLE_SCHEM contain NULL values.

    +-

    +- ++

    ++

    + +- + +@@ -1442,50 +1645,62 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getTablePrivileges ResultSet* odbc::DatabaseMetaData::getTablePrivileges const std::string &   catalog, catalog,
    const std::string &   schemaPattern, schemaPattern,
    const std::string &   tableNamePattern tableNamePattern
    +
    + +

    +-Fetches a list of access rights for tables in a catalog. +-

    +-A table privilege applies to one or more columns in a table. Do not assume that this privilege is valid for all columns. ++Fetches a list of access rights for tables in a catalog. +

    +-The returned ResultSet is ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME and PRIVILEGE. It contains the following columns:

      +-
    1. TABLE_CAT - string - table catalog (can be NULL)
    2. TABLE_SCHEM - string - table schema (can be NULL)
    3. TABLE_NAME - string - table name
    4. GRANTOR - string - grantor (can be NULL). If GRANTEE owns the object, GRANTOR is "SYSTEM".
    5. GRANTEE - string - grantee
    6. PRIVILEGE - string - one of "SELECT", "INSERT", "UPDATE", "DELETE", "REFERENCES" or a data source specific value
    7. IS_GRANTABLE - string - "YES" if GRANTEE can grant this privilege to other users. "NO" if not. NULL if unknown.
    ++A table privilege applies to one or more columns in a table. Do not assume that this privilege is valid for all columns.

    ++The returned ResultSet is ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME and PRIVILEGE. It contains the following columns:

      ++
    1. ++TABLE_CAT - string - table catalog (can be NULL)
    2. ++
    3. ++TABLE_SCHEM - string - table schema (can be NULL)
    4. ++
    5. ++TABLE_NAME - string - table name
    6. ++
    7. ++GRANTOR - string - grantor (can be NULL). If GRANTEE owns the object, GRANTOR is "SYSTEM".
    8. ++
    9. ++GRANTEE - string - grantee
    10. ++
    11. ++PRIVILEGE - string - one of "SELECT", "INSERT", "UPDATE", "DELETE", "REFERENCES" or a data source specific value
    12. ++
    13. ++IS_GRANTABLE - string - "YES" if GRANTEE can grant this privilege to other users. "NO" if not. NULL if unknown.
    14. ++
    +
    +-

    +- ++

    ++

    + +- + +@@ -1498,38 +1713,43 @@ + ++
  • ++TABLE_CAT - string - table catalog (can be NULL)
  • ++
  • ++TABLE_SCHEM - string - table schema (can be NULL)
  • ++
  • ++TABLE_NAME - string - table name
  • ++
  • ++TABLE_TYPE - string - table type
  • ++
  • ++REMARKS - string - comments on the table
  • ++ ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getTables ResultSet* odbc::DatabaseMetaData::getTables const std::string &   catalog, catalog,
    const std::string &   schemaPattern, schemaPattern,
    const std::string &   tableNamePattern, tableNamePattern,
    const std::vector< std::string > &   types types
    +
    + +

    +-Fetches the available tables in the data source. ++Fetches the available tables in the data source. +

    + The returned ResultSet has the following columns:

      +-
    1. TABLE_CAT - string - table catalog (can be NULL)
    2. TABLE_SCHEM - string - table schema (can be NULL)
    3. TABLE_NAME - string - table name
    4. TABLE_TYPE - string - table type
    5. REMARKS - string - comments on the table
    +-
    +-Parameters:
    +- +- +- +- +- +-
    catalog  +-the catalog name
    schemaPattern  +-schema name search pattern
    tableNamePattern  +-table name search pattern
    types  +-a list of table types. An empty list returns all table types.
    +-
    ++ ++ ++ ++ ++
    catalog the catalog name
    schemaPattern schema name search pattern
    tableNamePattern table name search pattern
    types a list of table types. An empty list returns all table types.
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1542,24 +1762,23 @@ + ++The returned ResultSet is the same as with getTables(), except that all columns but TABLE_TYPE contain NULL values. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    ResultSet* odbc::DatabaseMetaData::getTableTypes ResultSet* odbc::DatabaseMetaData::getTableTypes    ) 
    +
    + +

    +-Fetches the table types the database supports. ++Fetches the table types the database supports. +

    +-The returned ResultSet is the same as with getTables(), except that all columns but TABLE_TYPE contain NULL values.

    +-

    +- ++

    ++

    + +- + +@@ -1572,46 +1791,95 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    ResultSet* odbc::DatabaseMetaData::getTypeInfo ResultSet* odbc::DatabaseMetaData::getTypeInfo    ) 
    +
    + +

    +-Fetches a list of data types supported by this data source. ++Fetches a list of data types supported by this data source. +

    + The returned ResultSet is ordered by DATA_TYPE and then by how closely the type maps to the corresponding ODBC SQL type. It contains the following columns:

      +-
    1. TYPE_NAME - string - native type name
    2. DATA_TYPE - short - SQL data type from Types
    3. COLUMN_SIZE - int - maximum precision
    4. LITERAL_PREFIX - string - prefix used to quote a literal. Can be NULL.
    5. LITERAL_SUFFIX - string - suffix used to quote a literal. Can be NULL.
    6. CREATE_PARAMS - string - comma separated possible list of parameters to creating a column of this type
    7. NULLABLE - short - whether this type can contain NULLs:
        +-
      • typeNoNulls - no
      • typeNullable - yes, can be nullable
      • typeNullableUnknown - nobody knows
      +-
    8. CASE_SENSITIVE - bool - whether this type is case sensitive
    9. SEARCHABLE - bool - whether this type can be searched, eg used in WHERE-clauses:
        +-
      • typePredNone - no
      • typePredChar - yes, but only with a LIKE predicate
      • typePredBasic - yes, except in a LIKE predicate
      • typeSearchable - yes
      +-
    10. UNSIGNED_ATTRIBUTE - bool - true if this type is unsigned
    11. FIXED_PREC_SCALE - bool - whether this type has predefined fixed precision and scale (eg is useful for money)
    12. AUTO_UNIQUE_VALUE - bool - whether this type can be used for an autoincrementing value. NULL if not applicable.
    13. LOCAL_TYPE_NAME - string - localized native type name. Can be NULL.
    14. MINIMUM_SCALE - short - minimum supported scale, if applicable
    15. MAXIMUM_SCALE - short - maximum supported scale, if applicable
    16. SQL_DATA_TYPE - short - unused
    17. SQL_DATETIME_SUB - short - unused
    18. NUM_PREC_RADIX - int - radix, if applicable
    ++
  • ++TYPE_NAME - string - native type name
  • ++
  • ++DATA_TYPE - short - SQL data type from Types
  • ++
  • ++COLUMN_SIZE - int - maximum precision
  • ++
  • ++LITERAL_PREFIX - string - prefix used to quote a literal. Can be NULL.
  • ++
  • ++LITERAL_SUFFIX - string - suffix used to quote a literal. Can be NULL.
  • ++
  • ++CREATE_PARAMS - string - comma separated possible list of parameters to creating a column of this type
  • ++
  • ++NULLABLE - short - whether this type can contain NULLs:
      ++
    • ++typeNoNulls - no
    • ++
    • ++typeNullable - yes, can be nullable
    • ++
    • ++typeNullableUnknown - nobody knows
    • ++
    ++
  • ++
  • ++CASE_SENSITIVE - bool - whether this type is case sensitive
  • ++
  • ++SEARCHABLE - bool - whether this type can be searched, eg used in WHERE-clauses:
      ++
    • ++typePredNone - no
    • ++
    • ++typePredChar - yes, but only with a LIKE predicate
    • ++
    • ++typePredBasic - yes, except in a LIKE predicate
    • ++
    • ++typeSearchable - yes
    • ++
    ++
  • ++
  • ++UNSIGNED_ATTRIBUTE - bool - true if this type is unsigned
  • ++
  • ++FIXED_PREC_SCALE - bool - whether this type has predefined fixed precision and scale (eg is useful for money)
  • ++
  • ++AUTO_UNIQUE_VALUE - bool - whether this type can be used for an autoincrementing value. NULL if not applicable.
  • ++
  • ++LOCAL_TYPE_NAME - string - localized native type name. Can be NULL.
  • ++
  • ++MINIMUM_SCALE - short - minimum supported scale, if applicable
  • ++
  • ++MAXIMUM_SCALE - short - maximum supported scale, if applicable
  • ++
  • ++SQL_DATA_TYPE - short - unused
  • ++
  • ++SQL_DATETIME_SUB - short - unused
  • ++
  • ++NUM_PREC_RADIX - int - radix, if applicable
  • ++ +
    +-

    +- ++

    ++

    + +- + +@@ -1624,29 +1892,50 @@ + + +
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    ResultSet* odbc::DatabaseMetaData::getVersionColumns ResultSet* odbc::DatabaseMetaData::getVersionColumns const std::string &   catalog, catalog,
    const std::string &   schema, schema,
    const std::string &   table table
    +
    + +

    +-Returns a list of columns for a table that are automatically updated when anything in a row is updated. ++Returns a list of columns for a table that are automatically updated when anything in a row is updated. +

    + The returned ResultSet has the following unordered columns:

      +-
    1. SCOPE - short - unused
    2. COLUMN_NAME - string - the column name
    3. DATA_TYPE - short - the type of the column from Types
    4. TYPE_NAME - string - native type name (data source dependent)
    5. COLUMN_SIZE - int - the size (precision) of the column.
    6. BUFFER_LENGTH - int - unused
    7. DECIMAL_DIGITS - short - scale if applicable. Can be NULL.
    8. PSEUDO_COLUMN - short - whether this is a pseudo column:
        +-
      • versionColumnUnknown - it is unknown whether this is a pseudo column
      • versionColumnNotPseudo - it is definitely not a pseudo column
      • versionColumnPseudo - it is definitely a pseudo column
      ++
    9. ++SCOPE - short - unused
    10. ++
    11. ++COLUMN_NAME - string - the column name
    12. ++
    13. ++DATA_TYPE - short - the type of the column from Types
    14. ++
    15. ++TYPE_NAME - string - native type name (data source dependent)
    16. ++
    17. ++COLUMN_SIZE - int - the size (precision) of the column.
    18. ++
    19. ++BUFFER_LENGTH - int - unused
    20. ++
    21. ++DECIMAL_DIGITS - short - scale if applicable. Can be NULL.
    22. ++
    23. ++PSEUDO_COLUMN - short - whether this is a pseudo column:
        ++
      • ++versionColumnUnknown - it is unknown whether this is a pseudo column
      • ++
      • ++versionColumnNotPseudo - it is definitely not a pseudo column
      • ++
      • ++versionColumnPseudo - it is definitely a pseudo column
      • ++
      ++
    24. +
    +
    +-

    +- ++

    ++

    + +- + +@@ -1659,30 +1948,28 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::insertsAreDetected bool odbc::DatabaseMetaData::insertsAreDetected int   type type  ) 
    +
    + +

    +-Returns true if an inserted row can be detected with ResultSet::rowInserted(). ++Returns true if an inserted row can be detected with ResultSet::rowInserted(). +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1695,25 +1982,24 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::isCatalogAtStart bool odbc::DatabaseMetaData::isCatalogAtStart    ) 
    +
    + +

    +-Returns true if the catalog is positioned at the beginning of a fully qualified identifier. ++Returns true if the catalog is positioned at the beginning of a fully qualified identifier. +

    + For example mysql would say true, while oracle would say false.

    +-

    +- ++

    ++

    + +- + +@@ -1726,31 +2012,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::othersDeletesAreVisible bool odbc::DatabaseMetaData::othersDeletesAreVisible int   type type  ) 
    +
    + +

    +-Returns true if rows deleted by others disapear from a ResultSet. ++Returns true if rows deleted by others disapear from a ResultSet. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1763,31 +2047,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::othersInsertsAreVisible bool odbc::DatabaseMetaData::othersInsertsAreVisible int   type type  ) 
    +
    + +

    +-Returns true if rows inserted by others become available in a ResultSet. ++Returns true if rows inserted by others become available in a ResultSet. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1800,31 +2082,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::othersUpdatesAreVisible bool odbc::DatabaseMetaData::othersUpdatesAreVisible int   type type  ) 
    +
    + +

    +-Returns true if rows updated by others are visible with their new values. ++Returns true if rows updated by others are visible with their new values. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1837,31 +2117,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::ownDeletesAreVisible bool odbc::DatabaseMetaData::ownDeletesAreVisible int   type type  ) 
    +
    + +

    +-Returns true if deleted rows dissapear from a ResultSet. ++Returns true if deleted rows dissapear from a ResultSet. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1874,31 +2152,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::ownInsertsAreVisible bool odbc::DatabaseMetaData::ownInsertsAreVisible int   type type  ) 
    +
    + +

    +-Returns true if inserted rows become available in a ResultSet. ++Returns true if inserted rows become available in a ResultSet. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1911,30 +2187,28 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::ownUpdatesAreVisible bool odbc::DatabaseMetaData::ownUpdatesAreVisible int   type type  ) 
    +
    + +

    +-Returns true if updated rows are available with their new values in the ResultSet. ++Returns true if updated rows are available with their new values in the ResultSet. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1947,26 +2221,24 @@ + ++
    Returns:
    true if the data source supports both data manipulation (eg. UPDATE, INSERT) and data definition (eg. CREATE TABLE) within a transaction.
    ++If this method returns true, supportsDataManipulationTransactionsOnly(), dataDefinitionCausesTransactionCommit() and dataDefinitionIgnoredInTransactions() all return false. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions bool odbc::DatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions    ) 
    +
    + +

    +-Checks if the data source supports both DML and DDL in transactions. ++Checks if the data source supports both DML and DDL in transactions. +

    +-

    +-Returns:
    +-true if the data source supports both data manipulation (eg. UPDATE, INSERT) and data definition (eg. CREATE TABLE) within a transaction.
    If this method returns true, supportsDataManipulationTransactionsOnly(), dataDefinitionCausesTransactionCommit() and dataDefinitionIgnoredInTransactions() all return false.
    +-

    +- ++

    ++

    + +- + +@@ -1979,28 +2251,25 @@ + ++
    Returns:
    true if the data source only supports data manipulation (eg. UPDATE, INSERT) within a transaction.
    ++Attempts to use data definition (eg. CREATE TABLE) in a transaction will trigger an error.

    ++If this method returns true, supportsDataDefinitionAndDataManipulationTransactions(), dataDefinitionCausesTransactionCommit() and dataDefinitionIgnoredInTransactions() all return false. +

    +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsDataManipulationTransactionsOnly bool odbc::DatabaseMetaData::supportsDataManipulationTransactionsOnly    ) 
    +
    + +

    +-Checks if the data source only supports DML in transactions. +-

    +-

    +-Returns:
    +-true if the data source only supports data manipulation (eg. UPDATE, INSERT) within a transaction.
    Attempts to use data definition (eg. CREATE TABLE) in a transaction will trigger an error. ++Checks if the data source only supports DML in transactions. +

    +-If this method returns true, supportsDataDefinitionAndDataManipulationTransactions(), dataDefinitionCausesTransactionCommit() and dataDefinitionIgnoredInTransactions() all return false.

    +-

    +- ++

    ++

    + +- + +@@ -2013,24 +2282,23 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsOpenCursorsAcrossCommit bool odbc::DatabaseMetaData::supportsOpenCursorsAcrossCommit    ) 
    +
    + +

    +-Returns true if the data source and the driver can handle open cursors (eg. ++Returns true if the data source and the driver can handle open cursors (eg. +

    + ResultSets) across a commit, or false if they are invalidated.

    +-

    +- ++

    ++

    + +- + +@@ -2043,24 +2311,23 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsOpenCursorsAcrossRollback bool odbc::DatabaseMetaData::supportsOpenCursorsAcrossRollback    ) 
    +
    + +

    +-Returns true if the data source and the driver can handle open cursors (eg. ++Returns true if the data source and the driver can handle open cursors (eg. +

    + ResultSets) across a rollback, or false if they are invalidated.

    +-

    +- ++

    ++

    + +- + +@@ -2073,26 +2340,24 @@ + ++
    Returns:
    true if ("DELETE WHERE CURRENT OF ...") is supported
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsPositionedDelete bool odbc::DatabaseMetaData::supportsPositionedDelete    ) 
    +
    + +

    +-Checks if the data source supports positioned delete. ++Checks if the data source supports positioned delete. +

    +-

    +-Returns:
    +-true if ("DELETE WHERE CURRENT OF ...") is supported
    +-

    +- ++

    ++

    + +- + +@@ -2105,36 +2370,34 @@ + ++
    Returns:
    true if ("UPDATE ... WHERE CURRENT OF ...") is supported
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsPositionedUpdate bool odbc::DatabaseMetaData::supportsPositionedUpdate    ) 
    +
    + +

    +-Checks if the data source supports positioned update. ++Checks if the data source supports positioned update. +

    +-

    +-Returns:
    +-true if ("UPDATE ... WHERE CURRENT OF ...") is supported
    +-

    +- ++

    ++

    + +- + +@@ -2147,35 +2410,31 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    bool odbc::DatabaseMetaData::supportsResultSetConcurrency bool odbc::DatabaseMetaData::supportsResultSetConcurrency int   type, type,
    int   concurrency concurrency
    +
    + +

    +-Returns true if the data source supports the given result set concurrency for the given result set type. ++Returns true if the data source supports the given result set concurrency for the given result set type. +

    +-

    +-Parameters:
    +- +- +- +-
    type  +-The type to check for.
    concurrency  +-The concurrency level to check for.
    +-
    +-See also:
    +-ResultSet
    ++ ++ ++
    type The type to check for.
    concurrency The concurrency level to check for.
    ++ ++

    See also:
    ResultSet
    ++ + + +-

    +- ++

    ++

    + +- + +@@ -2188,32 +2447,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsResultSetType bool odbc::DatabaseMetaData::supportsResultSetType int   type type  ) 
    +
    + +

    +-Returns true if the data source supports the given result set type. ++Returns true if the data source supports the given result set type. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type to check for
    +-
    +-See also:
    +-ResultSet
    ++ ++
    type The type to check for
    ++ ++

    See also:
    ResultSet
    ++ + + +-

    +- ++

    ++

    + +- + +@@ -2226,27 +2482,25 @@ + ++
    Returns:
    true if ("SELECT ... FOR UPDATE") is supported
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsSelectForUpdate bool odbc::DatabaseMetaData::supportsSelectForUpdate    ) 
    +
    + +

    +-Checks if the data source supports. ++Checks if the data source supports. +

    +-

    +-Returns:
    +-true if ("SELECT ... FOR UPDATE") is supported
    +-

    +- ++

    ++

    + +- + +@@ -2259,31 +2513,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::supportsTransactionIsolationLevel bool odbc::DatabaseMetaData::supportsTransactionIsolationLevel int   lev lev  ) 
    +
    + +

    +-Returns true if the data source supports the specified transaction isolation level. ++Returns true if the data source supports the specified transaction isolation level. +

    +-

    +-Parameters:
    +- +- +-
    lev  +-The isolation level to check for
    +-
    ++ ++
    lev The isolation level to check for
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2296,19 +2548,18 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::DatabaseMetaData::updatesAreDetected bool odbc::DatabaseMetaData::updatesAreDetected int   type type  ) 
    +
    + +

    +-Returns true if ResultSet::rowUpdated can determine whether a row has been updated. ++Returns true if ResultSet::rowUpdated can determine whether a row has been updated. +

    +-

    +-Parameters:
    +- +- +-
    type  +-The type of ResultSet of interest
    +-
    ++ ++
    type The type of ResultSet of interest
    ++ ++ + + +


    The documentation for this class was generated from the following file: ++
  • odbc++/databasemetadata.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_database_meta_data-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_database_meta_data-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_database_meta_data-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_database_meta_data-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,160 +1,159 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DatabaseMetaData Member List

    This is the complete list of members for odbc::DatabaseMetaData, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::DatabaseMetaData Member List

    This is the complete list of members for odbc::DatabaseMetaData, including all inherited members.

    allProceduresAreCallable()odbc::DatabaseMetaData
    allTablesAreSelectable()odbc::DatabaseMetaData
    dataDefinitionCausesTransactionCommit()odbc::DatabaseMetaData
    dataDefinitionIgnoredInTransactions()odbc::DatabaseMetaData
    deletesAreDetected(int type)odbc::DatabaseMetaData
    doesMaxRowSizeIncludeBlobs()odbc::DatabaseMetaData
    getBestRowIdentifier(const std::string &catalog, const std::string &schema, const std::string &table, int scope, bool nullable)odbc::DatabaseMetaData
    getCatalogs()odbc::DatabaseMetaData
    getCatalogSeparator()odbc::DatabaseMetaData
    getCatalogTerm()odbc::DatabaseMetaData
    getColumnPrivileges(const std::string &catalog, const std::string &schema, const std::string &table, const std::string &columnNamePattern)odbc::DatabaseMetaData
    getColumns(const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::string &columnNamePattern)odbc::DatabaseMetaData
    getConnection()odbc::DatabaseMetaData
    getCrossReference(const std::string &primaryCatalog, const std::string &primarySchema, const std::string &primaryTable, const std::string &foreignCatalog, const std::string &foreignSchema, const std::string &foreignTable)odbc::DatabaseMetaData
    getDatabaseProductName()odbc::DatabaseMetaData
    getDatabaseProductVersion()odbc::DatabaseMetaData
    getDefaultTransactionIsolation()odbc::DatabaseMetaData
    getDriverMajorVersion()odbc::DatabaseMetaData
    getDriverMinorVersion()odbc::DatabaseMetaData
    getDriverName()odbc::DatabaseMetaData
    getDriverVersion()odbc::DatabaseMetaData
    getExportedKeys(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    getExtraNameCharacters()odbc::DatabaseMetaData
    getIdentifierQuoteString()odbc::DatabaseMetaData
    getImportedKeys(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    getIndexInfo(const std::string &catalog, const std::string &schema, const std::string &table, bool unique, bool approximate)odbc::DatabaseMetaData
    getMaxBinaryLiteralLength()odbc::DatabaseMetaData
    getMaxCatalogNameLength()odbc::DatabaseMetaData
    getMaxCharLiteralLength()odbc::DatabaseMetaData
    getMaxColumnNameLength()odbc::DatabaseMetaData
    getMaxColumnsInGroupBy()odbc::DatabaseMetaData
    getMaxColumnsInIndex()odbc::DatabaseMetaData
    getMaxColumnsInOrderBy()odbc::DatabaseMetaData
    getMaxColumnsInSelect()odbc::DatabaseMetaData
    getMaxColumnsInTable()odbc::DatabaseMetaData
    getMaxConnections()odbc::DatabaseMetaData
    getMaxCursorNameLength()odbc::DatabaseMetaData
    getMaxIndexLength()odbc::DatabaseMetaData
    getMaxProcedureNameLength()odbc::DatabaseMetaData
    getMaxRowSize()odbc::DatabaseMetaData
    getMaxSchemaNameLength()odbc::DatabaseMetaData
    getMaxStatementLength()odbc::DatabaseMetaData
    getMaxStatements()odbc::DatabaseMetaData
    getMaxTableNameLength()odbc::DatabaseMetaData
    getMaxTablesInSelect()odbc::DatabaseMetaData
    getMaxUserNameLength()odbc::DatabaseMetaData
    getNumericFunctions()odbc::DatabaseMetaData
    getPrimaryKeys(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    getProcedureColumns(const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern, const std::string &columnNamePattern)odbc::DatabaseMetaData
    getProcedures(const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern)odbc::DatabaseMetaData
    getProcedureTerm()odbc::DatabaseMetaData
    getSchemas()odbc::DatabaseMetaData
    getSchemaTerm()odbc::DatabaseMetaData
    getSearchStringEscape()odbc::DatabaseMetaData
    getSQLKeywords()odbc::DatabaseMetaData
    getStringFunctions()odbc::DatabaseMetaData
    getSystemFunctions()odbc::DatabaseMetaData
    getTablePrivileges(const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern)odbc::DatabaseMetaData
    getTables(const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::vector< std::string > &types)odbc::DatabaseMetaData
    getTableTerm()odbc::DatabaseMetaData
    getTableTypes()odbc::DatabaseMetaData
    getTimeDateFunctions()odbc::DatabaseMetaData
    getTypeInfo()odbc::DatabaseMetaData
    getUserName()odbc::DatabaseMetaData
    getVersionColumns(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    insertsAreDetected(int type)odbc::DatabaseMetaData
    isCatalogAtStart()odbc::DatabaseMetaData
    isReadOnly()odbc::DatabaseMetaData
    nullPlusNonNullIsNull()odbc::DatabaseMetaData
    nullsAreSortedAtEnd()odbc::DatabaseMetaData
    nullsAreSortedAtStart()odbc::DatabaseMetaData
    nullsAreSortedHigh()odbc::DatabaseMetaData
    nullsAreSortedLow()odbc::DatabaseMetaData
    othersDeletesAreVisible(int type)odbc::DatabaseMetaData
    othersInsertsAreVisible(int type)odbc::DatabaseMetaData
    othersUpdatesAreVisible(int type)odbc::DatabaseMetaData
    ownDeletesAreVisible(int type)odbc::DatabaseMetaData
    ownInsertsAreVisible(int type)odbc::DatabaseMetaData
    ownUpdatesAreVisible(int type)odbc::DatabaseMetaData
    storesLowerCaseIdentifiers()odbc::DatabaseMetaData
    storesLowerCaseQuotedIdentifiers()odbc::DatabaseMetaData
    storesMixedCaseIdentifiers()odbc::DatabaseMetaData
    storesMixedCaseQuotedIdentifiers()odbc::DatabaseMetaData
    storesUpperCaseIdentifiers()odbc::DatabaseMetaData
    storesUpperCaseQuotedIdentifiers()odbc::DatabaseMetaData
    supportsAlterTableWithAddColumn()odbc::DatabaseMetaData
    supportsAlterTableWithDropColumn()odbc::DatabaseMetaData
    supportsANSI92EntryLevelSQL()odbc::DatabaseMetaData
    supportsANSI92FullSQL()odbc::DatabaseMetaData
    supportsANSI92IntermediateSQL()odbc::DatabaseMetaData
    supportsBatchUpdates()odbc::DatabaseMetaData
    supportsCatalogsInDataManipulation()odbc::DatabaseMetaData
    supportsCatalogsInIndexDefinitions()odbc::DatabaseMetaData
    supportsCatalogsInPrivilegeDefinitions()odbc::DatabaseMetaData
    supportsCatalogsInProcedureCalls()odbc::DatabaseMetaData
    supportsCatalogsInTableDefinitions()odbc::DatabaseMetaData
    supportsColumnAliasing()odbc::DatabaseMetaData
    supportsConvert()odbc::DatabaseMetaData
    supportsConvert(int fromType, int toType)odbc::DatabaseMetaData
    supportsCoreSQLGrammar()odbc::DatabaseMetaData
    supportsCorrelatedSubqueries()odbc::DatabaseMetaData
    supportsDataDefinitionAndDataManipulationTransactions()odbc::DatabaseMetaData
    supportsDataManipulationTransactionsOnly()odbc::DatabaseMetaData
    supportsExtendedSQLGrammar()odbc::DatabaseMetaData
    supportsFullOuterJoins()odbc::DatabaseMetaData
    supportsGroupBy()odbc::DatabaseMetaData
    supportsGroupByBeyondSelect()odbc::DatabaseMetaData
    supportsGroupByUnrelated()odbc::DatabaseMetaData
    supportsIntegrityEnhancementFacility()odbc::DatabaseMetaData
    supportsLikeEscapeClause()odbc::DatabaseMetaData
    supportsLimitedOuterJoins()odbc::DatabaseMetaData
    supportsMinimumSQLGrammar()odbc::DatabaseMetaData
    supportsMixedCaseIdentifiers()odbc::DatabaseMetaData
    supportsMixedCaseQuotedIdentifiers()odbc::DatabaseMetaData
    supportsMultipleResultSets()odbc::DatabaseMetaData
    supportsMultipleTransactions()odbc::DatabaseMetaData
    supportsNonNullableColumns()odbc::DatabaseMetaData
    supportsOpenCursorsAcrossCommit()odbc::DatabaseMetaData
    supportsOpenCursorsAcrossRollback()odbc::DatabaseMetaData
    supportsOpenStatementsAcrossCommit()odbc::DatabaseMetaData
    supportsOpenStatementsAcrossRollback()odbc::DatabaseMetaData
    supportsOuterJoins()odbc::DatabaseMetaData
    supportsPositionedDelete()odbc::DatabaseMetaData
    supportsPositionedUpdate()odbc::DatabaseMetaData
    supportsResultSetConcurrency(int type, int concurrency)odbc::DatabaseMetaData
    supportsResultSetType(int type)odbc::DatabaseMetaData
    supportsSchemasInDataManipulation()odbc::DatabaseMetaData
    supportsSchemasInIndexDefinitions()odbc::DatabaseMetaData
    supportsSchemasInPrivilegeDefinitions()odbc::DatabaseMetaData
    supportsSchemasInProcedureCalls()odbc::DatabaseMetaData
    supportsSchemasInTableDefinitions()odbc::DatabaseMetaData
    supportsSelectForUpdate()odbc::DatabaseMetaData
    supportsStoredProcedures()odbc::DatabaseMetaData
    supportsSubqueriesInComparisons()odbc::DatabaseMetaData
    supportsSubqueriesInExists()odbc::DatabaseMetaData
    supportsSubqueriesInIns()odbc::DatabaseMetaData
    supportsSubqueriesInQuantifieds()odbc::DatabaseMetaData
    supportsTransactionIsolationLevel(int lev)odbc::DatabaseMetaData
    supportsTransactions()odbc::DatabaseMetaData
    supportsUnion()odbc::DatabaseMetaData
    supportsUnionAll()odbc::DatabaseMetaData
    typePredBasic enum valueodbc::DatabaseMetaData
    typePredChar enum valueodbc::DatabaseMetaData
    typePredNone enum valueodbc::DatabaseMetaData
    typeSearchable enum valueodbc::DatabaseMetaData
    updatesAreDetected(int type)odbc::DatabaseMetaData
    usesLocalFilePerTable()odbc::DatabaseMetaData
    usesLocalFiles()odbc::DatabaseMetaData
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    allProceduresAreCallable()odbc::DatabaseMetaData
    allTablesAreSelectable()odbc::DatabaseMetaData
    dataDefinitionCausesTransactionCommit()odbc::DatabaseMetaData
    dataDefinitionIgnoredInTransactions()odbc::DatabaseMetaData
    deletesAreDetected(int type)odbc::DatabaseMetaData
    doesMaxRowSizeIncludeBlobs()odbc::DatabaseMetaData
    getBestRowIdentifier(const std::string &catalog, const std::string &schema, const std::string &table, int scope, bool nullable)odbc::DatabaseMetaData
    getCatalogs()odbc::DatabaseMetaData
    getCatalogSeparator()odbc::DatabaseMetaData
    getCatalogTerm()odbc::DatabaseMetaData
    getColumnPrivileges(const std::string &catalog, const std::string &schema, const std::string &table, const std::string &columnNamePattern)odbc::DatabaseMetaData
    getColumns(const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::string &columnNamePattern)odbc::DatabaseMetaData
    getConnection()odbc::DatabaseMetaData
    getCrossReference(const std::string &primaryCatalog, const std::string &primarySchema, const std::string &primaryTable, const std::string &foreignCatalog, const std::string &foreignSchema, const std::string &foreignTable)odbc::DatabaseMetaData
    getDatabaseProductName()odbc::DatabaseMetaData
    getDatabaseProductVersion()odbc::DatabaseMetaData
    getDefaultTransactionIsolation()odbc::DatabaseMetaData
    getDriverMajorVersion()odbc::DatabaseMetaData
    getDriverMinorVersion()odbc::DatabaseMetaData
    getDriverName()odbc::DatabaseMetaData
    getDriverVersion()odbc::DatabaseMetaData
    getExportedKeys(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    getExtraNameCharacters()odbc::DatabaseMetaData
    getIdentifierQuoteString()odbc::DatabaseMetaData
    getImportedKeys(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    getIndexInfo(const std::string &catalog, const std::string &schema, const std::string &table, bool unique, bool approximate)odbc::DatabaseMetaData
    getMaxBinaryLiteralLength()odbc::DatabaseMetaData
    getMaxCatalogNameLength()odbc::DatabaseMetaData
    getMaxCharLiteralLength()odbc::DatabaseMetaData
    getMaxColumnNameLength()odbc::DatabaseMetaData
    getMaxColumnsInGroupBy()odbc::DatabaseMetaData
    getMaxColumnsInIndex()odbc::DatabaseMetaData
    getMaxColumnsInOrderBy()odbc::DatabaseMetaData
    getMaxColumnsInSelect()odbc::DatabaseMetaData
    getMaxColumnsInTable()odbc::DatabaseMetaData
    getMaxConnections()odbc::DatabaseMetaData
    getMaxCursorNameLength()odbc::DatabaseMetaData
    getMaxIndexLength()odbc::DatabaseMetaData
    getMaxProcedureNameLength()odbc::DatabaseMetaData
    getMaxRowSize()odbc::DatabaseMetaData
    getMaxSchemaNameLength()odbc::DatabaseMetaData
    getMaxStatementLength()odbc::DatabaseMetaData
    getMaxStatements()odbc::DatabaseMetaData
    getMaxTableNameLength()odbc::DatabaseMetaData
    getMaxTablesInSelect()odbc::DatabaseMetaData
    getMaxUserNameLength()odbc::DatabaseMetaData
    getNumericFunctions()odbc::DatabaseMetaData
    getPrimaryKeys(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    getProcedureColumns(const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern, const std::string &columnNamePattern)odbc::DatabaseMetaData
    getProcedures(const std::string &catalog, const std::string &schemaPattern, const std::string &procedureNamePattern)odbc::DatabaseMetaData
    getProcedureTerm()odbc::DatabaseMetaData
    getSchemas()odbc::DatabaseMetaData
    getSchemaTerm()odbc::DatabaseMetaData
    getSearchStringEscape()odbc::DatabaseMetaData
    getSQLKeywords()odbc::DatabaseMetaData
    getStringFunctions()odbc::DatabaseMetaData
    getSystemFunctions()odbc::DatabaseMetaData
    getTablePrivileges(const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern)odbc::DatabaseMetaData
    getTables(const std::string &catalog, const std::string &schemaPattern, const std::string &tableNamePattern, const std::vector< std::string > &types)odbc::DatabaseMetaData
    getTableTerm()odbc::DatabaseMetaData
    getTableTypes()odbc::DatabaseMetaData
    getTimeDateFunctions()odbc::DatabaseMetaData
    getTypeInfo()odbc::DatabaseMetaData
    getUserName()odbc::DatabaseMetaData
    getVersionColumns(const std::string &catalog, const std::string &schema, const std::string &table)odbc::DatabaseMetaData
    insertsAreDetected(int type)odbc::DatabaseMetaData
    isCatalogAtStart()odbc::DatabaseMetaData
    isReadOnly()odbc::DatabaseMetaData
    nullPlusNonNullIsNull()odbc::DatabaseMetaData
    nullsAreSortedAtEnd()odbc::DatabaseMetaData
    nullsAreSortedAtStart()odbc::DatabaseMetaData
    nullsAreSortedHigh()odbc::DatabaseMetaData
    nullsAreSortedLow()odbc::DatabaseMetaData
    othersDeletesAreVisible(int type)odbc::DatabaseMetaData
    othersInsertsAreVisible(int type)odbc::DatabaseMetaData
    othersUpdatesAreVisible(int type)odbc::DatabaseMetaData
    ownDeletesAreVisible(int type)odbc::DatabaseMetaData
    ownInsertsAreVisible(int type)odbc::DatabaseMetaData
    ownUpdatesAreVisible(int type)odbc::DatabaseMetaData
    storesLowerCaseIdentifiers()odbc::DatabaseMetaData
    storesLowerCaseQuotedIdentifiers()odbc::DatabaseMetaData
    storesMixedCaseIdentifiers()odbc::DatabaseMetaData
    storesMixedCaseQuotedIdentifiers()odbc::DatabaseMetaData
    storesUpperCaseIdentifiers()odbc::DatabaseMetaData
    storesUpperCaseQuotedIdentifiers()odbc::DatabaseMetaData
    supportsAlterTableWithAddColumn()odbc::DatabaseMetaData
    supportsAlterTableWithDropColumn()odbc::DatabaseMetaData
    supportsANSI92EntryLevelSQL()odbc::DatabaseMetaData
    supportsANSI92FullSQL()odbc::DatabaseMetaData
    supportsANSI92IntermediateSQL()odbc::DatabaseMetaData
    supportsBatchUpdates()odbc::DatabaseMetaData
    supportsCatalogsInDataManipulation()odbc::DatabaseMetaData
    supportsCatalogsInIndexDefinitions()odbc::DatabaseMetaData
    supportsCatalogsInPrivilegeDefinitions()odbc::DatabaseMetaData
    supportsCatalogsInProcedureCalls()odbc::DatabaseMetaData
    supportsCatalogsInTableDefinitions()odbc::DatabaseMetaData
    supportsColumnAliasing()odbc::DatabaseMetaData
    supportsConvert()odbc::DatabaseMetaData
    supportsConvert(int fromType, int toType)odbc::DatabaseMetaData
    supportsCoreSQLGrammar()odbc::DatabaseMetaData
    supportsCorrelatedSubqueries()odbc::DatabaseMetaData
    supportsDataDefinitionAndDataManipulationTransactions()odbc::DatabaseMetaData
    supportsDataManipulationTransactionsOnly()odbc::DatabaseMetaData
    supportsExtendedSQLGrammar()odbc::DatabaseMetaData
    supportsFullOuterJoins()odbc::DatabaseMetaData
    supportsGroupBy()odbc::DatabaseMetaData
    supportsGroupByBeyondSelect()odbc::DatabaseMetaData
    supportsGroupByUnrelated()odbc::DatabaseMetaData
    supportsIntegrityEnhancementFacility()odbc::DatabaseMetaData
    supportsLikeEscapeClause()odbc::DatabaseMetaData
    supportsLimitedOuterJoins()odbc::DatabaseMetaData
    supportsMinimumSQLGrammar()odbc::DatabaseMetaData
    supportsMixedCaseIdentifiers()odbc::DatabaseMetaData
    supportsMixedCaseQuotedIdentifiers()odbc::DatabaseMetaData
    supportsMultipleResultSets()odbc::DatabaseMetaData
    supportsMultipleTransactions()odbc::DatabaseMetaData
    supportsNonNullableColumns()odbc::DatabaseMetaData
    supportsOpenCursorsAcrossCommit()odbc::DatabaseMetaData
    supportsOpenCursorsAcrossRollback()odbc::DatabaseMetaData
    supportsOpenStatementsAcrossCommit()odbc::DatabaseMetaData
    supportsOpenStatementsAcrossRollback()odbc::DatabaseMetaData
    supportsOuterJoins()odbc::DatabaseMetaData
    supportsPositionedDelete()odbc::DatabaseMetaData
    supportsPositionedUpdate()odbc::DatabaseMetaData
    supportsResultSetConcurrency(int type, int concurrency)odbc::DatabaseMetaData
    supportsResultSetType(int type)odbc::DatabaseMetaData
    supportsSchemasInDataManipulation()odbc::DatabaseMetaData
    supportsSchemasInIndexDefinitions()odbc::DatabaseMetaData
    supportsSchemasInPrivilegeDefinitions()odbc::DatabaseMetaData
    supportsSchemasInProcedureCalls()odbc::DatabaseMetaData
    supportsSchemasInTableDefinitions()odbc::DatabaseMetaData
    supportsSelectForUpdate()odbc::DatabaseMetaData
    supportsStoredProcedures()odbc::DatabaseMetaData
    supportsSubqueriesInComparisons()odbc::DatabaseMetaData
    supportsSubqueriesInExists()odbc::DatabaseMetaData
    supportsSubqueriesInIns()odbc::DatabaseMetaData
    supportsSubqueriesInQuantifieds()odbc::DatabaseMetaData
    supportsTransactionIsolationLevel(int lev)odbc::DatabaseMetaData
    supportsTransactions()odbc::DatabaseMetaData
    supportsUnion()odbc::DatabaseMetaData
    supportsUnionAll()odbc::DatabaseMetaData
    typePredBasic enum valueodbc::DatabaseMetaData
    typePredChar enum valueodbc::DatabaseMetaData
    typePredNone enum valueodbc::DatabaseMetaData
    typeSearchable enum valueodbc::DatabaseMetaData
    updatesAreDetected(int type)odbc::DatabaseMetaData
    usesLocalFilePerTable()odbc::DatabaseMetaData
    usesLocalFiles()odbc::DatabaseMetaData

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_data_source.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_data_source.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_data_source.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_data_source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,32 +1,31 @@ +- ++ + +-odbc::DataSource class Reference ++libodbc++: odbc::DataSource Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DataSource Class Reference

    A Data Source. ++ ++ ++

    odbc::DataSource Class Reference

    A Data Source. + More... +

    + #include <drivermanager.h> +

    +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +-
    • ++
    • + DataSource (const std::string &name, const std::string &description) +-
      Constructor.

    • ++
      Constructor.
    • + virtual ~DataSource () +-
      Destructor.

    • ++
      Destructor.
    • + const std::string & getName () const +-
      Return the name of the data source.

    • ++
      Return the name of the data source.
    • + const std::string & getDescription () const +-
      Return the description (if any) of the datasource.

    ++
    Return the description (if any) of the datasource.
    +

    Detailed Description

    +-A Data Source. ++A Data Source. +

    +


    The documentation for this class was generated from the following file: ++
  • odbc++/drivermanager.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_data_source-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_data_source-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_data_source-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_data_source-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,16 +1,15 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DataSource Member List

    This is the complete list of members for odbc::DataSource, including all inherited members. +- +- +- +- ++ ++ ++

    odbc::DataSource Member List

    This is the complete list of members for odbc::DataSource, including all inherited members.

    DataSource(const std::string &name, const std::string &description)odbc::DataSource
    getDescription() constodbc::DataSource
    getName() constodbc::DataSource
    ~DataSource()odbc::DataSource [virtual]
    ++ ++ ++ ++ +
    DataSource(const std::string &name, const std::string &description)odbc::DataSource
    getDescription() constodbc::DataSource
    getName() constodbc::DataSource
    ~DataSource()odbc::DataSource [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_date.gif libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date.gif +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_date.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3 +0,0 @@ +-GIF89ahP`!,hP0I8ͻ`(Bhɾp|rmsQ0YڎÜIB"®3,uԖ4p5ȹP{?Z^c^,{"}uyvx1E~]wjl=NSIV}DYo?F2J=vk?!pk Lc!(1Ŋ'.bqc? a$ &OfHK/Oƌ1͛8sS@ +-)ѣH*]ʴӧP֌JիXNʵW[+6,ٳhh[:wYoE] +-+Ulp㼁 mKXqd'3̙ω. ZtӠ)ShfӚ[W~ٞaoߨ 1iގmNMkg|skƆ9᧽WNwѿ^|9=\Z1k h ]Mw])V9OIHJY ("N ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_date.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_date.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,72 +1,70 @@ +- ++ + +-odbc::Date class Reference ++libodbc++: odbc::Date Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Date Class Reference

    An SQL DATE. ++ ++ ++

    odbc::Date Class Reference

    An SQL DATE. + More... +

    + #include <types.h> +

    +

    Inheritance diagram for odbc::Date: +-

    ++

    + + odbc::Timestamp + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +-
    • ++
    • + Date (int year, int month, int day) +-
      Constructor.

    • Date () +-
      Constructor. More...

    • Date (std::time_t t) +-
      Constructor. More...

    • Date (const std::string &str) +-
      Constructor. More...

    • +-Date (const Date &d) +-
      Copy constructor.

    • +-Date & operator= (const Date &d) +-
      Assignment operator.

    • ++
      Constructor.
    • Date () ++
      Constructor.
    • Date (std::time_t t) ++
      Constructor.
    • Date (const std::string &str) ++
      Constructor.
    • ++Date (const Date &d) ++
      Copy constructor.
    • ++Date & operator= (const Date &d) ++
      Assignment operator.
    • + virtual ~Date () +-
      Destructor.

    • ++
      Destructor.
    • + virtual void setTime (std::time_t t) +-
      Sets this date to the specified time_t value.

    • ++
      Sets this date to the specified time_t value.
    • + std::time_t getTime () const +-
      Returns the time_t value of 00:00:00 at this date.

    • ++
      Returns the time_t value of 00:00:00 at this date.
    • + void parse (const std::string &str) +-
      Sets this date from a string in the YYYY-MM-DD format.

    • ++
      Sets this date from a string in the YYYY-MM-DD format.
    • + int getYear () const +-
      Gets the year of this date.

    • ++
      Gets the year of this date.
    • + int getMonth () const +-
      Gets the month of this date.

    • ++
      Gets the month of this date.
    • + int getDay () const +-
      Gets the monthday of this date.

    • ++
      Gets the monthday of this date.
    • + void setYear (int year) +-
      Sets the year of this date.

    • ++
      Sets the year of this date.
    • + void setMonth (int month) +-
      Sets the month of this date.

    • ++
      Sets the month of this date.
    • + void setDay (int day) +-
      Sets the day of this date.

    • ++
      Sets the day of this date.
    • + virtual std::string toString () const +-
      Gets the date as a string in the YYYY-MM-DD format.

    ++
    Gets the date as a string in the YYYY-MM-DD format.
    +

    Detailed Description

    +-An SQL DATE. ++An SQL DATE. +

    +


    Constructor & Destructor Documentation

    +-

    +- ++

    ++

    + +- + +@@ -79,25 +77,24 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    odbc::Date::Date odbc::Date::Date    )  [explicit]
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets this date to today.

    +-

    +- ++

    ++

    + +- + +@@ -110,25 +107,24 @@ + + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    odbc::Date::Date odbc::Date::Date std::time_t   t t  ) 
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets this date to the specified time_t value.

    +-

    +- ++

    ++

    + +- + +@@ -141,13 +137,13 @@ + + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    odbc::Date::Date odbc::Date::Date const std::string &   str str  ) 
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets this date to the specified string in the YYYY-MM-DD format.

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_date-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_date-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,29 +1,28 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Date Member List

    This is the complete list of members for odbc::Date, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::Date Member List

    This is the complete list of members for odbc::Date, including all inherited members.

    Date(int year, int month, int day)odbc::Date
    Date()odbc::Date [explicit]
    Date(std::time_t t)odbc::Date
    Date(const std::string &str)odbc::Date
    Date(const Date &d)odbc::Date
    getDay() constodbc::Date
    getMonth() constodbc::Date
    getTime() constodbc::Date
    getYear() constodbc::Date
    operator=(const Date &d)odbc::Date
    parse(const std::string &str)odbc::Date
    setDay(int day)odbc::Date
    setMonth(int month)odbc::Date
    setTime(std::time_t t)odbc::Date [virtual]
    setYear(int year)odbc::Date
    toString() constodbc::Date [virtual]
    ~Date()odbc::Date [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    Date(int year, int month, int day)odbc::Date
    Date()odbc::Date [explicit]
    Date(std::time_t t)odbc::Date
    Date(const std::string &str)odbc::Date
    Date(const Date &d)odbc::Date
    getDay() constodbc::Date
    getMonth() constodbc::Date
    getTime() constodbc::Date
    getYear() constodbc::Date
    operator=(const Date &d)odbc::Date
    parse(const std::string &str)odbc::Date
    setDay(int day)odbc::Date
    setMonth(int month)odbc::Date
    setTime(std::time_t t)odbc::Date [virtual]
    setYear(int year)odbc::Date
    toString() constodbc::Date [virtual]
    ~Date()odbc::Date [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_date.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_date.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_date.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,4 @@ ++PNG ++ ++ IHDRhP-RPLTE`{tRNS@fIDATx] ˞iov!%k@8Jڏ3x5Y,v@F˫Zá9$Y iY@:hoߝzw'{DY֠/@>aeg8NSA jP. ++=*VW}I3Cˮ,s0vq5F1a/r$z"z&č'f/+»s+ $INMxzIpvPCpRhr ׅʟc_l;IENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_driver.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_driver.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,32 +1,31 @@ +- ++ + +-odbc::Driver class Reference ++libodbc++: odbc::Driver Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Driver Class Reference

    An ODBC Driver with it's information. ++ ++ ++

    odbc::Driver Class Reference

    An ODBC Driver with it's information. + More... +

    + #include <drivermanager.h> +

    +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +-
    • ++
    • + Driver (const std::string &description, const std::vector< std::string > &attributes) +-
      Constructor.

    • ++
      Constructor.
    • + virtual ~Driver () +-
      Destructor.

    • ++
      Destructor.
    • + const std::string & getDescription () const +-
      Return a description of the driver.

    • ++
      Return a description of the driver.
    • + const std::vector< std::string > & getAttributes () const +-
      Return a list of keys that can appear in a connect string using this driver.

    ++
    Return a list of keys that can appear in a connect string using this driver.
    +

    Detailed Description

    +-An ODBC Driver with it's information. ++An ODBC Driver with it's information. +

    +


    The documentation for this class was generated from the following file: ++
  • odbc++/drivermanager.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_manager.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_manager.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_manager.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_manager.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,48 +1,46 @@ +- ++ + +-odbc::DriverManager class Reference ++libodbc++: odbc::DriverManager Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DriverManager Class Reference

    The DriverManager. ++ ++ ++

    odbc::DriverManager Class Reference

    The DriverManager. + More... +

    + #include <drivermanager.h> +

    +-List of all members.

    Static Public Methods

    ++List of all members.

    Static Public Member Functions

    + ++
  • ++Connection * getConnection (const std::string &dsn, const std::string &user, const std::string &password) ++
    Opens a connection by it's DSN, a username and a password.
  • Connection * getConnection (const std::string &connectString) ++
    Opens a connection using an ODBC connect string.
  • int getLoginTimeout () ++
    Gets the current login timeout in seconds.
  • void setLoginTimeout (int seconds) ++
    Sets the login timeout in seconds.
  • ++DataSourceList * getDataSources () ++
    Fetch a list of all available data sources.
  • ++DriverList * getDrivers () ++
    Fetch a list of the available drivers.
  • ++void shutdown () ++
    Should be called before an application is to exit and after all connections have been closed.
    +

    Detailed Description

    +-The DriverManager. ++The DriverManager. +

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -55,30 +53,28 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Connection* odbc::DriverManager::getConnection Connection* odbc::DriverManager::getConnection const std::string &   connectString connectString  )  [static]
    +
    + +

    +-Opens a connection using an ODBC connect string. ++Opens a connection using an ODBC connect string. +

    +-

    +-Parameters:
    +- +- +-
    connectString  +-Usually something like "DSN=db;uid=user;pwd=password"
    +-
    ++ ++
    connectString Usually something like "DSN=db;uid=user;pwd=password"
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -91,27 +87,25 @@ + ++
    Returns:
    The current login timeout in seconds, or 0 if disabled.
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    int odbc::DriverManager::getLoginTimeout int odbc::DriverManager::getLoginTimeout    )  [static]
    +
    + +

    +-Gets the current login timeout in seconds. ++Gets the current login timeout in seconds. +

    +-

    +-Returns:
    +-The current login timeout in seconds, or 0 if disabled.
    +-

    +- ++

    ++

    + +- + +@@ -124,19 +118,18 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    void odbc::DriverManager::setLoginTimeout void odbc::DriverManager::setLoginTimeout int   seconds seconds  )  [static]
    +
    + +

    +-Sets the login timeout in seconds. ++Sets the login timeout in seconds. +

    +-

    +-Parameters:
    +- +- +-
    seconds  +-The number of seconds to wait for a connection to open. Set to 0 to disable.
    +-
    ++ ++
    seconds The number of seconds to wait for a connection to open. Set to 0 to disable.
    ++ ++ + + +


    The documentation for this class was generated from the following file: ++
  • odbc++/drivermanager.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_manager-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_manager-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_manager-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_manager-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,19 +1,18 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DriverManager Member List

    This is the complete list of members for odbc::DriverManager, including all inherited members. +- +- +- +- +- +- +- ++ ++ ++

    odbc::DriverManager Member List

    This is the complete list of members for odbc::DriverManager, including all inherited members.

    getConnection(const std::string &dsn, const std::string &user, const std::string &password)odbc::DriverManager [static]
    getConnection(const std::string &connectString)odbc::DriverManager [static]
    getDataSources()odbc::DriverManager [static]
    getDrivers()odbc::DriverManager [static]
    getLoginTimeout()odbc::DriverManager [static]
    setLoginTimeout(int seconds)odbc::DriverManager [static]
    shutdown()odbc::DriverManager [static]
    ++ ++ ++ ++ ++ ++ ++ +
    getConnection(const std::string &dsn, const std::string &user, const std::string &password)odbc::DriverManager [static]
    getConnection(const std::string &connectString)odbc::DriverManager [static]
    getDataSources()odbc::DriverManager [static]
    getDrivers()odbc::DriverManager [static]
    getLoginTimeout()odbc::DriverManager [static]
    setLoginTimeout(int seconds)odbc::DriverManager [static]
    shutdown()odbc::DriverManager [static]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_driver-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_driver-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,16 +1,15 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Driver Member List

    This is the complete list of members for odbc::Driver, including all inherited members. +- +- +- +- ++ ++ ++

    odbc::Driver Member List

    This is the complete list of members for odbc::Driver, including all inherited members.

    Driver(const std::string &description, const std::vector< std::string > &attributes)odbc::Driver
    getAttributes() constodbc::Driver
    getDescription() constodbc::Driver
    ~Driver()odbc::Driver [virtual]
    ++ ++ ++ ++ +
    Driver(const std::string &description, const std::vector< std::string > &attributes)odbc::Driver
    getAttributes() constodbc::Driver
    getDescription() constodbc::Driver
    ~Driver()odbc::Driver [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_message.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_message.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_message.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_message.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,21 +1,20 @@ +- ++ + +-odbc::DriverMessage class Reference ++libodbc++: odbc::DriverMessage Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DriverMessage Class Reference

    Used internally - represents the result of an SQLError call. ++ ++ ++

    odbc::DriverMessage Class Reference

    Used internally - represents the result of an SQLError call. + More... +

    + #include <types.h> +

    + List of all members.


    Detailed Description

    +-Used internally - represents the result of an SQLError call. ++Used internally - represents the result of an SQLError call. +

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_message-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_message-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_driver_message-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_driver_message-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,12 +1,11 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::DriverMessage Member List

    This is the complete list of members for odbc::DriverMessage, including all inherited members. ++ ++ ++

    odbc::DriverMessage Member List

    This is the complete list of members for odbc::DriverMessage, including all inherited members.

    +

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_error_handler.gif libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_error_handler.gif +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_error_handler.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_error_handler.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,13 +0,0 @@ +-GIF89a`!,0I8`(dihZp,tm߸|pH,L0l*ШtJ-5z-x\贺a^'|N7e{g>zu@=O < +-;qmy [K~ǥɺ҄ͽւ|Ǽݪ0M{֤- +- t.kѳg rH"v1{OBR dA(SOc+SVCgB"3@@:'ѣ)"=ӡODT)UW +-uCׯ:l:f][ mZlFYAݻx˷ ~ xÖ (F̸1ŅK bʘ3OYG:MҨS8 +-_˞ 6ۭmMZ7ߚ}.Y8㇍#G̹УKNسkν৫Vޛ7yAZ~f ?__6V cƕ`rۂA58a藆`qȗrlThe0(4h8戣:@(ADi$<7P& J +-`Xf\v`)d9elgF0tilˆ|g砄 +-&j袌gFj'(*饘IifZ> +-ꨣn@* ꫋ +-묆'ʧ`kz(6j+x쯼B:mw{'~n[nj-X+~;In^Ɂl[[0'+,p3<1j,'lRk(C1?} S-_l2;9p)#k톋Rk5]tmv,/_[ـ'w}Ԧ˃iTt~=/MsW߅O2{}w+}z⪃{؝۹;L98μtޛKumJoYokxtv+>~~~v.cN =("zFL▀&fN"D(RDbE!Z^"{1f<Ә2Vh|#(W#H=~$ ASTJ"H9${IZ\&Mz2 (Q2D9*™U+|,Y2 .+^% fIL M2c2gR,~qd@7^s ?; ++ + +-odbc::ErrorHandler class Reference ++libodbc++: odbc::ErrorHandler Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::ErrorHandler Class Reference

    Base class for everything that might contain warnings. ++ ++ ++

    odbc::ErrorHandler Class Reference

    Base class for everything that might contain warnings. + More... +

    + #include <errorhandler.h> +

    +

    Inheritance diagram for odbc::ErrorHandler: +-

    ++

    + + odbc::Connection + odbc::ResultSet +@@ -20,36 +19,35 @@ + odbc::PreparedStatement + odbc::CallableStatement + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +-
    • ++
    • + void clearWarnings () +-
      Clears all the warnings stored in this object.

    • WarningList * getWarnings () +-
      Fetches all the warnings in this object. More...

    • ++
      Clears all the warnings stored in this object.
    • WarningList * getWarnings () ++
      Fetches all the warnings in this object.
    • + virtual ~ErrorHandler () +-
      Destructor.

    +-

    Protected Methods

    ++
    Destructor.
    ++

    Protected Member Functions

    +
      +-
    • ++
    • + ErrorHandler (bool collectWarnings=true) +-
      Constructor.

    ++
    Constructor.
    +

    Detailed Description

    +-Base class for everything that might contain warnings. ++Base class for everything that might contain warnings. +

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -62,13 +60,13 @@ + ++The caller is responsive for deleteing the returned object. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    WarningList* odbc::ErrorHandler::getWarnings WarningList* odbc::ErrorHandler::getWarnings    ) 
    +
    + +

    +-Fetches all the warnings in this object. ++Fetches all the warnings in this object. +

    +-The caller is responsive for deleteing the returned object.

    +


    The documentation for this class was generated from the following file: ++
  • odbc++/errorhandler.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_error_handler-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_error_handler-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_error_handler-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_error_handler-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,16 +1,15 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::ErrorHandler Member List

    This is the complete list of members for odbc::ErrorHandler, including all inherited members. +- +- +- +- ++ ++ ++

    odbc::ErrorHandler Member List

    This is the complete list of members for odbc::ErrorHandler, including all inherited members.

    clearWarnings()odbc::ErrorHandler
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    getWarnings()odbc::ErrorHandler
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ++ ++ ++ ++ +
    clearWarnings()odbc::ErrorHandler
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    getWarnings()odbc::ErrorHandler
    ~ErrorHandler()odbc::ErrorHandler [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_error_handler.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_error_handler.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_error_handler.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_error_handler.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,9 @@ ++PNG ++ ++ IHDRtPLTE`{tRNS@fXIDATx}n<AԿo`ծgz#=6N136S) TiFt]izU.ep%.C+u}7/--۫U#/JTVM=v  ++5C=tjY*}쏝~~Hתp'{\;}wjUˡ7ZH֪wn XX^NjqyީU-V%.C+u"\IJj]>;5%i…6|mA=?Q%Q/G1yAuz[^P6OxS߇{ƟaFuCO#'9D4Ǵ1mmwb>54_ ?nwj;5@ pPwj;5@ pPwj;5@ p(G޿hʨanlHw'N3u~bcr+׉Պpɵfv03bL쩰e:ާQϭ&z1A 4'q*M e[$8M ++*M^ ++7{JzD::J}Go /MC{pLDR=gK5 cQ&u<1x~k~comTs2%Pyto,0 {'e)c$hȣ1b{nЫ׆Ѯt}v|ߺ趢q̓3G:. ("  "\O!ÇFBC"ŋ84hǏIɓ(S\˗0cʜIM.oɳϔJђAs]ʴˤBJRXך\ ٳHѪ5v[mew]uw_+pKÈgNƈC.,yrʖbάw3g? --jO>z5֮F ۸5b܍"+|nB8!#_Ag*̸ֽ|Ţ/c i7KeUƨN3yizaLW)H}N"gJ;W5 +-v片d ̗a-!}*^9A^}\Gz%M{"2#@#($[F^d-CN>PRەXfygU^bTIfPUjj_`Ikٙwʼn'^{Υg> (_VZjSh2= +-)LNRWnzRV*R:z)*무j뭸뮵RlR KlST/ 42&a;r޲mNK(>, ;n En +-lԢ0BpB7|v+"_p!7)Ir&*[3$O s'{ L4Gc,s*Om3L,I7L>3s6=SU5htmkuSp+DLxwHKkjI^hY.yjMNꬷeFU|NlN_#7~;CQcr?ߨ?ߧ{v/?`@3PT@(@8 {O@':A3 p0NvÍ MD}2B)t#.tcaAT"?#,) #JxP"x}ȇ@J|)"$ Aq=)R(A)yPod#0CT +-,"h[4!,a<1ґxFV$!(pi (Q~ǔ)%*{J䨲B%,!ҿZڒ ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_prepared_statement.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_prepared_statement.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_prepared_statement.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_prepared_statement.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,78 +1,74 @@ +- ++ + +-odbc::PreparedStatement class Reference ++libodbc++: odbc::PreparedStatement Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::PreparedStatement Class Reference

    A prepared statement. ++ ++ ++

    odbc::PreparedStatement Class Reference

    A prepared statement. + More... +

    + #include <preparedstatement.h> +

    +

    Inheritance diagram for odbc::PreparedStatement: +-

    ++

    + + odbc::Statement + odbc::ErrorHandler + odbc::CallableStatement + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    + ++
    Executes this statement, assuming it returns an update count.
  • void setDouble (int idx, double val) ++
    Sets a parameter value to a double.
  • void setBoolean (int idx, bool val) ++
    Sets a parameter value to a bool.
  • void setByte (int idx, signed char val) ++
    Sets a parameter value to signed char.
  • void setBytes (int idx, const Bytes &val) ++
    Sets a parameter value to a chunk of bytes.
  • void setDate (int idx, const Date &val) ++
    Sets a parameter value to a Date.
  • void setFloat (int idx, float val) ++
    Sets a parameter value to a float.
  • void setInt (int idx, int val) ++
    Sets a parameter value to an int.
  • void setLong (int idx, Long val) ++
    Sets a parameter value to a Long.
  • void setShort (int idx, short val) ++
    Sets a parameter value to a short.
  • void setString (int idx, const std::string &val) ++
    Sets a parameter value to a string.
  • void setTime (int idx, const Time &val) ++
    Sets a parameter value to a Time.
  • void setTimestamp (int idx, const Timestamp &val) ++
    Sets a parameter value to a Timestamp.
  • void setAsciiStream (int idx, std::istream *s, int len) ++
    Sets a parameter value to an ascii stream.
  • void setBinaryStream (int idx, std::istream *s, int len) ++
    Sets a parameter value to a binary stream.
  • void setNull (int idx, int sqlType) ++
    Sets a parameter value to NULL.
    +

    Detailed Description

    +-A prepared statement. ++A prepared statement. +

    +-A prepared statement is precompiled by the driver and/or datasource, and can be executed multiple times with different parameters. +-

    +-Parameters are set using the setXXX methods. Note that it's advisable to use the set method compatible with the parameter's SQL type - for example, for a Types::DATE, setDate() should be used. Question marks ("?") are used in the SQL statement to represent a parameter, for example:

    +- PreparedStatement* pstmt=con->prepareStatement
    ++A prepared statement is precompiled by the driver and/or datasource, and can be executed multiple times with different parameters.

    ++Parameters are set using the setXXX methods. Note that it's advisable to use the set method compatible with the parameter's SQL type - for example, for a Types::DATE, setDate() should be used. Question marks ("?") are used in the SQL statement to represent a parameter, for example:

    ++ PreparedStatement* pstmt=con->prepareStatement
    +     ("INSERT INTO SOMETABLE(AN_INTEGER_COL,A_VARCHAR_COL) VALUES(?,?)");
    +  pstmt->setInt(1,10);
    +  pstmt->setString(2,"Hello, world!");
    +- int affectedRows=pstmt->executeUpdate();
    +- 
    +-See also:
    +-Connection::prepareStatement()
    ++ int affectedRows=pstmt->executeUpdate(); ++
    See also:
    Connection::prepareStatement()
    ++ +

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -85,24 +81,23 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    void odbc::PreparedStatement::clearParameters void odbc::PreparedStatement::clearParameters    ) 
    +
    + +

    +-Clears the parameters. ++Clears the parameters. +

    + The set of parameters stays around until they are set again. To explicitly clear them (and thus release buffers held by the driver), this method should be called.

    +-

    +- ++

    ++

    + +- + +@@ -115,42 +110,40 @@ + ++
    Returns:
    True if the result is a ResultSet, false if it's an update count or unknown.
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::PreparedStatement::execute bool odbc::PreparedStatement::execute    ) 
    +
    + +

    +-Executes this statement. ++Executes this statement. +

    +-

    +-Returns:
    +-True if the result is a ResultSet, false if it's an update count or unknown.
    +-

    +- ++

    ++

    + +- + +@@ -163,50 +156,46 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setAsciiStream void odbc::PreparedStatement::setAsciiStream int   idx, idx,
    std::istream *   s, s,
    int   len len
    +
    + +

    +-Sets a parameter value to an ascii stream. ++Sets a parameter value to an ascii stream. +

    +-

    +-Parameters:
    +- +- +- +- +-
    idx  +-The parameter index, starting at 1
    s  +-The stream to assign
    len  +-The number of bytes available in the stream
    +-
    ++ ++ ++ ++
    idx The parameter index, starting at 1
    s The stream to assign
    len The number of bytes available in the stream
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -219,44 +208,40 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setBinaryStream void odbc::PreparedStatement::setBinaryStream int   idx, idx,
    std::istream *   s, s,
    int   len len
    +
    + +

    +-Sets a parameter value to a binary stream. ++Sets a parameter value to a binary stream. +

    +-

    +-Parameters:
    +- +- +- +- +-
    idx  +-The parameter index, starting at 1
    s  +-The stream to assign
    len  +-The number of bytes available in the stream
    +-
    ++ ++ ++ ++
    idx The parameter index, starting at 1
    s The stream to assign
    len The number of bytes available in the stream
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -269,42 +254,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setBoolean void odbc::PreparedStatement::setBoolean int   idx, idx,
    bool   val val
    +
    + +

    +-Sets a parameter value to a bool. ++Sets a parameter value to a bool. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -317,42 +299,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setByte void odbc::PreparedStatement::setByte int   idx, idx,
    signed char   val val
    +
    + +

    +-Sets a parameter value to signed char. ++Sets a parameter value to signed char. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -365,42 +344,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setBytes void odbc::PreparedStatement::setBytes int   idx, idx,
    const Bytes  val val
    +
    + +

    +-Sets a parameter value to a chunk of bytes. ++Sets a parameter value to a chunk of bytes. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -413,42 +389,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setDate void odbc::PreparedStatement::setDate int   idx, idx,
    const Date  val val
    +
    + +

    +-Sets a parameter value to a Date. ++Sets a parameter value to a Date. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -461,42 +434,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setDouble void odbc::PreparedStatement::setDouble int   idx, idx,
    double   val val
    +
    + +

    +-Sets a parameter value to a double. ++Sets a parameter value to a double. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -509,42 +479,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setFloat void odbc::PreparedStatement::setFloat int   idx, idx,
    float   val val
    +
    + +

    +-Sets a parameter value to a float. ++Sets a parameter value to a float. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -557,42 +524,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setInt void odbc::PreparedStatement::setInt int   idx, idx,
    int   val val
    +
    + +

    +-Sets a parameter value to an int. ++Sets a parameter value to an int. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -605,42 +569,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setLong void odbc::PreparedStatement::setLong int   idx, idx,
    Long   val val
    +
    + +

    +-Sets a parameter value to a Long. ++Sets a parameter value to a Long. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -653,44 +614,40 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setNull void odbc::PreparedStatement::setNull int   idx, idx,
    int   sqlType sqlType
    +
    + +

    +-Sets a parameter value to NULL. ++Sets a parameter value to NULL. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    sqlType  +-The SQL type of the parameter
    +-
    +-See also:
    +-Types
    ++ ++ ++
    idx The parameter index, starting at 1
    sqlType The SQL type of the parameter
    ++ ++

    See also:
    Types
    ++ + + +-

    +- ++

    ++

    + +- + +@@ -703,42 +660,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setShort void odbc::PreparedStatement::setShort int   idx, idx,
    short   val val
    +
    + +

    +-Sets a parameter value to a short. ++Sets a parameter value to a short. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -751,42 +705,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setString void odbc::PreparedStatement::setString int   idx, idx,
    const std::string &   val val
    +
    + +

    +-Sets a parameter value to a string. ++Sets a parameter value to a string. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -799,42 +750,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setTime void odbc::PreparedStatement::setTime int   idx, idx,
    const Time  val val
    +
    + +

    +-Sets a parameter value to a Time. ++Sets a parameter value to a Time. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -847,21 +795,19 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::PreparedStatement::setTimestamp void odbc::PreparedStatement::setTimestamp int   idx, idx,
    const Timestamp  val val
    +
    + +

    +-Sets a parameter value to a Timestamp. ++Sets a parameter value to a Timestamp. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The parameter index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The parameter index, starting at 1
    val The value to set
    ++ ++ + + +


    The documentation for this class was generated from the following file: ++
  • odbc++/preparedstatement.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_prepared_statement-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_prepared_statement-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_prepared_statement-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_prepared_statement-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,59 +1,58 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::PreparedStatement Member List

    This is the complete list of members for odbc::PreparedStatement, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::PreparedStatement Member List

    This is the complete list of members for odbc::PreparedStatement, including all inherited members.

    cancel()odbc::Statement
    clearParameters()odbc::PreparedStatement
    clearWarnings()odbc::ErrorHandler
    close()odbc::Statement
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    execute()odbc::PreparedStatement
    odbc::Statement::execute(const std::string &sql)odbc::Statement [virtual]
    executeQuery()odbc::PreparedStatement
    odbc::Statement::executeQuery(const std::string &sql)odbc::Statement [virtual]
    executeUpdate()odbc::PreparedStatement
    odbc::Statement::executeUpdate(const std::string &sql)odbc::Statement [virtual]
    getConnection()odbc::Statement
    getEscapeProcessing()odbc::Statement
    getFetchSize()odbc::Statement
    getMaxFieldSize()odbc::Statement
    getMaxRows()odbc::Statement
    getMoreResults()odbc::Statement
    getQueryTimeout()odbc::Statement
    getResultSet()odbc::Statement
    getResultSetConcurrency()odbc::Statement
    getResultSetType()odbc::Statement
    getUpdateCount()odbc::Statement
    getWarnings()odbc::ErrorHandler
    setAsciiStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBinaryStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBoolean(int idx, bool val)odbc::PreparedStatement
    setByte(int idx, signed char val)odbc::PreparedStatement
    setBytes(int idx, const Bytes &val)odbc::PreparedStatement
    setCursorName(const std::string &name)odbc::Statement
    setDate(int idx, const Date &val)odbc::PreparedStatement
    setDouble(int idx, double val)odbc::PreparedStatement
    setEscapeProcessing(bool on)odbc::Statement
    setFetchSize(int size)odbc::Statement
    setFloat(int idx, float val)odbc::PreparedStatement
    setInt(int idx, int val)odbc::PreparedStatement
    setLong(int idx, Long val)odbc::PreparedStatement
    setMaxFieldSize(int maxFieldSize)odbc::Statement
    setMaxRows(int maxRows)odbc::Statement
    setNull(int idx, int sqlType)odbc::PreparedStatement
    setQueryTimeout(int seconds)odbc::Statement
    setShort(int idx, short val)odbc::PreparedStatement
    setString(int idx, const std::string &val)odbc::PreparedStatement
    setTime(int idx, const Time &val)odbc::PreparedStatement
    setTimestamp(int idx, const Timestamp &val)odbc::PreparedStatement
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~PreparedStatement()odbc::PreparedStatement [virtual]
    ~Statement()odbc::Statement [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    cancel()odbc::Statement
    clearParameters()odbc::PreparedStatement
    clearWarnings()odbc::ErrorHandler
    close()odbc::Statement
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    execute()odbc::PreparedStatement
    odbc::Statement::execute(const std::string &sql)odbc::Statement [virtual]
    executeQuery()odbc::PreparedStatement
    odbc::Statement::executeQuery(const std::string &sql)odbc::Statement [virtual]
    executeUpdate()odbc::PreparedStatement
    odbc::Statement::executeUpdate(const std::string &sql)odbc::Statement [virtual]
    getConnection()odbc::Statement
    getEscapeProcessing()odbc::Statement
    getFetchSize()odbc::Statement
    getMaxFieldSize()odbc::Statement
    getMaxRows()odbc::Statement
    getMoreResults()odbc::Statement
    getQueryTimeout()odbc::Statement
    getResultSet()odbc::Statement
    getResultSetConcurrency()odbc::Statement
    getResultSetType()odbc::Statement
    getUpdateCount()odbc::Statement
    getWarnings()odbc::ErrorHandler
    setAsciiStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBinaryStream(int idx, std::istream *s, int len)odbc::PreparedStatement
    setBoolean(int idx, bool val)odbc::PreparedStatement
    setByte(int idx, signed char val)odbc::PreparedStatement
    setBytes(int idx, const Bytes &val)odbc::PreparedStatement
    setCursorName(const std::string &name)odbc::Statement
    setDate(int idx, const Date &val)odbc::PreparedStatement
    setDouble(int idx, double val)odbc::PreparedStatement
    setEscapeProcessing(bool on)odbc::Statement
    setFetchSize(int size)odbc::Statement
    setFloat(int idx, float val)odbc::PreparedStatement
    setInt(int idx, int val)odbc::PreparedStatement
    setLong(int idx, Long val)odbc::PreparedStatement
    setMaxFieldSize(int maxFieldSize)odbc::Statement
    setMaxRows(int maxRows)odbc::Statement
    setNull(int idx, int sqlType)odbc::PreparedStatement
    setQueryTimeout(int seconds)odbc::Statement
    setShort(int idx, short val)odbc::PreparedStatement
    setString(int idx, const std::string &val)odbc::PreparedStatement
    setTime(int idx, const Time &val)odbc::PreparedStatement
    setTimestamp(int idx, const Timestamp &val)odbc::PreparedStatement
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~PreparedStatement()odbc::PreparedStatement [virtual]
    ~Statement()odbc::Statement [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_prepared_statement.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_prepared_statement.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_prepared_statement.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_prepared_statement.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,3 @@ ++PNG ++ ++ IHDRܶPLTE`{tRNS@fIDATx] Ko`NP6Lfd7 gLӯ4.9m ^$$/uҖ7iy&H34 -KAV;,#򑐇so(d͍Jcɤ ^Pm89ii]bnVFg.m=lDblK3'`_ztڏ}i㶴;iNsӜ4 ٻXຢFV)gOqǣy,D:isǃWTyѤdg4MKt.y?mٺ)"D:lz%9igOO/?449iNs! 8Ł82-Z^7YTgi&HCTZ0D9qRRZ\28rh< UF+mںE+JC{ ?*.|)OFN%5ѼЦ5ٲliuZmך.mZ uA lSV V{Yui%}JK?;iNsӜ4^:ߎ=w-^烾o"#ۚ~O4*V4F4H Pk h${Yd^(%]W|=%5hxHI5ۚV!RӤlia Ġdc` F薒RB{h3M,gJuKZ]dA!u5]TL%)M~c5uv=9ig '_q/?ӫIENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set.gif libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set.gif +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF89ayP`!,yP80IJͻ`(di٩l+tv@Yv4W'j5e Kg?[Z-;Zqs,wnt8~}kwyn~okw|DJfg#iuxTq!=Zydu۬vbAS _A:3zY' Ç'Hŋ3jhǏ CIdE&S\-cʜ9%J8sҴ Sϟ&yJơF*tSMJuՖUj +ˬ^KV$زhMKv-۰nv+W+ݺV╪wӾ~lt0aLX'T!Õ1嘖z̹ϠCM:eIN_Mz*O_^*eKzb;7L}Iu]1ys?*i~o)".oӣ_=xߗ^{Ç^~GG??}'_{G]w^F5߂~FGt Etehf !6#|/X8bw!w w^w:9S*.SNe3MIeLV^[Ze)&di&h ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,158 +1,158 @@ +- ++ + +-odbc::ResultSet class Reference ++libodbc++: odbc::ResultSet Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::ResultSet Class Reference

    A result set. ++ ++ ++

    odbc::ResultSet Class Reference

    A result set. + More... +

    + #include <resultset.h> +

    +

    Inheritance diagram for odbc::ResultSet: +-

    ++

    + + odbc::ErrorHandler + + List of all members.

    Public Types

    + +-

    Public Methods

    ++
    ResultSet type constants. More...
    ++

    Public Member Functions

    +
      +-
    • ++
    • + virtual ~ResultSet () +-
      Destructor.

    • bool absolute (int row) +-
      Moves the cursor to a specific row in this result set. More...

    • bool relative (int rows) +-
      Moves the cursor inside the result set relative to the current row. More...

    • ++
      Destructor.
    • bool absolute (int row) ++
      Moves the cursor to a specific row in this result set.
    • bool relative (int rows) ++
      Moves the cursor inside the result set relative to the current row.
    • + void afterLast () +-
      Places the cursor after the last row in the result set.

    • ++
      Places the cursor after the last row in the result set.
    • + void beforeFirst () +-
      Places the cursor before the first row in the result set.

    • ++
      Places the cursor before the first row in the result set.
    • + bool isAfterLast () +-
      Checks if the cursor is after the last row in the result set.

    • ++
      Checks if the cursor is after the last row in the result set.
    • + bool isBeforeFirst () +-
      Checks if the cursor is before the first row in the result set.

    • ++
      Checks if the cursor is before the first row in the result set.
    • + bool isFirst () +-
      Checks if the cursor is on the first row in the result set.

    • ++
      Checks if the cursor is on the first row in the result set.
    • + bool isLast () +-
      Checks if the cursor is on the last row in the result set.

    • int getRow () +-
      Returns the current row number. More...

    • bool next () +-
      Moves to the next row in the result set. More...

    • bool previous () +-
      Moves to the previous row in the result set. More...

    • bool first () +-
      Moves to the first row in the result set. More...

    • bool last () +-
      Moves to the last row in the result set. More...

    • void moveToInsertRow () +-
      Moves the cursor to the 'insert row' of this result set. More...

    • ++
      Checks if the cursor is on the last row in the result set.
    • int getRow () ++
      Returns the current row number.
    • bool next () ++
      Moves to the next row in the result set.
    • bool previous () ++
      Moves to the previous row in the result set.
    • bool first () ++
      Moves to the first row in the result set.
    • bool last () ++
      Moves to the last row in the result set.
    • void moveToInsertRow () ++
      Moves the cursor to the 'insert row' of this result set.
    • + void moveToCurrentRow () +-
      Moves the cursor back to where it was before it was moved to the insert row.

    • ++
      Moves the cursor back to where it was before it was moved to the insert row.
    • + void refreshRow () +-
      Refreshes the current row.

    • ++
      Refreshes the current row.
    • + void deleteRow () +-
      Deletes the current row.

    • void insertRow () +-
      Inserts the current row. More...

    • ++
      Deletes the current row.
    • void insertRow () ++
      Inserts the current row.
    • + void updateRow () +-
      Updates the current row.

    • ++
      Updates the current row.
    • + void cancelRowUpdates () +-
      Cancels any updates done to the current row.

    • ResultSetMetaData * getMetaData () +-
      Returns meta data about this result set. More...

    • ++
      Cancels any updates done to the current row.
    • ResultSetMetaData * getMetaData () ++
      Returns meta data about this result set.
    • + int findColumn (const std::string &colName) +-
      Find a column index by the column's name.

    • ++
      Find a column index by the column's name.
    • + bool rowDeleted () +-
      Checks if the current row is deleted.

    • ++
      Checks if the current row is deleted.
    • + bool rowInserted () +-
      Checks if the current row was inserted.

    • ++
      Checks if the current row was inserted.
    • + bool rowUpdated () +-
      Checks if the current row was updated.

    • ++
      Checks if the current row was updated.
    • + int getType () +-
      Gets the type of this result set.

    • ++
      Gets the type of this result set.
    • + int getConcurrency () +-
      Gets the concurrency of this result set.

    • ++
      Gets the concurrency of this result set.
    • + int getFetchSize () +-
      Gets this result set's current fetch size.

    • ++
      Gets this result set's current fetch size.
    • + void setFetchSize (int fetchSize) +-
      Sets this result set's fetch size (doesn't apply immediately).

    • ++
      Sets this result set's fetch size (doesn't apply immediately).
    • + std::string getCursorName () +-
      Gets the cursor name associated with this result set.

    • ++
      Gets the cursor name associated with this result set.
    • + Statement * getStatement () +-
      Gets the Statement that created this result set.

    • double getDouble (int idx) +-
      Gets a column's value as a double. More...

    • bool getBoolean (int idx) +-
      Gets a column's value as a bool. More...

    • signed char getByte (int idx) +-
      Gets a column's value as a signed char. More...

    • Bytes getBytes (int idx) +-
      Gets a column's value as a chunk of bytes. More...

    • Date getDate (int idx) +-
      Gets a column's value as a Date. More...

    • float getFloat (int idx) +-
      Gets a column's value as a float. More...

    • int getInt (int idx) +-
      Gets a column's value as an int. More...

    • Long getLong (int idx) +-
      Gets a column's value as a Long. More...

    • short getShort (int idx) +-
      Gets a column's value as a short. More...

    • std::string getString (int idx) +-
      Gets a column's value as a string. More...

    • Time getTime (int idx) +-
      Gets a column's value as a Time. More...

    • Timestamp getTimestamp (int idx) +-
      Gets a column's value as a Timestamp. More...

    • double getDouble (const std::string &colName) +-
      Gets a column's value as a double. More...

    • bool getBoolean (const std::string &colName) +-
      Gets a column's value as a bool. More...

    • signed char getByte (const std::string &colName) +-
      Gets a column's value as a signed char. More...

    • Bytes getBytes (const std::string &colName) +-
      Gets a column's value as a chunk of bytes. More...

    • Date getDate (const std::string &colName) +-
      Gets a column's value as a Date. More...

    • float getFloat (const std::string &colName) +-
      Gets a column's value as a float. More...

    • int getInt (const std::string &colName) +-
      Gets a column's value as an int. More...

    • Long getLong (const std::string &colName) +-
      Gets a column's value as a Long. More...

    • short getShort (const std::string &colName) +-
      Gets a column's value as a short. More...

    • std::string getString (const std::string &colName) +-
      Gets a column's value as a string. More...

    • Time getTime (const std::string &colName) +-
      Gets a column's value as a Time. More...

    • Timestamp getTimestamp (const std::string &colName) +-
      Gets a column's value as a Timestamp. More...

    • std::istream * getAsciiStream (int idx) +-
      Fetches a column's value as a stream. More...

    • std::istream * getAsciiStream (const std::string &colName) +-
      Fetches a column's value as a stream. More...

    • std::istream * getBinaryStream (int idx) +-
      Fetches a column's value as a stream. More...

    • std::istream * getBinaryStream (const std::string &colName) +-
      Fetches a column's value as a stream. More...

    • bool wasNull () +-
      Checks if the last fetched column value was NULL. More...

    • void updateDouble (int idx, double val) +-
      Sets the value of a column to a double. More...

    • void updateBoolean (int idx, bool val) +-
      Sets the value of a column to a bool. More...

    • void updateByte (int idx, signed char val) +-
      Sets the value of a column to a signed char. More...

    • void updateBytes (int idx, const Bytes &val) +-
      Sets the value of a column to a chunk of bytes. More...

    • void updateDate (int idx, const Date &val) +-
      Sets the value of a column to a Date. More...

    • void updateFloat (int idx, float val) +-
      Sets the value of a column to a float. More...

    • void updateInt (int idx, int val) +-
      Sets the value of a column to an int. More...

    • void updateLong (int idx, Long val) +-
      Sets the value of a column to a Long. More...

    • void updateShort (int idx, short val) +-
      Sets the value of a column to a short. More...

    • void updateString (int idx, const std::string &val) +-
      Sets the value of a column to a string. More...

    • void updateTime (int idx, const Time &val) +-
      Sets the value of a column to a Time. More...

    • void updateTimestamp (int idx, const Timestamp &val) +-
      Sets the value of a column to a Timestamp. More...

    • void updateNull (int idx) +-
      Sets the value of a column to NULL. More...

    • void updateDouble (const std::string &colName, double val) +-
      Sets the value of a column to a double. More...

    • void updateBoolean (const std::string &colName, bool val) +-
      Sets the value of a column to a bool. More...

    • void updateByte (const std::string &colName, signed char val) +-
      Sets the value of a column to a signed char. More...

    • void updateBytes (const std::string &colName, const Bytes &val) +-
      Sets the value of a column to a chunk of bytes. More...

    • void updateDate (const std::string &colName, const Date &val) +-
      Sets the value of a column to a Date. More...

    • void updateFloat (const std::string &colName, float val) +-
      Sets the value of a column to a float. More...

    • void updateInt (const std::string &colName, int val) +-
      Sets the value of a column to an int. More...

    • void updateLong (const std::string &colName, Long val) +-
      Sets the value of a column to a Long. More...

    • void updateShort (const std::string &colName, short val) +-
      Sets the value of a column to a short. More...

    • void updateString (const std::string &colName, const std::string &val) +-
      Sets the value of a column to a string. More...

    • void updateTime (const std::string &colName, const Time &val) +-
      Sets the value of a column to a Time. More...

    • void updateTimestamp (const std::string &colName, const Timestamp &val) +-
      Sets the value of a column to a Timestamp. More...

    • void updateAsciiStream (int idx, std::istream *s, int len) +-
      Sets the value of a column to a stream. More...

    • void updateAsciiStream (const std::string &colName, std::istream *s, int len) +-
      Sets the value of a column to the contens of a stream. More...

    • void updateBinaryStream (int idx, std::istream *s, int len) +-
      Sets the value of a column to the contens of a stream. More...

    • void updateBinaryStream (const std::string &colName, std::istream *s, int len) +-
      Sets the value of a column to the contens of a stream. More...

    • void updateNull (const std::string &colName) +-
      Sets the value of a column to NULL. More...

    ++
    Gets the Statement that created this result set.
  • double getDouble (int idx) ++
    Gets a column's value as a double.
  • bool getBoolean (int idx) ++
    Gets a column's value as a bool.
  • signed char getByte (int idx) ++
    Gets a column's value as a signed char.
  • Bytes getBytes (int idx) ++
    Gets a column's value as a chunk of bytes.
  • Date getDate (int idx) ++
    Gets a column's value as a Date.
  • float getFloat (int idx) ++
    Gets a column's value as a float.
  • int getInt (int idx) ++
    Gets a column's value as an int.
  • Long getLong (int idx) ++
    Gets a column's value as a Long.
  • short getShort (int idx) ++
    Gets a column's value as a short.
  • std::string getString (int idx) ++
    Gets a column's value as a string.
  • Time getTime (int idx) ++
    Gets a column's value as a Time.
  • Timestamp getTimestamp (int idx) ++
    Gets a column's value as a Timestamp.
  • double getDouble (const std::string &colName) ++
    Gets a column's value as a double.
  • bool getBoolean (const std::string &colName) ++
    Gets a column's value as a bool.
  • signed char getByte (const std::string &colName) ++
    Gets a column's value as a signed char.
  • Bytes getBytes (const std::string &colName) ++
    Gets a column's value as a chunk of bytes.
  • Date getDate (const std::string &colName) ++
    Gets a column's value as a Date.
  • float getFloat (const std::string &colName) ++
    Gets a column's value as a float.
  • int getInt (const std::string &colName) ++
    Gets a column's value as an int.
  • Long getLong (const std::string &colName) ++
    Gets a column's value as a Long.
  • short getShort (const std::string &colName) ++
    Gets a column's value as a short.
  • std::string getString (const std::string &colName) ++
    Gets a column's value as a string.
  • Time getTime (const std::string &colName) ++
    Gets a column's value as a Time.
  • Timestamp getTimestamp (const std::string &colName) ++
    Gets a column's value as a Timestamp.
  • std::istream * getAsciiStream (int idx) ++
    Fetches a column's value as a stream.
  • std::istream * getAsciiStream (const std::string &colName) ++
    Fetches a column's value as a stream.
  • std::istream * getBinaryStream (int idx) ++
    Fetches a column's value as a stream.
  • std::istream * getBinaryStream (const std::string &colName) ++
    Fetches a column's value as a stream.
  • bool wasNull () ++
    Checks if the last fetched column value was NULL.
  • void updateDouble (int idx, double val) ++
    Sets the value of a column to a double.
  • void updateBoolean (int idx, bool val) ++
    Sets the value of a column to a bool.
  • void updateByte (int idx, signed char val) ++
    Sets the value of a column to a signed char.
  • void updateBytes (int idx, const Bytes &val) ++
    Sets the value of a column to a chunk of bytes.
  • void updateDate (int idx, const Date &val) ++
    Sets the value of a column to a Date.
  • void updateFloat (int idx, float val) ++
    Sets the value of a column to a float.
  • void updateInt (int idx, int val) ++
    Sets the value of a column to an int.
  • void updateLong (int idx, Long val) ++
    Sets the value of a column to a Long.
  • void updateShort (int idx, short val) ++
    Sets the value of a column to a short.
  • void updateString (int idx, const std::string &val) ++
    Sets the value of a column to a string.
  • void updateTime (int idx, const Time &val) ++
    Sets the value of a column to a Time.
  • void updateTimestamp (int idx, const Timestamp &val) ++
    Sets the value of a column to a Timestamp.
  • void updateNull (int idx) ++
    Sets the value of a column to NULL.
  • void updateDouble (const std::string &colName, double val) ++
    Sets the value of a column to a double.
  • void updateBoolean (const std::string &colName, bool val) ++
    Sets the value of a column to a bool.
  • void updateByte (const std::string &colName, signed char val) ++
    Sets the value of a column to a signed char.
  • void updateBytes (const std::string &colName, const Bytes &val) ++
    Sets the value of a column to a chunk of bytes.
  • void updateDate (const std::string &colName, const Date &val) ++
    Sets the value of a column to a Date.
  • void updateFloat (const std::string &colName, float val) ++
    Sets the value of a column to a float.
  • void updateInt (const std::string &colName, int val) ++
    Sets the value of a column to an int.
  • void updateLong (const std::string &colName, Long val) ++
    Sets the value of a column to a Long.
  • void updateShort (const std::string &colName, short val) ++
    Sets the value of a column to a short.
  • void updateString (const std::string &colName, const std::string &val) ++
    Sets the value of a column to a string.
  • void updateTime (const std::string &colName, const Time &val) ++
    Sets the value of a column to a Time.
  • void updateTimestamp (const std::string &colName, const Timestamp &val) ++
    Sets the value of a column to a Timestamp.
  • void updateAsciiStream (int idx, std::istream *s, int len) ++
    Sets the value of a column to a stream.
  • void updateAsciiStream (const std::string &colName, std::istream *s, int len) ++
    Sets the value of a column to the contens of a stream.
  • void updateBinaryStream (int idx, std::istream *s, int len) ++
    Sets the value of a column to the contens of a stream.
  • void updateBinaryStream (const std::string &colName, std::istream *s, int len) ++
    Sets the value of a column to the contens of a stream.
  • void updateNull (const std::string &colName) ++
    Sets the value of a column to NULL.
    +

    Detailed Description

    +-A result set. ++A result set. +

    +


    Member Enumeration Documentation

    +-

    +- ++

    ++

    + +- + +@@ -165,27 +165,27 @@ + + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-ResultSet concurrency constants. ++ResultSet concurrency constants. +

    +-

    +-Enumeration values:
    ++
    Enumeration values:
    + +- +- ++ ++ +
    CONCUR_READ_ONLY  +-The ResultSet is read only.
    CONCUR_UPDATABLE  +-The ResultSet is updatable.
    CONCUR_READ_ONLY  ++The ResultSet is read only.
    CONCUR_UPDATABLE  ++The ResultSet is updatable.
    +
    +
    +-

    +- ++

    ++

    + +- + +@@ -198,37 +198,35 @@ + + +
    ++ + + +- ++ +
    anonymous enum ++ anonymous enum
    +
    + +

    +-ResultSet type constants. ++ResultSet type constants. +

    +-

    +-Enumeration values:
    ++
    Enumeration values:
    + +- +- +- ++ ++ ++ +
    TYPE_FORWARD_ONLY  +-The result set only goes forward.
    TYPE_SCROLL_INSENSITIVE  +-The result set is scrollable, but the data in it is not affected by changes in the database.
    TYPE_SCROLL_SENSITIVE  +-The result set is scrollable and sensitive to database changes.
    TYPE_FORWARD_ONLY  ++The result set only goes forward.
    TYPE_SCROLL_INSENSITIVE  ++The result set is scrollable, but the data in it is not affected by changes in the database.
    TYPE_SCROLL_SENSITIVE  ++The result set is scrollable and sensitive to database changes.
    +
    +
    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -241,26 +239,24 @@ + ++If row is negative, the actual row number is calculated from the end of the result set. Calling absolute(0) is equivalent to calling beforeFirst()
    Returns:
    true if the cursor is in the result set
    ++ + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::absolute bool odbc::ResultSet::absolute int   row row  ) 
    +
    + +

    +-Moves the cursor to a specific row in this result set. ++Moves the cursor to a specific row in this result set. +

    +-If row is negative, the actual row number is calculated from the end of the result set. Calling absolute(0) is equivalent to calling beforeFirst()

    +-Returns:
    +-true if the cursor is in the result set
    +-

    +- ++

    ++

    + +- + +@@ -273,27 +269,25 @@ + ++
    Returns:
    true if the cursor is in the result set
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::first bool odbc::ResultSet::first    ) 
    +
    + +

    +-Moves to the first row in the result set. ++Moves to the first row in the result set. +

    +-

    +-Returns:
    +-true if the cursor is in the result set
    +-

    +- ++

    ++

    + +- + +@@ -306,31 +300,29 @@ + ++Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::istream* odbc::ResultSet::getAsciiStream std::istream* odbc::ResultSet::getAsciiStream const std::string &   colName colName  ) 
    +
    + +

    +-Fetches a column's value as a stream. ++Fetches a column's value as a stream. +

    +-Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.

    +-Parameters:
    +- +- +-
    colName  +-The column name
    +-
    ++ ++
    colName The column name
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -343,31 +335,29 @@ + ++Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::istream* odbc::ResultSet::getAsciiStream std::istream* odbc::ResultSet::getAsciiStream int   idx idx  ) 
    +
    + +

    +-Fetches a column's value as a stream. ++Fetches a column's value as a stream. +

    +-Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -380,31 +370,29 @@ + ++Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::istream* odbc::ResultSet::getBinaryStream std::istream* odbc::ResultSet::getBinaryStream const std::string &   colName colName  ) 
    +
    + +

    +-Fetches a column's value as a stream. ++Fetches a column's value as a stream. +

    +-Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.

    +-Parameters:
    +- +- +-
    colName  +-The column name
    +-
    ++ ++
    colName The column name
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -417,31 +405,29 @@ + ++Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::istream* odbc::ResultSet::getBinaryStream std::istream* odbc::ResultSet::getBinaryStream int   idx idx  ) 
    +
    + +

    +-Fetches a column's value as a stream. ++Fetches a column's value as a stream. +

    +-Note that the stream is owned by the result set and should in no case be deleted by the caller. Also, the returned stream is only valid while the cursor remains on this position.

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -454,31 +440,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::getBoolean bool odbc::ResultSet::getBoolean const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a bool. ++Gets a column's value as a bool. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -491,31 +475,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::getBoolean bool odbc::ResultSet::getBoolean int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a bool. ++Gets a column's value as a bool. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -528,31 +510,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    signed char odbc::ResultSet::getByte signed char odbc::ResultSet::getByte const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a signed char. ++Gets a column's value as a signed char. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -565,31 +545,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    signed char odbc::ResultSet::getByte signed char odbc::ResultSet::getByte int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a signed char. ++Gets a column's value as a signed char. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -602,31 +580,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Bytes odbc::ResultSet::getBytes Bytes odbc::ResultSet::getBytes const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a chunk of bytes. ++Gets a column's value as a chunk of bytes. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -639,31 +615,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Bytes odbc::ResultSet::getBytes Bytes odbc::ResultSet::getBytes int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a chunk of bytes. ++Gets a column's value as a chunk of bytes. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -676,31 +650,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Date odbc::ResultSet::getDate Date odbc::ResultSet::getDate const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a Date. ++Gets a column's value as a Date. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -713,31 +685,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Date odbc::ResultSet::getDate Date odbc::ResultSet::getDate int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a Date. ++Gets a column's value as a Date. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -750,31 +720,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    double odbc::ResultSet::getDouble double odbc::ResultSet::getDouble const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a double. ++Gets a column's value as a double. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -787,31 +755,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    double odbc::ResultSet::getDouble double odbc::ResultSet::getDouble int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a double. ++Gets a column's value as a double. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -824,31 +790,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    float odbc::ResultSet::getFloat float odbc::ResultSet::getFloat const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a float. ++Gets a column's value as a float. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -861,31 +825,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    float odbc::ResultSet::getFloat float odbc::ResultSet::getFloat int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a float. ++Gets a column's value as a float. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -898,31 +860,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::ResultSet::getInt int odbc::ResultSet::getInt const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as an int. ++Gets a column's value as an int. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -935,31 +895,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::ResultSet::getInt int odbc::ResultSet::getInt int   idx idx  ) 
    +
    + +

    +-Gets a column's value as an int. ++Gets a column's value as an int. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -972,31 +930,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Long odbc::ResultSet::getLong Long odbc::ResultSet::getLong const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a Long. ++Gets a column's value as a Long. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1009,30 +965,28 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Long odbc::ResultSet::getLong Long odbc::ResultSet::getLong int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a Long. ++Gets a column's value as a Long. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1045,26 +999,24 @@ + ++
    See also:
    ResultSetMetaData
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    ResultSetMetaData* odbc::ResultSet::getMetaData ResultSetMetaData* odbc::ResultSet::getMetaData    ) 
    +
    + +

    +-Returns meta data about this result set. ++Returns meta data about this result set. +

    +-

    +-See also:
    +-ResultSetMetaData
    +-

    +- ++

    ++

    + +- + +@@ -1077,27 +1029,25 @@ + ++
    Returns:
    The current row number in the result set, or 0 if it can't be determined.
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    int odbc::ResultSet::getRow int odbc::ResultSet::getRow    ) 
    +
    + +

    +-Returns the current row number. ++Returns the current row number. +

    +-

    +-Returns:
    +-The current row number in the result set, or 0 if it can't be determined.
    +-

    +- ++

    ++

    + +- + +@@ -1110,31 +1060,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    short odbc::ResultSet::getShort short odbc::ResultSet::getShort const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a short. ++Gets a column's value as a short. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1147,31 +1095,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    short odbc::ResultSet::getShort short odbc::ResultSet::getShort int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a short. ++Gets a column's value as a short. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1184,31 +1130,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::ResultSet::getString std::string odbc::ResultSet::getString const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a string. ++Gets a column's value as a string. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1221,31 +1165,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::ResultSet::getString std::string odbc::ResultSet::getString int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a string. ++Gets a column's value as a string. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1258,31 +1200,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Time odbc::ResultSet::getTime Time odbc::ResultSet::getTime const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a Time. ++Gets a column's value as a Time. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1295,31 +1235,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Time odbc::ResultSet::getTime Time odbc::ResultSet::getTime int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a Time. ++Gets a column's value as a Time. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1332,31 +1270,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Timestamp odbc::ResultSet::getTimestamp Timestamp odbc::ResultSet::getTimestamp const std::string &   colName colName  ) 
    +
    + +

    +-Gets a column's value as a Timestamp. ++Gets a column's value as a Timestamp. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The name of the column
    +-
    ++ ++
    colName The name of the column
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1369,30 +1305,28 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    Timestamp odbc::ResultSet::getTimestamp Timestamp odbc::ResultSet::getTimestamp int   idx idx  ) 
    +
    + +

    +-Gets a column's value as a Timestamp. ++Gets a column's value as a Timestamp. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1405,26 +1339,24 @@ + ++Only valid while on the insert row.
    See also:
    moveToInsertRow()
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    void odbc::ResultSet::insertRow void odbc::ResultSet::insertRow    ) 
    +
    + +

    +-Inserts the current row. ++Inserts the current row. +

    +-Only valid while on the insert row.

    +-See also:
    +-moveToInsertRow()
    +-

    +- ++

    ++

    + +- + +@@ -1437,26 +1369,24 @@ + ++
    Returns:
    true if the cursor is in the result set
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::last bool odbc::ResultSet::last    ) 
    +
    + +

    +-Moves to the last row in the result set. ++Moves to the last row in the result set. +

    +-

    +-Returns:
    +-true if the cursor is in the result set
    +-

    +- ++

    ++

    + +- + +@@ -1469,28 +1399,25 @@ + ++
    Warning:
    The only valid methods while on the insert row are updateXXX(), insertRow() and moveToCurrentRow().
    ++
    See also:
    moveToCurrentRow()
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    void odbc::ResultSet::moveToInsertRow void odbc::ResultSet::moveToInsertRow    ) 
    +
    + +

    +-Moves the cursor to the 'insert row' of this result set. ++Moves the cursor to the 'insert row' of this result set. +

    +-

    +-Warning:
    +-The only valid methods while on the insert row are updateXXX(), insertRow() and moveToCurrentRow().
    +-See also:
    +-moveToCurrentRow()
    +-

    +- ++

    ++

    + +- + +@@ -1503,26 +1430,24 @@ + ++
    Returns:
    true if the cursor is in the result set
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::next bool odbc::ResultSet::next    ) 
    +
    + +

    +-Moves to the next row in the result set. ++Moves to the next row in the result set. +

    +-

    +-Returns:
    +-true if the cursor is in the result set
    +-

    +- ++

    ++

    + +- + +@@ -1535,27 +1460,25 @@ + ++
    Returns:
    true if the cursor is in the result set
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::previous bool odbc::ResultSet::previous    ) 
    +
    + +

    +-Moves to the previous row in the result set. ++Moves to the previous row in the result set. +

    +-

    +-Returns:
    +-true if the cursor is in the result set
    +-

    +- ++

    ++

    + +- + +@@ -1568,42 +1491,40 @@ + ++Negative values are allowed. This call is illegal if there is no current row.
    Returns:
    true if the cursor is in the result set
    ++ + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::relative bool odbc::ResultSet::relative int   rows rows  ) 
    +
    + +

    +-Moves the cursor inside the result set relative to the current row. ++Moves the cursor inside the result set relative to the current row. +

    +-Negative values are allowed. This call is illegal if there is no current row.

    +-Returns:
    +-true if the cursor is in the result set
    +-

    +- ++

    ++

    + +- + +@@ -1616,50 +1537,46 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateAsciiStream void odbc::ResultSet::updateAsciiStream const std::string &   colName, colName,
    std::istream *   s, s,
    int   len len
    +
    + +

    +-Sets the value of a column to the contens of a stream. ++Sets the value of a column to the contens of a stream. +

    +-

    +-Parameters:
    +- +- +- +- +-
    colName  +-The column name
    s  +-The stream to assign
    len  +-The number of bytes in the stream
    +-
    ++ ++ ++ ++
    colName The column name
    s The stream to assign
    len The number of bytes in the stream
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1672,50 +1589,46 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateAsciiStream void odbc::ResultSet::updateAsciiStream int   idx, idx,
    std::istream *   s, s,
    int   len len
    +
    + +

    +-Sets the value of a column to a stream. ++Sets the value of a column to a stream. +

    +-

    +-Parameters:
    +- +- +- +- +-
    idx  +-The column index, starting at 1
    s  +-The stream to assign
    len  +-The number of bytes in the stream
    +-
    ++ ++ ++ ++
    idx The column index, starting at 1
    s The stream to assign
    len The number of bytes in the stream
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1728,50 +1641,46 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateBinaryStream void odbc::ResultSet::updateBinaryStream const std::string &   colName, colName,
    std::istream *   s, s,
    int   len len
    +
    + +

    +-Sets the value of a column to the contens of a stream. ++Sets the value of a column to the contens of a stream. +

    +-

    +-Parameters:
    +- +- +- +- +-
    colName  +-The column name
    s  +-The stream to assign
    len  +-The number of bytes in the stream
    +-
    ++ ++ ++ ++
    colName The column name
    s The stream to assign
    len The number of bytes in the stream
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1784,44 +1693,40 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateBinaryStream void odbc::ResultSet::updateBinaryStream int   idx, idx,
    std::istream *   s, s,
    int   len len
    +
    + +

    +-Sets the value of a column to the contens of a stream. ++Sets the value of a column to the contens of a stream. +

    +-

    +-Parameters:
    +- +- +- +- +-
    idx  +-The column index, starting at 1
    s  +-The stream to assign
    len  +-The number of bytes in the stream
    +-
    ++ ++ ++ ++
    idx The column index, starting at 1
    s The stream to assign
    len The number of bytes in the stream
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1834,42 +1739,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateBoolean void odbc::ResultSet::updateBoolean const std::string &   colName, colName,
    bool   val val
    +
    + +

    +-Sets the value of a column to a bool. ++Sets the value of a column to a bool. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1882,42 +1784,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateBoolean void odbc::ResultSet::updateBoolean int   idx, idx,
    bool   val val
    +
    + +

    +-Sets the value of a column to a bool. ++Sets the value of a column to a bool. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1930,42 +1829,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateByte void odbc::ResultSet::updateByte const std::string &   colName, colName,
    signed char   val val
    +
    + +

    +-Sets the value of a column to a signed char. ++Sets the value of a column to a signed char. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -1978,42 +1874,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateByte void odbc::ResultSet::updateByte int   idx, idx,
    signed char   val val
    +
    + +

    +-Sets the value of a column to a signed char. ++Sets the value of a column to a signed char. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2026,42 +1919,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateBytes void odbc::ResultSet::updateBytes const std::string &   colName, colName,
    const Bytes  val val
    +
    + +

    +-Sets the value of a column to a chunk of bytes. ++Sets the value of a column to a chunk of bytes. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2074,42 +1964,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateBytes void odbc::ResultSet::updateBytes int   idx, idx,
    const Bytes  val val
    +
    + +

    +-Sets the value of a column to a chunk of bytes. ++Sets the value of a column to a chunk of bytes. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2122,42 +2009,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateDate void odbc::ResultSet::updateDate const std::string &   colName, colName,
    const Date  val val
    +
    + +

    +-Sets the value of a column to a Date. ++Sets the value of a column to a Date. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2170,42 +2054,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateDate void odbc::ResultSet::updateDate int   idx, idx,
    const Date  val val
    +
    + +

    +-Sets the value of a column to a Date. ++Sets the value of a column to a Date. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2218,42 +2099,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateDouble void odbc::ResultSet::updateDouble const std::string &   colName, colName,
    double   val val
    +
    + +

    +-Sets the value of a column to a double. ++Sets the value of a column to a double. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2266,42 +2144,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateDouble void odbc::ResultSet::updateDouble int   idx, idx,
    double   val val
    +
    + +

    +-Sets the value of a column to a double. ++Sets the value of a column to a double. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2314,42 +2189,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateFloat void odbc::ResultSet::updateFloat const std::string &   colName, colName,
    float   val val
    +
    + +

    +-Sets the value of a column to a float. ++Sets the value of a column to a float. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2362,42 +2234,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateFloat void odbc::ResultSet::updateFloat int   idx, idx,
    float   val val
    +
    + +

    +-Sets the value of a column to a float. ++Sets the value of a column to a float. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2410,42 +2279,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateInt void odbc::ResultSet::updateInt const std::string &   colName, colName,
    int   val val
    +
    + +

    +-Sets the value of a column to an int. ++Sets the value of a column to an int. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2458,42 +2324,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateInt void odbc::ResultSet::updateInt int   idx, idx,
    int   val val
    +
    + +

    +-Sets the value of a column to an int. ++Sets the value of a column to an int. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2506,42 +2369,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateLong void odbc::ResultSet::updateLong const std::string &   colName, colName,
    Long   val val
    +
    + +

    +-Sets the value of a column to a Long. ++Sets the value of a column to a Long. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2554,33 +2414,30 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateLong void odbc::ResultSet::updateLong int   idx, idx,
    Long   val val
    +
    + +

    +-Sets the value of a column to a Long. ++Sets the value of a column to a Long. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2593,31 +2450,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    void odbc::ResultSet::updateNull void odbc::ResultSet::updateNull const std::string &   colName colName  ) 
    +
    + +

    +-Sets the value of a column to NULL. ++Sets the value of a column to NULL. +

    +-

    +-Parameters:
    +- +- +-
    colName  +-The column name
    +-
    ++ ++
    colName The column name
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2630,40 +2485,38 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    void odbc::ResultSet::updateNull void odbc::ResultSet::updateNull int   idx idx  ) 
    +
    + +

    +-Sets the value of a column to NULL. ++Sets the value of a column to NULL. +

    +-

    +-Parameters:
    +- +- +-
    idx  +-The column index, starting at 1
    +-
    ++ ++
    idx The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2676,42 +2529,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateShort void odbc::ResultSet::updateShort const std::string &   colName, colName,
    short   val val
    +
    + +

    +-Sets the value of a column to a short. ++Sets the value of a column to a short. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2724,42 +2574,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateShort void odbc::ResultSet::updateShort int   idx, idx,
    short   val val
    +
    + +

    +-Sets the value of a column to a short. ++Sets the value of a column to a short. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2772,42 +2619,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateString void odbc::ResultSet::updateString const std::string &   colName, colName,
    const std::string &   val val
    +
    + +

    +-Sets the value of a column to a string. ++Sets the value of a column to a string. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2820,42 +2664,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateString void odbc::ResultSet::updateString int   idx, idx,
    const std::string &   val val
    +
    + +

    +-Sets the value of a column to a string. ++Sets the value of a column to a string. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2868,42 +2709,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateTime void odbc::ResultSet::updateTime const std::string &   colName, colName,
    const Time  val val
    +
    + +

    +-Sets the value of a column to a Time. ++Sets the value of a column to a Time. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2916,42 +2754,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateTime void odbc::ResultSet::updateTime int   idx, idx,
    const Time  val val
    +
    + +

    +-Sets the value of a column to a Time. ++Sets the value of a column to a Time. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -2964,42 +2799,39 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateTimestamp void odbc::ResultSet::updateTimestamp const std::string &   colName, colName,
    const Timestamp  val val
    +
    + +

    +-Sets the value of a column to a Timestamp. ++Sets the value of a column to a Timestamp. +

    +-

    +-Parameters:
    +- +- +- +-
    colName  +-The name of the column
    val  +-The value to set
    +-
    ++ ++ ++
    colName The name of the column
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -3012,32 +2844,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + + + + +- +
    void odbc::ResultSet::updateTimestamp void odbc::ResultSet::updateTimestamp int   idx, idx,
    const Timestamp  val val
    +
    + +

    +-Sets the value of a column to a Timestamp. ++Sets the value of a column to a Timestamp. +

    +-

    +-Parameters:
    +- +- +- +-
    idx  +-The column index, starting at 1
    val  +-The value to set
    +-
    ++ ++ ++
    idx The column index, starting at 1
    val The value to set
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -3050,13 +2879,13 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::ResultSet::wasNull bool odbc::ResultSet::wasNull    ) 
    +
    + +

    +-Checks if the last fetched column value was NULL. ++Checks if the last fetched column value was NULL. +

    + Note that if this is true, the returned value was undefined.

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/resultset.h
    ++
  • odbc++/resultset.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,112 +1,111 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::ResultSet Member List

    This is the complete list of members for odbc::ResultSet, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::ResultSet Member List

    This is the complete list of members for odbc::ResultSet, including all inherited members.

    absolute(int row)odbc::ResultSet
    afterLast()odbc::ResultSet
    beforeFirst()odbc::ResultSet
    cancelRowUpdates()odbc::ResultSet
    clearWarnings()odbc::ErrorHandler
    CONCUR_READ_ONLY enum valueodbc::ResultSet
    CONCUR_UPDATABLE enum valueodbc::ResultSet
    deleteRow()odbc::ResultSet
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    findColumn(const std::string &colName)odbc::ResultSet
    first()odbc::ResultSet
    getAsciiStream(int idx)odbc::ResultSet
    getAsciiStream(const std::string &colName)odbc::ResultSet
    getBinaryStream(int idx)odbc::ResultSet
    getBinaryStream(const std::string &colName)odbc::ResultSet
    getBoolean(int idx)odbc::ResultSet
    getBoolean(const std::string &colName)odbc::ResultSet
    getByte(int idx)odbc::ResultSet
    getByte(const std::string &colName)odbc::ResultSet
    getBytes(int idx)odbc::ResultSet
    getBytes(const std::string &colName)odbc::ResultSet
    getConcurrency()odbc::ResultSet
    getCursorName()odbc::ResultSet
    getDate(int idx)odbc::ResultSet
    getDate(const std::string &colName)odbc::ResultSet
    getDouble(int idx)odbc::ResultSet
    getDouble(const std::string &colName)odbc::ResultSet
    getFetchSize()odbc::ResultSet
    getFloat(int idx)odbc::ResultSet
    getFloat(const std::string &colName)odbc::ResultSet
    getInt(int idx)odbc::ResultSet
    getInt(const std::string &colName)odbc::ResultSet
    getLong(int idx)odbc::ResultSet
    getLong(const std::string &colName)odbc::ResultSet
    getMetaData()odbc::ResultSet
    getRow()odbc::ResultSet
    getShort(int idx)odbc::ResultSet
    getShort(const std::string &colName)odbc::ResultSet
    getStatement()odbc::ResultSet
    getString(int idx)odbc::ResultSet
    getString(const std::string &colName)odbc::ResultSet
    getTime(int idx)odbc::ResultSet
    getTime(const std::string &colName)odbc::ResultSet
    getTimestamp(int idx)odbc::ResultSet
    getTimestamp(const std::string &colName)odbc::ResultSet
    getType()odbc::ResultSet
    getWarnings()odbc::ErrorHandler
    insertRow()odbc::ResultSet
    isAfterLast()odbc::ResultSet
    isBeforeFirst()odbc::ResultSet
    isFirst()odbc::ResultSet
    isLast()odbc::ResultSet
    last()odbc::ResultSet
    moveToCurrentRow()odbc::ResultSet
    moveToInsertRow()odbc::ResultSet
    next()odbc::ResultSet
    previous()odbc::ResultSet
    refreshRow()odbc::ResultSet
    relative(int rows)odbc::ResultSet
    rowDeleted()odbc::ResultSet
    rowInserted()odbc::ResultSet
    rowUpdated()odbc::ResultSet
    setFetchSize(int fetchSize)odbc::ResultSet
    TYPE_FORWARD_ONLY enum valueodbc::ResultSet
    TYPE_SCROLL_INSENSITIVE enum valueodbc::ResultSet
    TYPE_SCROLL_SENSITIVE enum valueodbc::ResultSet
    updateAsciiStream(int idx, std::istream *s, int len)odbc::ResultSet
    updateAsciiStream(const std::string &colName, std::istream *s, int len)odbc::ResultSet
    updateBinaryStream(int idx, std::istream *s, int len)odbc::ResultSet
    updateBinaryStream(const std::string &colName, std::istream *s, int len)odbc::ResultSet
    updateBoolean(int idx, bool val)odbc::ResultSet
    updateBoolean(const std::string &colName, bool val)odbc::ResultSet
    updateByte(int idx, signed char val)odbc::ResultSet
    updateByte(const std::string &colName, signed char val)odbc::ResultSet
    updateBytes(int idx, const Bytes &val)odbc::ResultSet
    updateBytes(const std::string &colName, const Bytes &val)odbc::ResultSet
    updateDate(int idx, const Date &val)odbc::ResultSet
    updateDate(const std::string &colName, const Date &val)odbc::ResultSet
    updateDouble(int idx, double val)odbc::ResultSet
    updateDouble(const std::string &colName, double val)odbc::ResultSet
    updateFloat(int idx, float val)odbc::ResultSet
    updateFloat(const std::string &colName, float val)odbc::ResultSet
    updateInt(int idx, int val)odbc::ResultSet
    updateInt(const std::string &colName, int val)odbc::ResultSet
    updateLong(int idx, Long val)odbc::ResultSet
    updateLong(const std::string &colName, Long val)odbc::ResultSet
    updateNull(int idx)odbc::ResultSet
    updateNull(const std::string &colName)odbc::ResultSet
    updateRow()odbc::ResultSet
    updateShort(int idx, short val)odbc::ResultSet
    updateShort(const std::string &colName, short val)odbc::ResultSet
    updateString(int idx, const std::string &val)odbc::ResultSet
    updateString(const std::string &colName, const std::string &val)odbc::ResultSet
    updateTime(int idx, const Time &val)odbc::ResultSet
    updateTime(const std::string &colName, const Time &val)odbc::ResultSet
    updateTimestamp(int idx, const Timestamp &val)odbc::ResultSet
    updateTimestamp(const std::string &colName, const Timestamp &val)odbc::ResultSet
    wasNull()odbc::ResultSet
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~ResultSet()odbc::ResultSet [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    absolute(int row)odbc::ResultSet
    afterLast()odbc::ResultSet
    beforeFirst()odbc::ResultSet
    cancelRowUpdates()odbc::ResultSet
    clearWarnings()odbc::ErrorHandler
    CONCUR_READ_ONLY enum valueodbc::ResultSet
    CONCUR_UPDATABLE enum valueodbc::ResultSet
    deleteRow()odbc::ResultSet
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    findColumn(const std::string &colName)odbc::ResultSet
    first()odbc::ResultSet
    getAsciiStream(int idx)odbc::ResultSet
    getAsciiStream(const std::string &colName)odbc::ResultSet
    getBinaryStream(int idx)odbc::ResultSet
    getBinaryStream(const std::string &colName)odbc::ResultSet
    getBoolean(int idx)odbc::ResultSet
    getBoolean(const std::string &colName)odbc::ResultSet
    getByte(int idx)odbc::ResultSet
    getByte(const std::string &colName)odbc::ResultSet
    getBytes(int idx)odbc::ResultSet
    getBytes(const std::string &colName)odbc::ResultSet
    getConcurrency()odbc::ResultSet
    getCursorName()odbc::ResultSet
    getDate(int idx)odbc::ResultSet
    getDate(const std::string &colName)odbc::ResultSet
    getDouble(int idx)odbc::ResultSet
    getDouble(const std::string &colName)odbc::ResultSet
    getFetchSize()odbc::ResultSet
    getFloat(int idx)odbc::ResultSet
    getFloat(const std::string &colName)odbc::ResultSet
    getInt(int idx)odbc::ResultSet
    getInt(const std::string &colName)odbc::ResultSet
    getLong(int idx)odbc::ResultSet
    getLong(const std::string &colName)odbc::ResultSet
    getMetaData()odbc::ResultSet
    getRow()odbc::ResultSet
    getShort(int idx)odbc::ResultSet
    getShort(const std::string &colName)odbc::ResultSet
    getStatement()odbc::ResultSet
    getString(int idx)odbc::ResultSet
    getString(const std::string &colName)odbc::ResultSet
    getTime(int idx)odbc::ResultSet
    getTime(const std::string &colName)odbc::ResultSet
    getTimestamp(int idx)odbc::ResultSet
    getTimestamp(const std::string &colName)odbc::ResultSet
    getType()odbc::ResultSet
    getWarnings()odbc::ErrorHandler
    insertRow()odbc::ResultSet
    isAfterLast()odbc::ResultSet
    isBeforeFirst()odbc::ResultSet
    isFirst()odbc::ResultSet
    isLast()odbc::ResultSet
    last()odbc::ResultSet
    moveToCurrentRow()odbc::ResultSet
    moveToInsertRow()odbc::ResultSet
    next()odbc::ResultSet
    previous()odbc::ResultSet
    refreshRow()odbc::ResultSet
    relative(int rows)odbc::ResultSet
    rowDeleted()odbc::ResultSet
    rowInserted()odbc::ResultSet
    rowUpdated()odbc::ResultSet
    setFetchSize(int fetchSize)odbc::ResultSet
    TYPE_FORWARD_ONLY enum valueodbc::ResultSet
    TYPE_SCROLL_INSENSITIVE enum valueodbc::ResultSet
    TYPE_SCROLL_SENSITIVE enum valueodbc::ResultSet
    updateAsciiStream(int idx, std::istream *s, int len)odbc::ResultSet
    updateAsciiStream(const std::string &colName, std::istream *s, int len)odbc::ResultSet
    updateBinaryStream(int idx, std::istream *s, int len)odbc::ResultSet
    updateBinaryStream(const std::string &colName, std::istream *s, int len)odbc::ResultSet
    updateBoolean(int idx, bool val)odbc::ResultSet
    updateBoolean(const std::string &colName, bool val)odbc::ResultSet
    updateByte(int idx, signed char val)odbc::ResultSet
    updateByte(const std::string &colName, signed char val)odbc::ResultSet
    updateBytes(int idx, const Bytes &val)odbc::ResultSet
    updateBytes(const std::string &colName, const Bytes &val)odbc::ResultSet
    updateDate(int idx, const Date &val)odbc::ResultSet
    updateDate(const std::string &colName, const Date &val)odbc::ResultSet
    updateDouble(int idx, double val)odbc::ResultSet
    updateDouble(const std::string &colName, double val)odbc::ResultSet
    updateFloat(int idx, float val)odbc::ResultSet
    updateFloat(const std::string &colName, float val)odbc::ResultSet
    updateInt(int idx, int val)odbc::ResultSet
    updateInt(const std::string &colName, int val)odbc::ResultSet
    updateLong(int idx, Long val)odbc::ResultSet
    updateLong(const std::string &colName, Long val)odbc::ResultSet
    updateNull(int idx)odbc::ResultSet
    updateNull(const std::string &colName)odbc::ResultSet
    updateRow()odbc::ResultSet
    updateShort(int idx, short val)odbc::ResultSet
    updateShort(const std::string &colName, short val)odbc::ResultSet
    updateString(int idx, const std::string &val)odbc::ResultSet
    updateString(const std::string &colName, const std::string &val)odbc::ResultSet
    updateTime(int idx, const Time &val)odbc::ResultSet
    updateTime(const std::string &colName, const Time &val)odbc::ResultSet
    updateTimestamp(int idx, const Timestamp &val)odbc::ResultSet
    updateTimestamp(const std::string &colName, const Timestamp &val)odbc::ResultSet
    wasNull()odbc::ResultSet
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~ResultSet()odbc::ResultSet [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set_meta_data.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set_meta_data.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set_meta_data.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set_meta_data.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,12 +1,11 @@ +- ++ + +-odbc::ResultSetMetaData class Reference ++libodbc++: odbc::ResultSetMetaData Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::ResultSetMetaData Class Reference

    Provides meta data about a result set. ++ ++ ++

    odbc::ResultSetMetaData Class Reference

    Provides meta data about a result set. + More... +

    + #include <resultsetmetadata.h> +@@ -14,49 +13,48 @@ + List of all members.

    Public Types

    +
      +
    • enum +-
      Nullability constants.

    +-

    Public Methods

    ++
    Nullability constants.
    ++

    Public Member Functions

    + ++
    Fetch the number of columns in this result set.
  • const std::string & getColumnName (int column) const ++
    Get the name of a column.
  • int getColumnType (int column) const ++
    Get the SQL type of a column.
  • int getPrecision (int column) const ++
    Get the precision of a column.
  • int getScale (int column) const ++
    Get the scale of a column.
  • int getColumnDisplaySize (int column) ++
    Get the display size of a column.
  • std::string getCatalogName (int column) ++
    Get the catalog name for a column.
  • std::string getColumnLabel (int column) ++
    Get the label (if any) for a column.
  • std::string getColumnTypeName (int column) ++
    Get the name of a columns SQL type.
  • std::string getSchemaName (int column) ++
    Get the schema name for a column.
  • std::string getTableName (int column) ++
    Get the table name for a column.
  • bool isAutoIncrement (int column) ++
    Check if a column is autoincrementing.
  • bool isCaseSensitive (int column) ++
    Check if a column is case sensitive.
  • bool isCurrency (int column) ++
    Check if a column can be a currency (eg fixed precision).
  • bool isDefinitelyWritable (int column) ++
    Check if a column can be updated.
  • int isNullable (int column) ++
    Check if a column can be set to NULL.
  • bool isReadOnly (int column) ++
    Check if a column is read only.
  • bool isSearchable (int column) ++
    Check if a column can be used in a where-clause.
  • bool isSigned (int column) ++
    Check if a column is signed.
  • bool isWritable (int column) ++
    Check if a column is 'probably' writeable.
    +

    Detailed Description

    +-Provides meta data about a result set. ++Provides meta data about a result set. +

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -69,31 +67,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::ResultSetMetaData::getCatalogName std::string odbc::ResultSetMetaData::getCatalogName int   column column  ) 
    +
    + +

    +-Get the catalog name for a column. ++Get the catalog name for a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -106,31 +102,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::ResultSetMetaData::getColumnDisplaySize int odbc::ResultSetMetaData::getColumnDisplaySize int   column column  ) 
    +
    + +

    +-Get the display size of a column. ++Get the display size of a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -143,31 +137,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::ResultSetMetaData::getColumnLabel std::string odbc::ResultSetMetaData::getColumnLabel int   column column  ) 
    +
    + +

    +-Get the label (if any) for a column. ++Get the label (if any) for a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -180,31 +172,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    const std::string& odbc::ResultSetMetaData::getColumnName const std::string& odbc::ResultSetMetaData::getColumnName int   column column  )  const
    +
    + +

    +-Get the name of a column. ++Get the name of a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -217,33 +207,30 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::ResultSetMetaData::getColumnType int odbc::ResultSetMetaData::getColumnType int   column column  )  const
    +
    + +

    +-Get the SQL type of a column. ++Get the SQL type of a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    +-See also:
    +-Types
    ++ ++
    column The column index, starting at 1
    ++ ++

    See also:
    Types
    ++ + + +-

    +- ++

    ++

    + +- + +@@ -256,31 +243,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::ResultSetMetaData::getColumnTypeName std::string odbc::ResultSetMetaData::getColumnTypeName int   column column  ) 
    +
    + +

    +-Get the name of a columns SQL type. ++Get the name of a columns SQL type. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -293,31 +278,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::ResultSetMetaData::getPrecision int odbc::ResultSetMetaData::getPrecision int   column column  )  const
    +
    + +

    +-Get the precision of a column. ++Get the precision of a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -330,31 +313,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::ResultSetMetaData::getScale int odbc::ResultSetMetaData::getScale int   column column  )  const
    +
    + +

    +-Get the scale of a column. ++Get the scale of a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -367,31 +348,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::ResultSetMetaData::getSchemaName std::string odbc::ResultSetMetaData::getSchemaName int   column column  ) 
    +
    + +

    +-Get the schema name for a column. ++Get the schema name for a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -404,31 +383,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    std::string odbc::ResultSetMetaData::getTableName std::string odbc::ResultSetMetaData::getTableName int   column column  ) 
    +
    + +

    +-Get the table name for a column. ++Get the table name for a column. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -441,31 +418,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isAutoIncrement bool odbc::ResultSetMetaData::isAutoIncrement int   column column  ) 
    +
    + +

    +-Check if a column is autoincrementing. ++Check if a column is autoincrementing. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -478,31 +453,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isCaseSensitive bool odbc::ResultSetMetaData::isCaseSensitive int   column column  ) 
    +
    + +

    +-Check if a column is case sensitive. ++Check if a column is case sensitive. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -515,31 +488,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isCurrency bool odbc::ResultSetMetaData::isCurrency int   column column  ) 
    +
    + +

    +-Check if a column can be a currency (eg fixed precision). ++Check if a column can be a currency (eg fixed precision). +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -552,31 +523,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isDefinitelyWritable bool odbc::ResultSetMetaData::isDefinitelyWritable int   column column  ) 
    +
    + +

    +-Check if a column can be updated. ++Check if a column can be updated. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -589,31 +558,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    int odbc::ResultSetMetaData::isNullable int odbc::ResultSetMetaData::isNullable int   column column  ) 
    +
    + +

    +-Check if a column can be set to NULL. ++Check if a column can be set to NULL. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -626,31 +593,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isReadOnly bool odbc::ResultSetMetaData::isReadOnly int   column column  ) 
    +
    + +

    +-Check if a column is read only. ++Check if a column is read only. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -663,31 +628,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isSearchable bool odbc::ResultSetMetaData::isSearchable int   column column  ) 
    +
    + +

    +-Check if a column can be used in a where-clause. ++Check if a column can be used in a where-clause. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -700,31 +663,29 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isSigned bool odbc::ResultSetMetaData::isSigned int   column column  ) 
    +
    + +

    +-Check if a column is signed. ++Check if a column is signed. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +-

    +- ++

    ++

    + +- + +@@ -737,19 +698,18 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    bool odbc::ResultSetMetaData::isWritable bool odbc::ResultSetMetaData::isWritable int   column column  ) 
    +
    + +

    +-Check if a column is 'probably' writeable. ++Check if a column is 'probably' writeable. +

    +-

    +-Parameters:
    +- +- +-
    column  +-The column index, starting at 1
    +-
    ++ ++
    column The column index, starting at 1
    ++ ++ + + +


    The documentation for this class was generated from the following file: ++
  • odbc++/resultsetmetadata.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set_meta_data-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set_meta_data-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set_meta_data-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set_meta_data-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,32 +1,31 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::ResultSetMetaData Member List

    This is the complete list of members for odbc::ResultSetMetaData, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::ResultSetMetaData Member List

    This is the complete list of members for odbc::ResultSetMetaData, including all inherited members.

    getCatalogName(int column)odbc::ResultSetMetaData
    getColumnCount() constodbc::ResultSetMetaData
    getColumnDisplaySize(int column)odbc::ResultSetMetaData
    getColumnLabel(int column)odbc::ResultSetMetaData
    getColumnName(int column) constodbc::ResultSetMetaData
    getColumnType(int column) constodbc::ResultSetMetaData
    getColumnTypeName(int column)odbc::ResultSetMetaData
    getPrecision(int column) constodbc::ResultSetMetaData
    getScale(int column) constodbc::ResultSetMetaData
    getSchemaName(int column)odbc::ResultSetMetaData
    getTableName(int column)odbc::ResultSetMetaData
    isAutoIncrement(int column)odbc::ResultSetMetaData
    isCaseSensitive(int column)odbc::ResultSetMetaData
    isCurrency(int column)odbc::ResultSetMetaData
    isDefinitelyWritable(int column)odbc::ResultSetMetaData
    isNullable(int column)odbc::ResultSetMetaData
    isReadOnly(int column)odbc::ResultSetMetaData
    isSearchable(int column)odbc::ResultSetMetaData
    isSigned(int column)odbc::ResultSetMetaData
    isWritable(int column)odbc::ResultSetMetaData
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    getCatalogName(int column)odbc::ResultSetMetaData
    getColumnCount() constodbc::ResultSetMetaData
    getColumnDisplaySize(int column)odbc::ResultSetMetaData
    getColumnLabel(int column)odbc::ResultSetMetaData
    getColumnName(int column) constodbc::ResultSetMetaData
    getColumnType(int column) constodbc::ResultSetMetaData
    getColumnTypeName(int column)odbc::ResultSetMetaData
    getPrecision(int column) constodbc::ResultSetMetaData
    getScale(int column) constodbc::ResultSetMetaData
    getSchemaName(int column)odbc::ResultSetMetaData
    getTableName(int column)odbc::ResultSetMetaData
    isAutoIncrement(int column)odbc::ResultSetMetaData
    isCaseSensitive(int column)odbc::ResultSetMetaData
    isCurrency(int column)odbc::ResultSetMetaData
    isDefinitelyWritable(int column)odbc::ResultSetMetaData
    isNullable(int column)odbc::ResultSetMetaData
    isReadOnly(int column)odbc::ResultSetMetaData
    isSearchable(int column)odbc::ResultSetMetaData
    isSigned(int column)odbc::ResultSetMetaData
    isWritable(int column)odbc::ResultSetMetaData

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_result_set.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_result_set.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,3 @@ ++PNG ++ ++ IHDRyPwDŽPLTE`{tRNS@f,\[t..ъ5вpN=l޵ޅ{Cӈݞ'yz]___k/IENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception.gif libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception.gif +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3 +0,0 @@ +-GIF89a~P`!,~P0Iͻ`(dil뾥 +-tmo<`\Nq(HJQWi^[Oe7ۋ,>js5=ŵ}m{o|lste}gM&x8 \Mk>r2J>[j[iǪŭYvqNFx⭤zB+0hU *T Ѣ"ݧtNAn*U!Vɪ׮:!v,f1vmnW{b.].˷߿ l`È X̸ǐ#KL˘̹Ϡ-oMӌG^ͺudծc6 sŷ=3pqƿ v19oφlෑG_~=菵? }pٙ^r>Ӈ?{u~ ~ w(ل\Ba8`aw x2W"*xau!A7cx>($g +-ʧ]"9_]`?>;cMl.d&#u&kTk 眨I睡ى瞜矕%&蠄j$; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,54 +1,52 @@ +- ++ + +-odbc::SQLException class Reference ++libodbc++: odbc::SQLException Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::SQLException Class Reference

    The exception thrown when errors occur inside the library. ++ ++ ++

    odbc::SQLException Class Reference

    The exception thrown when errors occur inside the library. + More... +

    + #include <types.h> +

    +

    Inheritance diagram for odbc::SQLException: +-

    ++

    + + odbc::SQLWarning + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +-
    • ++
    • + SQLException (const std::string &reason="", const std::string &sqlState="", int vendorCode=0) +-
      Constructor.

    • ++
      Constructor.
    • + SQLException (const DriverMessage &dm) +-
      Copy from a DriverMessage.

    • ++
      Copy from a DriverMessage.
    • + virtual ~SQLException () throw () +-
      Destructor.

    • ++
      Destructor.
    • + int getErrorCode () const +-
      Get the vendor error code of this exception.

    • const std::string & getSQLState () const +-
      Gets the SQLSTATE of this exception. More...

    • ++
      Get the vendor error code of this exception.
    • const std::string & getSQLState () const ++
      Gets the SQLSTATE of this exception.
    • + const std::string & getMessage () const +-
      Gets the description of this message.

    • ++
      Gets the description of this message.
    • + virtual const char * what () const throw () +-
      Gets the description of this message.

    ++
    Gets the description of this message.
    +

    Detailed Description

    +-The exception thrown when errors occur inside the library. ++The exception thrown when errors occur inside the library. +

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -61,13 +59,13 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    const std::string& odbc::SQLException::getSQLState const std::string& odbc::SQLException::getSQLState    )  const
    +
    + +

    +-Gets the SQLSTATE of this exception. ++Gets the SQLSTATE of this exception. +

    + Consult your local ODBC reference for SQLSTATE values.

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,19 +1,18 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::SQLException Member List

    This is the complete list of members for odbc::SQLException, including all inherited members. +- +- +- +- +- +- +- ++ ++ ++

    odbc::SQLException Member List

    This is the complete list of members for odbc::SQLException, including all inherited members.

    getErrorCode() constodbc::SQLException
    getMessage() constodbc::SQLException
    getSQLState() constodbc::SQLException
    SQLException(const std::string &reason="", const std::string &sqlState="", int vendorCode=0)odbc::SQLException
    SQLException(const DriverMessage &dm)odbc::SQLException
    what() constodbc::SQLException [virtual]
    ~SQLException()odbc::SQLException [virtual]
    ++ ++ ++ ++ ++ ++ ++ +
    getErrorCode() constodbc::SQLException
    getMessage() constodbc::SQLException
    getSQLState() constodbc::SQLException
    SQLException(const std::string &reason="", const std::string &sqlState="", int vendorCode=0)odbc::SQLException
    SQLException(const DriverMessage &dm)odbc::SQLException
    what() constodbc::SQLException [virtual]
    ~SQLException()odbc::SQLException [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_exception.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_exception.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,5 @@ ++PNG ++ ++ IHDR~P-PLTE`{tRNS@f\IDATxKr Df֒ns*?Bh$3Τ~ڟ }8 Lu8H8Pe621cF%ft$zI:ԲgΣ.E#- -y,čΥJ}OV;|Ϟ?cWX__{'q^??]Rr?~8ϓ>kGcE)N|U|4*n[QI5t <$ ++.xш R41%f͛lT| ++Ųh^EࣕVXyϿoI^ʷ&x5[K' IENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning.gif libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning.gif +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,6 +0,0 @@ +-GIF89a~P`!,~P80IOͻ`(dil뾥 +-tmo<`W +-hY2ϣ3JCRMD5a>M|B]dm'ޕ~j+ڋ?`PRr~usGaozrlTMZqSm&smKdį _ȝjʿfkwQNgi`xvBU|gj ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,37 +1,36 @@ +- ++ + +-odbc::SQLWarning class Reference ++libodbc++: odbc::SQLWarning Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::SQLWarning Class Reference

    Represents an SQL warning. ++ ++ ++

    odbc::SQLWarning Class Reference

    Represents an SQL warning. + More... +

    + #include <types.h> +

    +

    Inheritance diagram for odbc::SQLWarning: +-

    ++

    + + odbc::SQLException + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    + ++
    Destructor.
    +

    Detailed Description

    +-Represents an SQL warning. ++Represents an SQL warning. +

    + Contains the same info as an SQLException. +

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,22 +1,21 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::SQLWarning Member List

    This is the complete list of members for odbc::SQLWarning, including all inherited members. +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::SQLWarning Member List

    This is the complete list of members for odbc::SQLWarning, including all inherited members.

    getErrorCode() constodbc::SQLException
    getMessage() constodbc::SQLException
    getSQLState() constodbc::SQLException
    SQLException(const std::string &reason="", const std::string &sqlState="", int vendorCode=0)odbc::SQLException
    SQLException(const DriverMessage &dm)odbc::SQLException
    SQLWarning(const std::string &reason="", const std::string &sqlState="", int vendorCode=0)odbc::SQLWarning
    SQLWarning(const DriverMessage &dm)odbc::SQLWarning
    what() constodbc::SQLException [virtual]
    ~SQLException()odbc::SQLException [virtual]
    ~SQLWarning()odbc::SQLWarning [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    getErrorCode() constodbc::SQLException
    getMessage() constodbc::SQLException
    getSQLState() constodbc::SQLException
    SQLException(const std::string &reason="", const std::string &sqlState="", int vendorCode=0)odbc::SQLException
    SQLException(const DriverMessage &dm)odbc::SQLException
    SQLWarning(const std::string &reason="", const std::string &sqlState="", int vendorCode=0)odbc::SQLWarning
    SQLWarning(const DriverMessage &dm)odbc::SQLWarning
    what() constodbc::SQLException [virtual]
    ~SQLException()odbc::SQLException [virtual]
    ~SQLWarning()odbc::SQLWarning [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_s_q_l_warning.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_s_q_l_warning.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,4 @@ ++PNG ++ ++ IHDR~P-PLTE`{tRNS@fXIDATxKr0&k(7H/ԕ ++8uRMMGxFFߏ1gge8Jg$Q/eNO_OySIA0_5 =~/fBH7rkh!6AKCu׽>EBy0>< =gK5 cQ&u<1x~k~comTs2%Pyto,0 {'e)c$hȣ1b{nЫ׆Ѯt}v|ߺ趢q̓3G:. ("  "\O!ÇFBC"ŋ84hǏIɓ(S\˗0cʜIM.oɳϔJђAs]ʴˤBJRXך\ ٳHѪ5v[mew]uw_+pKÈgNƈC.,yrʖbάw3g? --jO>z5֮Fk۸sͻuFd#Ow9Ω9&Of'{տ>ѧ dۣ.>rǾ\?SvW v%H]w 槟JR`B!KtR`Eeކ8Ӊ-cHQ*"7#H#},bN;|B&FwF7uֈIaGޔsk&meingbIWvީUzbܟ*蠄l}h[E(k>:UUlaʚr:բ*VW +-Sj +-*իkS*Rk"+2۪BHԂd@vѶX+x &K!XT +- /#B># 4.@xQF(ըN(N9\p*l8,h!x/t\J3`##C21.L3.x!r5ӁN6Dɼq4H/O+o6=6Y,<"uTo0b 8={lu?l0I_x|0M9]XK5E7E.yA_yƙoo zND٦+]TFJ;_>XPҖÃZsc|K3Z}=Y>?>s'׾q\K 3ҹ\z +-^"&M6k`ڰ` 97!o*ַ^+X! Yd X 7e!𕹭 a@܄&8qA |fÈ9M_\į̈́`[՜Hvqk\VqBT-(‘sD%3.Fo) E苉p;[> @lH3-Lr[dB)Jԑ$*ɀVҕ ; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_statement.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_statement.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_statement.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_statement.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,80 +1,78 @@ +- ++ + +-odbc::Statement class Reference ++libodbc++: odbc::Statement Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Statement Class Reference

    A simple non-prepared statement. ++ ++ ++

    odbc::Statement Class Reference

    A simple non-prepared statement. + More... +

    + #include <statement.h> +

    +

    Inheritance diagram for odbc::Statement: +-

    ++

    + + odbc::ErrorHandler + odbc::PreparedStatement + odbc::CallableStatement + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +
    • virtual ~Statement () +-
      Destructor. More...

    • ++
      Destructor.
    • + Connection * getConnection () +-
      Returns the connection that created this statement.

    • ++
      Returns the connection that created this statement.
    • + void cancel () +-
      Cancel an ongoing operation that was executed in another thread.

    • virtual bool execute (const std::string &sql) +-
      Execute a given SQL statement. More...

    • virtual ResultSet * executeQuery (const std::string &sql) +-
      Execute an SQL statement, expected to return a resultset. More...

    • virtual int executeUpdate (const std::string &sql) +-
      Execute an SQL statement, expected to return an update count. More...

    • int getUpdateCount () +-
      Fetch the current result as an update count. More...

    • ++
      Cancel an ongoing operation that was executed in another thread.
    • virtual bool execute (const std::string &sql) ++
      Execute a given SQL statement.
    • virtual ResultSet * executeQuery (const std::string &sql) ++
      Execute an SQL statement, expected to return a resultset.
    • virtual int executeUpdate (const std::string &sql) ++
      Execute an SQL statement, expected to return an update count.
    • int getUpdateCount () ++
      Fetch the current result as an update count.
    • + ResultSet * getResultSet () +-
      Fetch the current result as a ResultSet.

    • bool getMoreResults () +-
      Check if there are more results available on this statment. More...

    • ++
      Fetch the current result as a ResultSet.
    • bool getMoreResults () ++
      Check if there are more results available on this statment.
    • + void setCursorName (const std::string &name) +-
      Set the cursor name for this statement.

    • ++
      Set the cursor name for this statement.
    • + int getFetchSize () +-
      Fetch the current fetch size (also called rowset size) for resultsets created by this statement.

    • ++
      Fetch the current fetch size (also called rowset size) for resultsets created by this statement.
    • + void setFetchSize (int size) +-
      Set the current fetch size for resultsets created by this statement.

    • ++
      Set the current fetch size for resultsets created by this statement.
    • + int getResultSetConcurrency () +-
      Get the concurrency type for resultsets created by this statement.

    • ++
      Get the concurrency type for resultsets created by this statement.
    • + int getResultSetType () +-
      Get the type for resultsets created by this statement.

    • ++
      Get the type for resultsets created by this statement.
    • + int getQueryTimeout () +-
      Get the query timeout for this statement.

    • ++
      Get the query timeout for this statement.
    • + void setQueryTimeout (int seconds) +-
      Set the query timeout for this statement.

    • ++
      Set the query timeout for this statement.
    • + int getMaxRows () +-
      Get the maximum number of rows to return in a resultset.

    • ++
      Get the maximum number of rows to return in a resultset.
    • + void setMaxRows (int maxRows) +-
      Set the maximum number of rows to return in a resultset.

    • ++
      Set the maximum number of rows to return in a resultset.
    • + int getMaxFieldSize () +-
      Get the maximum field size for resultsets create by this statement.

    • ++
      Get the maximum field size for resultsets create by this statement.
    • + void setMaxFieldSize (int maxFieldSize) +-
      Set the maximum field size for resultsets create by this statement.

    • void setEscapeProcessing (bool on) +-
      Sets escape processing on or off. More...

    • bool getEscapeProcessing () +-
      Gets the current escape processing setting. More...

    • void close () +-
      Closes all result sets from this execution. More...

    ++
    Set the maximum field size for resultsets create by this statement.
  • void setEscapeProcessing (bool on) ++
    Sets escape processing on or off.
  • bool getEscapeProcessing () ++
    Gets the current escape processing setting.
  • void close () ++
    Closes all result sets from this execution.
    +

    Detailed Description

    +-A simple non-prepared statement. ++A simple non-prepared statement. +

    +


    Constructor & Destructor Documentation

    +-

    +- ++

    ++

    + +- + +@@ -87,25 +85,24 @@ + ++Destroys/closes this statement as well as all created resultsets. + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    virtual odbc::Statement::~Statement virtual odbc::Statement::~Statement    )  [virtual]
    +
    + +

    +-Destructor. ++Destructor. +

    +-Destroys/closes this statement as well as all created resultsets.

    +


    Member Function Documentation

    +-

    +- ++

    ++

    + +- + +@@ -118,25 +115,24 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    void odbc::Statement::close void odbc::Statement::close    ) 
    +
    + +

    +-Closes all result sets from this execution. ++Closes all result sets from this execution. +

    + This is useful if you don't wish to iterate through all remaining results, or if your driver does not auto-close cursors.

    +-

    +- ++

    ++

    + +- + +@@ -149,33 +145,30 @@ + ++The statement can return multiple results. To get to the next result after processing the first one, getMoreResults() should be called.
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    virtual bool odbc::Statement::execute virtual bool odbc::Statement::execute const std::string &   sql sql  )  [virtual]
    +
    + +

    +-Execute a given SQL statement. ++Execute a given SQL statement. +

    +-The statement can return multiple results. To get to the next result after processing the first one, getMoreResults() should be called.

    +-Parameters:
    +- +- +-
    sql  +-The string to execute
    +-
    +-Returns:
    +-true if a resultset is available
    ++ ++
    sql The string to execute
    ++ ++

    Returns:
    true if a resultset is available
    ++ + + +-

    +- ++

    ++

    + +- + +@@ -188,33 +181,30 @@ + ++
    Parameters:
    ++
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    virtual ResultSet* odbc::Statement::executeQuery virtual ResultSet* odbc::Statement::executeQuery const std::string &   sql sql  )  [virtual]
    +
    + +

    +-Execute an SQL statement, expected to return a resultset. ++Execute an SQL statement, expected to return a resultset. +

    +-

    +-Parameters:
    +- +- +-
    sql  +-The string to execute
    +-
    +-Returns:
    +-A ResultSet object.
    ++ ++
    sql The string to execute
    ++ ++

    Returns:
    A ResultSet object.
    ++ + + +-

    +- ++

    ++

    + +- + +@@ -227,26 +217,24 @@ + ++
    Returns:
    The number of affected rows
    ++ + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    virtual int odbc::Statement::executeUpdate virtual int odbc::Statement::executeUpdate const std::string &   sql sql  )  [virtual]
    +
    + +

    +-Execute an SQL statement, expected to return an update count. ++Execute an SQL statement, expected to return an update count. +

    +-

    +-Returns:
    +-The number of affected rows
    +-

    +- ++

    ++

    + +- + +@@ -259,26 +247,24 @@ + ++
    Returns:
    true if escape processing is on, false otherwise
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::Statement::getEscapeProcessing bool odbc::Statement::getEscapeProcessing    ) 
    +
    + +

    +-Gets the current escape processing setting. ++Gets the current escape processing setting. +

    +-

    +-Returns:
    +-true if escape processing is on, false otherwise
    +-

    +- ++

    ++

    + +- + +@@ -291,26 +277,24 @@ + ++
    Returns:
    True if this statement has more results to offer.
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    bool odbc::Statement::getMoreResults bool odbc::Statement::getMoreResults    ) 
    +
    + +

    +-Check if there are more results available on this statment. ++Check if there are more results available on this statment. +

    +-

    +-Returns:
    +-True if this statement has more results to offer.
    +-

    +- ++

    ++

    + +- + +@@ -323,27 +307,25 @@ + ++
    Returns:
    the current result's update count (affected rows), or -1 if the result is a ResultSet or if there are no more results.
    ++ + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    int odbc::Statement::getUpdateCount int odbc::Statement::getUpdateCount    ) 
    +
    + +

    +-Fetch the current result as an update count. ++Fetch the current result as an update count. +

    +-

    +-Returns:
    +-the current result's update count (affected rows), or -1 if the result is a ResultSet or if there are no more results.
    +-

    +- ++

    ++

    + +- + +@@ -356,13 +338,13 @@ + ++For PreparedStatements, the command has been parsed on creation, so this setting won't really have any effect. + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    void odbc::Statement::setEscapeProcessing void odbc::Statement::setEscapeProcessing bool   on on  ) 
    +
    + +

    +-Sets escape processing on or off. ++Sets escape processing on or off. +

    +-For PreparedStatements, the command has been parsed on creation, so this setting won't really have any effect.

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/statement.h
    ++
  • odbc++/statement.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_statement-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_statement-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_statement-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_statement-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,39 +1,38 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Statement Member List

    This is the complete list of members for odbc::Statement, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::Statement Member List

    This is the complete list of members for odbc::Statement, including all inherited members.

    cancel()odbc::Statement
    clearWarnings()odbc::ErrorHandler
    close()odbc::Statement
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    execute(const std::string &sql)odbc::Statement [virtual]
    executeQuery(const std::string &sql)odbc::Statement [virtual]
    executeUpdate(const std::string &sql)odbc::Statement [virtual]
    getConnection()odbc::Statement
    getEscapeProcessing()odbc::Statement
    getFetchSize()odbc::Statement
    getMaxFieldSize()odbc::Statement
    getMaxRows()odbc::Statement
    getMoreResults()odbc::Statement
    getQueryTimeout()odbc::Statement
    getResultSet()odbc::Statement
    getResultSetConcurrency()odbc::Statement
    getResultSetType()odbc::Statement
    getUpdateCount()odbc::Statement
    getWarnings()odbc::ErrorHandler
    setCursorName(const std::string &name)odbc::Statement
    setEscapeProcessing(bool on)odbc::Statement
    setFetchSize(int size)odbc::Statement
    setMaxFieldSize(int maxFieldSize)odbc::Statement
    setMaxRows(int maxRows)odbc::Statement
    setQueryTimeout(int seconds)odbc::Statement
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~Statement()odbc::Statement [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    cancel()odbc::Statement
    clearWarnings()odbc::ErrorHandler
    close()odbc::Statement
    ErrorHandler(bool collectWarnings=true)odbc::ErrorHandler [protected]
    execute(const std::string &sql)odbc::Statement [virtual]
    executeQuery(const std::string &sql)odbc::Statement [virtual]
    executeUpdate(const std::string &sql)odbc::Statement [virtual]
    getConnection()odbc::Statement
    getEscapeProcessing()odbc::Statement
    getFetchSize()odbc::Statement
    getMaxFieldSize()odbc::Statement
    getMaxRows()odbc::Statement
    getMoreResults()odbc::Statement
    getQueryTimeout()odbc::Statement
    getResultSet()odbc::Statement
    getResultSetConcurrency()odbc::Statement
    getResultSetType()odbc::Statement
    getUpdateCount()odbc::Statement
    getWarnings()odbc::ErrorHandler
    setCursorName(const std::string &name)odbc::Statement
    setEscapeProcessing(bool on)odbc::Statement
    setFetchSize(int size)odbc::Statement
    setMaxFieldSize(int maxFieldSize)odbc::Statement
    setMaxRows(int maxRows)odbc::Statement
    setQueryTimeout(int seconds)odbc::Statement
    ~ErrorHandler()odbc::ErrorHandler [virtual]
    ~Statement()odbc::Statement [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_statement.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_statement.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_statement.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_statement.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,5 @@ ++PNG ++ ++ IHDRܶPLTE`{tRNS@fIDATxkn0 ɟ}FZi#(!d jC×8nEcg`=}qhhsB2HxD懲LxDPBܡf+ O|A%C`om>B:xPU1M'W7M4-4մt+4\-kiD4jd]d4>ңs7~=K{>٦F3ьf4``yFK]LrA'h.NͳsT@LuɜD@riB΀;c!gm.ZFeFMZ'CiRŲDX}ڦb*ȀjEjˤ6f#'`_z !٦F3ьf4{|;v? }E.m;8 0-*q!q!1D@8!Q P2QZJŅp.@4fM!(84$Bbt6KӍ э ; P@ h( ++9\fCą2 ++$ےVtlS )T+\=[;^KF;KRy}:!'Pьf4hFBZyyOZ:9K=+-o>-yD>њސLKstxg7$i=~@FhxCִ|Ϛς>QWUҦ-4ͫlyCv-ڴoMoȎMTRՏb|i>YF_h'?&%_Zz֭IENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_time.gif libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_time.gif +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_time.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_time.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-GIF89ahP`!,hP0I8ͻ`(Bhɾp|rms_6Шb;fδ,2%MڊC`1ڴu39(']6sn"wy 0}#jh1dx,S>[W4m]{|O7+vHĴļO?v xc HÆ+BL!q≊G`b#?v)2Zɂ'mL `eJ5ȜI͛8s4ϟ6JѣH*]ʴRNJJPVj+ׯ`z KlSUցZ۔ܴerVQv]tڷVlׯ`jv\/Ď3'Fٰ⾂;MsȠ9 ++ + +-odbc::Time class Reference ++libodbc++: odbc::Time Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Time Class Reference

    An SQL TIME. ++ ++ ++

    odbc::Time Class Reference

    An SQL TIME. + More... +

    + #include <types.h> +

    +

    Inheritance diagram for odbc::Time: +-

    ++

    + + odbc::Timestamp + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +-
    • ++
    • + Time (int hour, int minute, int second) +-
      Constructor.

    • Time () +-
      Constructor. More...

    • Time (std::time_t t) +-
      Constructor. More...

    • Time (const std::string &str) +-
      Constructor. More...

    • +-Time (const Time &t) +-
      Copy constructor.

    • +-Time & operator= (const Time &t) +-
      Assignment operator.

    • ++
      Constructor.
    • Time () ++
      Constructor.
    • Time (std::time_t t) ++
      Constructor.
    • Time (const std::string &str) ++
      Constructor.
    • ++Time (const Time &t) ++
      Copy constructor.
    • ++Time & operator= (const Time &t) ++
      Assignment operator.
    • + virtual ~Time () +-
      Destructor.

    • ++
      Destructor.
    • + virtual void setTime (std::time_t t) +-
      Sets the time to the specified time_t value.

    • ++
      Sets the time to the specified time_t value.
    • + std::time_t getTime () const +-
      Returns the time_t value of 1970-01-01 at this time.

    • ++
      Returns the time_t value of 1970-01-01 at this time.
    • + void parse (const std::string &str) +-
      Sets this time from a string in the HH:MM:SS format.

    • ++
      Sets this time from a string in the HH:MM:SS format.
    • + int getHour () const +-
      Gets the hour of this time.

    • ++
      Gets the hour of this time.
    • + int getMinute () const +-
      Gets the minute of this time.

    • ++
      Gets the minute of this time.
    • + int getSecond () const +-
      Gets the second of this time.

    • ++
      Gets the second of this time.
    • + void setHour (int h) +-
      Sets the hour of this time.

    • ++
      Sets the hour of this time.
    • + void setMinute (int m) +-
      Sets the minute of this time.

    • ++
      Sets the minute of this time.
    • + void setSecond (int s) +-
      Sets the second of this time.

    ++
    Sets the second of this time.
    +

    Detailed Description

    +-An SQL TIME. ++An SQL TIME. +

    +


    Constructor & Destructor Documentation

    +-

    +- ++

    ++

    + +- + +@@ -77,25 +75,24 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    odbc::Time::Time odbc::Time::Time    )  [explicit]
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets the time to now.

    +-

    +- ++

    ++

    + +- + +@@ -108,25 +105,24 @@ + + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    odbc::Time::Time odbc::Time::Time std::time_t   t t  ) 
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets the time to the specified time_t value.

    +-

    +- ++

    ++

    + +- + +@@ -139,13 +135,13 @@ + + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    odbc::Time::Time odbc::Time::Time const std::string &   str str  ) 
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets the time to the specified string in the HH:MM:SS format.

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_time-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_time-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_time-members.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_time-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,28 +1,27 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Time Member List

    This is the complete list of members for odbc::Time, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::Time Member List

    This is the complete list of members for odbc::Time, including all inherited members.

    getHour() constodbc::Time
    getMinute() constodbc::Time
    getSecond() constodbc::Time
    getTime() constodbc::Time
    operator=(const Time &t)odbc::Time
    parse(const std::string &str)odbc::Time
    setHour(int h)odbc::Time
    setMinute(int m)odbc::Time
    setSecond(int s)odbc::Time
    setTime(std::time_t t)odbc::Time [virtual]
    Time(int hour, int minute, int second)odbc::Time
    Time()odbc::Time [explicit]
    Time(std::time_t t)odbc::Time
    Time(const std::string &str)odbc::Time
    Time(const Time &t)odbc::Time
    ~Time()odbc::Time [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    getHour() constodbc::Time
    getMinute() constodbc::Time
    getSecond() constodbc::Time
    getTime() constodbc::Time
    operator=(const Time &t)odbc::Time
    parse(const std::string &str)odbc::Time
    setHour(int h)odbc::Time
    setMinute(int m)odbc::Time
    setSecond(int s)odbc::Time
    setTime(std::time_t t)odbc::Time [virtual]
    Time(int hour, int minute, int second)odbc::Time
    Time()odbc::Time [explicit]
    Time(std::time_t t)odbc::Time
    Time(const std::string &str)odbc::Time
    Time(const Time &t)odbc::Time
    ~Time()odbc::Time [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_time.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_time.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_time.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_time.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,5 @@ ++PNG ++ ++ IHDRhP-RPLTE`{tRNS@fIDATx k7@_hlta.8K0TY}$\fmu139k)AHȲ^8~$ss(ujQy|m%{/n7-/)ɾ:E?ԭ?.ܿ-QĴ+9Խ#[m-%Aw +-͇@:3ivVB0W2Qh$PīO ^/`yh& 6nFHVHf؟ʇa ~}H≣⊛(c}38㎡>cBǑH&L6PY$dLAV.[f9JB bXhIn$qj9ZV敘crh|_(vht2Z%{2(Q%^ ꧐J顨B誣j)dZʪꫫ무*{kJ)*}{++ت,vkm^[*K,6;zJJzikjj) Y#p , ;Of s2Ql(^; +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_timestamp.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_timestamp.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_timestamp.html 2003-06-17 12:25:41.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_timestamp.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,65 +1,63 @@ +- ++ + +-odbc::Timestamp class Reference ++libodbc++: odbc::Timestamp Class Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Timestamp Class Reference

    An SQL TIMESTAMP. ++ ++ ++

    odbc::Timestamp Class Reference

    An SQL TIMESTAMP. + More... +

    + #include <types.h> +

    +

    Inheritance diagram for odbc::Timestamp: +-

    ++

    + + odbc::Date + odbc::Time + +-List of all members.

    Public Methods

    ++List of all members.

    Public Member Functions

    +
      +-
    • ++
    • + Timestamp (int year, int month, int day, int hour, int minute, int second, int nanos=0) +-
      Constructor.

    • Timestamp () +-
      Constructor. More...

    • Timestamp (std::time_t t) +-
      Constructor. More...

    • Timestamp (const std::string &s) +-
      Constructor. More...

    • +-Timestamp (const Timestamp &t) +-
      Copy constructor.

    • +-Timestamp & operator= (const Timestamp &t) +-
      Assignment operator.

    • ++
      Constructor.
    • Timestamp () ++
      Constructor.
    • Timestamp (std::time_t t) ++
      Constructor.
    • Timestamp (const std::string &s) ++
      Constructor.
    • ++Timestamp (const Timestamp &t) ++
      Copy constructor.
    • ++Timestamp & operator= (const Timestamp &t) ++
      Assignment operator.
    • + virtual ~Timestamp () +-
      Destructor.

    • ++
      Destructor.
    • + virtual void setTime (std::time_t t) +-
      Sets this timestamp to the specified time_t value.

    • ++
      Sets this timestamp to the specified time_t value.
    • + virtual std::time_t getTime () +-
      Gets the time_t value of this timestamp.

    • ++
      Gets the time_t value of this timestamp.
    • + void parse (const std::string &s) +-
      Set this timestamp from a YYYY-MM-DD HH:MM:SS[.NNN...] format.

    • ++
      Set this timestamp from a YYYY-MM-DD HH:MM:SS[.NNN...] format.
    • + int getNanos () const +-
      Gets the nanoseconds value of this timestamp.

    • ++
      Gets the nanoseconds value of this timestamp.
    • + void setNanos (int nanos) +-
      Sets the nanoseconds value of this timestamp.

    • ++
      Sets the nanoseconds value of this timestamp.
    • + virtual std::string toString () const +-
      Gets the date as a string in the YYYY-MM-DD format.

    ++
    Gets the date as a string in the YYYY-MM-DD format.
    +

    Detailed Description

    +-An SQL TIMESTAMP. ++An SQL TIMESTAMP. +

    +


    Constructor & Destructor Documentation

    +-

    +- ++

    ++

    + +- + +@@ -72,25 +70,24 @@ + + +
    ++ + + +- ++ + +- +- ++ ++ + + +- +
    odbc::Timestamp::Timestamp odbc::Timestamp::Timestamp    )  [explicit]
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets the timestamp to now.

    +-

    +- ++

    ++

    + +- + +@@ -103,25 +100,24 @@ + + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    odbc::Timestamp::Timestamp odbc::Timestamp::Timestamp std::time_t   t t  ) 
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets this timestamp to the specified time_t value.

    +-

    +- ++

    ++

    + +- + +@@ -134,13 +130,13 @@ + + +
    ++ + + +- ++ + + +- +- ++ ++ + + +- +
    odbc::Timestamp::Timestamp odbc::Timestamp::Timestamp const std::string &   s s  ) 
    +
    + +

    +-Constructor. ++Constructor. +

    + Sets this timestamp from a YYYY-MM-DD HH:MM:SS[.NNN...] format

    +


    The documentation for this class was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_timestamp-members.html libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_timestamp-members.html +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_timestamp-members.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_timestamp-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,53 +1,52 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Timestamp Member List

    This is the complete list of members for odbc::Timestamp, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::Timestamp Member List

    This is the complete list of members for odbc::Timestamp, including all inherited members.

    Date(int year, int month, int day)odbc::Date
    Date()odbc::Date [explicit]
    Date(std::time_t t)odbc::Date
    Date(const std::string &str)odbc::Date
    Date(const Date &d)odbc::Date
    getDay() constodbc::Date
    getHour() constodbc::Time
    getMinute() constodbc::Time
    getMonth() constodbc::Date
    getNanos() constodbc::Timestamp
    getSecond() constodbc::Time
    getTime()odbc::Timestamp [virtual]
    odbc::Date::getTime() constodbc::Date
    odbc::Time::getTime() constodbc::Time
    getYear() constodbc::Date
    operator=(const Timestamp &t)odbc::Timestamp
    odbc::Date::operator=(const Date &d)odbc::Date
    odbc::Time::operator=(const Time &t)odbc::Time
    parse(const std::string &s)odbc::Timestamp
    setDay(int day)odbc::Date
    setHour(int h)odbc::Time
    setMinute(int m)odbc::Time
    setMonth(int month)odbc::Date
    setNanos(int nanos)odbc::Timestamp
    setSecond(int s)odbc::Time
    setTime(std::time_t t)odbc::Timestamp [virtual]
    setYear(int year)odbc::Date
    Time(int hour, int minute, int second)odbc::Time
    Time()odbc::Time [explicit]
    Time(std::time_t t)odbc::Time
    Time(const std::string &str)odbc::Time
    Time(const Time &t)odbc::Time
    Timestamp(int year, int month, int day, int hour, int minute, int second, int nanos=0)odbc::Timestamp
    Timestamp()odbc::Timestamp [explicit]
    Timestamp(std::time_t t)odbc::Timestamp
    Timestamp(const std::string &s)odbc::Timestamp
    Timestamp(const Timestamp &t)odbc::Timestamp
    toString() constodbc::Timestamp [virtual]
    ~Date()odbc::Date [virtual]
    ~Time()odbc::Time [virtual]
    ~Timestamp()odbc::Timestamp [virtual]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    Date(int year, int month, int day)odbc::Date
    Date()odbc::Date [explicit]
    Date(std::time_t t)odbc::Date
    Date(const std::string &str)odbc::Date
    Date(const Date &d)odbc::Date
    getDay() constodbc::Date
    getHour() constodbc::Time
    getMinute() constodbc::Time
    getMonth() constodbc::Date
    getNanos() constodbc::Timestamp
    getSecond() constodbc::Time
    getTime()odbc::Timestamp [virtual]
    odbc::Date::getTime() constodbc::Date
    odbc::Time::getTime() constodbc::Time
    getYear() constodbc::Date
    operator=(const Timestamp &t)odbc::Timestamp
    odbc::Date::operator=(const Date &d)odbc::Date
    odbc::Time::operator=(const Time &t)odbc::Time
    parse(const std::string &s)odbc::Timestamp
    setDay(int day)odbc::Date
    setHour(int h)odbc::Time
    setMinute(int m)odbc::Time
    setMonth(int month)odbc::Date
    setNanos(int nanos)odbc::Timestamp
    setSecond(int s)odbc::Time
    setTime(std::time_t t)odbc::Timestamp [virtual]
    setYear(int year)odbc::Date
    Time(int hour, int minute, int second)odbc::Time
    Time()odbc::Time [explicit]
    Time(std::time_t t)odbc::Time
    Time(const std::string &str)odbc::Time
    Time(const Time &t)odbc::Time
    Timestamp(int year, int month, int day, int hour, int minute, int second, int nanos=0)odbc::Timestamp
    Timestamp()odbc::Timestamp [explicit]
    Timestamp(std::time_t t)odbc::Timestamp
    Timestamp(const std::string &s)odbc::Timestamp
    Timestamp(const Timestamp &t)odbc::Timestamp
    toString() constodbc::Timestamp [virtual]
    ~Date()odbc::Date [virtual]
    ~Time()odbc::Time [virtual]
    ~Timestamp()odbc::Timestamp [virtual]

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/classodbc_1_1_timestamp.png libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_timestamp.png +--- libodbc++-0.2.3/doc/progref/classodbc_1_1_timestamp.png 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/classodbc_1_1_timestamp.png 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,4 @@ ++PNG ++ ++ IHDRPvVPLTE`{tRNS@fIDATxKr0&kޠPV ++XXQ1$cϧ(̉]}EJh!B!8Rr& CG!AC2Đ]Z.$xƕ9G>&HK.,EAhHiH%hKam_҈]I˄/itKQV4vp'׭%{#%=9uI\nOe41޾ݟ<{j*aSڭWT¶h*a['ьf^ki٭vAhF3ڥi4h\Dt5|]ګhb8?Cs4+Dc s`-9~# wCѺ綦e¹{rzRf}Ul9]V mhIENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/config_8h-source.html libodbc++-0.2.3-20050404/doc/progref/config_8h-source.html +--- libodbc++-0.2.3/doc/progref/config_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/config_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,182 +1,181 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/config.h Source File ++libodbc++: odbc++/config.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/config.h

    00001 #if !defined(__ODBCXX_SETUP_H)
    +-00002 # error "Do not include this file directly. Use <odbc++/setup.h> instead"
    +-00003 #endif
    +-00004 /* config.h.  Generated by configure.  */
    +-00005 /* config.h.in.  Generated from configure.ac by autoheader.  */
    ++
    ++
    ++

    odbc++/config.h

    00001 #if !defined(__ODBCXX_SETUP_H) ++00002 # error "Do not include this file directly. Use <odbc++/setup.h> instead" ++00003 #endif ++00004 /* config.h. Generated by configure. */ ++00005 /* config.h.in. Generated from configure.ac by autoheader. */ + 00006 +-00007 /* Defined if threads enabled */ +-00008 #define ODBCXX_ENABLE_THREADS 1 +-00009 +-00010 /* Define to 1 if you have the <cstdio> header file. */ +-00011 #define ODBCXX_HAVE_CSTDIO 1 +-00012 +-00013 /* Define to 1 if you have the <cstdlib> header file. */ +-00014 #define ODBCXX_HAVE_CSTDLIB 1 +-00015 +-00016 /* Define to 1 if you have the <cstring> header file. */ +-00017 #define ODBCXX_HAVE_CSTRING 1 +-00018 +-00019 /* Define to 1 if you have the <ctime> header file. */ +-00020 #define ODBCXX_HAVE_CTIME 1 +-00021 +-00022 /* Define to 1 if you have the <dlfcn.h> header file. */ +-00023 #define ODBCXX_HAVE_DLFCN_H 1 +-00024 +-00025 /* Define to 1 if you have the <exception> header file. */ +-00026 #define ODBCXX_HAVE_EXCEPTION 1 +-00027 +-00028 /* Define to 1 if you have the <inttypes.h> header file. */ +-00029 #define ODBCXX_HAVE_INTTYPES_H 1 +-00030 +-00031 /* Define to 1 if you have the <iostream> header file. */ +-00032 #define ODBCXX_HAVE_IOSTREAM 1 +-00033 +-00034 /* Define to 1 if you have the <iostream.h> header file. */ +-00035 #define ODBCXX_HAVE_IOSTREAM_H 1 +-00036 +-00037 /* Defined if using iodbc */ +-00038 /* #undef ODBCXX_HAVE_ISQLEXT_H */ ++00007 /* Defined if threads enabled */ ++00008 /* #undef ODBCXX_ENABLE_THREADS */ ++00009 ++00010 /* Define to 1 if you have the <cstdio> header file. */ ++00011 #define ODBCXX_HAVE_CSTDIO 1 ++00012 ++00013 /* Define to 1 if you have the <cstdlib> header file. */ ++00014 #define ODBCXX_HAVE_CSTDLIB 1 ++00015 ++00016 /* Define to 1 if you have the <cstring> header file. */ ++00017 #define ODBCXX_HAVE_CSTRING 1 ++00018 ++00019 /* Define to 1 if you have the <ctime> header file. */ ++00020 #define ODBCXX_HAVE_CTIME 1 ++00021 ++00022 /* Define to 1 if you have the <dlfcn.h> header file. */ ++00023 #define ODBCXX_HAVE_DLFCN_H 1 ++00024 ++00025 /* Define to 1 if you have the <exception> header file. */ ++00026 #define ODBCXX_HAVE_EXCEPTION 1 ++00027 ++00028 /* Define to 1 if you have the <inttypes.h> header file. */ ++00029 #define ODBCXX_HAVE_INTTYPES_H 1 ++00030 ++00031 /* Define to 1 if you have the <iostream> header file. */ ++00032 #define ODBCXX_HAVE_IOSTREAM 1 ++00033 ++00034 /* Define to 1 if you have the <iostream.h> header file. */ ++00035 #define ODBCXX_HAVE_IOSTREAM_H 1 ++00036 ++00037 /* Defined if using iodbc */ ++00038 /* #undef ODBCXX_HAVE_ISQLEXT_H */ + 00039 +-00040 /* Defined if using iodbc */ +-00041 /* #undef ODBCXX_HAVE_ISQL_H */ ++00040 /* Defined if using iodbc */ ++00041 /* #undef ODBCXX_HAVE_ISQL_H */ + 00042 +-00043 /* Define to 1 if you have the <istream> header file. */ +-00044 #define ODBCXX_HAVE_ISTREAM 1 +-00045 +-00046 /* Defined if using iodbc */ +-00047 /* #undef ODBCXX_HAVE_LIBIODBC */ ++00043 /* Define to 1 if you have the <istream> header file. */ ++00044 #define ODBCXX_HAVE_ISTREAM 1 ++00045 ++00046 /* Defined if using iodbc */ ++00047 /* #undef ODBCXX_HAVE_LIBIODBC */ + 00048 +-00049 /* defined if using unixodbc */ +-00050 #define ODBCXX_HAVE_LIBODBC +-00051 +-00052 /* Define to 1 if you have the `localtime_r' function. */ +-00053 #define ODBCXX_HAVE_LOCALTIME_R 1 +-00054 +-00055 /* Define if we have long long */ +-00056 #define ODBCXX_HAVE_LONG_LONG 1 +-00057 +-00058 /* Define to 1 if you have the <memory.h> header file. */ +-00059 #define ODBCXX_HAVE_MEMORY_H 1 +-00060 +-00061 /* Define to 1 if you have the `pthread_create' function. */ +-00062 /* #undef ODBCXX_HAVE_PTHREAD_CREATE */ ++00049 /* defined if using unixodbc */ ++00050 #define ODBCXX_HAVE_LIBODBC ++00051 ++00052 /* Define to 1 if you have the `localtime_r' function. */ ++00053 /* #undef ODBCXX_HAVE_LOCALTIME_R */ ++00054 ++00055 /* Define if we have long long */ ++00056 #define ODBCXX_HAVE_LONG_LONG 1 ++00057 ++00058 /* Define to 1 if you have the <memory.h> header file. */ ++00059 #define ODBCXX_HAVE_MEMORY_H 1 ++00060 ++00061 /* Define to 1 if you have the `pthread_create' function. */ ++00062 /* #undef ODBCXX_HAVE_PTHREAD_CREATE */ + 00063 +-00064 /* Defined if pthreads are available */ +-00065 #define ODBCXX_HAVE_PTHREAD_H 1 +-00066 +-00067 /* Define to 1 if you have the <readline/history.h> header file. */ +-00068 #define ODBCXX_HAVE_READLINE_HISTORY_H 1 +-00069 +-00070 /* Define to 1 if you have the <readline/readline.h> header file. */ +-00071 #define ODBCXX_HAVE_READLINE_READLINE_H 1 +-00072 +-00073 /* Define to 1 if you have the <set> header file. */ +-00074 #define ODBCXX_HAVE_SET 1 +-00075 +-00076 /* Define to 1 if you have the <set.h> header file. */ +-00077 #define ODBCXX_HAVE_SET_H 1 +-00078 +-00079 /* Define to 1 if you have the `snprintf' function. */ +-00080 #define ODBCXX_HAVE_SNPRINTF 1 +-00081 +-00082 /* Define to 1 if you have the <sqlext.h> header file. */ +-00083 #define ODBCXX_HAVE_SQLEXT_H 1 +-00084 +-00085 /* Define to 1 if you have the <sqlucode.h> header file. */ +-00086 #define ODBCXX_HAVE_SQLUCODE_H 1 +-00087 +-00088 /* Define to 1 if you have the <sql.h> header file. */ +-00089 #define ODBCXX_HAVE_SQL_H 1 +-00090 +-00091 /* Define to 1 if you have the <sstream> header file. */ +-00092 #define ODBCXX_HAVE_SSTREAM 1 +-00093 +-00094 /* Define to 1 if you have the <stdint.h> header file. */ +-00095 #define ODBCXX_HAVE_STDINT_H 1 +-00096 +-00097 /* Define to 1 if you have the <stdlib.h> header file. */ +-00098 #define ODBCXX_HAVE_STDLIB_H 1 +-00099 +-00100 /* Define to 1 if you have the <string> header file. */ +-00101 #define ODBCXX_HAVE_STRING 1 +-00102 +-00103 /* Define to 1 if you have the <strings.h> header file. */ +-00104 #define ODBCXX_HAVE_STRINGS_H 1 +-00105 +-00106 /* Define to 1 if you have the <string.h> header file. */ +-00107 #define ODBCXX_HAVE_STRING_H 1 +-00108 +-00109 /* Define to 1 if you have the <strstream> header file. */ +-00110 #define ODBCXX_HAVE_STRSTREAM 1 +-00111 +-00112 /* Define to 1 if you have the <strstream.h> header file. */ +-00113 #define ODBCXX_HAVE_STRSTREAM_H 1 +-00114 +-00115 /* Define to 1 if you have the `strtoll' function. */ +-00116 /* #undef ODBCXX_HAVE_STRTOLL */ +-00117 +-00118 /* Define to 1 if you have the `strtoq' function. */ +-00119 /* #undef ODBCXX_HAVE_STRTOQ */ +-00120 +-00121 /* Define to 1 if you have the <sys/stat.h> header file. */ +-00122 #define ODBCXX_HAVE_SYS_STAT_H 1 +-00123 +-00124 /* Define to 1 if you have the <sys/types.h> header file. */ +-00125 #define ODBCXX_HAVE_SYS_TYPES_H 1 +-00126 +-00127 /* Define to 1 if you have the <unistd.h> header file. */ +-00128 #define ODBCXX_HAVE_UNISTD_H 1 +-00129 +-00130 /* Define to 1 if you have the <vector> header file. */ +-00131 #define ODBCXX_HAVE_VECTOR 1 +-00132 +-00133 /* Define to 1 if you have the <vector.h> header file. */ +-00134 #define ODBCXX_HAVE_VECTOR_H 1 +-00135 +-00136 /* ODBC version */ +-00137 /* #undef ODBCXX_ODBCVER */ ++00064 /* Defined if pthreads are available */ ++00065 /* #undef ODBCXX_HAVE_PTHREAD_H */ ++00066 ++00067 /* Define to 1 if you have the <readline/history.h> header file. */ ++00068 /* #undef ODBCXX_HAVE_READLINE_HISTORY_H */ ++00069 ++00070 /* Define to 1 if you have the <readline/readline.h> header file. */ ++00071 /* #undef ODBCXX_HAVE_READLINE_READLINE_H */ ++00072 ++00073 /* Define to 1 if you have the <set> header file. */ ++00074 #define ODBCXX_HAVE_SET 1 ++00075 ++00076 /* Define to 1 if you have the <set.h> header file. */ ++00077 #define ODBCXX_HAVE_SET_H 1 ++00078 ++00079 /* Define to 1 if you have the `snprintf' function. */ ++00080 #define ODBCXX_HAVE_SNPRINTF 1 ++00081 ++00082 /* Define to 1 if you have the <sqlext.h> header file. */ ++00083 #define ODBCXX_HAVE_SQLEXT_H 1 ++00084 ++00085 /* Define to 1 if you have the <sqlucode.h> header file. */ ++00086 #define ODBCXX_HAVE_SQLUCODE_H 1 ++00087 ++00088 /* Define to 1 if you have the <sql.h> header file. */ ++00089 #define ODBCXX_HAVE_SQL_H 1 ++00090 ++00091 /* Define to 1 if you have the <sstream> header file. */ ++00092 #define ODBCXX_HAVE_SSTREAM 1 ++00093 ++00094 /* Define to 1 if you have the <stdint.h> header file. */ ++00095 #define ODBCXX_HAVE_STDINT_H 1 ++00096 ++00097 /* Define to 1 if you have the <stdlib.h> header file. */ ++00098 #define ODBCXX_HAVE_STDLIB_H 1 ++00099 ++00100 /* Define to 1 if you have the <string> header file. */ ++00101 #define ODBCXX_HAVE_STRING 1 ++00102 ++00103 /* Define to 1 if you have the <strings.h> header file. */ ++00104 #define ODBCXX_HAVE_STRINGS_H 1 ++00105 ++00106 /* Define to 1 if you have the <string.h> header file. */ ++00107 #define ODBCXX_HAVE_STRING_H 1 ++00108 ++00109 /* Define to 1 if you have the <strstream> header file. */ ++00110 #define ODBCXX_HAVE_STRSTREAM 1 ++00111 ++00112 /* Define to 1 if you have the <strstream.h> header file. */ ++00113 /* #undef ODBCXX_HAVE_STRSTREAM_H */ ++00114 ++00115 /* Define to 1 if you have the `strtoll' function. */ ++00116 #define ODBCXX_HAVE_STRTOLL 1 ++00117 ++00118 /* Define to 1 if you have the `strtoq' function. */ ++00119 #define ODBCXX_HAVE_STRTOQ 1 ++00120 ++00121 /* Define to 1 if you have the <sys/stat.h> header file. */ ++00122 #define ODBCXX_HAVE_SYS_STAT_H 1 ++00123 ++00124 /* Define to 1 if you have the <sys/types.h> header file. */ ++00125 #define ODBCXX_HAVE_SYS_TYPES_H 1 ++00126 ++00127 /* Define to 1 if you have the <unistd.h> header file. */ ++00128 #define ODBCXX_HAVE_UNISTD_H 1 ++00129 ++00130 /* Define to 1 if you have the <vector> header file. */ ++00131 #define ODBCXX_HAVE_VECTOR 1 ++00132 ++00133 /* Define to 1 if you have the <vector.h> header file. */ ++00134 #define ODBCXX_HAVE_VECTOR_H 1 ++00135 ++00136 /* ODBC version */ ++00137 /* #undef ODBCXX_ODBCVER */ + 00138 +-00139 /* Name of package */ +-00140 #define ODBCXX_PACKAGE "libodbc++" +-00141 +-00142 /* Define to the address where bug reports for this package should be sent. */ +-00143 #define ODBCXX_PACKAGE_BUGREPORT "freeodbc++@orcane.net" +-00144 +-00145 /* Define to the full name of this package. */ +-00146 #define ODBCXX_PACKAGE_NAME "libodbcxx" +-00147 +-00148 /* Define to the full name and version of this package. */ +-00149 #define ODBCXX_PACKAGE_STRING "libodbcxx 0.2.3" +-00150 +-00151 /* Define to the one symbol short name of this package. */ +-00152 #define ODBCXX_PACKAGE_TARNAME "libodbc++" +-00153 +-00154 /* Define to the version of this package. */ +-00155 #define ODBCXX_PACKAGE_VERSION "0.2.3" +-00156 +-00157 /* The size of a `int', as computed by sizeof. */ +-00158 #define ODBCXX_SIZEOF_INT 4 +-00159 +-00160 /* The size of a `long', as computed by sizeof. */ +-00161 #define ODBCXX_SIZEOF_LONG 4 +-00162 +-00163 /* The size of a `long long', as computed by sizeof. */ +-00164 #define ODBCXX_SIZEOF_LONG_LONG 8 +-00165 +-00166 /* Define to 1 if you have the ANSI C header files. */ +-00167 #define ODBCXX_STDC_HEADERS 1 +-00168 +-00169 /* Version number of package */ +-00170 #define ODBCXX_VERSION "0.2.3" +-

    ++00139 /* Name of package */ ++00140 #define ODBCXX_PACKAGE "libodbc++" ++00141 ++00142 /* Define to the address where bug reports for this package should be sent. */ ++00143 #define ODBCXX_PACKAGE_BUGREPORT "freeodbc++@orcane.net" ++00144 ++00145 /* Define to the full name of this package. */ ++00146 #define ODBCXX_PACKAGE_NAME "libodbcxx" ++00147 ++00148 /* Define to the full name and version of this package. */ ++00149 #define ODBCXX_PACKAGE_STRING "libodbcxx 0.2.3" ++00150 ++00151 /* Define to the one symbol short name of this package. */ ++00152 #define ODBCXX_PACKAGE_TARNAME "libodbc++" ++00153 ++00154 /* Define to the version of this package. */ ++00155 #define ODBCXX_PACKAGE_VERSION "0.2.3" ++00156 ++00157 /* The size of a `int', as computed by sizeof. */ ++00158 #define ODBCXX_SIZEOF_INT 4 ++00159 ++00160 /* The size of a `long', as computed by sizeof. */ ++00161 #define ODBCXX_SIZEOF_LONG 4 ++00162 ++00163 /* The size of a `long long', as computed by sizeof. */ ++00164 #define ODBCXX_SIZEOF_LONG_LONG 8 ++00165 ++00166 /* Define to 1 if you have the ANSI C header files. */ ++00167 #define ODBCXX_STDC_HEADERS 1 ++00168 ++00169 /* Version number of package */ ++00170 #define ODBCXX_VERSION "0.2.3" ++

    + +diff -Naur libodbc++-0.2.3/doc/progref/config-win32_8h-source.html libodbc++-0.2.3-20050404/doc/progref/config-win32_8h-source.html +--- libodbc++-0.2.3/doc/progref/config-win32_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/config-win32_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,103 +1,102 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/config-win32.h Source File ++libodbc++: odbc++/config-win32.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/config-win32.h

    00001 #if !defined(__ODBCXX_SETUP_H)
    +-00002 # error "Do not include this file directly. Use <odbc++/setup.h> instead"
    +-00003 #endif
    +-00004 
    +-00005 #define ODBCXX_HAVE_SQL_H
    +-00006 #define ODBCXX_HAVE_SQLEXT_H
    +-00007 #define ODBCXX_HAVE_SQLUCODE_H
    +-00008 
    +-00009 #define ODBCXX_HAVE_CSTDIO
    +-00010 #define ODBCXX_HAVE_CSTDLIB
    +-00011 #define ODBCXX_HAVE_CSTRING
    +-00012 #define ODBCXX_HAVE_CTIME
    +-00013 #define ODBCXX_HAVE_IOSTREAM
    +-00014 #define ODBCXX_HAVE_STRSTREAM
    +-00015 #define ODBCXX_HAVE_SET
    +-00016 #define ODBCXX_HAVE_VECTOR
    +-00017 
    ++
    ++
    ++

    odbc++/config-win32.h

    00001 #if !defined(__ODBCXX_SETUP_H) ++00002 # error "Do not include this file directly. Use <odbc++/setup.h> instead" ++00003 #endif ++00004 ++00005 #define ODBCXX_HAVE_SQL_H ++00006 #define ODBCXX_HAVE_SQLEXT_H ++00007 #define ODBCXX_HAVE_SQLUCODE_H ++00008 ++00009 #define ODBCXX_HAVE_CSTDIO ++00010 #define ODBCXX_HAVE_CSTDLIB ++00011 #define ODBCXX_HAVE_CSTRING ++00012 #define ODBCXX_HAVE_CTIME ++00013 #define ODBCXX_HAVE_IOSTREAM ++00014 #define ODBCXX_HAVE_STRSTREAM ++00015 #define ODBCXX_HAVE_SET ++00016 #define ODBCXX_HAVE_VECTOR ++00017 + 00018 +-00019 #define ODBCXX_ENABLE_THREADS +-00020 +-00021 #if defined(_MSC_VER) +-00022 // MSVC has a rather compliant CXX lib +-00023 # define ODBCXX_HAVE_ISO_CXXLIB +-00024 +-00025 # define ODBCXX_HAVE__ITOA +-00026 # define ODBCXX_HAVE__STRICMP +-00027 # define ODBCXX_HAVE__SNPRINTF +-00028 +-00029 # define ODBCXX_HAVE__I64TOA +-00030 # define ODBCXX_HAVE__ATOI64 +-00031 # define ODBCXX_HAVE__ATOI +-00032 +-00033 // disable the 'identifier name truncated in debug info' warning +-00034 # pragma warning(disable:4786) +-00035 +-00036 // disable the 'class blah blah should be exported' warning +-00037 // don't know if this is dangerous, but it only whines about templated +-00038 // and/or inlined classes and it really bothers me =) +-00039 # if defined(ODBCXX_DLL) +-00040 # pragma warning(disable:4251) +-00041 # endif +-00042 +-00043 # if _MSC_VER <= 1200 +-00044 # define ODBCXX_NO_STD_TIME_T +-00045 # endif +-00046 +-00047 #endif // _MSC_VER +-00048 ++00019 #define ODBCXX_ENABLE_THREADS ++00020 ++00021 #if defined(_MSC_VER) ++00022 // MSVC has a rather compliant CXX lib ++00023 # define ODBCXX_HAVE_ISO_CXXLIB ++00024 ++00025 # define ODBCXX_HAVE__ITOA ++00026 # define ODBCXX_HAVE__STRICMP ++00027 # define ODBCXX_HAVE__SNPRINTF ++00028 ++00029 # define ODBCXX_HAVE__I64TOA ++00030 # define ODBCXX_HAVE__ATOI64 ++00031 # define ODBCXX_HAVE__ATOI ++00032 ++00033 // disable the 'identifier name truncated in debug info' warning ++00034 # pragma warning(disable:4786) ++00035 ++00036 // disable the 'class blah blah should be exported' warning ++00037 // don't know if this is dangerous, but it only whines about templated ++00038 // and/or inlined classes and it really bothers me =) ++00039 # if defined(ODBCXX_DLL) ++00040 # pragma warning(disable:4251) ++00041 # endif ++00042 ++00043 # if _MSC_VER <= 1200 ++00044 # define ODBCXX_NO_STD_TIME_T ++00045 # endif ++00046 ++00047 #endif // _MSC_VER ++00048 + 00049 + 00050 +-00051 #if defined(__BORLANDC__) +-00052 +-00053 // FIXME: this should check for older versions +-00054 # define ODBCXX_HAVE_ISO_CXXLIB +-00055 +-00056 # if !defined(_RWSTD_NO_EX_SPEC) +-00057 # define _RWSTD_NO_EX_SPEC 1 +-00058 # endif +-00059 // sql.h only defines this for msc, but borland has __int64 as well +-00060 # if !defined(ODBCINT64) +-00061 # define ODBCINT64 __int64 +-00062 # endif +-00063 +-00064 # define ODBCXX_HAVE_ITOA 1 +-00065 # define ODBCXX_HAVE_STRICMP 1 +-00066 +-00067 #endif // __BORLANDC__ +-00068 ++00051 #if defined(__BORLANDC__) ++00052 ++00053 // FIXME: this should check for older versions ++00054 # define ODBCXX_HAVE_ISO_CXXLIB ++00055 ++00056 # if !defined(_RWSTD_NO_EX_SPEC) ++00057 # define _RWSTD_NO_EX_SPEC 1 ++00058 # endif ++00059 // sql.h only defines this for msc, but borland has __int64 as well ++00060 # if !defined(ODBCINT64) ++00061 # define ODBCINT64 __int64 ++00062 # endif ++00063 ++00064 # define ODBCXX_HAVE_ITOA 1 ++00065 # define ODBCXX_HAVE_STRICMP 1 ++00066 ++00067 #endif // __BORLANDC__ ++00068 + 00069 +-00070 #if defined(__MINGW32__) +-00071 +-00072 // the MS runtime has those +-00073 # if defined(__MSVCRT__) +-00074 # define ODBCXX_HAVE__I64TOA +-00075 # define ODBCXX_HAVE__ATOI64 +-00076 # endif +-00077 +-00078 #define ODBCXX_HAVE__ITOA +-00079 #define ODBCXX_HAVE__STRICMP +-00080 +-00081 #define ODBCXX_HAVE__SNPRINTF +-00082 +-00083 // same as with borland +-00084 # if !defined(ODBCINT64) +-00085 # define ODBCINT64 __int64 +-00086 # endif +-00087 +-00088 #endif // __MINGW32__ +-00089 +-00090 #define WIN32_LEAN_AND_MEAN +-00091 #include <windows.h> +-

    ++00070 #if defined(__MINGW32__) ++00071 ++00072 // the MS runtime has those ++00073 # if defined(__MSVCRT__) ++00074 # define ODBCXX_HAVE__I64TOA ++00075 # define ODBCXX_HAVE__ATOI64 ++00076 # endif ++00077 ++00078 #define ODBCXX_HAVE__ITOA ++00079 #define ODBCXX_HAVE__STRICMP ++00080 ++00081 #define ODBCXX_HAVE__SNPRINTF ++00082 ++00083 // same as with borland ++00084 # if !defined(ODBCINT64) ++00085 # define ODBCINT64 __int64 ++00086 # endif ++00087 ++00088 #endif // __MINGW32__ ++00089 ++00090 #define WIN32_LEAN_AND_MEAN ++00091 #include <windows.h> ++

    + +diff -Naur libodbc++-0.2.3/doc/progref/connection_8h-source.html libodbc++-0.2.3-20050404/doc/progref/connection_8h-source.html +--- libodbc++-0.2.3/doc/progref/connection_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/connection_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,89 +1,88 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/connection.h Source File ++libodbc++: odbc++/connection.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/connection.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/connection.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_CONNECTION_H +-00023 #define __ODBCXX_CONNECTION_H +-00024 +-00025 #include <odbc++/setup.h> +-00026 #include <odbc++/types.h> +-00027 #include <odbc++/errorhandler.h> ++00022 #ifndef __ODBCXX_CONNECTION_H ++00023 #define __ODBCXX_CONNECTION_H ++00024 ++00025 #include <odbc++/setup.h> ++00026 #include <odbc++/types.h> ++00027 #include <odbc++/errorhandler.h> + 00028 +-00029 namespace odbc { ++00029 namespace odbc { + 00030 +-00031 class DriverInfo; +-00032 class DatabaseMetaData; +-00033 class Statement; +-00034 class PreparedStatement; +-00035 class CallableStatement; ++00031 class DriverInfo; ++00032 class DatabaseMetaData; ++00033 class Statement; ++00034 class PreparedStatement; ++00035 class CallableStatement; + 00036 +-00038 class ODBCXX_EXPORT Connection : public ErrorHandler { +-00039 friend class DriverManager; +-00040 friend class Statement; +-00041 friend class DatabaseMetaData; +-00042 friend class DriverInfo; ++00038 class ODBCXX_EXPORT Connection : public ErrorHandler { ++00039 friend class DriverManager; ++00040 friend class Statement; ++00041 friend class DatabaseMetaData; ++00042 friend class DriverInfo; + 00043 +-00044 private: +-00045 struct PD; +-00046 // private data ++00044 private: ++00045 struct PD; ++00046 // private data + 00047 PD* pd_; + 00048 + 00049 SQLHDBC hdbc_; + 00050 +-00051 DatabaseMetaData* metaData_; ++00051 DatabaseMetaData* metaData_; + 00052 DriverInfo* driverInfo_; + 00053 +-00054 //utilities ++00054 //utilities + 00055 SQLUINTEGER _getNumericOption(SQLINTEGER optnum); + 00056 ODBCXX_STRING _getStringOption(SQLINTEGER optnum); +-00057 void _setNumericOption(SQLINTEGER optnum, SQLUINTEGER value); +-00058 void _setStringOption(SQLINTEGER optnum, const ODBCXX_STRING& value); ++00057 void _setNumericOption(SQLINTEGER optnum, SQLUINTEGER value); ++00058 void _setStringOption(SQLINTEGER optnum, const ODBCXX_STRING& value); + 00059 + 00060 SQLHSTMT _allocStmt(); + 00061 +-00062 //private constructor, called from DriverManager ++00062 //private constructor, called from DriverManager + 00063 Connection(SQLHDBC h); + 00064 +-00065 void _connect(const ODBCXX_STRING& dsn, +-00066 const ODBCXX_STRING& user, +-00067 const ODBCXX_STRING& password); ++00065 void _connect(const ODBCXX_STRING& dsn, ++00066 const ODBCXX_STRING& user, ++00067 const ODBCXX_STRING& password); + 00068 +-00069 void _connect(const ODBCXX_STRING& connectString); ++00069 void _connect(const ODBCXX_STRING& connectString); + 00070 +-00071 void _registerStatement(Statement* stmt); +-00072 void _unregisterStatement(Statement* stmt); ++00071 void _registerStatement(Statement* stmt); ++00072 void _unregisterStatement(Statement* stmt); + 00073 +-00074 const DriverInfo* _getDriverInfo() const { +-00075 return driverInfo_; ++00074 const DriverInfo* _getDriverInfo() const { ++00075 return driverInfo_; + 00076 } + 00077 +-00078 public: +-00081 enum TransactionIsolation { ++00078 public: ++00081 enum TransactionIsolation { + 00083 TRANSACTION_NONE, + 00085 TRANSACTION_READ_UNCOMMITTED, + 00087 TRANSACTION_READ_COMMITTED, +@@ -91,67 +90,67 @@ + 00091 TRANSACTION_SERIALIZABLE + 00092 }; + 00093 +-00095 virtual ~Connection(); ++00095 virtual ~Connection(); + 00096 +-00098 bool getAutoCommit(); ++00098 bool getAutoCommit(); + 00099 +-00103 void setAutoCommit(bool autoCommit); ++00103 void setAutoCommit(bool autoCommit); + 00104 +-00106 void commit(); ++00106 void commit(); + 00107 +-00109 void rollback(); ++00109 void rollback(); + 00110 + 00112 ODBCXX_STRING getCatalog(); + 00113 +-00115 void setCatalog(const ODBCXX_STRING& catalog); ++00115 void setCatalog(const ODBCXX_STRING& catalog); + 00116 + 00118 TransactionIsolation getTransactionIsolation(); + 00119 +-00121 void setTransactionIsolation(TransactionIsolation isolation); ++00121 void setTransactionIsolation(TransactionIsolation isolation); + 00122 +-00124 bool isReadOnly(); ++00124 bool isReadOnly(); + 00125 +-00127 void setReadOnly(bool readOnly); ++00127 void setReadOnly(bool readOnly); + 00128 +-00131 bool getTrace(); ++00131 bool getTrace(); + 00132 +-00134 void setTrace(bool on); ++00134 void setTrace(bool on); + 00135 + 00137 ODBCXX_STRING getTraceFile(); + 00138 +-00140 void setTraceFile(const ODBCXX_STRING& s); ++00140 void setTraceFile(const ODBCXX_STRING& s); + 00141 +-00147 DatabaseMetaData* getMetaData(); ++00147 DatabaseMetaData* getMetaData(); + 00148 + 00149 +-00151 Statement* createStatement(); ++00151 Statement* createStatement(); + 00152 +-00159 Statement* createStatement(int resultSetType, +-00160 int resultSetConcurrency); ++00159 Statement* createStatement(int resultSetType, ++00160 int resultSetConcurrency); + 00161 + 00162 +-00167 PreparedStatement* prepareStatement(const ODBCXX_STRING& sql); ++00167 PreparedStatement* prepareStatement(const ODBCXX_STRING& sql); + 00168 +-00177 PreparedStatement* prepareStatement(const ODBCXX_STRING& sql, +-00178 int resultSetType, +-00179 int resultSetConcurrency); ++00177 PreparedStatement* prepareStatement(const ODBCXX_STRING& sql, ++00178 int resultSetType, ++00179 int resultSetConcurrency); + 00180 +-00185 CallableStatement* prepareCall(const ODBCXX_STRING& sql); ++00185 CallableStatement* prepareCall(const ODBCXX_STRING& sql); + 00186 +-00195 CallableStatement* prepareCall(const ODBCXX_STRING& sql, +-00196 int resultSetType, +-00197 int resultSetConcurrency); ++00195 CallableStatement* prepareCall(const ODBCXX_STRING& sql, ++00196 int resultSetType, ++00197 int resultSetConcurrency); + 00198 +-00202 ODBCXX_STRING nativeSQL(const ODBCXX_STRING& sql); ++00202 ODBCXX_STRING nativeSQL(const ODBCXX_STRING& sql); + 00203 }; + 00204 + 00205 + 00206 +-00207 }; // namespace odbc ++00207 }; // namespace odbc + 00208 + 00209 +-00210 #endif // __ODBCXX_CONNECTION_H +-

    ++00210 #endif // __ODBCXX_CONNECTION_H ++
    + +diff -Naur libodbc++-0.2.3/doc/progref/databasemetadata_8h-source.html libodbc++-0.2.3-20050404/doc/progref/databasemetadata_8h-source.html +--- libodbc++-0.2.3/doc/progref/databasemetadata_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/databasemetadata_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,108 +1,107 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/databasemetadata.h Source File ++libodbc++: odbc++/databasemetadata.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/databasemetadata.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/databasemetadata.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_DATABASEMETADATA_H +-00023 #define __ODBCXX_DATABASEMETADATA_H +-00024 +-00025 #include <odbc++/setup.h> +-00026 #include <odbc++/types.h> +-00027 #include <odbc++/connection.h> ++00022 #ifndef __ODBCXX_DATABASEMETADATA_H ++00023 #define __ODBCXX_DATABASEMETADATA_H ++00024 ++00025 #include <odbc++/setup.h> ++00026 #include <odbc++/types.h> ++00027 #include <odbc++/connection.h> + 00028 +-00029 namespace odbc { ++00029 namespace odbc { + 00030 +-00031 class ResultSet; +-00032 class DriverInfo; ++00031 class ResultSet; ++00032 class DriverInfo; + 00033 +-00043 class ODBCXX_EXPORT DatabaseMetaData { +-00044 friend class Connection; +-00045 friend class DriverInfo; ++00043 class ODBCXX_EXPORT DatabaseMetaData { ++00044 friend class Connection; ++00045 friend class DriverInfo; + 00046 +-00047 private: +-00048 Connection* connection_; ++00047 private: ++00048 Connection* connection_; + 00049 +-00050 DatabaseMetaData(Connection* c); ++00050 DatabaseMetaData(Connection* c); + 00051 ~DatabaseMetaData(); + 00052 +-00053 const DriverInfo* _getDriverInfo() const { +-00054 return connection_->_getDriverInfo(); ++00053 const DriverInfo* _getDriverInfo() const { ++00054 return connection_->_getDriverInfo(); + 00055 } + 00056 +-00057 SQLUSMALLINT _getNumeric16(int what); +-00058 SQLUINTEGER _getNumeric32(int what); ++00057 SQLUSMALLINT _getNumeric16(int what); ++00058 SQLUINTEGER _getNumeric32(int what); + 00059 +-00060 ODBCXX_STRING _getStringInfo(int what); +-00061 bool _ownXXXAreVisible(int type, int what); ++00060 ODBCXX_STRING _getStringInfo(int what); ++00061 bool _ownXXXAreVisible(int type, int what); + 00062 +-00063 #if ODBCVER >= 0x0300 +-00064 // returns all CA1 or-ed together ++00063 #if ODBCVER >= 0x0300 ++00064 // returns all CA1 or-ed together + 00065 SQLUINTEGER _getAllCursorAttributes1(); +-00066 #endif +-00067 +-00068 public: ++00066 #endif ++00067 ++00068 public: + 00069 +-00071 Connection* getConnection() { +-00072 return connection_; ++00071 Connection* getConnection() { ++00072 return connection_; + 00073 } + 00074 +-00076 enum { ++00076 enum { + 00077 bestRowTemporary = SQL_SCOPE_CURROW, + 00078 bestRowTransaction = SQL_SCOPE_TRANSACTION, + 00079 bestRowSession = SQL_SCOPE_SESSION + 00080 }; + 00081 +-00083 enum { ++00083 enum { + 00084 bestRowUnknown = SQL_PC_UNKNOWN, + 00085 bestRowPseudo = SQL_PC_PSEUDO, + 00086 bestRowNotPseudo = SQL_PC_NOT_PSEUDO + 00087 }; + 00088 + 00089 +-00093 enum { ++00093 enum { + 00094 versionColumnNotPseudo = SQL_PC_NOT_PSEUDO, + 00095 versionColumnPseudo = SQL_PC_PSEUDO, + 00096 versionColumnUnknown = SQL_PC_UNKNOWN + 00097 }; + 00098 + 00099 +-00103 enum { ++00103 enum { + 00104 typeNoNulls = SQL_NO_NULLS, + 00105 typeNullable = SQL_NULLABLE, + 00106 typeNullableUnknown = SQL_NULLABLE_UNKNOWN + 00107 }; + 00108 +-00113 enum { ++00113 enum { + 00114 columnNoNulls = SQL_NO_NULLS, + 00115 columnNullable = SQL_NULLABLE, + 00116 columnNullableUnknown = SQL_NULLABLE_UNKNOWN + 00117 }; + 00118 +-00120 enum { ++00120 enum { + 00122 typePredNone = SQL_UNSEARCHABLE, + 00124 typePredChar = SQL_LIKE_ONLY, + 00126 typePredBasic = SQL_ALL_EXCEPT_LIKE, +@@ -110,17 +109,17 @@ + 00129 }; + 00130 + 00131 +-00135 #if ODBCVER >= 0x0300 +-00136 enum { ++00135 #if ODBCVER >= 0x0300 ++00136 enum { + 00137 importedKeyCascade = SQL_CASCADE, + 00138 importedKeySetNull = SQL_SET_NULL, + 00139 importedKeySetDefault = SQL_SET_DEFAULT, + 00140 importedKeyNoAction = SQL_NO_ACTION, + 00141 importedKeyRestrict = SQL_RESTRICT + 00142 }; +-00143 #else +-00144 // workaround mode on +-00145 enum { ++00143 #else ++00144 // workaround mode on ++00145 enum { + 00146 importedKeyCascade = SQL_CASCADE, + 00147 importedKeySetNull = SQL_SET_NULL, + 00148 importedKeyRestrict = SQL_RESTRICT, +@@ -128,29 +127,29 @@ + 00150 importedKeySetDefault + 00151 }; + 00152 +-00153 #endif +-00154 +-00155 #if ODBCVER >= 0x0300 +-00156 #if !defined(SQL_NOT_DEFERRABLE) +-00157 # warning "Your sqlext.h is missing SQL_NOT_DEFERRABLE, consider upgrading" +-00158 # define SQL_NOT_DEFERRABLE 7 +-00159 #endif +-00160 +-00161 enum { ++00153 #endif ++00154 ++00155 #if ODBCVER >= 0x0300 ++00156 #if !defined(SQL_NOT_DEFERRABLE) ++00157 # warning "Your sqlext.h is missing SQL_NOT_DEFERRABLE, consider upgrading" ++00158 # define SQL_NOT_DEFERRABLE 7 ++00159 #endif ++00160 ++00161 enum { + 00162 importedKeyInitiallyDeferred = SQL_INITIALLY_DEFERRED, + 00163 importedKeyInitiallyImmediate = SQL_INITIALLY_IMMEDIATE, + 00164 importedKeyNotDeferrable = SQL_NOT_DEFERRABLE + 00165 }; +-00166 #endif +-00167 +-00169 enum { ++00166 #endif ++00167 ++00169 enum { + 00170 tableIndexClustered = SQL_INDEX_CLUSTERED, + 00171 tableIndexHashed = SQL_INDEX_HASHED, + 00172 tableIndexOther = SQL_INDEX_OTHER, + 00173 tableIndexStatistic = SQL_TABLE_STAT + 00174 }; + 00175 +-00179 enum { ++00179 enum { + 00180 procedureColumnIn = SQL_PARAM_INPUT, + 00181 procedureColumnInOut = SQL_PARAM_INPUT_OUTPUT, + 00182 procedureColumnOut = SQL_PARAM_OUTPUT, +@@ -159,13 +158,13 @@ + 00185 procedureColumnUnknown = SQL_PARAM_TYPE_UNKNOWN + 00186 }; + 00187 +-00191 enum { ++00191 enum { + 00192 procedureNoNulls = SQL_NO_NULLS, + 00193 procedureNullable = SQL_NULLABLE, + 00194 procedureNullableUnknown = SQL_NULLABLE_UNKNOWN + 00195 }; + 00196 +-00200 enum { ++00200 enum { + 00201 procedureReturnsResult = SQL_PT_FUNCTION, + 00202 procedureNoResult = SQL_PT_PROCEDURE, + 00203 procedureResultUnknown = SQL_PT_UNKNOWN +@@ -181,9 +180,9 @@ + 00219 + 00222 ODBCXX_STRING getDriverVersion(); + 00223 +-00225 int getDriverMajorVersion(); ++00225 int getDriverMajorVersion(); + 00226 +-00228 int getDriverMinorVersion(); ++00228 int getDriverMinorVersion(); + 00229 + 00233 ODBCXX_STRING getIdentifierQuoteString(); + 00234 +@@ -199,82 +198,82 @@ + 00257 + 00264 ODBCXX_STRING getCatalogSeparator(); + 00265 +-00271 bool isCatalogAtStart(); ++00271 bool isCatalogAtStart(); + 00272 + 00276 ODBCXX_STRING getSQLKeywords(); + 00277 + 00278 +-00281 bool supportsTransactions(); ++00281 bool supportsTransactions(); + 00282 +-00286 int getDefaultTransactionIsolation(); ++00286 int getDefaultTransactionIsolation(); + 00287 +-00292 bool supportsTransactionIsolationLevel(int lev); ++00292 bool supportsTransactionIsolationLevel(int lev); + 00293 +-00306 bool supportsDataDefinitionAndDataManipulationTransactions(); ++00306 bool supportsDataDefinitionAndDataManipulationTransactions(); + 00307 +-00322 bool supportsDataManipulationTransactionsOnly(); ++00322 bool supportsDataManipulationTransactionsOnly(); + 00323 +-00336 bool dataDefinitionCausesTransactionCommit(); ++00336 bool dataDefinitionCausesTransactionCommit(); + 00337 +-00350 bool dataDefinitionIgnoredInTransactions(); ++00350 bool dataDefinitionIgnoredInTransactions(); + 00351 + 00352 +-00355 bool supportsTableCorrelationNames(); ++00355 bool supportsTableCorrelationNames(); + 00356 +-00359 bool supportsDifferentTableCorrelationNames(); ++00359 bool supportsDifferentTableCorrelationNames(); + 00360 +-00363 bool supportsOrderByUnrelated(); ++00363 bool supportsOrderByUnrelated(); + 00364 +-00367 bool supportsExpressionsInOrderBy(); ++00367 bool supportsExpressionsInOrderBy(); + 00368 +-00373 bool supportsOpenCursorsAcrossCommit(); ++00373 bool supportsOpenCursorsAcrossCommit(); + 00374 + 00375 +-00380 bool supportsOpenCursorsAcrossRollback(); ++00380 bool supportsOpenCursorsAcrossRollback(); + 00381 + 00382 +-00387 bool supportsOpenStatementsAcrossCommit(); ++00387 bool supportsOpenStatementsAcrossCommit(); + 00388 +-00393 bool supportsOpenStatementsAcrossRollback(); ++00393 bool supportsOpenStatementsAcrossRollback(); + 00394 +-00400 bool supportsResultSetType(int type); ++00400 bool supportsResultSetType(int type); + 00401 +-00408 bool supportsResultSetConcurrency(int type, int concurrency); ++00408 bool supportsResultSetConcurrency(int type, int concurrency); + 00409 + 00410 +-00412 bool supportsCatalogsInDataManipulation(); ++00412 bool supportsCatalogsInDataManipulation(); + 00413 +-00415 bool supportsCatalogsInProcedureCalls(); ++00415 bool supportsCatalogsInProcedureCalls(); + 00416 +-00418 bool supportsCatalogsInTableDefinitions(); ++00418 bool supportsCatalogsInTableDefinitions(); + 00419 +-00421 bool supportsCatalogsInIndexDefinitions(); ++00421 bool supportsCatalogsInIndexDefinitions(); + 00422 +-00424 bool supportsCatalogsInPrivilegeDefinitions(); ++00424 bool supportsCatalogsInPrivilegeDefinitions(); + 00425 + 00426 +-00428 bool supportsSchemasInDataManipulation(); ++00428 bool supportsSchemasInDataManipulation(); + 00429 +-00431 bool supportsSchemasInProcedureCalls(); ++00431 bool supportsSchemasInProcedureCalls(); + 00432 +-00434 bool supportsSchemasInTableDefinitions(); ++00434 bool supportsSchemasInTableDefinitions(); + 00435 +-00437 bool supportsSchemasInIndexDefinitions(); ++00437 bool supportsSchemasInIndexDefinitions(); + 00438 +-00440 bool supportsSchemasInPrivilegeDefinitions(); ++00440 bool supportsSchemasInPrivilegeDefinitions(); + 00441 + 00442 +-00445 bool nullPlusNonNullIsNull(); ++00445 bool nullPlusNonNullIsNull(); + 00446 +-00450 bool supportsColumnAliasing(); ++00450 bool supportsColumnAliasing(); + 00451 +-00454 bool supportsConvert(); ++00454 bool supportsConvert(); + 00455 +-00458 bool supportsConvert(int fromType, int toType); ++00458 bool supportsConvert(int fromType, int toType); + 00459 +-00462 bool supportsAlterTableWithDropColumn(); ++00462 bool supportsAlterTableWithDropColumn(); + 00463 +-00466 bool supportsAlterTableWithAddColumn(); ++00466 bool supportsAlterTableWithAddColumn(); + 00467 + 00471 ODBCXX_STRING getExtraNameCharacters(); + 00472 +@@ -288,254 +287,254 @@ + 00488 + 00491 ODBCXX_STRING getNumericFunctions(); + 00492 +-00495 bool supportsLikeEscapeClause(); ++00495 bool supportsLikeEscapeClause(); + 00496 +-00499 bool supportsMultipleResultSets(); ++00499 bool supportsMultipleResultSets(); + 00500 +-00504 bool supportsMultipleTransactions(); ++00504 bool supportsMultipleTransactions(); + 00505 +-00508 bool supportsNonNullableColumns(); ++00508 bool supportsNonNullableColumns(); + 00509 +-00512 bool supportsMinimumSQLGrammar(); ++00512 bool supportsMinimumSQLGrammar(); + 00513 +-00516 bool supportsCoreSQLGrammar(); ++00516 bool supportsCoreSQLGrammar(); + 00517 +-00520 bool supportsExtendedSQLGrammar(); ++00520 bool supportsExtendedSQLGrammar(); + 00521 + 00522 +-00526 bool supportsANSI92EntryLevelSQL(); ++00526 bool supportsANSI92EntryLevelSQL(); + 00527 +-00531 bool supportsANSI92IntermediateSQL(); ++00531 bool supportsANSI92IntermediateSQL(); + 00532 +-00535 bool supportsANSI92FullSQL(); ++00535 bool supportsANSI92FullSQL(); + 00536 +-00542 bool supportsPositionedDelete(); ++00542 bool supportsPositionedDelete(); + 00543 +-00549 bool supportsPositionedUpdate(); ++00549 bool supportsPositionedUpdate(); + 00550 +-00556 bool supportsSelectForUpdate(); ++00556 bool supportsSelectForUpdate(); + 00557 + 00558 +-00562 bool supportsIntegrityEnhancementFacility(); ++00562 bool supportsIntegrityEnhancementFacility(); + 00563 +-00566 bool supportsBatchUpdates(); ++00566 bool supportsBatchUpdates(); + 00567 +-00570 bool supportsSubqueriesInComparisons(); ++00570 bool supportsSubqueriesInComparisons(); + 00571 +-00575 bool supportsSubqueriesInExists(); ++00575 bool supportsSubqueriesInExists(); + 00576 +-00580 bool supportsSubqueriesInIns(); ++00580 bool supportsSubqueriesInIns(); + 00581 +-00585 bool supportsSubqueriesInQuantifieds(); ++00585 bool supportsSubqueriesInQuantifieds(); + 00586 + 00587 +-00590 bool supportsCorrelatedSubqueries(); ++00590 bool supportsCorrelatedSubqueries(); + 00591 +-00596 bool ownUpdatesAreVisible(int type); ++00596 bool ownUpdatesAreVisible(int type); + 00597 +-00601 bool ownDeletesAreVisible(int type); ++00601 bool ownDeletesAreVisible(int type); + 00602 +-00606 bool ownInsertsAreVisible(int type); ++00606 bool ownInsertsAreVisible(int type); + 00607 +-00612 bool othersUpdatesAreVisible(int type); ++00612 bool othersUpdatesAreVisible(int type); + 00613 +-00618 bool othersDeletesAreVisible(int type); ++00618 bool othersDeletesAreVisible(int type); + 00619 +-00624 bool othersInsertsAreVisible(int type); ++00624 bool othersInsertsAreVisible(int type); + 00625 +-00630 bool deletesAreDetected(int type); ++00630 bool deletesAreDetected(int type); + 00631 +-00636 bool insertsAreDetected(int type); ++00636 bool insertsAreDetected(int type); + 00637 +-00642 bool updatesAreDetected(int type); ++00642 bool updatesAreDetected(int type); + 00643 + 00644 +-00648 int getMaxBinaryLiteralLength(); ++00648 int getMaxBinaryLiteralLength(); + 00649 +-00652 int getMaxCharLiteralLength(); ++00652 int getMaxCharLiteralLength(); + 00653 +-00656 int getMaxColumnNameLength(); ++00656 int getMaxColumnNameLength(); + 00657 +-00661 int getMaxColumnsInGroupBy(); ++00661 int getMaxColumnsInGroupBy(); + 00662 +-00665 int getMaxColumnsInIndex(); ++00665 int getMaxColumnsInIndex(); + 00666 +-00670 int getMaxColumnsInOrderBy(); ++00670 int getMaxColumnsInOrderBy(); + 00671 +-00674 int getMaxColumnsInSelect(); ++00674 int getMaxColumnsInSelect(); + 00675 +-00678 int getMaxColumnsInTable(); ++00678 int getMaxColumnsInTable(); + 00679 +-00682 int getMaxCursorNameLength(); ++00682 int getMaxCursorNameLength(); + 00683 +-00686 int getMaxIndexLength(); ++00686 int getMaxIndexLength(); + 00687 +-00690 int getMaxSchemaNameLength(); ++00690 int getMaxSchemaNameLength(); + 00691 +-00694 int getMaxProcedureNameLength(); ++00694 int getMaxProcedureNameLength(); + 00695 +-00698 int getMaxCatalogNameLength(); ++00698 int getMaxCatalogNameLength(); + 00699 +-00702 int getMaxRowSize(); ++00702 int getMaxRowSize(); + 00703 +-00707 bool doesMaxRowSizeIncludeBlobs(); ++00707 bool doesMaxRowSizeIncludeBlobs(); + 00708 + 00709 +-00712 int getMaxStatementLength(); ++00712 int getMaxStatementLength(); + 00713 +-00716 int getMaxTableNameLength(); ++00716 int getMaxTableNameLength(); + 00717 +-00721 int getMaxTablesInSelect(); ++00721 int getMaxTablesInSelect(); + 00722 +-00725 int getMaxUserNameLength(); ++00725 int getMaxUserNameLength(); + 00726 +-00730 int getMaxConnections(); ++00730 int getMaxConnections(); + 00731 +-00735 int getMaxStatements(); ++00735 int getMaxStatements(); + 00736 + 00737 +-00741 bool supportsMixedCaseIdentifiers(); ++00741 bool supportsMixedCaseIdentifiers(); + 00742 +-00746 bool supportsMixedCaseQuotedIdentifiers(); ++00746 bool supportsMixedCaseQuotedIdentifiers(); + 00747 +-00751 bool supportsStoredProcedures(); ++00751 bool supportsStoredProcedures(); + 00752 + 00753 +-00757 bool supportsGroupBy(); ++00757 bool supportsGroupBy(); + 00758 +-00762 bool supportsGroupByUnrelated(); ++00762 bool supportsGroupByUnrelated(); + 00763 +-00767 bool supportsGroupByBeyondSelect(); ++00767 bool supportsGroupByBeyondSelect(); + 00768 + 00769 +-00772 bool supportsUnion(); ++00772 bool supportsUnion(); + 00773 +-00776 bool supportsUnionAll(); ++00776 bool supportsUnionAll(); + 00777 +-00781 bool supportsOuterJoins(); ++00781 bool supportsOuterJoins(); + 00782 +-00785 bool supportsFullOuterJoins(); ++00785 bool supportsFullOuterJoins(); + 00786 +-00790 bool supportsLimitedOuterJoins(); ++00790 bool supportsLimitedOuterJoins(); + 00791 +-00793 bool usesLocalFilePerTable(); ++00793 bool usesLocalFilePerTable(); + 00794 +-00796 bool usesLocalFiles(); ++00796 bool usesLocalFiles(); + 00797 +-00801 bool nullsAreSortedAtStart(); ++00801 bool nullsAreSortedAtStart(); + 00802 +-00806 bool nullsAreSortedAtEnd(); ++00806 bool nullsAreSortedAtEnd(); + 00807 +-00810 bool nullsAreSortedHigh(); ++00810 bool nullsAreSortedHigh(); + 00811 +-00814 bool nullsAreSortedLow(); ++00814 bool nullsAreSortedLow(); + 00815 +-00819 bool allProceduresAreCallable(); ++00819 bool allProceduresAreCallable(); + 00820 +-00824 bool allTablesAreSelectable(); ++00824 bool allTablesAreSelectable(); + 00825 +-00829 bool isReadOnly(); ++00829 bool isReadOnly(); + 00830 +-00834 bool storesLowerCaseIdentifiers(); ++00834 bool storesLowerCaseIdentifiers(); + 00835 +-00839 bool storesLowerCaseQuotedIdentifiers(); ++00839 bool storesLowerCaseQuotedIdentifiers(); + 00840 +-00844 bool storesMixedCaseIdentifiers(); ++00844 bool storesMixedCaseIdentifiers(); + 00845 +-00849 bool storesMixedCaseQuotedIdentifiers(); ++00849 bool storesMixedCaseQuotedIdentifiers(); + 00850 +-00854 bool storesUpperCaseIdentifiers(); ++00854 bool storesUpperCaseIdentifiers(); + 00855 +-00859 bool storesUpperCaseQuotedIdentifiers(); ++00859 bool storesUpperCaseQuotedIdentifiers(); + 00860 + 00861 + 00908 ResultSet* getTypeInfo(); + 00909 +-00945 ResultSet* getColumns(const ODBCXX_STRING& catalog, +-00946 const ODBCXX_STRING& schemaPattern, +-00947 const ODBCXX_STRING& tableNamePattern, +-00948 const ODBCXX_STRING& columnNamePattern); ++00945 ResultSet* getColumns(const ODBCXX_STRING& catalog, ++00946 const ODBCXX_STRING& schemaPattern, ++00947 const ODBCXX_STRING& tableNamePattern, ++00948 const ODBCXX_STRING& columnNamePattern); + 00949 + 00950 +-00965 ResultSet* getTables(const ODBCXX_STRING& catalog, +-00966 const ODBCXX_STRING& schemaPattern, +-00967 const ODBCXX_STRING& tableNamePattern, +-00968 const std::vector<ODBCXX_STRING>& types); ++00965 ResultSet* getTables(const ODBCXX_STRING& catalog, ++00966 const ODBCXX_STRING& schemaPattern, ++00967 const ODBCXX_STRING& tableNamePattern, ++00968 const std::vector<ODBCXX_STRING>& types); + 00969 +-00994 ResultSet* getTablePrivileges(const ODBCXX_STRING& catalog, +-00995 const ODBCXX_STRING& schemaPattern, +-00996 const ODBCXX_STRING& tableNamePattern); ++00994 ResultSet* getTablePrivileges(const ODBCXX_STRING& catalog, ++00995 const ODBCXX_STRING& schemaPattern, ++00996 const ODBCXX_STRING& tableNamePattern); + 00997 + 00998 +-01021 ResultSet* getColumnPrivileges(const ODBCXX_STRING& catalog, +-01022 const ODBCXX_STRING& schema, +-01023 const ODBCXX_STRING& table, +-01024 const ODBCXX_STRING& columnNamePattern); ++01021 ResultSet* getColumnPrivileges(const ODBCXX_STRING& catalog, ++01022 const ODBCXX_STRING& schema, ++01023 const ODBCXX_STRING& table, ++01024 const ODBCXX_STRING& columnNamePattern); + 01025 +-01041 ResultSet* getPrimaryKeys(const ODBCXX_STRING& catalog, +-01042 const ODBCXX_STRING& schema, +-01043 const ODBCXX_STRING& table); ++01041 ResultSet* getPrimaryKeys(const ODBCXX_STRING& catalog, ++01042 const ODBCXX_STRING& schema, ++01043 const ODBCXX_STRING& table); + 01044 + 01045 +-01091 ResultSet* getIndexInfo(const ODBCXX_STRING& catalog, +-01092 const ODBCXX_STRING& schema, +-01093 const ODBCXX_STRING& table, +-01094 bool unique, bool approximate); ++01091 ResultSet* getIndexInfo(const ODBCXX_STRING& catalog, ++01092 const ODBCXX_STRING& schema, ++01093 const ODBCXX_STRING& table, ++01094 bool unique, bool approximate); + 01095 +-01140 ResultSet* getCrossReference(const ODBCXX_STRING& primaryCatalog, +-01141 const ODBCXX_STRING& primarySchema, +-01142 const ODBCXX_STRING& primaryTable, +-01143 const ODBCXX_STRING& foreignCatalog, +-01144 const ODBCXX_STRING& foreignSchema, +-01145 const ODBCXX_STRING& foreignTable); ++01140 ResultSet* getCrossReference(const ODBCXX_STRING& primaryCatalog, ++01141 const ODBCXX_STRING& primarySchema, ++01142 const ODBCXX_STRING& primaryTable, ++01143 const ODBCXX_STRING& foreignCatalog, ++01144 const ODBCXX_STRING& foreignSchema, ++01145 const ODBCXX_STRING& foreignTable); + 01146 +-01155 ResultSet* getImportedKeys(const ODBCXX_STRING& catalog, +-01156 const ODBCXX_STRING& schema, +-01157 const ODBCXX_STRING& table) { +-01158 return this->getCrossReference("","","",catalog,schema,table); ++01155 ResultSet* getImportedKeys(const ODBCXX_STRING& catalog, ++01156 const ODBCXX_STRING& schema, ++01157 const ODBCXX_STRING& table) { ++01158 return this->getCrossReference("","","",catalog,schema,table); + 01159 } + 01160 +-01167 ResultSet* getExportedKeys(const ODBCXX_STRING& catalog, +-01168 const ODBCXX_STRING& schema, +-01169 const ODBCXX_STRING& table) { +-01170 return this->getCrossReference(catalog,schema,table,"","",""); ++01167 ResultSet* getExportedKeys(const ODBCXX_STRING& catalog, ++01168 const ODBCXX_STRING& schema, ++01169 const ODBCXX_STRING& table) { ++01170 return this->getCrossReference(catalog,schema,table,"","",""); + 01171 } + 01172 +-01195 ResultSet* getProcedures(const ODBCXX_STRING& catalog, +-01196 const ODBCXX_STRING& schemaPattern, +-01197 const ODBCXX_STRING& procedureNamePattern); ++01195 ResultSet* getProcedures(const ODBCXX_STRING& catalog, ++01196 const ODBCXX_STRING& schemaPattern, ++01197 const ODBCXX_STRING& procedureNamePattern); + 01198 +-01238 ResultSet* getProcedureColumns(const ODBCXX_STRING& catalog, +-01239 const ODBCXX_STRING& schemaPattern, +-01240 const ODBCXX_STRING& procedureNamePattern, +-01241 const ODBCXX_STRING& columnNamePattern); ++01238 ResultSet* getProcedureColumns(const ODBCXX_STRING& catalog, ++01239 const ODBCXX_STRING& schemaPattern, ++01240 const ODBCXX_STRING& procedureNamePattern, ++01241 const ODBCXX_STRING& columnNamePattern); + 01242 + 01243 +-01279 ResultSet* getBestRowIdentifier(const ODBCXX_STRING& catalog, +-01280 const ODBCXX_STRING& schema, +-01281 const ODBCXX_STRING& table, +-01282 int scope, +-01283 bool nullable); ++01279 ResultSet* getBestRowIdentifier(const ODBCXX_STRING& catalog, ++01280 const ODBCXX_STRING& schema, ++01281 const ODBCXX_STRING& table, ++01282 int scope, ++01283 bool nullable); + 01284 +-01307 ResultSet* getVersionColumns(const ODBCXX_STRING& catalog, +-01308 const ODBCXX_STRING& schema, +-01309 const ODBCXX_STRING& table); ++01307 ResultSet* getVersionColumns(const ODBCXX_STRING& catalog, ++01308 const ODBCXX_STRING& schema, ++01309 const ODBCXX_STRING& table); + 01310 + 01311 + 01312 +-01318 ResultSet* getTableTypes(); ++01318 ResultSet* getTableTypes(); + 01319 +-01325 ResultSet* getSchemas(); ++01325 ResultSet* getSchemas(); + 01326 +-01332 ResultSet* getCatalogs(); ++01332 ResultSet* getCatalogs(); + 01333 }; + 01334 + 01335 +-01336 }; // namespace odbc ++01336 }; // namespace odbc + 01337 + 01338 +-01339 #endif // __ODBCXX_DATABASEMETADATA_H +-

    ++01339 #endif // __ODBCXX_DATABASEMETADATA_H ++
    + +diff -Naur libodbc++-0.2.3/doc/progref/doxygen.css libodbc++-0.2.3-20050404/doc/progref/doxygen.css +--- libodbc++-0.2.3/doc/progref/doxygen.css 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/doxygen.css 2005-04-04 18:21:28.000000000 +0200 +@@ -1,52 +1,219 @@ +-H1 { text-align: center; } ++H1 { ++ text-align: center; ++ font-family: Geneva, Arial, Helvetica, sans-serif; ++} ++H2 { ++ font-family: Geneva, Arial, Helvetica, sans-serif; ++} + CAPTION { font-weight: bold } +-A.qindex {} +-A.qindexRef {} ++DIV.qindex { ++ width: 100%; ++ background-color: #eeeeff; ++ border: 1px solid #B0B0B0; ++ text-align: center; ++ margin: 2px; ++ padding: 2px; ++ line-height: 120%; ++} ++A.qindex { ++ text-decoration: none; ++ font-weight: bold; ++ color: #1A419D; ++ padding: 2px; ++} ++A.qindex:visited { ++ text-decoration: none; ++ font-weight: bold; ++ color: #1A419D ++ padding: 2px; ++} ++A.qindex:hover { ++ text-decoration: none; ++ background-color: #ddddff; ++ padding: 2px; ++} ++A.qindexHL { ++ text-decoration: none; ++ font-weight: bold; ++ background-color: #6666cc; ++ color: #ffffff; ++ padding: 2px 6px; ++ border: 1px double #9295C2; ++} ++A.qindexHL:hover { ++ text-decoration: none; ++ background-color: #6666cc; ++ color: #ffffff; ++ padding: 2px 6px; ++} ++A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } + A.el { text-decoration: none; font-weight: bold } + A.elRef { font-weight: bold } +-A.code { text-decoration: none; font-weight: normal; color: #4444ee } +-A.codeRef { font-weight: normal; color: #4444ee } ++A.code { text-decoration: none; font-weight: normal; color: #1A419D} ++A.codeRef { font-weight: normal; color: #1A419D} + A:hover { text-decoration: none; background-color: #f2f2ff } + DL.el { margin-left: -1cm } +-DIV.fragment { width: 100%; border: none; background-color: #eeeeee } ++PRE.fragment { ++ border: 1px solid #CCCCCC; ++ background-color: #f5f5f5; ++ margin-top: 4px; ++ margin-bottom: 4px; ++ margin-left: 2px; ++ margin-right: 8px; ++ padding-left: 6px; ++ padding-right: 6px; ++ padding-top: 4px; ++ padding-bottom: 4px; ++} ++DIV.fragment { ++ border: 1px solid #CCCCCC; ++ background-color: #f5f5f5; ++ padding: 6px; ++} + DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } +-TD.md { background-color: #f2f2ff; font-weight: bold; } +-TD.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; } +-TD.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; } +-DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } +-DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } +-BODY { background: white } +-TD.indexkey { +- background-color: #eeeeff; +- font-weight: bold; +- padding-right : 10px; +- padding-top : 2px; +- padding-left : 10px; +- padding-bottom : 2px; +- margin-left : 0px; +- margin-right : 0px; +- margin-top : 2px; +- margin-bottom : 2px +-} +-TD.indexvalue { +- background-color: #eeeeff; +- font-style: italic; +- padding-right : 10px; +- padding-top : 2px; +- padding-left : 10px; +- padding-bottom : 2px; +- margin-left : 0px; +- margin-right : 0px; +- margin-top : 2px; +- margin-bottom : 2px +-} +-FONT.keyword { color: #008000 } +-FONT.keywordtype { color: #604020 } +-FONT.keywordflow { color: #e08000 } +-FONT.comment { color: #800000 } +-FONT.preprocessor { color: #806020 } +-FONT.stringliteral { color: #002080 } +-FONT.charliteral { color: #008080 } ++TD.md { background-color: #F4F4FB; font-weight: bold; } ++TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } ++TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } ++DIV.groupHeader { ++ margin-left: 16px; ++ margin-top: 12px; ++ margin-bottom: 6px; ++ font-weight: bold; ++ font-family: Geneva, Arial, Helvetica, sans-serif; ++} ++DIV.groupText { margin-left: 16px; font-style: italic; font-size: 14px } ++BODY { ++ background: white; ++ color: black; ++ margin-right: 20px; ++ margin-left: 20px; ++} ++TD.indexkey { ++ background-color: #eeeeff; ++ font-weight: bold; ++ padding-right : 10px; ++ padding-top : 2px; ++ padding-left : 10px; ++ padding-bottom : 2px; ++ margin-left : 0px; ++ margin-right : 0px; ++ margin-top : 2px; ++ margin-bottom : 2px; ++ border: 1px solid #CCCCCC; ++} ++TD.indexvalue { ++ background-color: #eeeeff; ++ font-style: italic; ++ padding-right : 10px; ++ padding-top : 2px; ++ padding-left : 10px; ++ padding-bottom : 2px; ++ margin-left : 0px; ++ margin-right : 0px; ++ margin-top : 2px; ++ margin-bottom : 2px; ++ border: 1px solid #CCCCCC; ++} ++TR.memlist { ++ background-color: #f0f0f0; ++} ++P.formulaDsp { text-align: center; } ++IMG.formulaDsp { } ++IMG.formulaInl { vertical-align: middle; } ++SPAN.keyword { color: #008000 } ++SPAN.keywordtype { color: #604020 } ++SPAN.keywordflow { color: #e08000 } ++SPAN.comment { color: #800000 } ++SPAN.preprocessor { color: #806020 } ++SPAN.stringliteral { color: #002080 } ++SPAN.charliteral { color: #008080 } ++.mdTable { ++ border: 1px solid #868686; ++ background-color: #F4F4FB; ++} ++.mdRow { ++ padding: 8px 10px; ++} ++.mdescLeft { ++ padding: 0px 8px 4px 8px; ++ font-size: 14px; ++ font-style: italic; ++ background-color: #FAFAFA; ++ border-top: 1px none #E0E0E0; ++ border-right: 1px none #E0E0E0; ++ border-bottom: 1px none #E0E0E0; ++ border-left: 1px none #E0E0E0; ++ margin: 0px; ++} ++.mdescRight { ++ padding: 0px 8px 4px 8px; ++ font-size: 14px; ++ font-style: italic; ++ background-color: #FAFAFA; ++ border-top: 1px none #E0E0E0; ++ border-right: 1px none #E0E0E0; ++ border-bottom: 1px none #E0E0E0; ++ border-left: 1px none #E0E0E0; ++ margin: 0px; ++} ++.memItemLeft { ++ padding: 1px 0px 0px 8px; ++ margin: 4px; ++ border-top-width: 1px; ++ border-right-width: 1px; ++ border-bottom-width: 1px; ++ border-left-width: 1px; ++ border-top-style: solid; ++ border-top-color: #E0E0E0; ++ border-right-color: #E0E0E0; ++ border-bottom-color: #E0E0E0; ++ border-left-color: #E0E0E0; ++ border-right-style: none; ++ border-bottom-style: none; ++ border-left-style: none; ++ background-color: #FAFAFA; ++ font-family: Geneva, Arial, Helvetica, sans-serif; ++ font-size: 12px; ++} ++.memItemRight { ++ padding: 1px 8px 0px 8px; ++ margin: 4px; ++ border-top-width: 1px; ++ border-right-width: 1px; ++ border-bottom-width: 1px; ++ border-left-width: 1px; ++ border-top-style: solid; ++ border-top-color: #E0E0E0; ++ border-right-color: #E0E0E0; ++ border-bottom-color: #E0E0E0; ++ border-left-color: #E0E0E0; ++ border-right-style: none; ++ border-bottom-style: none; ++ border-left-style: none; ++ background-color: #FAFAFA; ++ font-family: Geneva, Arial, Helvetica, sans-serif; ++ font-size: 13px; ++} ++.search { color: #003399; ++ font-weight: bold; ++} ++FORM.search { ++ margin-bottom: 0px; ++ margin-top: 0px; ++} ++INPUT.search { font-size: 75%; ++ color: #000080; ++ font-weight: normal; ++ background-color: #eeeeff; ++} ++TD.tiny { font-size: 75%; ++} ++a { ++ color: #252E78; ++} ++a:visited { ++ color: #3D2185; ++} + A { + text-decoration: none; + } +diff -Naur libodbc++-0.2.3/doc/progref/doxygen.gif libodbc++-0.2.3-20050404/doc/progref/doxygen.gif +--- libodbc++-0.2.3/doc/progref/doxygen.gif 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/doxygen.gif 1970-01-01 01:00:00.000000000 +0100 +@@ -1,11 +0,0 @@ +-GIF89an5 %%߲ӿvܹ,dջWɁᆿd=6 ٰ!դ?<,Xu ۿЫ&R΍@?5ե>;(@@9@@7ҙxgڰ\Q&n4Bd v[Q&گ?=/=gҙռWɀ?>2>:%Ό u=7Ⱦuј  @@8ܹeɁBuufBҲ:C@/tX͍dy^ZB``Uqm4uDD: dѭ-¿>9"_\G5vaaT``T>8"?;( ֤_^L^X< ٰٟұ:ƙMⶸd͌﮿b\?R^X=`_P(&nqc.͍tԘc`^L·~ B>+љ=4>J4'%Є``R>9!>8!`_ODD;5 +-vҘ>ҘmЭ.|(4<4ٯDC800)5HG<!,n5 H*\ȰÇ#JHŋ3VDZc= CZ8E\ɰ^0dI@0 ȴɓ%Θ3{ +-SgСH)ݙĥGJ]uՖ *כ>| פ;>Aʴƽ\w޵^9&(`(.† 8 *HШ^ZqC >}:ːQ~踀Ÿo+Vޏc~Qx5uWqFPƮ;{ }ǽ=+̞z7 Xy^[|06n1LD(!,Zl1aJ=30ȡ]kr`;)>ȑ|c +-b :VKy xx E P@ $2x0F=r;x D M&Bd&PeB!$yԓɒPzML6i\i (PFPI0(G:D(i=idʨ7**2JϣnHzJiĈ)AΡ*s @TYQpB ! ъpB=І1mG1X"S'@H0 hHÑŠ& Ao`k aGaE " d +-(L0 +-$tP@P$ ( *L*`(A$sD$L1ͫ`Q'>S@K(l2*d\#WJ*L,S@*TlW'`CA [ Aԃ#l192# ,,gmX%yc`j=B,Ax׏7ۆ,j=M/#0oKgvH % D*S WpE SC 4K6Qv EpQv.M\԰{Z>P%!޽Ep+$ Bԓ2b<-E 8/C=A^0 1X H!" @Ad@ q l`g'lx:gt4HF=p#ҠG8*/X7QxB=05k *J<130eG BHA +-x:<:p (b ahA "`-h --@'a@I#t{#Iփ{PByI*,R\AR! +-!B. l"Ui*! +-QЦ4z!@2M"#B)͎ӛAPLTEoˆ۴q[Q&m+ջWI0ѭ-=7g^7`_P@?2ԟ߲""> !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~3"tRNS@fbKGDH pHYsnnhtIME ++ :bpIDATxVk0 iK3kdžwB:*b%̾1Ɇݮ^jds"iy"_׉Eʄ2t*oE}@'ldYh1iwӔLߦbٰB N$Vu.IvINEiYᮕTpÃJjN+gl,zn "(mڍV;IF;mL$i p:̴\\~?#\ޏښQy0y;ڈ.#IR\ffEe&=1N"G5ƭD&~:h0>F+=12YsO8@$gP-C}2GXo bi:1O>zxT>J.?c4sTB 4NӜEN͟6}m9g2e鋪'_v],1}[䋙_?.aD6IIENDB` +\ No newline at end of file +diff -Naur libodbc++-0.2.3/doc/progref/drivermanager_8h-source.html libodbc++-0.2.3-20050404/doc/progref/drivermanager_8h-source.html +--- libodbc++-0.2.3/doc/progref/drivermanager_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/drivermanager_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,122 +1,121 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/drivermanager.h Source File ++libodbc++: odbc++/drivermanager.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/drivermanager.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/drivermanager.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_DRIVERMANAGER_H +-00023 #define __ODBCXX_DRIVERMANAGER_H +-00024 +-00025 #include <odbc++/setup.h> ++00022 #ifndef __ODBCXX_DRIVERMANAGER_H ++00023 #define __ODBCXX_DRIVERMANAGER_H ++00024 ++00025 #include <odbc++/setup.h> + 00026 +-00027 #include <odbc++/types.h> ++00027 #include <odbc++/types.h> + 00028 +-00030 namespace odbc { ++00030 namespace odbc { + 00031 +-00032 class Connection; ++00032 class Connection; + 00033 +-00036 class ODBCXX_EXPORT Driver { +-00037 private: ++00036 class ODBCXX_EXPORT Driver { ++00037 private: + 00038 ODBCXX_STRING description_; + 00039 std::vector<ODBCXX_STRING> attributes_; + 00040 +-00041 Driver(const Driver&); //forbid +-00042 Driver& operator=(const Driver&); //forbid ++00041 Driver(const Driver&); //forbid ++00042 Driver& operator=(const Driver&); //forbid + 00043 +-00044 public: +-00046 Driver(const ODBCXX_STRING& description, +-00047 const std::vector<ODBCXX_STRING>& attributes) ++00044 public: ++00046 Driver(const ODBCXX_STRING& description, ++00047 const std::vector<ODBCXX_STRING>& attributes) + 00048 :description_(description), attributes_(attributes) {} + 00049 +-00051 virtual ~Driver() {} ++00051 virtual ~Driver() {} + 00052 +-00054 const ODBCXX_STRING& getDescription() const { +-00055 return description_; ++00054 const ODBCXX_STRING& getDescription() const { ++00055 return description_; + 00056 } + 00057 +-00059 const std::vector<ODBCXX_STRING>& getAttributes() const { +-00060 return attributes_; ++00059 const std::vector<ODBCXX_STRING>& getAttributes() const { ++00060 return attributes_; + 00061 } + 00062 }; + 00063 +-00065 typedef CleanVector<Driver*> DriverList; ++00065 typedef CleanVector<Driver*> DriverList; + 00066 + 00067 +-00069 class ODBCXX_EXPORT DataSource { +-00070 private: ++00069 class ODBCXX_EXPORT DataSource { ++00070 private: + 00071 ODBCXX_STRING name_; + 00072 ODBCXX_STRING description_; + 00073 +-00074 public: +-00076 DataSource(const ODBCXX_STRING& name, const ODBCXX_STRING& description) ++00074 public: ++00076 DataSource(const ODBCXX_STRING& name, const ODBCXX_STRING& description) + 00077 :name_(name), description_(description) {} + 00078 +-00080 virtual ~DataSource() {} ++00080 virtual ~DataSource() {} + 00081 +-00083 const ODBCXX_STRING& getName() const { +-00084 return name_; ++00083 const ODBCXX_STRING& getName() const { ++00084 return name_; + 00085 } + 00086 +-00088 const ODBCXX_STRING& getDescription() const { +-00089 return description_; ++00088 const ODBCXX_STRING& getDescription() const { ++00089 return description_; + 00090 } + 00091 }; + 00092 +-00094 typedef CleanVector<DataSource*> DataSourceList; ++00094 typedef CleanVector<DataSource*> DataSourceList; + 00095 + 00096 +-00099 class ODBCXX_EXPORT DriverManager { +-00100 private: +-00101 static SQLHENV henv_; +-00102 static ErrorHandler* eh_; +-00103 static int loginTimeout_; ++00099 class ODBCXX_EXPORT DriverManager { ++00100 private: ++00101 static SQLHENV henv_; ++00102 static ErrorHandler* eh_; ++00103 static int loginTimeout_; + 00104 +-00105 static void _checkInit(); +-00106 static Connection* _createConnection(); ++00105 static void _checkInit(); ++00106 static Connection* _createConnection(); + 00107 +-00108 // forbid ++00108 // forbid + 00109 DriverManager(); + 00110 +-00111 public: ++00111 public: + 00112 +-00114 static Connection* getConnection(const ODBCXX_STRING& dsn, +-00115 const ODBCXX_STRING& user, +-00116 const ODBCXX_STRING& password); ++00114 static Connection* getConnection(const ODBCXX_STRING& dsn, ++00115 const ODBCXX_STRING& user, ++00116 const ODBCXX_STRING& password); + 00117 +-00121 static Connection* getConnection(const ODBCXX_STRING& connectString); ++00121 static Connection* getConnection(const ODBCXX_STRING& connectString); + 00122 +-00126 static int getLoginTimeout(); ++00126 static int getLoginTimeout(); + 00127 +-00132 static void setLoginTimeout(int seconds); ++00132 static void setLoginTimeout(int seconds); + 00133 +-00136 static DataSourceList* getDataSources(); ++00136 static DataSourceList* getDataSources(); + 00137 +-00140 static DriverList* getDrivers(); ++00140 static DriverList* getDrivers(); + 00141 +-00145 static void shutdown(); ++00145 static void shutdown(); + 00146 }; + 00147 + 00148 +@@ -124,8 +123,8 @@ + 00150 }; + 00151 + 00152 +-00153 #endif // __ODBCXX_DRIVERMANAGER_H +-

    ++00153 #endif // __ODBCXX_DRIVERMANAGER_H ++
    + +diff -Naur libodbc++-0.2.3/doc/progref/errorhandler_8h-source.html libodbc++-0.2.3-20050404/doc/progref/errorhandler_8h-source.html +--- libodbc++-0.2.3/doc/progref/errorhandler_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/errorhandler_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,136 +1,135 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/errorhandler.h Source File ++libodbc++: odbc++/errorhandler.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/errorhandler.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/errorhandler.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_ERRORHANDLER_H +-00023 #define __ODBCXX_ERRORHANDLER_H +-00024 +-00025 #include <odbc++/setup.h> +-00026 #include <odbc++/types.h> +-00027 #include <odbc++/threads.h> ++00022 #ifndef __ODBCXX_ERRORHANDLER_H ++00023 #define __ODBCXX_ERRORHANDLER_H ++00024 ++00025 #include <odbc++/setup.h> ++00026 #include <odbc++/types.h> ++00027 #include <odbc++/threads.h> + 00028 +-00029 namespace odbc { ++00029 namespace odbc { + 00030 +-00032 class ODBCXX_EXPORT ErrorHandler { +-00033 friend class DriverManager; +-00034 friend class DataStreamBuf; +-00035 friend class DataStream; +-00036 private: +-00037 // private data +-00038 struct PD; ++00032 class ODBCXX_EXPORT ErrorHandler { ++00033 friend class DriverManager; ++00034 friend class DataStreamBuf; ++00035 friend class DataStream; ++00036 private: ++00037 // private data ++00038 struct PD; + 00039 PD* pd_; + 00040 + 00041 WarningList* warnings_; +-00042 bool collectWarnings_; ++00042 bool collectWarnings_; + 00043 +-00044 //the maxumum number of warnings to contain at a time +-00045 enum { ++00044 //the maxumum number of warnings to contain at a time ++00045 enum { + 00046 MAX_WARNINGS=128 + 00047 }; + 00048 +-00049 protected: +-00050 void _postWarning(SQLWarning* w); ++00049 protected: ++00050 void _postWarning(SQLWarning* w); + 00051 + 00052 +-00053 #if ODBCVER < 0x0300 +-00054 void _checkErrorODBC2(SQLHENV henv, ++00053 #if ODBCVER < 0x0300 ++00054 void _checkErrorODBC2(SQLHENV henv, + 00055 SQLHDBC hdbc, + 00056 SQLHSTMT hstmt, + 00057 SQLRETURN r, +-00058 const ODBCXX_STRING& what); +-00059 #else +-00060 +-00061 void _checkErrorODBC3(SQLINTEGER handleType, ++00058 const ODBCXX_STRING& what); ++00059 #else ++00060 ++00061 void _checkErrorODBC3(SQLINTEGER handleType, + 00062 SQLHANDLE h, +-00063 SQLRETURN r, const ODBCXX_STRING& what); +-00064 #endif //ODBCVER < 0x0300 +-00065 +-00066 void _checkStmtError(SQLHSTMT hstmt, +-00067 SQLRETURN r, const char* what="") { ++00063 SQLRETURN r, const ODBCXX_STRING& what); ++00064 #endif //ODBCVER < 0x0300 ++00065 ++00066 void _checkStmtError(SQLHSTMT hstmt, ++00067 SQLRETURN r, const char* what="") { + 00068 +-00069 if(r==SQL_SUCCESS_WITH_INFO || r==SQL_ERROR) { +-00070 #if ODBCVER < 0x0300 +-00071 ++00069 if(r==SQL_SUCCESS_WITH_INFO || r==SQL_ERROR) { ++00070 #if ODBCVER < 0x0300 ++00071 + 00072 this->_checkErrorODBC2(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt, + 00073 r,ODBCXX_STRING_C(what)); +-00074 #else +-00075 ++00074 #else ++00075 + 00076 this->_checkErrorODBC3(SQL_HANDLE_STMT,hstmt,r,ODBCXX_STRING_C(what)); + 00077 +-00078 #endif +-00079 } ++00078 #endif ++00079 } + 00080 } + 00081 +-00082 void _checkConError(SQLHDBC hdbc, SQLRETURN r, const char* what="") { +-00083 if(r==SQL_SUCCESS_WITH_INFO || r==SQL_ERROR) { +-00084 #if ODBCVER < 0x0300 +-00085 ++00082 void _checkConError(SQLHDBC hdbc, SQLRETURN r, const char* what="") { ++00083 if(r==SQL_SUCCESS_WITH_INFO || r==SQL_ERROR) { ++00084 #if ODBCVER < 0x0300 ++00085 + 00086 this->_checkErrorODBC2(SQL_NULL_HENV, hdbc, SQL_NULL_HSTMT, r, + 00087 ODBCXX_STRING_C(what)); + 00088 +-00089 #else +-00090 ++00089 #else ++00090 + 00091 this->_checkErrorODBC3(SQL_HANDLE_DBC, hdbc, r, ODBCXX_STRING_C(what)); + 00092 +-00093 #endif +-00094 } ++00093 #endif ++00094 } + 00095 } + 00096 +-00097 void _checkEnvError(SQLHENV henv, SQLRETURN r, const char* what="") { +-00098 if(r==SQL_SUCCESS_WITH_INFO || r==SQL_ERROR) { +-00099 #if ODBCVER < 0x0300 +-00100 ++00097 void _checkEnvError(SQLHENV henv, SQLRETURN r, const char* what="") { ++00098 if(r==SQL_SUCCESS_WITH_INFO || r==SQL_ERROR) { ++00099 #if ODBCVER < 0x0300 ++00100 + 00101 this->_checkErrorODBC2(henv,SQL_NULL_HDBC,SQL_NULL_HSTMT,r, + 00102 ODBCXX_STRING_C(what)); + 00103 +-00104 #else +-00105 ++00104 #else ++00105 + 00106 this->_checkErrorODBC3(SQL_HANDLE_ENV,henv,r,ODBCXX_STRING_C(what)); + 00107 +-00108 #endif +-00109 } ++00108 #endif ++00109 } + 00110 } + 00111 +-00113 ErrorHandler(bool collectWarnings =true); ++00113 ErrorHandler(bool collectWarnings =true); + 00114 +-00115 public: +-00117 void clearWarnings(); ++00115 public: ++00117 void clearWarnings(); + 00118 + 00123 WarningList* getWarnings(); + 00124 +-00126 virtual ~ErrorHandler(); ++00126 virtual ~ErrorHandler(); + 00127 }; + 00128 + 00129 +-00130 }; // namespace odbc ++00130 }; // namespace odbc + 00131 +-00132 #endif +-

    ++00132 #endif ++
    + +diff -Naur libodbc++-0.2.3/doc/progref/files.html libodbc++-0.2.3-20050404/doc/progref/files.html +--- libodbc++-0.2.3/doc/progref/files.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/files.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,26 +1,25 @@ +- ++ + +-File Index ++libodbc++: File Index + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    libodbc++ File List

    Here is a list of all documented files with brief descriptions: +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    libodbc++ File List

    Here is a list of all documented files with brief descriptions:
    /trees/alex/src/libodbc++/include/odbc++/callablestatement.h [code]
    /trees/alex/src/libodbc++/include/odbc++/config-win32.h [code]
    /trees/alex/src/libodbc++/include/odbc++/config.h [code]
    /trees/alex/src/libodbc++/include/odbc++/connection.h [code]
    /trees/alex/src/libodbc++/include/odbc++/databasemetadata.h [code]
    /trees/alex/src/libodbc++/include/odbc++/drivermanager.h [code]
    /trees/alex/src/libodbc++/include/odbc++/errorhandler.h [code]
    /trees/alex/src/libodbc++/include/odbc++/preparedstatement.h [code]
    /trees/alex/src/libodbc++/include/odbc++/resultset.h [code]
    /trees/alex/src/libodbc++/include/odbc++/resultsetmetadata.h [code]
    /trees/alex/src/libodbc++/include/odbc++/setup.h [code]
    /trees/alex/src/libodbc++/include/odbc++/statement.h [code]
    /trees/alex/src/libodbc++/include/odbc++/threads.h [code]
    /trees/alex/src/libodbc++/include/odbc++/types.h [code]
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    odbc++/callablestatement.h [code]
    odbc++/config-win32.h [code]
    odbc++/config.h [code]
    odbc++/connection.h [code]
    odbc++/databasemetadata.h [code]
    odbc++/drivermanager.h [code]
    odbc++/errorhandler.h [code]
    odbc++/preparedstatement.h [code]
    odbc++/resultset.h [code]
    odbc++/resultsetmetadata.h [code]
    odbc++/setup.h [code]
    odbc++/statement.h [code]
    odbc++/threads.h [code]
    odbc++/types.h [code]
    +
    +
    +diff -Naur libodbc++-0.2.3/doc/progref/functions_enum.html libodbc++-0.2.3-20050404/doc/progref/functions_enum.html +--- libodbc++-0.2.3/doc/progref/functions_enum.html 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/functions_enum.html 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,18 @@ ++ ++ ++libodbc++: Class Members - Enumerations ++ ++ ++ ++ ++ ++ ++

    ++

    ++
    ++ +diff -Naur libodbc++-0.2.3/doc/progref/functions_eval.html libodbc++-0.2.3-20050404/doc/progref/functions_eval.html +--- libodbc++-0.2.3/doc/progref/functions_eval.html 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/functions_eval.html 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,72 @@ ++ ++ ++libodbc++: Class Members - Enumeration values ++ ++ ++ ++ ++ ++
    b | c | d | f | i | l | n | r | s | t | v
    ++ ++

    ++ ++

    ++

    - b -

    ++

    - c -

    ++

    - d -

    ++

    - f -

    ++

    - i -

    ++

    - l -

    ++

    - n -

    ++

    - r -

    ++

    - s -

    ++

    - t -

    ++

    - v -

    ++
    ++ +diff -Naur libodbc++-0.2.3/doc/progref/functions_func.html libodbc++-0.2.3-20050404/doc/progref/functions_func.html +--- libodbc++-0.2.3/doc/progref/functions_func.html 1970-01-01 01:00:00.000000000 +0100 ++++ libodbc++-0.2.3-20050404/doc/progref/functions_func.html 2005-04-04 18:21:28.000000000 +0200 +@@ -0,0 +1,389 @@ ++ ++ ++libodbc++: Class Members - Functions ++ ++ ++ ++ ++ ++
    a | b | c | d | e | f | g | i | l | m | n | o | p | r | s | t | u | w | ~
    ++ ++

    ++ ++

    ++

    - a -

    ++

    - b -

    ++

    - c -

    ++

    - d -

    ++

    - e -

    ++

    - f -

    ++

    - g -

    ++

    - i -

    ++

    - l -

    ++

    - m -

    ++

    - n -

    ++

    - o -

    ++

    - p -

    ++

    - r -

    ++

    - s -

    ++

    - t -

    ++

    - u -

    ++

    - w -

    ++

    - ~ -

    ++
    ++ +diff -Naur libodbc++-0.2.3/doc/progref/functions.html libodbc++-0.2.3-20050404/doc/progref/functions.html +--- libodbc++-0.2.3/doc/progref/functions.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/functions.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,72 +1,66 @@ +- ++ + +-Compound Member Index ++libodbc++: Class Members + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    libodbc++ Compound Members

    +-a | b | c | d | e | f | g | i | l | m | n | o | p | r | s | t | u | v | w | ~
    ++ ++ ++ ++
    a | b | c | d | e | f | g | i | l | m | n | o | p | r | s | t | u | v | w | ~
    + +

    +-Here is a list of all documented class members with links to the classes they belong to:

    - a -

    +-
      ++ ++

      ++Here is a list of all documented class members with links to the class documentation for each member:

      - a -

      +-

      - b -

      +-
        ++

        - b -

        +-

        - c -

        +-
          ++

          - c -

          +-

          - d -

          +-
            ++

            - d -

            +-

            - e -

            +-
              ++

              - e -

              +-

              - f -

              +-
                ++

                - f -

                +-

                - g -

                +- ++

                - g -

                +-

                - i -

                +-
                  ++

                  - i -

                  +-

                  - l -

                  +-
                    ++

                    - l -

                    +-

                    - m -

                    +- ++

                    - m -

                    +-

                    - n -

                    +-
                      ++

                      - n -

                      +-

                      - o -

                      +- ++

                      - o -

                      +-

                      - p -

                      +-
                        ++

                        - p -

                        +-

                        - r -

                        +-
                          ++

                          - r -

                          +-

                          - s -

                          +-
                            ++

                            - s -

                            +-

                            - t -

                            +-
                              ++

                              - t -

                              +-

                              - u -

                              +- ++

                              - u -

                              +-

                              - v -

                              +-
                                ++

                                - v -

                                +-

                                - w -

                                +- ++

                                - w -

                                +-

                                - ~ -

                                +-
                                  ++

                                  - ~ -

                                    +
                                  • ~Bytes() +-: odbc::Bytes
                                  • ~CallableStatement() ++: odbc::Bytes
                                  • ~CallableStatement() + : odbc::CallableStatement
                                  • ~Connection() + : odbc::Connection
                                  • ~DataSource() + : odbc::DataSource
                                  • ~Date() +diff -Naur libodbc++-0.2.3/doc/progref/hierarchy.html libodbc++-0.2.3-20050404/doc/progref/hierarchy.html +--- libodbc++-0.2.3/doc/progref/hierarchy.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/hierarchy.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,12 +1,11 @@ +- ++ + +-Hierarchical Index ++libodbc++: Hierarchical Index + + +- +-
                                    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
                                    +-

                                    libodbc++ Class Hierarchy

                                    This inheritance list is sorted roughly, but not completely, alphabetically:
                                      ++ ++ ++

                                      libodbc++ Class Hierarchy

                                      This inheritance list is sorted roughly, but not completely, alphabetically:
                                        +
                                      • odbc::Bytes +
                                      • odbc::DatabaseMetaData +
                                      • odbc::DataSource +diff -Naur libodbc++-0.2.3/doc/progref/index.html libodbc++-0.2.3-20050404/doc/progref/index.html +--- libodbc++-0.2.3/doc/progref/index.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/index.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,14 +1,13 @@ +- ++ + +-Main Page ++libodbc++: Main Page + + +- +-
                                        +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
                                        +-

                                        libodbc++ Documentation

                                        ++ ++ ++

                                        libodbc++ Documentation

                                        +

                                        +-

                                        0.2.3


                                        ++

                                        0.2.3-20050404


                                        + +diff -Naur libodbc++-0.2.3/doc/progref/Makefile.in libodbc++-0.2.3-20050404/doc/progref/Makefile.in +--- libodbc++-0.2.3/doc/progref/Makefile.in 2003-06-17 12:20:50.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/Makefile.in 2005-04-04 18:21:27.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,92 +32,146 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = ../.. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + progref_dir = @docdir@/@PACKAGE@-@VERSION@/progref +@@ -147,11 +201,12 @@ + + EXTRA_DIST = Doxyfile footer doxygen.css.in + subdir = doc/progref ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = + DIST_SOURCES = +-DIST_COMMON = Makefile.am Makefile.in ++DIST_COMMON = $(srcdir)/Makefile.in Makefile.am + all: all-am + + .SUFFIXES: +@@ -173,13 +228,22 @@ + tags: TAGS + TAGS: + ++ctags: CTAGS ++CTAGS: ++ + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = ../.. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -200,14 +264,13 @@ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ +- top_distdir="${top_distdir}" distdir="$(distdir)" \ ++ top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + check-am: all-am + check: check-am + all-am: Makefile + + installdirs: +- + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -219,7 +282,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -227,7 +290,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -237,7 +300,7 @@ + clean-am: clean-generic clean-libtool mostlyclean-am + + distclean: distclean-am +- ++ -rm -f Makefile + distclean-am: clean-am distclean-generic distclean-libtool + + dvi: dvi-am +@@ -259,7 +322,7 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-am +- ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +@@ -267,6 +330,14 @@ + + mostlyclean-am: mostlyclean-generic mostlyclean-libtool + ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ + uninstall-am: uninstall-info-am uninstall-local + + .PHONY: all all-am check check-am clean clean-generic clean-libtool \ +@@ -276,8 +347,8 @@ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ +- mostlyclean-generic mostlyclean-libtool uninstall uninstall-am \ +- uninstall-info-am uninstall-local ++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ ++ uninstall uninstall-am uninstall-info-am uninstall-local + + + all: $(stamp) +diff -Naur libodbc++-0.2.3/doc/progref/namespacemembers.html libodbc++-0.2.3-20050404/doc/progref/namespacemembers.html +--- libodbc++-0.2.3/doc/progref/namespacemembers.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/namespacemembers.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,17 +1,14 @@ +- ++ + +-Namespace Member Index ++libodbc++: Namespace Members + + +- +-
                                        +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
                                        +-

                                        libodbc++ Namespace Members

                                        +-d
                                        ++ ++ ++ + +

                                        +-Here is a list of all documented namespace members with links to the namespaces they belong to:

                                        - d -

                                        +- +

                                        Typedefs

                                        + ++
                                        A list of Drivers.
                                      • typedef CleanVector< DataSource * > DataSourceList ++
                                        A list of datasources.
                                      +

                                      Detailed Description

                                      +-The namespace where all libodbc++ classes reside.

                                      Typedef Documentation

                                      +-

                                      +- ++The namespace where all libodbc++ classes reside.

                                      Typedef Documentation

                                      ++

                                      ++

                                      + +- + +@@ -57,18 +57,19 @@ + + +
                                      ++ + + +- ++ +
                                      typedef CleanVector<DataSource*> odbc::DataSourceList ++ typedef CleanVector<DataSource*> odbc::DataSourceList
                                      +
                                      + +

                                      +-A list of datasources. ++A list of datasources. +

                                      + Behaves like an std::vector

                                      +-

                                      +- ++

                                      ++

                                      + +- + +@@ -81,7 +82,7 @@ + + +diff -Naur libodbc++-0.2.3/doc/progref/namespaces.html libodbc++-0.2.3-20050404/doc/progref/namespaces.html +--- libodbc++-0.2.3/doc/progref/namespaces.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/namespaces.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,13 +1,12 @@ +- ++ + +-Namespace Index ++libodbc++: Namespace Index + + +- +-
                                      +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
                                      +-

                                      libodbc++ Namespace List

                                      Here is a list of all documented namespaces with brief descriptions:
                                      ++ + + +- ++ +
                                      typedef CleanVector<Driver*> odbc::DriverList ++ typedef CleanVector<Driver*> odbc::DriverList
                                      +
                                      + +

                                      +-A list of Drivers. ++A list of Drivers. +

                                      + Actually an STL vector

                                      +- ++ ++ ++

                                      libodbc++ Namespace List

                                      Here is a list of all documented namespaces with brief descriptions:
                                      odbcThe namespace where all libodbc++ classes reside
                                      ++ +
                                      odbcThe namespace where all libodbc++ classes reside
                                      +


                                      +
                                      +diff -Naur libodbc++-0.2.3/doc/progref/preparedstatement_8h-source.html libodbc++-0.2.3-20050404/doc/progref/preparedstatement_8h-source.html +--- libodbc++-0.2.3/doc/progref/preparedstatement_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/preparedstatement_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,130 +1,129 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/preparedstatement.h Source File ++libodbc++: odbc++/preparedstatement.h Source File + + +- +-
                                      +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
                                      +-

                                      /trees/alex/src/libodbc++/include/odbc++/preparedstatement.h

                                      00001 /* 
                                      +-00002    This file is part of libodbc++.
                                      +-00003    
                                      +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
                                      +-00005    
                                      +-00006    This library is free software; you can redistribute it and/or
                                      +-00007    modify it under the terms of the GNU Library General Public
                                      +-00008    License as published by the Free Software Foundation; either
                                      +-00009    version 2 of the License, or (at your option) any later version.
                                      +-00010    
                                      +-00011    This library is distributed in the hope that it will be useful,
                                      +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
                                      +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                                      +-00014    Library General Public License for more details.
                                      +-00015    
                                      +-00016    You should have received a copy of the GNU Library General Public License
                                      +-00017    along with this library; see the file COPYING.  If not, write to
                                      +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
                                      +-00019    Boston, MA 02111-1307, USA.
                                      +-00020 */
                                      ++
                                      ++
                                      ++

                                      odbc++/preparedstatement.h

                                      00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 + 00022 +-00023 #ifndef __ODBCXX_PREPAREDSTATEMENT_H +-00024 #define __ODBCXX_PREPAREDSTATEMENT_H +-00025 +-00026 #include <odbc++/setup.h> +-00027 #include <odbc++/types.h> +-00028 #include <odbc++/statement.h> ++00023 #ifndef __ODBCXX_PREPAREDSTATEMENT_H ++00024 #define __ODBCXX_PREPAREDSTATEMENT_H ++00025 ++00026 #include <odbc++/setup.h> ++00027 #include <odbc++/types.h> ++00028 #include <odbc++/statement.h> + 00029 +-00030 #if defined(ODBCXX_HAVE_ISO_CXXLIB) +-00031 # include <iosfwd> +-00032 #else +-00033 # include <iostream> +-00034 #endif +-00035 +-00036 namespace odbc { ++00030 #if defined(ODBCXX_HAVE_ISO_CXXLIB) ++00031 # include <iosfwd> ++00032 #else ++00033 # include <iostream> ++00034 #endif ++00035 ++00036 namespace odbc { + 00037 +-00038 class Rowset; ++00038 class Rowset; + 00039 +-00061 class ODBCXX_EXPORT PreparedStatement : public Statement { +-00062 friend class Connection; ++00061 class ODBCXX_EXPORT PreparedStatement : public Statement { ++00062 friend class Connection; + 00063 +-00064 private: +-00065 void _prepare(); +-00066 void _setupParams(); ++00064 private: ++00065 void _prepare(); ++00066 void _setupParams(); + 00067 +-00068 protected: ++00068 protected: + 00069 ODBCXX_STRING sql_; +-00070 //here we store the parameters ++00070 //here we store the parameters + 00071 Rowset* rowset_; + 00072 size_t numParams_; + 00073 std::vector<int> directions_; +-00074 int defaultDirection_; +-00075 bool paramsBound_; ++00074 int defaultDirection_; ++00075 bool paramsBound_; + 00076 +-00077 PreparedStatement(Connection* con, ++00077 PreparedStatement(Connection* con, + 00078 SQLHSTMT hstmt, +-00079 const ODBCXX_STRING& sql, +-00080 int resultSetType, +-00081 int resultSetConcurrency, +-00082 int defaultDirection =SQL_PARAM_INPUT); ++00079 const ODBCXX_STRING& sql, ++00080 int resultSetType, ++00081 int resultSetConcurrency, ++00082 int defaultDirection =SQL_PARAM_INPUT); + 00083 +-00084 void _bindParams(); +-00085 void _unbindParams(); ++00084 void _bindParams(); ++00085 void _unbindParams(); + 00086 +-00087 void _checkParam(int idx, +-00088 int* allowed, int numAllowed, +-00089 int defPrec, int defScale); ++00087 void _checkParam(int idx, ++00088 int* allowed, int numAllowed, ++00089 int defPrec, int defScale); + 00090 +-00091 public: +-00093 virtual ~PreparedStatement(); ++00091 public: ++00093 virtual ~PreparedStatement(); + 00094 +-00101 void clearParameters(); ++00101 void clearParameters(); + 00102 +-00107 bool execute(); ++00107 bool execute(); + 00108 +-00111 ResultSet* executeQuery(); ++00111 ResultSet* executeQuery(); + 00112 +-00114 int executeUpdate(); ++00114 int executeUpdate(); + 00115 +-00120 void setDouble(int idx, double val); ++00120 void setDouble(int idx, double val); + 00121 +-00126 void setBoolean(int idx, bool val); ++00126 void setBoolean(int idx, bool val); + 00127 +-00132 void setByte(int idx, signed char val); ++00132 void setByte(int idx, signed char val); + 00133 + 00134 +-00139 void setBytes(int idx, const ODBCXX_BYTES& val); ++00139 void setBytes(int idx, const ODBCXX_BYTES& val); + 00140 +-00145 void setDate(int idx, const Date& val); ++00145 void setDate(int idx, const Date& val); + 00146 +-00151 void setFloat(int idx, float val); ++00151 void setFloat(int idx, float val); + 00152 + 00153 +-00158 void setInt(int idx, int val); ++00158 void setInt(int idx, int val); + 00159 +-00164 void setLong(int idx, Long val); ++00164 void setLong(int idx, Long val); + 00165 +-00170 void setShort(int idx, short val); ++00170 void setShort(int idx, short val); + 00171 +-00176 void setString(int idx, const ODBCXX_STRING& val); ++00176 void setString(int idx, const ODBCXX_STRING& val); + 00177 +-00182 void setTime(int idx, const Time& val); ++00182 void setTime(int idx, const Time& val); + 00183 +-00188 void setTimestamp(int idx, const Timestamp& val); ++00188 void setTimestamp(int idx, const Timestamp& val); + 00189 +-00195 void setAsciiStream(int idx, ODBCXX_STREAM* s, int len); ++00195 void setAsciiStream(int idx, ODBCXX_STREAM* s, int len); + 00196 +-00202 void setBinaryStream(int idx, ODBCXX_STREAM* s, int len); ++00202 void setBinaryStream(int idx, ODBCXX_STREAM* s, int len); + 00203 + 00204 +-00210 void setNull(int idx, int sqlType); ++00210 void setNull(int idx, int sqlType); + 00211 }; + 00212 + 00213 +-00214 }; // namespace odbc ++00214 }; // namespace odbc + 00215 +-00216 #endif // __ODBCXX_PREPAREDSTATEMENT_H +-

                                      ++00216 #endif // __ODBCXX_PREPAREDSTATEMENT_H ++

                                      + +diff -Naur libodbc++-0.2.3/doc/progref/resultset_8h-source.html libodbc++-0.2.3-20050404/doc/progref/resultset_8h-source.html +--- libodbc++-0.2.3/doc/progref/resultset_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/resultset_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,335 +1,334 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/resultset.h Source File ++libodbc++: odbc++/resultset.h Source File + + +- +-
                                      +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
                                      +-

                                      /trees/alex/src/libodbc++/include/odbc++/resultset.h

                                      00001 /* 
                                      +-00002    This file is part of libodbc++.
                                      +-00003    
                                      +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
                                      +-00005    
                                      +-00006    This library is free software; you can redistribute it and/or
                                      +-00007    modify it under the terms of the GNU Library General Public
                                      +-00008    License as published by the Free Software Foundation; either
                                      +-00009    version 2 of the License, or (at your option) any later version.
                                      +-00010    
                                      +-00011    This library is distributed in the hope that it will be useful,
                                      +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
                                      +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                                      +-00014    Library General Public License for more details.
                                      +-00015    
                                      +-00016    You should have received a copy of the GNU Library General Public License
                                      +-00017    along with this library; see the file COPYING.  If not, write to
                                      +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
                                      +-00019    Boston, MA 02111-1307, USA.
                                      +-00020 */
                                      ++
                                      ++
                                      ++

                                      odbc++/resultset.h

                                      00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_RESULTSET_H +-00023 #define __ODBCXX_RESULTSET_H +-00024 +-00025 #include <odbc++/setup.h> +-00026 #include <odbc++/types.h> +-00027 #include <odbc++/errorhandler.h> +-00028 #include <odbc++/statement.h> ++00022 #ifndef __ODBCXX_RESULTSET_H ++00023 #define __ODBCXX_RESULTSET_H ++00024 ++00025 #include <odbc++/setup.h> ++00026 #include <odbc++/types.h> ++00027 #include <odbc++/errorhandler.h> ++00028 #include <odbc++/statement.h> + 00029 + 00030 +-00031 namespace odbc { ++00031 namespace odbc { + 00032 +-00033 class ResultSetMetaData; +-00034 class Statement; +-00035 class Rowset; ++00033 class ResultSetMetaData; ++00034 class Statement; ++00035 class Rowset; + 00036 +-00038 class ODBCXX_EXPORT ResultSet : public ErrorHandler { +-00039 friend class Statement; +-00040 friend class ResultSetMetaData; ++00038 class ODBCXX_EXPORT ResultSet : public ErrorHandler { ++00039 friend class Statement; ++00040 friend class ResultSetMetaData; + 00041 +-00042 private: +-00043 Statement* statement_; ++00042 private: ++00043 Statement* statement_; + 00044 SQLHSTMT hstmt_; +-00045 bool ownStatement_; ++00045 bool ownStatement_; + 00046 + 00047 +-00048 int currentFetchSize_; +-00049 int newFetchSize_; ++00048 int currentFetchSize_; ++00049 int newFetchSize_; + 00050 + 00051 Rowset* rowset_; + 00052 SQLUSMALLINT* rowStatus_; + 00053 SQLUINTEGER rowsInRowset_; + 00054 +-00055 //tells us if the columns are bound right now +-00056 bool colsBound_; +-00057 bool streamedColsBound_; ++00055 //tells us if the columns are bound right now ++00056 bool colsBound_; ++00057 bool streamedColsBound_; + 00058 +-00059 //the position in the rowset last time we did a bind +-00060 unsigned int bindPos_; ++00059 //the position in the rowset last time we did a bind ++00060 unsigned int bindPos_; + 00061 +-00062 //meta data - it's always there since we need info from it +-00063 ResultSetMetaData* metaData_; ++00062 //meta data - it's always there since we need info from it ++00063 ResultSetMetaData* metaData_; + 00064 +-00065 int location_; ++00065 int location_; + 00066 +-00067 bool lastWasNull_; ++00067 bool lastWasNull_; + 00068 +-00069 int rowBeforeInsert_; +-00070 int locBeforeInsert_; ++00069 int rowBeforeInsert_; ++00070 int locBeforeInsert_; + 00071 +-00072 ResultSet(Statement* stmt,SQLHSTMT hstmt, bool ownStmt); ++00072 ResultSet(Statement* stmt,SQLHSTMT hstmt, bool ownStmt); + 00073 +-00074 //driver info +-00075 const DriverInfo* _getDriverInfo() const { +-00076 return statement_->_getDriverInfo(); ++00074 //driver info ++00075 const DriverInfo* _getDriverInfo() const { ++00076 return statement_->_getDriverInfo(); + 00077 } + 00078 +-00079 //private utils +-00080 void _applyFetchSize(); +-00081 //this makes sure there is a rowset +-00082 void _resetRowset(); ++00079 //private utils ++00080 void _applyFetchSize(); ++00081 //this makes sure there is a rowset ++00082 void _resetRowset(); + 00083 +-00084 //this should be called before any call to SQLExtendedFetch +-00085 void _prepareForFetch(); +-00086 //this performs a possibly scrolled fetch with fetchType to rownum +-00087 void _doFetch(int fetchType, int rowNum); ++00084 //this should be called before any call to SQLExtendedFetch ++00085 void _prepareForFetch(); ++00086 //this performs a possibly scrolled fetch with fetchType to rownum ++00087 void _doFetch(int fetchType, int rowNum); + 00088 +-00089 //this should be called after the position in the rowset changes +-00090 SQLRETURN _applyPosition(int mode =SQL_POSITION); ++00089 //this should be called after the position in the rowset changes ++00090 SQLRETURN _applyPosition(int mode =SQL_POSITION); + 00091 +-00092 //these bind/unbind all non-streamed columns +-00093 void _bindCols(); +-00094 void _unbindCols(); ++00092 //these bind/unbind all non-streamed columns ++00093 void _bindCols(); ++00094 void _unbindCols(); + 00095 +-00096 //these bind/unbind all streamed columns +-00097 void _bindStreamedCols(); +-00098 void _unbindStreamedCols(); ++00096 //these bind/unbind all streamed columns ++00097 void _bindStreamedCols(); ++00098 void _unbindStreamedCols(); + 00099 +-00100 //this sends all needed data from streamed columns +-00101 //to be called from insertRow and updateRow +-00102 void _handleStreams(SQLRETURN r); ++00100 //this sends all needed data from streamed columns ++00101 //to be called from insertRow and updateRow ++00102 void _handleStreams(SQLRETURN r); + 00103 + 00104 +-00105 public: +-00107 virtual ~ResultSet(); ++00105 public: ++00107 virtual ~ResultSet(); + 00108 +-00109 //remember to update DatabaseMetaData when changing those values ++00109 //remember to update DatabaseMetaData when changing those values + 00110 +-00113 enum { ++00113 enum { + 00115 CONCUR_READ_ONLY, + 00117 CONCUR_UPDATABLE + 00118 }; + 00119 + 00120 +-00123 enum { ++00123 enum { + 00125 TYPE_FORWARD_ONLY, + 00129 TYPE_SCROLL_INSENSITIVE, + 00131 TYPE_SCROLL_SENSITIVE + 00132 }; + 00133 +-00140 bool absolute(int row); ++00140 bool absolute(int row); + 00141 +-00147 bool relative(int rows); ++00147 bool relative(int rows); + 00148 +-00150 void afterLast(); ++00150 void afterLast(); + 00151 +-00153 void beforeFirst(); ++00153 void beforeFirst(); + 00154 +-00156 bool isAfterLast(); ++00156 bool isAfterLast(); + 00157 +-00159 bool isBeforeFirst(); ++00159 bool isBeforeFirst(); + 00160 +-00162 bool isFirst(); ++00162 bool isFirst(); + 00163 +-00166 bool isLast(); ++00166 bool isLast(); + 00167 +-00172 int getRow(); ++00172 int getRow(); + 00173 +-00177 bool next(); ++00177 bool next(); + 00178 +-00182 bool previous(); ++00182 bool previous(); + 00183 +-00187 bool first(); ++00187 bool first(); + 00188 +-00192 bool last(); ++00192 bool last(); + 00193 +-00199 void moveToInsertRow(); ++00199 void moveToInsertRow(); + 00200 +-00204 void moveToCurrentRow(); ++00204 void moveToCurrentRow(); + 00205 +-00207 void refreshRow(); ++00207 void refreshRow(); + 00208 +-00210 void deleteRow(); ++00210 void deleteRow(); + 00211 +-00216 void insertRow(); ++00216 void insertRow(); + 00217 +-00219 void updateRow(); ++00219 void updateRow(); + 00220 +-00222 void cancelRowUpdates(); ++00222 void cancelRowUpdates(); + 00223 +-00227 ResultSetMetaData* getMetaData() { +-00228 return metaData_; ++00227 ResultSetMetaData* getMetaData() { ++00228 return metaData_; + 00229 } + 00230 +-00232 int findColumn(const ODBCXX_STRING& colName); ++00232 int findColumn(const ODBCXX_STRING& colName); + 00233 +-00235 bool rowDeleted(); ++00235 bool rowDeleted(); + 00236 +-00238 bool rowInserted(); ++00238 bool rowInserted(); + 00239 +-00241 bool rowUpdated(); ++00241 bool rowUpdated(); + 00242 +-00244 int getType(); ++00244 int getType(); + 00245 +-00247 int getConcurrency(); ++00247 int getConcurrency(); + 00248 + 00249 +-00251 int getFetchSize() { +-00252 return newFetchSize_; ++00251 int getFetchSize() { ++00252 return newFetchSize_; + 00253 } + 00254 +-00256 void setFetchSize(int fetchSize); ++00256 void setFetchSize(int fetchSize); + 00257 + 00259 ODBCXX_STRING getCursorName(); + 00260 +-00262 Statement* getStatement() { +-00263 return statement_; ++00262 Statement* getStatement() { ++00263 return statement_; + 00264 } + 00265 +-00269 double getDouble(int idx); ++00269 double getDouble(int idx); + 00270 +-00274 bool getBoolean(int idx); ++00274 bool getBoolean(int idx); + 00275 +-00279 signed char getByte(int idx); ++00279 signed char getByte(int idx); + 00280 +-00285 ODBCXX_BYTES getBytes(int idx); ++00285 ODBCXX_BYTES getBytes(int idx); + 00286 +-00290 Date getDate(int idx); ++00290 Date getDate(int idx); + 00291 +-00295 float getFloat(int idx); ++00295 float getFloat(int idx); + 00296 +-00300 int getInt(int idx); ++00300 int getInt(int idx); + 00301 +-00305 Long getLong(int idx); ++00305 Long getLong(int idx); + 00306 +-00310 short getShort(int idx); ++00310 short getShort(int idx); + 00311 +-00315 ODBCXX_STRING getString(int idx); ++00315 ODBCXX_STRING getString(int idx); + 00316 +-00320 Time getTime(int idx); ++00320 Time getTime(int idx); + 00321 +-00325 Timestamp getTimestamp(int idx); ++00325 Timestamp getTimestamp(int idx); + 00326 +-00330 double getDouble(const ODBCXX_STRING& colName); ++00330 double getDouble(const ODBCXX_STRING& colName); + 00331 +-00335 bool getBoolean(const ODBCXX_STRING& colName); ++00335 bool getBoolean(const ODBCXX_STRING& colName); + 00336 +-00340 signed char getByte(const ODBCXX_STRING& colName); ++00340 signed char getByte(const ODBCXX_STRING& colName); + 00341 + 00342 +-00346 ODBCXX_BYTES getBytes(const ODBCXX_STRING& colName); ++00346 ODBCXX_BYTES getBytes(const ODBCXX_STRING& colName); + 00347 +-00351 Date getDate(const ODBCXX_STRING& colName); ++00351 Date getDate(const ODBCXX_STRING& colName); + 00352 +-00356 float getFloat(const ODBCXX_STRING& colName); ++00356 float getFloat(const ODBCXX_STRING& colName); + 00357 +-00361 int getInt(const ODBCXX_STRING& colName); ++00361 int getInt(const ODBCXX_STRING& colName); + 00362 +-00366 Long getLong(const ODBCXX_STRING& colName); ++00366 Long getLong(const ODBCXX_STRING& colName); + 00367 +-00371 short getShort(const ODBCXX_STRING& colName); ++00371 short getShort(const ODBCXX_STRING& colName); + 00372 +-00376 ODBCXX_STRING getString(const ODBCXX_STRING& colName); ++00376 ODBCXX_STRING getString(const ODBCXX_STRING& colName); + 00377 +-00381 Time getTime(const ODBCXX_STRING& colName); ++00381 Time getTime(const ODBCXX_STRING& colName); + 00382 +-00386 Timestamp getTimestamp(const ODBCXX_STRING& colName); ++00386 Timestamp getTimestamp(const ODBCXX_STRING& colName); + 00387 + 00388 +-00396 ODBCXX_STREAM* getAsciiStream(int idx); ++00396 ODBCXX_STREAM* getAsciiStream(int idx); + 00397 +-00405 ODBCXX_STREAM* getAsciiStream(const ODBCXX_STRING& colName); ++00405 ODBCXX_STREAM* getAsciiStream(const ODBCXX_STRING& colName); + 00406 +-00414 ODBCXX_STREAM* getBinaryStream(int idx); ++00414 ODBCXX_STREAM* getBinaryStream(int idx); + 00415 +-00423 ODBCXX_STREAM* getBinaryStream(const ODBCXX_STRING& colName); ++00423 ODBCXX_STREAM* getBinaryStream(const ODBCXX_STRING& colName); + 00424 +-00428 bool wasNull() { +-00429 return lastWasNull_; ++00428 bool wasNull() { ++00429 return lastWasNull_; + 00430 } + 00431 +-00436 void updateDouble(int idx, double val); ++00436 void updateDouble(int idx, double val); + 00437 +-00442 void updateBoolean(int idx, bool val); ++00442 void updateBoolean(int idx, bool val); + 00443 +-00448 void updateByte(int idx, signed char val); ++00448 void updateByte(int idx, signed char val); + 00449 + 00450 +-00455 void updateBytes(int idx, const ODBCXX_BYTES& val); ++00455 void updateBytes(int idx, const ODBCXX_BYTES& val); + 00456 +-00461 void updateDate(int idx, const Date& val); ++00461 void updateDate(int idx, const Date& val); + 00462 +-00467 void updateFloat(int idx, float val); ++00467 void updateFloat(int idx, float val); + 00468 +-00473 void updateInt(int idx, int val); ++00473 void updateInt(int idx, int val); + 00474 +-00479 void updateLong(int idx, Long val); ++00479 void updateLong(int idx, Long val); + 00480 +-00485 void updateShort(int idx, short val); ++00485 void updateShort(int idx, short val); + 00486 +-00491 void updateString(int idx, const ODBCXX_STRING& val); ++00491 void updateString(int idx, const ODBCXX_STRING& val); + 00492 +-00497 void updateTime(int idx, const Time& val); ++00497 void updateTime(int idx, const Time& val); + 00498 +-00503 void updateTimestamp(int idx, const Timestamp& val); ++00503 void updateTimestamp(int idx, const Timestamp& val); + 00504 +-00508 void updateNull(int idx); ++00508 void updateNull(int idx); + 00509 + 00510 +-00515 void updateDouble(const ODBCXX_STRING& colName, double val); ++00515 void updateDouble(const ODBCXX_STRING& colName, double val); + 00516 +-00521 void updateBoolean(const ODBCXX_STRING& colName, bool val); ++00521 void updateBoolean(const ODBCXX_STRING& colName, bool val); + 00522 +-00527 void updateByte(const ODBCXX_STRING& colName, signed char val); ++00527 void updateByte(const ODBCXX_STRING& colName, signed char val); + 00528 +-00533 void updateBytes(const ODBCXX_STRING& colName, +-00534 const ODBCXX_BYTES& val); ++00533 void updateBytes(const ODBCXX_STRING& colName, ++00534 const ODBCXX_BYTES& val); + 00535 + 00536 +-00541 void updateDate(const ODBCXX_STRING& colName, const Date& val); ++00541 void updateDate(const ODBCXX_STRING& colName, const Date& val); + 00542 +-00547 void updateFloat(const ODBCXX_STRING& colName, float val); ++00547 void updateFloat(const ODBCXX_STRING& colName, float val); + 00548 +-00553 void updateInt(const ODBCXX_STRING& colName, int val); ++00553 void updateInt(const ODBCXX_STRING& colName, int val); + 00554 +-00559 void updateLong(const ODBCXX_STRING& colName, Long val); ++00559 void updateLong(const ODBCXX_STRING& colName, Long val); + 00560 +-00565 void updateShort(const ODBCXX_STRING& colName, short val); ++00565 void updateShort(const ODBCXX_STRING& colName, short val); + 00566 +-00571 void updateString(const ODBCXX_STRING& colName, const ODBCXX_STRING& val); ++00571 void updateString(const ODBCXX_STRING& colName, const ODBCXX_STRING& val); + 00572 +-00577 void updateTime(const ODBCXX_STRING& colName, const Time& val); ++00577 void updateTime(const ODBCXX_STRING& colName, const Time& val); + 00578 +-00583 void updateTimestamp(const ODBCXX_STRING& colName, const Timestamp& val); ++00583 void updateTimestamp(const ODBCXX_STRING& colName, const Timestamp& val); + 00584 +-00590 void updateAsciiStream(int idx, ODBCXX_STREAM* s, int len); ++00590 void updateAsciiStream(int idx, ODBCXX_STREAM* s, int len); + 00591 +-00597 void updateAsciiStream(const ODBCXX_STRING& colName, ODBCXX_STREAM* s, int len); ++00597 void updateAsciiStream(const ODBCXX_STRING& colName, ODBCXX_STREAM* s, int len); + 00598 + 00599 +-00605 void updateBinaryStream(int idx, ODBCXX_STREAM* s, int len); ++00605 void updateBinaryStream(int idx, ODBCXX_STREAM* s, int len); + 00606 +-00612 void updateBinaryStream(const ODBCXX_STRING& colName, ODBCXX_STREAM* s, int len); ++00612 void updateBinaryStream(const ODBCXX_STRING& colName, ODBCXX_STREAM* s, int len); + 00613 +-00617 void updateNull(const ODBCXX_STRING& colName); ++00617 void updateNull(const ODBCXX_STRING& colName); + 00618 }; + 00619 + 00620 + 00621 +-00622 }; // namespace odbc ++00622 }; // namespace odbc + 00623 + 00624 +-00625 #endif // __ODBCXX_RESULTSET_H +-

                                      ++00625 #endif // __ODBCXX_RESULTSET_H ++

    + +diff -Naur libodbc++-0.2.3/doc/progref/resultsetmetadata_8h-source.html libodbc++-0.2.3-20050404/doc/progref/resultsetmetadata_8h-source.html +--- libodbc++-0.2.3/doc/progref/resultsetmetadata_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/resultsetmetadata_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,133 +1,132 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/resultsetmetadata.h Source File ++libodbc++: odbc++/resultsetmetadata.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/resultsetmetadata.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/resultsetmetadata.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_RESULTSETMETADATA_H +-00023 #define __ODBCXX_RESULTSETMETADATA_H +-00024 +-00025 #include <odbc++/setup.h> +-00026 #include <odbc++/types.h> +-00027 #include <odbc++/resultset.h> ++00022 #ifndef __ODBCXX_RESULTSETMETADATA_H ++00023 #define __ODBCXX_RESULTSETMETADATA_H ++00024 ++00025 #include <odbc++/setup.h> ++00026 #include <odbc++/types.h> ++00027 #include <odbc++/resultset.h> + 00028 +-00029 namespace odbc { ++00029 namespace odbc { + 00030 +-00031 class ResultSet; +-00032 class DriverInfo; ++00031 class ResultSet; ++00032 class DriverInfo; + 00033 +-00035 class ODBCXX_EXPORT ResultSetMetaData { +-00036 friend class ResultSet; +-00037 friend class Statement; +-00038 private: +-00039 ResultSet* resultSet_; ++00035 class ODBCXX_EXPORT ResultSetMetaData { ++00036 friend class ResultSet; ++00037 friend class Statement; ++00038 private: ++00039 ResultSet* resultSet_; + 00040 +-00041 int numCols_; ++00041 int numCols_; + 00042 std::vector<ODBCXX_STRING> colNames_; + 00043 std::vector<int> colTypes_; + 00044 std::vector<int> colPrecisions_; + 00045 std::vector<int> colScales_; +-00046 #if ODBCVER >= 0x0300 +-00047 std::vector<int> colLengths_; +-00048 #endif +-00049 +-00050 //internal stuff +-00051 bool needsGetData_; ++00046 #if ODBCVER >= 0x0300 ++00047 std::vector<int> colLengths_; ++00048 #endif ++00049 ++00050 //internal stuff ++00051 bool needsGetData_; + 00052 +-00053 //yes, both constructor and destructor are meant to be private +-00054 ResultSetMetaData(ResultSet* rs); ++00053 //yes, both constructor and destructor are meant to be private ++00054 ResultSetMetaData(ResultSet* rs); + 00055 ~ResultSetMetaData() {} + 00056 +-00057 //driver info +-00058 const DriverInfo* _getDriverInfo() const { +-00059 return resultSet_->_getDriverInfo(); ++00057 //driver info ++00058 const DriverInfo* _getDriverInfo() const { ++00059 return resultSet_->_getDriverInfo(); + 00060 } + 00061 +-00062 //these fetch info about a column +-00063 int _getNumericAttribute(unsigned int col, SQLUSMALLINT attr); +-00064 ODBCXX_STRING _getStringAttribute(unsigned int col, SQLUSMALLINT attr, unsigned int maxlen =255); ++00062 //these fetch info about a column ++00063 int _getNumericAttribute(unsigned int col, SQLUSMALLINT attr); ++00064 ODBCXX_STRING _getStringAttribute(unsigned int col, SQLUSMALLINT attr, unsigned int maxlen =255); + 00065 +-00066 //this loads the above values +-00067 void _fetchColumnInfo(); ++00066 //this loads the above values ++00067 void _fetchColumnInfo(); + 00068 +-00069 public: +-00071 enum { ++00069 public: ++00071 enum { + 00072 columnNoNulls = SQL_NO_NULLS, + 00073 columnNullable = SQL_NULLABLE, + 00074 columnNullableUnknown = SQL_NULLABLE_UNKNOWN + 00075 }; + 00076 +-00078 int getColumnCount() const; ++00078 int getColumnCount() const; + 00079 +-00083 const ODBCXX_STRING& getColumnName(int column) const; ++00083 const ODBCXX_STRING& getColumnName(int column) const; + 00084 +-00089 int getColumnType(int column) const; ++00089 int getColumnType(int column) const; + 00090 +-00094 int getPrecision(int column) const; ++00094 int getPrecision(int column) const; + 00095 +-00099 int getScale(int column) const; ++00099 int getScale(int column) const; + 00100 +-00104 int getColumnDisplaySize(int column); ++00104 int getColumnDisplaySize(int column); + 00105 +-00109 ODBCXX_STRING getCatalogName(int column); ++00109 ODBCXX_STRING getCatalogName(int column); + 00110 +-00114 ODBCXX_STRING getColumnLabel(int column); ++00114 ODBCXX_STRING getColumnLabel(int column); + 00115 +-00119 ODBCXX_STRING getColumnTypeName(int column); ++00119 ODBCXX_STRING getColumnTypeName(int column); + 00120 +-00124 ODBCXX_STRING getSchemaName(int column); ++00124 ODBCXX_STRING getSchemaName(int column); + 00125 +-00129 ODBCXX_STRING getTableName(int column); ++00129 ODBCXX_STRING getTableName(int column); + 00130 +-00134 bool isAutoIncrement(int column); ++00134 bool isAutoIncrement(int column); + 00135 +-00139 bool isCaseSensitive(int column); ++00139 bool isCaseSensitive(int column); + 00140 +-00144 bool isCurrency(int column); ++00144 bool isCurrency(int column); + 00145 +-00149 bool isDefinitelyWritable(int column); ++00149 bool isDefinitelyWritable(int column); + 00150 +-00154 int isNullable(int column); ++00154 int isNullable(int column); + 00155 +-00159 bool isReadOnly(int column); ++00159 bool isReadOnly(int column); + 00160 +-00164 bool isSearchable(int column); ++00164 bool isSearchable(int column); + 00165 +-00169 bool isSigned(int column); ++00169 bool isSigned(int column); + 00170 +-00174 bool isWritable(int column); ++00174 bool isWritable(int column); + 00175 }; + 00176 + 00177 + 00178 +-00179 }; // namespace odbc ++00179 }; // namespace odbc + 00180 + 00181 +-00182 #endif // __ODBCXX_RESULTSETMETADATA_H +-

    ++00182 #endif // __ODBCXX_RESULTSETMETADATA_H ++
    + +diff -Naur libodbc++-0.2.3/doc/progref/setup_8h-source.html libodbc++-0.2.3-20050404/doc/progref/setup_8h-source.html +--- libodbc++-0.2.3/doc/progref/setup_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/setup_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,148 +1,147 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/setup.h Source File ++libodbc++: odbc++/setup.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/setup.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/setup.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_SETUP_H +-00023 #define __ODBCXX_SETUP_H +-00024 +-00025 #if defined(__WIN32__) && !defined(WIN32) +-00026 # define WIN32 1 +-00027 #endif +-00028 +-00029 #if !defined(WIN32) +-00030 # include <odbc++/config.h> +-00031 #else +-00032 # include <odbc++/config-win32.h> +-00033 #endif +-00034 ++00022 #ifndef __ODBCXX_SETUP_H ++00023 #define __ODBCXX_SETUP_H ++00024 ++00025 #if defined(__WIN32__) && !defined(WIN32) ++00026 # define WIN32 1 ++00027 #endif ++00028 ++00029 #if !defined(WIN32) ++00030 # include <odbc++/config.h> ++00031 #else ++00032 # include <odbc++/config-win32.h> ++00033 #endif ++00034 + 00035 +-00036 #if defined(IN_ODBCXX) && defined(ODBCXX_ENABLE_THREADS) +-00037 # if !defined(_REENTRANT) +-00038 # define _REENTRANT 1 +-00039 # endif +-00040 # if !defined(_THREAD_SAFE) +-00041 # define _THREAD_SAFE 1 +-00042 # endif +-00043 #endif +-00044 +-00045 // check whether we use strstream or stringstream +-00046 #if defined(IN_ODBCXX) +-00047 # if defined(ODBCXX_HAVE_SSTREAM) +-00048 # define ODBCXX_SSTREAM std::stringstream +-00049 # else +-00050 # define ODBCXX_SSTREAM std::strstream +-00051 # endif +-00052 #endif +-00053 +-00054 // check if ODBCVER is forced to something +-00055 #if defined(ODBCXX_ODBCVER) +-00056 # define ODBCVER ODBCXX_ODBCVER +-00057 #endif +-00058 +-00059 // this can confuse our Types::CHAR +-00060 #ifdef CHAR +-00061 #undef CHAR +-00062 #endif +-00063 +-00064 // NDEBUG and cassert +-00065 #if defined(IN_ODBCXX) +-00066 # if !defined(ODBCXX_DEBUG) +-00067 # define NDEBUG +-00068 # endif +-00069 # include <cassert> +-00070 #endif +-00071 +-00072 // this should do the trick +-00073 #if defined(__GNUC__) && __GNUC__>=3 +-00074 # define ODBCXX_HAVE_ISO_CXXLIB +-00075 #endif +-00076 ++00036 #if defined(IN_ODBCXX) && defined(ODBCXX_ENABLE_THREADS) ++00037 # if !defined(_REENTRANT) ++00038 # define _REENTRANT 1 ++00039 # endif ++00040 # if !defined(_THREAD_SAFE) ++00041 # define _THREAD_SAFE 1 ++00042 # endif ++00043 #endif ++00044 ++00045 // check whether we use strstream or stringstream ++00046 #if defined(IN_ODBCXX) ++00047 # if defined(ODBCXX_HAVE_SSTREAM) ++00048 # define ODBCXX_SSTREAM std::stringstream ++00049 # else ++00050 # define ODBCXX_SSTREAM std::strstream ++00051 # endif ++00052 #endif ++00053 ++00054 // check if ODBCVER is forced to something ++00055 #if defined(ODBCXX_ODBCVER) ++00056 # define ODBCVER ODBCXX_ODBCVER ++00057 #endif ++00058 ++00059 // this can confuse our Types::CHAR ++00060 #ifdef CHAR ++00061 #undef CHAR ++00062 #endif ++00063 ++00064 // NDEBUG and cassert ++00065 #if defined(IN_ODBCXX) ++00066 # if !defined(ODBCXX_DEBUG) ++00067 # define NDEBUG ++00068 # endif ++00069 # include <cassert> ++00070 #endif ++00071 ++00072 // this should do the trick ++00073 #if defined(__GNUC__) && __GNUC__>=3 ++00074 # define ODBCXX_HAVE_ISO_CXXLIB ++00075 #endif ++00076 + 00077 +-00078 #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) +-00079 # if defined(ODBCXX_DLL) +-00080 # if defined(IN_ODBCXX) +-00081 # define ODBCXX_EXPORT __declspec(dllexport) +-00082 # else +-00083 # define ODBCXX_EXPORT __declspec(dllimport) +-00084 # endif +-00085 # endif +-00086 #endif +-00087 +-00088 #if !defined(ODBCXX_EXPORT) +-00089 # define ODBCXX_EXPORT +-00090 #endif +-00091 +-00092 #if defined(_MSC_VER) || defined(__MINGW32__) +-00093 # define ODBCXX_DUMMY_RETURN(x) return (x) +-00094 #else +-00095 # define ODBCXX_DUMMY_RETURN(x) ((void)0) +-00096 #endif +-00097 ++00078 #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) ++00079 # if defined(ODBCXX_DLL) ++00080 # if defined(IN_ODBCXX) ++00081 # define ODBCXX_EXPORT __declspec(dllexport) ++00082 # else ++00083 # define ODBCXX_EXPORT __declspec(dllimport) ++00084 # endif ++00085 # endif ++00086 #endif ++00087 ++00088 #if !defined(ODBCXX_EXPORT) ++00089 # define ODBCXX_EXPORT ++00090 #endif ++00091 ++00092 #if defined(_MSC_VER) || defined(__MINGW32__) ++00093 # define ODBCXX_DUMMY_RETURN(x) return (x) ++00094 #else ++00095 # define ODBCXX_DUMMY_RETURN(x) ((void)0) ++00096 #endif ++00097 + 00098 +-00099 // environment abstractions ++00099 // environment abstractions + 00100 +-00101 #if defined(ODBCXX_QT) +-00102 +-00103 # define ODBCXX_STRING QString +-00104 # define ODBCXX_STRING_C(s) QString::fromLocal8Bit(s) +-00105 # define ODBCXX_STRING_CL(s,l) QString::fromLocal8Bit(s,l) +-00106 # define ODBCXX_STRING_LEN(s) s.length() +-00107 # define ODBCXX_STRING_DATA(s) s.local8Bit().data() +-00108 # define ODBCXX_STRING_CSTR(s) s.local8Bit().data() +-00109 +-00110 # define ODBCXX_STREAM QIODevice +-00111 +-00112 # define ODBCXX_BYTES QByteArray +-00113 # define ODBCXX_BYTES_SIZE(b) b.size() +-00114 # define ODBCXX_BYTES_DATA(b) b.data() +-00115 # define ODBCXX_BYTES_C(buf,len) QByteArray().duplicate(buf,len) +-00116 +-00117 #else +-00118 +-00119 # define ODBCXX_STRING std::string +-00120 # define ODBCXX_STRING_C(s) std::string(s) +-00121 # define ODBCXX_STRING_CL(s,l) std::string(s,l) +-00122 # define ODBCXX_STRING_LEN(s) s.length() +-00123 # define ODBCXX_STRING_DATA(s) s.data() +-00124 # define ODBCXX_STRING_CSTR(s) s.c_str() +-00125 +-00126 # define ODBCXX_STREAM std::istream +-00127 +-00128 # define ODBCXX_BYTES odbc::Bytes +-00129 # define ODBCXX_BYTES_SIZE(b) b.getSize() +-00130 # define ODBCXX_BYTES_DATA(b) b.getData() +-00131 # define ODBCXX_BYTES_C(buf,len) odbc::Bytes((signed char*)buf,(size_t)len) +-00132 +-00133 #endif // ODBCXX_QT +-00134 ++00101 #if defined(ODBCXX_QT) ++00102 ++00103 # define ODBCXX_STRING QString ++00104 # define ODBCXX_STRING_C(s) QString::fromLocal8Bit(s) ++00105 # define ODBCXX_STRING_CL(s,l) QString::fromLocal8Bit(s,l) ++00106 # define ODBCXX_STRING_LEN(s) s.length() ++00107 # define ODBCXX_STRING_DATA(s) s.local8Bit().data() ++00108 # define ODBCXX_STRING_CSTR(s) s.local8Bit().data() ++00109 ++00110 # define ODBCXX_STREAM QIODevice ++00111 ++00112 # define ODBCXX_BYTES QByteArray ++00113 # define ODBCXX_BYTES_SIZE(b) b.size() ++00114 # define ODBCXX_BYTES_DATA(b) b.data() ++00115 # define ODBCXX_BYTES_C(buf,len) QByteArray().duplicate(buf,len) ++00116 ++00117 #else ++00118 ++00119 # define ODBCXX_STRING std::string ++00120 # define ODBCXX_STRING_C(s) std::string(s) ++00121 # define ODBCXX_STRING_CL(s,l) std::string(s,l) ++00122 # define ODBCXX_STRING_LEN(s) s.length() ++00123 # define ODBCXX_STRING_DATA(s) s.data() ++00124 # define ODBCXX_STRING_CSTR(s) s.c_str() ++00125 ++00126 # define ODBCXX_STREAM std::istream ++00127 ++00128 # define ODBCXX_BYTES odbc::Bytes ++00129 # define ODBCXX_BYTES_SIZE(b) b.getSize() ++00130 # define ODBCXX_BYTES_DATA(b) b.getData() ++00131 # define ODBCXX_BYTES_C(buf,len) odbc::Bytes((signed char*)buf,(size_t)len) ++00132 ++00133 #endif // ODBCXX_QT ++00134 + 00135 +-00136 #endif // __ODBCXX_SETUP_H +-

    ++00136 #endif // __ODBCXX_SETUP_H ++
    + +diff -Naur libodbc++-0.2.3/doc/progref/statement_8h-source.html libodbc++-0.2.3-20050404/doc/progref/statement_8h-source.html +--- libodbc++-0.2.3/doc/progref/statement_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/statement_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,68 +1,67 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/statement.h Source File ++libodbc++: odbc++/statement.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/statement.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/statement.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_STATEMENT_H +-00023 #define __ODBCXX_STATEMENT_H +-00024 +-00025 #include <odbc++/setup.h> +-00026 #include <odbc++/types.h> +-00027 #include <odbc++/errorhandler.h> +-00028 #include <odbc++/connection.h> ++00022 #ifndef __ODBCXX_STATEMENT_H ++00023 #define __ODBCXX_STATEMENT_H ++00024 ++00025 #include <odbc++/setup.h> ++00026 #include <odbc++/types.h> ++00027 #include <odbc++/errorhandler.h> ++00028 #include <odbc++/connection.h> + 00029 +-00030 namespace odbc { ++00030 namespace odbc { + 00031 +-00032 class ResultSet; +-00033 class DriverInfo; ++00032 class ResultSet; ++00033 class DriverInfo; + 00034 +-00036 class ODBCXX_EXPORT Statement : public ErrorHandler { +-00037 friend class Connection; +-00038 friend class ResultSet; +-00039 friend class DatabaseMetaData; ++00036 class ODBCXX_EXPORT Statement : public ErrorHandler { ++00037 friend class Connection; ++00038 friend class ResultSet; ++00039 friend class DatabaseMetaData; + 00040 +-00041 protected: +-00042 Connection* connection_; ++00041 protected: ++00042 Connection* connection_; + 00043 SQLHSTMT hstmt_; +-00044 int lastExecute_; ++00044 int lastExecute_; + 00045 +-00046 const DriverInfo* _getDriverInfo() const { +-00047 return connection_->_getDriverInfo(); ++00046 const DriverInfo* _getDriverInfo() const { ++00047 return connection_->_getDriverInfo(); + 00048 } + 00049 +-00050 private: +-00051 ResultSet* currentResultSet_; ++00050 private: ++00051 ResultSet* currentResultSet_; + 00052 +-00053 int fetchSize_; +-00054 int resultSetType_; +-00055 int resultSetConcurrency_; ++00053 int fetchSize_; ++00054 int resultSetType_; ++00055 int resultSetConcurrency_; + 00056 +-00057 //used internally +-00058 enum StatementState { ++00057 //used internally ++00058 enum StatementState { + 00059 STATE_CLOSED, + 00060 STATE_OPEN + 00061 }; +@@ -71,153 +70,153 @@ + 00064 + 00065 std::vector<ODBCXX_STRING> batches_; + 00066 +-00067 void _registerResultSet(ResultSet* rs); +-00068 void _unregisterResultSet(ResultSet* rs); ++00067 void _registerResultSet(ResultSet* rs); ++00068 void _unregisterResultSet(ResultSet* rs); + 00069 +-00070 void _applyResultSetType(); ++00070 void _applyResultSetType(); + 00071 +-00072 ResultSet* _getTypeInfo(); +-00073 ResultSet* _getTables(const ODBCXX_STRING& catalog, +-00074 const ODBCXX_STRING& schema, +-00075 const ODBCXX_STRING& tableName, +-00076 const ODBCXX_STRING& types); ++00072 ResultSet* _getTypeInfo(); ++00073 ResultSet* _getTables(const ODBCXX_STRING& catalog, ++00074 const ODBCXX_STRING& schema, ++00075 const ODBCXX_STRING& tableName, ++00076 const ODBCXX_STRING& types); + 00077 +-00078 ResultSet* _getTablePrivileges(const ODBCXX_STRING& catalog, +-00079 const ODBCXX_STRING& schema, +-00080 const ODBCXX_STRING& tableName); ++00078 ResultSet* _getTablePrivileges(const ODBCXX_STRING& catalog, ++00079 const ODBCXX_STRING& schema, ++00080 const ODBCXX_STRING& tableName); + 00081 +-00082 ResultSet* _getColumnPrivileges(const ODBCXX_STRING& catalog, +-00083 const ODBCXX_STRING& schema, +-00084 const ODBCXX_STRING& tableName, +-00085 const ODBCXX_STRING& columnName); ++00082 ResultSet* _getColumnPrivileges(const ODBCXX_STRING& catalog, ++00083 const ODBCXX_STRING& schema, ++00084 const ODBCXX_STRING& tableName, ++00085 const ODBCXX_STRING& columnName); + 00086 +-00087 ResultSet* _getPrimaryKeys(const ODBCXX_STRING& catalog, +-00088 const ODBCXX_STRING& schema, +-00089 const ODBCXX_STRING& tableName); ++00087 ResultSet* _getPrimaryKeys(const ODBCXX_STRING& catalog, ++00088 const ODBCXX_STRING& schema, ++00089 const ODBCXX_STRING& tableName); + 00090 +-00091 ResultSet* _getColumns(const ODBCXX_STRING& catalog, +-00092 const ODBCXX_STRING& schema, +-00093 const ODBCXX_STRING& tableName, +-00094 const ODBCXX_STRING& columnName); ++00091 ResultSet* _getColumns(const ODBCXX_STRING& catalog, ++00092 const ODBCXX_STRING& schema, ++00093 const ODBCXX_STRING& tableName, ++00094 const ODBCXX_STRING& columnName); + 00095 +-00096 ResultSet* _getIndexInfo(const ODBCXX_STRING& catalog, +-00097 const ODBCXX_STRING& schema, +-00098 const ODBCXX_STRING& tableName, +-00099 bool unique, bool approximate); ++00096 ResultSet* _getIndexInfo(const ODBCXX_STRING& catalog, ++00097 const ODBCXX_STRING& schema, ++00098 const ODBCXX_STRING& tableName, ++00099 bool unique, bool approximate); + 00100 +-00101 ResultSet* _getCrossReference(const ODBCXX_STRING& pc, +-00102 const ODBCXX_STRING& ps, +-00103 const ODBCXX_STRING& pt, +-00104 const ODBCXX_STRING& fc, +-00105 const ODBCXX_STRING& fs, +-00106 const ODBCXX_STRING& ft); ++00101 ResultSet* _getCrossReference(const ODBCXX_STRING& pc, ++00102 const ODBCXX_STRING& ps, ++00103 const ODBCXX_STRING& pt, ++00104 const ODBCXX_STRING& fc, ++00105 const ODBCXX_STRING& fs, ++00106 const ODBCXX_STRING& ft); + 00107 + 00108 +-00109 ResultSet* _getProcedures(const ODBCXX_STRING& catalog, +-00110 const ODBCXX_STRING& schema, +-00111 const ODBCXX_STRING& procName); ++00109 ResultSet* _getProcedures(const ODBCXX_STRING& catalog, ++00110 const ODBCXX_STRING& schema, ++00111 const ODBCXX_STRING& procName); + 00112 +-00113 ResultSet* _getProcedureColumns(const ODBCXX_STRING& catalog, +-00114 const ODBCXX_STRING& schema, +-00115 const ODBCXX_STRING& procName, +-00116 const ODBCXX_STRING& colName); ++00113 ResultSet* _getProcedureColumns(const ODBCXX_STRING& catalog, ++00114 const ODBCXX_STRING& schema, ++00115 const ODBCXX_STRING& procName, ++00116 const ODBCXX_STRING& colName); + 00117 +-00118 ResultSet* _getSpecialColumns(const ODBCXX_STRING& catalog, +-00119 const ODBCXX_STRING& schema, +-00120 const ODBCXX_STRING& table, +-00121 int what,int scope,int nullable); ++00118 ResultSet* _getSpecialColumns(const ODBCXX_STRING& catalog, ++00119 const ODBCXX_STRING& schema, ++00120 const ODBCXX_STRING& table, ++00121 int what,int scope,int nullable); + 00122 +-00123 protected: +-00124 Statement(Connection* con, SQLHSTMT hstmt, +-00125 int resultSetType, int resultSetConcurrency); ++00123 protected: ++00124 Statement(Connection* con, SQLHSTMT hstmt, ++00125 int resultSetType, int resultSetConcurrency); + 00126 +-00127 //utilities ++00127 //utilities + 00128 SQLUINTEGER _getNumericOption(SQLINTEGER optnum); + 00129 ODBCXX_STRING _getStringOption(SQLINTEGER optnum); + 00130 +-00131 void _setNumericOption(SQLINTEGER optnum, SQLUINTEGER value); +-00132 void _setStringOption(SQLINTEGER optnum, const ODBCXX_STRING& value); ++00131 void _setNumericOption(SQLINTEGER optnum, SQLUINTEGER value); ++00132 void _setStringOption(SQLINTEGER optnum, const ODBCXX_STRING& value); + 00133 +-00134 #if ODBCVER >= 0x0300 +-00135 SQLPOINTER _getPointerOption(SQLINTEGER optnum); +-00136 void _setPointerOption(SQLINTEGER optnum, SQLPOINTER value); +-00137 #endif +-00138 +-00139 //this returns true if we have a result set pending +-00140 bool _checkForResults(); ++00134 #if ODBCVER >= 0x0300 ++00135 SQLPOINTER _getPointerOption(SQLINTEGER optnum); ++00136 void _setPointerOption(SQLINTEGER optnum, SQLPOINTER value); ++00137 #endif ++00138 ++00139 //this returns true if we have a result set pending ++00140 bool _checkForResults(); + 00141 +-00142 //this _always_ returns a ResultSet. If hideMe is true, this statement +-00143 //becomes 'owned' by the ResultSet +-00144 ResultSet* _getResultSet(bool hideMe =false); ++00142 //this _always_ returns a ResultSet. If hideMe is true, this statement ++00143 //becomes 'owned' by the ResultSet ++00144 ResultSet* _getResultSet(bool hideMe =false); + 00145 +-00146 //this is called before a Statement (or any of the derived classes) +-00147 //is executed +-00148 void _beforeExecute(); ++00146 //this is called before a Statement (or any of the derived classes) ++00147 //is executed ++00148 void _beforeExecute(); + 00149 +-00150 //this is called after a successeful execution +-00151 void _afterExecute(); ++00150 //this is called after a successeful execution ++00151 void _afterExecute(); + 00152 + 00153 +-00154 public: +-00158 virtual ~Statement(); ++00154 public: ++00158 virtual ~Statement(); + 00159 +-00161 Connection* getConnection(); ++00161 Connection* getConnection(); + 00162 + 00163 +-00165 void cancel(); ++00165 void cancel(); + 00166 +-00174 virtual bool execute(const ODBCXX_STRING& sql); ++00174 virtual bool execute(const ODBCXX_STRING& sql); + 00175 +-00180 virtual ResultSet* executeQuery(const ODBCXX_STRING& sql); ++00180 virtual ResultSet* executeQuery(const ODBCXX_STRING& sql); + 00181 +-00185 virtual int executeUpdate(const ODBCXX_STRING& sql); ++00185 virtual int executeUpdate(const ODBCXX_STRING& sql); + 00186 +-00192 int getUpdateCount(); ++00192 int getUpdateCount(); + 00193 +-00195 ResultSet* getResultSet(); ++00195 ResultSet* getResultSet(); + 00196 +-00201 bool getMoreResults(); ++00201 bool getMoreResults(); + 00202 +-00204 void setCursorName(const ODBCXX_STRING& name); ++00204 void setCursorName(const ODBCXX_STRING& name); + 00205 +-00209 int getFetchSize() { +-00210 return fetchSize_; ++00209 int getFetchSize() { ++00210 return fetchSize_; + 00211 } + 00212 +-00214 void setFetchSize(int size); ++00214 void setFetchSize(int size); + 00215 +-00217 int getResultSetConcurrency() { +-00218 return resultSetConcurrency_; ++00217 int getResultSetConcurrency() { ++00218 return resultSetConcurrency_; + 00219 } + 00220 +-00222 int getResultSetType() { +-00223 return resultSetType_; ++00222 int getResultSetType() { ++00223 return resultSetType_; + 00224 } + 00225 +-00227 int getQueryTimeout(); +-00229 void setQueryTimeout(int seconds); ++00227 int getQueryTimeout(); ++00229 void setQueryTimeout(int seconds); + 00230 +-00232 int getMaxRows(); +-00234 void setMaxRows(int maxRows); ++00232 int getMaxRows(); ++00234 void setMaxRows(int maxRows); + 00235 +-00237 int getMaxFieldSize(); +-00239 void setMaxFieldSize(int maxFieldSize); ++00237 int getMaxFieldSize(); ++00239 void setMaxFieldSize(int maxFieldSize); + 00240 +-00246 void setEscapeProcessing(bool on); ++00246 void setEscapeProcessing(bool on); + 00247 +-00252 bool getEscapeProcessing(); ++00252 bool getEscapeProcessing(); + 00253 +-00257 void close(); ++00257 void close(); + 00258 + 00259 }; + 00260 + 00261 + 00262 +-00263 }; // namespace odbc ++00263 }; // namespace odbc + 00264 + 00265 +-00266 #endif // __ODBCXX_STATEMENT_H +-

    ++00266 #endif // __ODBCXX_STATEMENT_H ++
    + +diff -Naur libodbc++-0.2.3/doc/progref/structodbc_1_1_types.html libodbc++-0.2.3-20050404/doc/progref/structodbc_1_1_types.html +--- libodbc++-0.2.3/doc/progref/structodbc_1_1_types.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/structodbc_1_1_types.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,56 +1,56 @@ +- ++ + +-odbc::Types struct Reference ++libodbc++: odbc::Types Struct Reference + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Types Struct Reference

    SQL type constants. ++ ++ ++

    odbc::Types Struct Reference

    SQL type constants. + More... +

    + #include <types.h> +

    + List of all members.

    Public Types

    + ++
    Type constants. More...
    +

    Detailed Description

    +-SQL type constants. ++SQL type constants. +

    +


    Member Enumeration Documentation

    +-

    +- ++

    ++

    + +- + +@@ -63,56 +63,55 @@ + + +
    ++ + + +- ++ +
    enum odbc::Types::SQLType ++ enum odbc::Types::SQLType
    +
    + +

    +-Type constants. ++Type constants. +

    +-

    +-Enumeration values:
    ++
    Enumeration values:
    + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    BIGINT  +-An SQL BIGINT.
    BINARY  +-An SQL BINARY (fixed length).
    BIT  +-An SQL BIT.
    CHAR  +-An SQL CHAR (fixed length).
    DATE  +-An SQL DATE.
    DECIMAL  +-An SQL DECIMAL (precision,scale).
    DOUBLE  +-An SQL DOUBLE.
    FLOAT  +-An SQL FLOAT.
    INTEGER  +-An SQL INTEGER.
    LONGVARBINARY  +-An SQL LONGVARBINARY (variable length, huge).
    LONGVARCHAR  +-An SQL LONGVARCHAR (variable length, huge).
    NUMERIC  +-An SQL NUMERIC (precision,scale).
    REAL  +-An SQL REAL.
    SMALLINT  +-An SQL SMALLINT.
    TIME  +-An SQL TIME.
    TIMESTAMP  +-An SQL TIMESTAMP.
    TINYINT  +-An SQL TINYINT.
    VARBINARY  +-An SQL VARBINARY (variable length less than 256).
    VARCHAR  +-An SQL VARCHAR (variable length less than 256).
    BIGINT  ++An SQL BIGINT.
    BINARY  ++An SQL BINARY (fixed length).
    BIT  ++An SQL BIT.
    CHAR  ++An SQL CHAR (fixed length).
    DATE  ++An SQL DATE.
    DECIMAL  ++An SQL DECIMAL (precision,scale).
    DOUBLE  ++An SQL DOUBLE.
    FLOAT  ++An SQL FLOAT.
    INTEGER  ++An SQL INTEGER.
    LONGVARBINARY  ++An SQL LONGVARBINARY (variable length, huge).
    LONGVARCHAR  ++An SQL LONGVARCHAR (variable length, huge).
    NUMERIC  ++An SQL NUMERIC (precision,scale).
    REAL  ++An SQL REAL.
    SMALLINT  ++An SQL SMALLINT.
    TIME  ++An SQL TIME.
    TIMESTAMP  ++An SQL TIMESTAMP.
    TINYINT  ++An SQL TINYINT.
    VARBINARY  ++An SQL VARBINARY (variable length less than 256).
    VARCHAR  ++An SQL VARCHAR (variable length less than 256).
    +
    +
    +


    The documentation for this struct was generated from the following file:
      +-
    • /trees/alex/src/libodbc++/include/odbc++/types.h
    ++
  • odbc++/types.h +
    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/structodbc_1_1_types-members.html libodbc++-0.2.3-20050404/doc/progref/structodbc_1_1_types-members.html +--- libodbc++-0.2.3/doc/progref/structodbc_1_1_types-members.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/structodbc_1_1_types-members.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,32 +1,31 @@ +- ++ + +-Member List ++libodbc++: Member List + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    odbc::Types Member List

    This is the complete list of members for odbc::Types, including all inherited members. +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++

    odbc::Types Member List

    This is the complete list of members for odbc::Types, including all inherited members.

    BIGINT enum valueodbc::Types
    BINARY enum valueodbc::Types
    BIT enum valueodbc::Types
    CHAR enum valueodbc::Types
    DATE enum valueodbc::Types
    DECIMAL enum valueodbc::Types
    DOUBLE enum valueodbc::Types
    FLOAT enum valueodbc::Types
    INTEGER enum valueodbc::Types
    LONGVARBINARY enum valueodbc::Types
    LONGVARCHAR enum valueodbc::Types
    NUMERIC enum valueodbc::Types
    REAL enum valueodbc::Types
    SMALLINT enum valueodbc::Types
    SQLType enum nameodbc::Types
    TIME enum valueodbc::Types
    TIMESTAMP enum valueodbc::Types
    TINYINT enum valueodbc::Types
    VARBINARY enum valueodbc::Types
    VARCHAR enum valueodbc::Types
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +
    BIGINT enum valueodbc::Types
    BINARY enum valueodbc::Types
    BIT enum valueodbc::Types
    CHAR enum valueodbc::Types
    DATE enum valueodbc::Types
    DECIMAL enum valueodbc::Types
    DOUBLE enum valueodbc::Types
    FLOAT enum valueodbc::Types
    INTEGER enum valueodbc::Types
    LONGVARBINARY enum valueodbc::Types
    LONGVARCHAR enum valueodbc::Types
    NUMERIC enum valueodbc::Types
    REAL enum valueodbc::Types
    SMALLINT enum valueodbc::Types
    SQLType enum nameodbc::Types
    TIME enum valueodbc::Types
    TIMESTAMP enum valueodbc::Types
    TINYINT enum valueodbc::Types
    VARBINARY enum valueodbc::Types
    VARCHAR enum valueodbc::Types

    +
    + Go back to the freeodbc++ homepage +diff -Naur libodbc++-0.2.3/doc/progref/threads_8h-source.html libodbc++-0.2.3-20050404/doc/progref/threads_8h-source.html +--- libodbc++-0.2.3/doc/progref/threads_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/threads_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,68 +1,67 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/threads.h Source File ++libodbc++: odbc++/threads.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/threads.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/threads.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_THREADS_H +-00023 #define __ODBCXX_THREADS_H +-00024 +-00025 #include <odbc++/setup.h> ++00022 #ifndef __ODBCXX_THREADS_H ++00023 #define __ODBCXX_THREADS_H ++00024 ++00025 #include <odbc++/setup.h> + 00026 +-00027 #if defined(ODBCXX_ENABLE_THREADS) +-00028 +-00029 #if !defined(WIN32) +-00030 # include <pthread.h> +-00031 #endif +-00032 +-00033 namespace odbc { ++00027 #if defined(ODBCXX_ENABLE_THREADS) ++00028 ++00029 #if !defined(WIN32) ++00030 # include <pthread.h> ++00031 #endif ++00032 ++00033 namespace odbc { + 00034 +-00035 class ODBCXX_EXPORT Mutex { +-00036 private: +-00037 #if !defined(WIN32) +-00038 pthread_mutex_t mutex_; +-00039 #else +-00040 CRITICAL_SECTION mutex_; +-00041 #endif +-00042 +-00043 Mutex(const Mutex&); +-00044 Mutex& operator=(const Mutex&); ++00035 class ODBCXX_EXPORT Mutex { ++00036 private: ++00037 #if !defined(WIN32) ++00038 pthread_mutex_t mutex_; ++00039 #else ++00040 CRITICAL_SECTION mutex_; ++00041 #endif ++00042 ++00043 Mutex(const Mutex&); ++00044 Mutex& operator=(const Mutex&); + 00045 +-00046 public: +-00047 explicit Mutex(); ++00046 public: ++00047 explicit Mutex(); + 00048 ~Mutex(); + 00049 +-00050 void lock(); +-00051 void unlock(); ++00050 void lock(); ++00051 void unlock(); + 00052 }; + 00053 +-00054 class ODBCXX_EXPORT Locker { +-00055 private: ++00054 class ODBCXX_EXPORT Locker { ++00055 private: + 00056 Mutex& m_; +-00057 public: ++00057 public: + 00058 Locker(Mutex& m) + 00059 :m_(m) { + 00060 m_.lock(); +@@ -73,19 +72,19 @@ + 00065 } + 00066 }; + 00067 +-00068 }; //namespace odbc ++00068 }; //namespace odbc + 00069 +-00070 // macro used all over the place +-00071 #define ODBCXX_LOCKER(mut) odbc::Locker _locker(mut) +-00072 +-00073 #else // !ODBCXX_ENABLE_THREADS +-00074 +-00075 #define ODBCXX_LOCKER(mut) ((void)0) +-00076 +-00077 #endif +-00078 +-00079 #endif // __ODBCXX_THREADS_H +-

    ++00070 // macro used all over the place ++00071 #define ODBCXX_LOCKER(mut) odbc::Locker _locker(mut) ++00072 ++00073 #else // !ODBCXX_ENABLE_THREADS ++00074 ++00075 #define ODBCXX_LOCKER(mut) ((void)0) ++00076 ++00077 #endif ++00078 ++00079 #endif // __ODBCXX_THREADS_H ++

    + +diff -Naur libodbc++-0.2.3/doc/progref/types_8h-source.html libodbc++-0.2.3-20050404/doc/progref/types_8h-source.html +--- libodbc++-0.2.3/doc/progref/types_8h-source.html 2003-06-17 12:25:42.000000000 +0200 ++++ libodbc++-0.2.3-20050404/doc/progref/types_8h-source.html 2005-04-04 18:21:28.000000000 +0200 +@@ -1,672 +1,681 @@ +- ++ + +-/trees/alex/src/libodbc++/include/odbc++/types.h Source File ++libodbc++: odbc++/types.h Source File + + +- +-
    +-Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  
    +-

    /trees/alex/src/libodbc++/include/odbc++/types.h

    00001 /* 
    +-00002    This file is part of libodbc++.
    +-00003    
    +-00004    Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>
    +-00005    
    +-00006    This library is free software; you can redistribute it and/or
    +-00007    modify it under the terms of the GNU Library General Public
    +-00008    License as published by the Free Software Foundation; either
    +-00009    version 2 of the License, or (at your option) any later version.
    +-00010    
    +-00011    This library is distributed in the hope that it will be useful,
    +-00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +-00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +-00014    Library General Public License for more details.
    +-00015    
    +-00016    You should have received a copy of the GNU Library General Public License
    +-00017    along with this library; see the file COPYING.  If not, write to
    +-00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    +-00019    Boston, MA 02111-1307, USA.
    +-00020 */
    ++
    ++
    ++

    odbc++/types.h

    00001 /* ++00002 This file is part of libodbc++. ++00003 ++00004 Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net> ++00005 ++00006 This library is free software; you can redistribute it and/or ++00007 modify it under the terms of the GNU Library General Public ++00008 License as published by the Free Software Foundation; either ++00009 version 2 of the License, or (at your option) any later version. ++00010 ++00011 This library is distributed in the hope that it will be useful, ++00012 but WITHOUT ANY WARRANTY; without even the implied warranty of ++00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++00014 Library General Public License for more details. ++00015 ++00016 You should have received a copy of the GNU Library General Public License ++00017 along with this library; see the file COPYING. If not, write to ++00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++00019 Boston, MA 02111-1307, USA. ++00020 */ + 00021 +-00022 #ifndef __ODBCXX_TYPES_H +-00023 #define __ODBCXX_TYPES_H +-00024 +-00025 #include <odbc++/setup.h> ++00022 #ifndef __ODBCXX_TYPES_H ++00023 #define __ODBCXX_TYPES_H ++00024 ++00025 #include <odbc++/setup.h> + 00026 +-00027 #include <exception> ++00027 #include <exception> + 00028 +-00029 #if !defined(ODBCXX_QT) +-00030 # include <string> +-00031 # else +-00032 # include <qstring.h> +-00033 #endif +-00034 +-00035 #include <ctime> +-00036 #if defined(ODBCXX_NO_STD_TIME_T) +-00037 namespace std { ++00029 #if !defined(ODBCXX_QT) ++00030 # include <string> ++00031 # else ++00032 # include <qstring.h> ++00033 #endif ++00034 ++00035 #include <ctime> ++00036 #if defined(ODBCXX_NO_STD_TIME_T) ++00037 namespace std { + 00038 using ::time_t; + 00039 }; +-00040 #endif +-00041 +-00042 #if defined(ODBCXX_QT) +-00043 class QIODevice; +-00044 #endif +-00045 +-00046 #if defined(ODBCXX_HAVE_ISQL_H) && defined(ODBCXX_HAVE_ISQLEXT_H) +-00047 # include <isql.h> +-00048 # include <isqlext.h> +-00049 #elif defined(ODBCXX_HAVE_SQL_H) && defined(ODBCXX_HAVE_SQLEXT_H) +-00050 # include <sql.h> +-00051 # include <sqlext.h> +-00052 #else +-00053 # error "Whoops. Can not recognize the ODBC subsystem." +-00054 #endif +-00055 +-00056 #if defined(ODBCXX_HAVE_SQLUCODE_H) +-00057 # include <sqlucode.h> +-00058 #endif +-00059 +-00060 // fixups for current iODBC, which kindly doesn't provide SQL_TRUE and +-00061 // SQL_FALSE macros ++00040 #endif ++00041 ++00042 #if defined(ODBCXX_QT) ++00043 class QIODevice; ++00044 #endif ++00045 ++00046 #if defined(ODBCXX_HAVE_ISQL_H) && defined(ODBCXX_HAVE_ISQLEXT_H) ++00047 # include <isql.h> ++00048 # include <isqlext.h> ++00049 #elif defined(ODBCXX_HAVE_SQL_H) && defined(ODBCXX_HAVE_SQLEXT_H) ++00050 # include <sql.h> ++00051 # include <sqlext.h> ++00052 #else ++00053 # error "Whoops. Can not recognize the ODBC subsystem." ++00054 #endif ++00055 ++00056 #if defined(ODBCXX_HAVE_SQLUCODE_H) ++00057 # include <sqlucode.h> ++00058 #endif ++00059 ++00060 // fixups for current iODBC, which kindly doesn't provide SQL_TRUE and ++00061 // SQL_FALSE macros + 00062 +-00063 #if !defined(SQL_TRUE) +-00064 # define SQL_TRUE 1 +-00065 #endif +-00066 +-00067 #if !defined(SQL_FALSE) +-00068 # define SQL_FALSE 0 +-00069 #endif +-00070 +-00071 // MS ODBC SDK misses this in some releases +-00072 #if ODBCVER >= 0x0300 && !defined(SQL_NOT_DEFERRABLE) +-00073 # define SQL_NOT_DEFERRABLE 7 +-00074 #endif +-00075 ++00063 #if !defined(SQL_TRUE) ++00064 # define SQL_TRUE 1 ++00065 #endif ++00066 ++00067 #if !defined(SQL_FALSE) ++00068 # define SQL_FALSE 0 ++00069 #endif ++00070 ++00071 // MS ODBC SDK misses this in some releases ++00072 #if ODBCVER >= 0x0300 && !defined(SQL_NOT_DEFERRABLE) ++00073 # define SQL_NOT_DEFERRABLE 7 ++00074 #endif ++00075 + 00076 +-00077 // Setup our ODBC3_C (odbc3 conditional) macro +-00078 #if ODBCVER >= 0x0300 +-00079 +-00080 # define ODBC3_C(odbc3_value,old_value) odbc3_value +-00081 +-00082 #else +-00083 +-00084 # define ODBC3_C(odbc3_value,old_value) old_value +-00085 +-00086 #endif +-00087 ++00077 // Setup our ODBC3_C (odbc3 conditional) macro ++00078 #if ODBCVER >= 0x0300 ++00079 ++00080 # define ODBC3_C(odbc3_value,old_value) odbc3_value ++00081 ++00082 #else ++00083 ++00084 # define ODBC3_C(odbc3_value,old_value) old_value ++00085 ++00086 #endif ++00087 + 00088 +-00089 // ODBC3_DC (odbc3 dynamic conditional) +-00090 // Every context using this macro should provide +-00091 // a this->_getDriverInfo() method returning +-00092 // a const DriverInfo* ++00089 // ODBC3_DC (odbc3 dynamic conditional) ++00090 // Every context using this macro should provide ++00091 // a this->_getDriverInfo() method returning ++00092 // a const DriverInfo* + 00093 +-00094 #if ODBCVER >= 0x0300 +-00095 +-00096 # define ODBC3_DC(odbc3_value,old_value) \ +-00097 (this->_getDriverInfo()->getMajorVersion()>=3?odbc3_value:old_value) +-00098 +-00099 #else +-00100 +-00101 # define ODBC3_DC(odbc3_value,old_value) old_value +-00102 +-00103 #endif +-00104 +-00105 #if defined(ODBCXX_HAVE_INTTYPES_H) +-00106 # include <inttypes.h> +-00107 #endif +-00108 +-00109 #include <vector> ++00094 #if ODBCVER >= 0x0300 ++00095 ++00096 # define ODBC3_DC(odbc3_value,old_value) \ ++00097 (this->_getDriverInfo()->getMajorVersion()>=3?odbc3_value:old_value) ++00098 ++00099 #else ++00100 ++00101 # define ODBC3_DC(odbc3_value,old_value) old_value ++00102 ++00103 #endif ++00104 ++00105 #if defined(ODBCXX_HAVE_INTTYPES_H) ++00106 # include <inttypes.h> ++00107 #endif ++00108 ++00109 #include <vector> + 00110 + 00111 +-00112 namespace odbc { ++00112 namespace odbc { + 00113 +-00114 // We want Long to be at least 64 bits ++00114 // We want Long to be at least 64 bits + 00115 +-00116 #if defined(WIN32) +-00117 +-00118 typedef __int64 Long; ++00116 #if defined(WIN32) ++00117 ++00118 typedef __int64 Long; + 00119 +-00120 #elif defined(ODBCXX_HAVE_INTTYPES_H) +-00121 +-00122 typedef int64_t Long; ++00120 #elif defined(ODBCXX_HAVE_INTTYPES_H) ++00121 ++00122 typedef int64_t Long; + 00123 +-00124 #else +-00125 +-00126 # if ODBCXX_SIZEOF_INT == 8 +-00127 +-00128 typedef int Long; ++00124 #else ++00125 ++00126 # if ODBCXX_SIZEOF_INT == 8 ++00127 ++00128 typedef int Long; + 00129 +-00130 # elif ODBCXX_SIZEOF_LONG == 8 +-00131 +-00132 typedef long Long; ++00130 # elif ODBCXX_SIZEOF_LONG == 8 ++00131 ++00132 typedef long Long; + 00133 +-00134 # elif ODBCXX_SIZEOF_LONG_LONG == 8 +-00135 +-00136 typedef long long Long; ++00134 # elif ODBCXX_SIZEOF_LONG_LONG == 8 ++00135 ++00136 typedef long long Long; + 00137 +-00138 # else +-00139 +-00140 # error "Can't find an appropriate at-least-64-bit integer" +-00141 +-00142 # endif +-00143 +-00144 #endif +-00145 ++00138 # else ++00139 ++00140 # error "Can't find an appropriate at-least-64-bit integer" ++00141 ++00142 # endif ++00143 ++00144 #endif ++00145 + 00146 +-00147 //constants: +-00148 //how much we try to fetch with each SQLGetData call +-00149 const int GETDATA_CHUNK_SIZE=4*1024; +-00150 //how much we write with each SQLPutData call +-00151 const int PUTDATA_CHUNK_SIZE=GETDATA_CHUNK_SIZE; ++00147 //constants: ++00148 //how much we try to fetch with each SQLGetData call ++00149 const int GETDATA_CHUNK_SIZE=4*1024; ++00150 //how much we write with each SQLPutData call ++00151 const int PUTDATA_CHUNK_SIZE=GETDATA_CHUNK_SIZE; + 00152 +-00153 //how much we read/write in string<->stream conversion +-00154 //better names for those? +-00155 const int STRING_TO_STREAM_CHUNK_SIZE=1024; +-00156 const int STREAM_TO_STRING_CHUNK_SIZE=STRING_TO_STREAM_CHUNK_SIZE; ++00153 //how much we read/write in string<->stream conversion ++00154 //better names for those? ++00155 const int STRING_TO_STREAM_CHUNK_SIZE=1024; ++00156 const int STREAM_TO_STRING_CHUNK_SIZE=STRING_TO_STREAM_CHUNK_SIZE; + 00157 + 00158 + 00159 + 00160 + 00161 +-00164 struct Types { +-00167 enum SQLType { +-00169 BIGINT = SQL_BIGINT, +-00171 BINARY = SQL_BINARY, +-00173 BIT = SQL_BIT, +-00175 CHAR = SQL_CHAR, +-00177 DATE = ODBC3_C(SQL_TYPE_DATE,SQL_DATE), +-00179 DECIMAL = SQL_DECIMAL, +-00181 DOUBLE = SQL_DOUBLE, +-00183 FLOAT = SQL_FLOAT, +-00185 INTEGER = SQL_INTEGER, +-00187 LONGVARBINARY = SQL_LONGVARBINARY, +-00189 LONGVARCHAR = SQL_LONGVARCHAR, +-00191 NUMERIC = SQL_NUMERIC, +-00193 REAL = SQL_REAL, +-00195 SMALLINT = SQL_SMALLINT, +-00197 TIME = ODBC3_C(SQL_TYPE_TIME,SQL_TIME), +-00199 TIMESTAMP = ODBC3_C(SQL_TYPE_TIMESTAMP,SQL_TIMESTAMP), +-00201 TINYINT = SQL_TINYINT, +-00203 VARBINARY = SQL_VARBINARY, +-00205 VARCHAR = SQL_VARCHAR +-00206 #if defined(ODBCXX_HAVE_SQLUCODE_H) +-00207 , ++00164 struct Types { ++00167 enum SQLType { ++00169 BIGINT = SQL_BIGINT, ++00171 BINARY = SQL_BINARY, ++00173 BIT = SQL_BIT, ++00175 CHAR = SQL_CHAR, ++00177 DATE = ODBC3_C(SQL_TYPE_DATE,SQL_DATE), ++00179 DECIMAL = SQL_DECIMAL, ++00181 DOUBLE = SQL_DOUBLE, ++00183 FLOAT = SQL_FLOAT, ++00185 INTEGER = SQL_INTEGER, ++00187 LONGVARBINARY = SQL_LONGVARBINARY, ++00189 LONGVARCHAR = SQL_LONGVARCHAR, ++00191 NUMERIC = SQL_NUMERIC, ++00193 REAL = SQL_REAL, ++00195 SMALLINT = SQL_SMALLINT, ++00197 TIME = ODBC3_C(SQL_TYPE_TIME,SQL_TIME), ++00199 TIMESTAMP = ODBC3_C(SQL_TYPE_TIMESTAMP,SQL_TIMESTAMP), ++00201 TINYINT = SQL_TINYINT, ++00203 VARBINARY = SQL_VARBINARY, ++00205 VARCHAR = SQL_VARCHAR ++00206 #if defined(ODBCXX_HAVE_SQLUCODE_H) ++00207 , + 00209 WVARCHAR = SQL_WCHAR, + 00211 WCHAR = SQL_WVARCHAR, + 00213 WLONGVARCHAR = SQL_WLONGVARCHAR +-00214 #endif +-00215 }; ++00214 #endif ++00215 }; + 00216 }; + 00217 + 00218 +-00219 #if !defined(ODBCXX_QT) +-00220 +-00226 class ODBCXX_EXPORT Bytes { +-00227 private: +-00228 struct Rep { +-00229 signed char* buf_; ++00219 #if !defined(ODBCXX_QT) ++00220 ++00226 class ODBCXX_EXPORT Bytes { ++00227 private: ++00228 struct Rep { ++00229 signed char* buf_; + 00230 size_t len_; +-00231 int refCount_; +-00232 Rep(const signed char* b, size_t l) ++00231 int refCount_; ++00232 Rep(const signed char* b, size_t l) + 00233 :len_(l), refCount_(0) { +-00234 if(len_>0) { +-00235 buf_=new signed char[len_]; +-00236 memcpy((void*)buf_,(void*)b,len_); +-00237 } else { ++00234 if(len_>0) { ++00235 buf_=new signed char[len_]; ++00236 memcpy((void*)buf_,(void*)b,len_); ++00237 } else { + 00238 buf_=NULL; + 00239 } + 00240 } + 00241 ~Rep() { +-00242 delete [] buf_; ++00242 delete [] buf_; + 00243 } + 00244 }; + 00245 + 00246 Rep* rep_; +-00247 public: ++00247 public: + 00249 Bytes() + 00250 :rep_(new Rep(NULL,0)) { + 00251 rep_->refCount_++; + 00252 } + 00253 +-00255 Bytes(const signed char* data, size_t dataLen) ++00255 Bytes(const signed char* data, size_t dataLen) + 00256 :rep_(new Rep(data,dataLen)) { + 00257 rep_->refCount_++; + 00258 } + 00259 +-00261 Bytes(const Bytes& b) ++00261 Bytes(const Bytes& b) + 00262 :rep_(b.rep_) { + 00263 rep_->refCount_++; + 00264 } + 00265 +-00267 Bytes& operator=(const Bytes& b) { +-00268 if(--rep_->refCount_==0) { +-00269 delete rep_; ++00267 Bytes& operator=(const Bytes& b) { ++00268 if(--rep_->refCount_==0) { ++00269 delete rep_; + 00270 } +-00271 rep_=b.rep_; ++00271 rep_=b.rep_; + 00272 rep_->refCount_++; +-00273 return *this; ++00273 return *this; + 00274 } +-00275 +-00277 ~Bytes() { +-00278 if(--rep_->refCount_==0) { +-00279 delete rep_; +-00280 } +-00281 } +-00282 +-00284 const signed char* getData() const { +-00285 return rep_->buf_; +-00286 } +-00287 +-00289 size_t getSize() const { +-00290 return rep_->len_; +-00291 } +-00292 }; +-00293 #endif +-00294 +-00296 class ODBCXX_EXPORT Date { +-00297 protected: +-00298 int year_; +-00299 int month_; +-00300 int day_; +-00301 +-00302 virtual void _invalid(const char* what, int value); +-00303 +-00304 int _validateYear(int y) { +-00305 return y; +-00306 } +-00307 +-00308 int _validateMonth(int m) { +-00309 if(m<1 || m>12) { +-00310 this->_invalid("month",m); +-00311 } +-00312 return m; +-00313 } +-00314 +-00315 int _validateDay(int d) { +-00316 if(d<1 || d>31) { +-00317 this->_invalid("day",d); +-00318 } +-00319 return d; +-00320 } +-00321 +-00322 public: +-00325 Date(int year, int month, int day) { +-00326 this->setYear(year); +-00327 this->setMonth(month); +-00328 this->setDay(day); +-00329 } +-00330 +-00335 explicit Date(); +-00336 +-00341 Date(std::time_t t) { +-00342 this->setTime(t); +-00343 } +-00344 +-00349 Date(const ODBCXX_STRING& str) { +-00350 this->parse(str); +-00351 } +-00352 +-00354 Date(const Date& d) +-00355 :year_(d.year_), +-00356 month_(d.month_), +-00357 day_(d.day_) {} +-00358 +-00360 Date& operator=(const Date& d) { +-00361 year_=d.year_; +-00362 month_=d.month_; +-00363 day_=d.day_; +-00364 return *this; +-00365 } +-00366 +-00368 virtual ~Date() {} ++00275 ++00277 bool operator==(const Bytes& b) { ++00278 if (getSize()!=b.getSize()) ++00279 return false; ++00280 for(size_t i=0;i<getSize();i++) { ++00281 if(*(getData()+i)!=*(b.getData()+i)) ++00282 return false; ++00283 } ++00284 return true; ++00285 } ++00286 ++00288 ~Bytes() { ++00289 if(--rep_->refCount_==0) { ++00290 delete rep_; ++00291 } ++00292 } ++00293 ++00295 const signed char* getData() const { ++00296 return rep_->buf_; ++00297 } ++00298 ++00300 size_t getSize() const { ++00301 return rep_->len_; ++00302 } ++00303 }; ++00304 #endif ++00305 ++00307 class ODBCXX_EXPORT Date { ++00308 protected: ++00309 int year_; ++00310 int month_; ++00311 int day_; ++00312 ++00313 virtual void _invalid(const char* what, int value); ++00314 ++00315 int _validateYear(int y) { ++00316 return y; ++00317 } ++00318 ++00319 int _validateMonth(int m) { ++00320 if(m<1 || m>12) { ++00321 this->_invalid("month",m); ++00322 } ++00323 return m; ++00324 } ++00325 ++00326 int _validateDay(int d) { ++00327 if(d<1 || d>31) { ++00328 this->_invalid("day",d); ++00329 } ++00330 return d; ++00331 } ++00332 ++00333 public: ++00336 Date(int year, int month, int day) { ++00337 this->setYear(year); ++00338 this->setMonth(month); ++00339 this->setDay(day); ++00340 } ++00341 ++00346 explicit Date(); ++00347 ++00352 Date(std::time_t t) { ++00353 this->setTime(t); ++00354 } ++00355 ++00360 Date(const ODBCXX_STRING& str) { ++00361 this->parse(str); ++00362 } ++00363 ++00365 Date(const Date& d) ++00366 :year_(d.year_), ++00367 month_(d.month_), ++00368 day_(d.day_) {} + 00369 +-00371 virtual void setTime(std::time_t t); +-00372 +-00374 std::time_t getTime() const; +-00375 +-00377 void parse(const ODBCXX_STRING& str); +-00378 +-00380 int getYear() const { +-00381 return year_; +-00382 } ++00371 Date& operator=(const Date& d) { ++00372 year_=d.year_; ++00373 month_=d.month_; ++00374 day_=d.day_; ++00375 return *this; ++00376 } ++00377 ++00379 virtual ~Date() {} ++00380 ++00382 virtual void setTime(std::time_t t); + 00383 +-00385 int getMonth() const { +-00386 return month_; +-00387 } +-00388 +-00390 int getDay() const { +-00391 return day_; +-00392 } +-00393 +-00395 void setYear(int year) { +-00396 year_=this->_validateYear(year); +-00397 } +-00398 +-00400 void setMonth(int month) { +-00401 month_=this->_validateMonth(month); +-00402 } +-00403 +-00405 void setDay(int day) { +-00406 day_=this->_validateDay(day); +-00407 } +-00408 +-00410 virtual ODBCXX_STRING toString() const; +-00411 }; +-00412 +-00414 class ODBCXX_EXPORT Time { +-00415 protected: +-00416 int hour_; +-00417 int minute_; +-00418 int second_; ++00385 std::time_t getTime() const; ++00386 ++00388 void parse(const ODBCXX_STRING& str); ++00389 ++00391 int getYear() const { ++00392 return year_; ++00393 } ++00394 ++00396 int getMonth() const { ++00397 return month_; ++00398 } ++00399 ++00401 int getDay() const { ++00402 return day_; ++00403 } ++00404 ++00406 void setYear(int year) { ++00407 year_=this->_validateYear(year); ++00408 } ++00409 ++00411 void setMonth(int month) { ++00412 month_=this->_validateMonth(month); ++00413 } ++00414 ++00416 void setDay(int day) { ++00417 day_=this->_validateDay(day); ++00418 } + 00419 +-00420 virtual void _invalid(const char* what, int value); +-00421 +-00422 int _validateHour(int h) { +-00423 if(h<0 || h>23) { +-00424 this->_invalid("hour",h); +-00425 } +-00426 return h; +-00427 } +-00428 +-00429 int _validateMinute(int m) { +-00430 if(m<0 || m>59) { +-00431 this->_invalid("minute",m); +-00432 } +-00433 return m; +-00434 } +-00435 +-00436 int _validateSecond(int s) { +-00437 if(s<0 || s>61) { +-00438 this->_invalid("second",s); +-00439 } +-00440 return s; +-00441 } +-00442 +-00443 public: +-00445 Time(int hour, int minute, int second) { +-00446 this->setHour(hour); +-00447 this->setMinute(minute); +-00448 this->setSecond(second); +-00449 } +-00450 +-00455 explicit Time(); +-00456 +-00461 Time(std::time_t t) { +-00462 this->setTime(t); +-00463 } +-00464 +-00469 Time(const ODBCXX_STRING& str) { +-00470 this->parse(str); +-00471 } +-00472 +-00474 Time(const Time& t) +-00475 :hour_(t.hour_), +-00476 minute_(t.minute_), +-00477 second_(t.second_) {} +-00478 +-00480 Time& operator=(const Time& t) { +-00481 hour_=t.hour_; +-00482 minute_=t.minute_; +-00483 second_=t.second_; +-00484 return *this; +-00485 } +-00486 +-00488 virtual ~Time() {} ++00421 virtual ODBCXX_STRING toString() const; ++00422 }; ++00423 ++00425 class ODBCXX_EXPORT Time { ++00426 protected: ++00427 int hour_; ++00428 int minute_; ++00429 int second_; ++00430 ++00431 virtual void _invalid(const char* what, int value); ++00432 ++00433 int _validateHour(int h) { ++00434 if(h<0 || h>23) { ++00435 this->_invalid("hour",h); ++00436 } ++00437 return h; ++00438 } ++00439 ++00440 int _validateMinute(int m) { ++00441 if(m<0 || m>59) { ++00442 this->_invalid("minute",m); ++00443 } ++00444 return m; ++00445 } ++00446 ++00447 int _validateSecond(int s) { ++00448 if(s<0 || s>61) { ++00449 this->_invalid("second",s); ++00450 } ++00451 return s; ++00452 } ++00453 ++00454 public: ++00456 Time(int hour, int minute, int second) { ++00457 this->setHour(hour); ++00458 this->setMinute(minute); ++00459 this->setSecond(second); ++00460 } ++00461 ++00466 explicit Time(); ++00467 ++00472 Time(std::time_t t) { ++00473 this->setTime(t); ++00474 } ++00475 ++00480 Time(const ODBCXX_STRING& str) { ++00481 this->parse(str); ++00482 } ++00483 ++00485 Time(const Time& t) ++00486 :hour_(t.hour_), ++00487 minute_(t.minute_), ++00488 second_(t.second_) {} + 00489 +-00491 virtual void setTime(std::time_t t); +-00492 +-00494 std::time_t getTime() const; +-00495 +-00497 void parse(const ODBCXX_STRING& str); +-00498 +-00500 int getHour() const { +-00501 return hour_; +-00502 } ++00491 Time& operator=(const Time& t) { ++00492 hour_=t.hour_; ++00493 minute_=t.minute_; ++00494 second_=t.second_; ++00495 return *this; ++00496 } ++00497 ++00499 virtual ~Time() {} ++00500 ++00502 virtual void setTime(std::time_t t); + 00503 +-00505 int getMinute() const { +-00506 return minute_; +-00507 } +-00508 +-00510 int getSecond() const { +-00511 return second_; +-00512 } +-00513 +-00515 void setHour(int h) { +-00516 hour_=this->_validateHour(h); +-00517 } +-00518 +-00520 void setMinute(int m) { +-00521 minute_=this->_validateMinute(m); +-00522 } +-00523 +-00525 void setSecond(int s) { +-00526 second_=this->_validateSecond(s); +-00527 } +-00528 +-00529 virtual ODBCXX_STRING toString() const; +-00530 }; +-00531 +-00532 +-00535 class ODBCXX_EXPORT Timestamp : public Date, public Time { +-00536 private: +-00537 int nanos_; +-00538 +-00539 virtual void _invalid(const char* what, int value); +-00540 +-00541 int _validateNanos(int n) { +-00542 if(n<0) { +-00543 this->_invalid("nanoseconds",n); +-00544 } +-00545 return n; +-00546 } +-00547 +-00548 public: +-00550 Timestamp(int year, int month, int day, +-00551 int hour, int minute, int second, +-00552 int nanos =0) +-00553 :Date(year,month,day), Time(hour,minute,second) { +-00554 this->setNanos(nanos); +-00555 } +-00556 +-00561 explicit Timestamp(); +-00562 +-00567 Timestamp(std::time_t t) { +-00568 this->setTime(t); +-00569 } +-00570 +-00575 Timestamp(const ODBCXX_STRING& s) { +-00576 this->parse(s); +-00577 } +-00578 +-00579 +-00581 Timestamp(const Timestamp& t) +-00582 :Date(t),Time(t),nanos_(t.nanos_) {} +-00583 +-00585 Timestamp& operator=(const Timestamp& t) { +-00586 Date::operator=(t); +-00587 Time::operator=(t); +-00588 nanos_=t.nanos_; +-00589 return *this; +-00590 } +-00591 +-00593 virtual ~Timestamp() {} ++00505 std::time_t getTime() const; ++00506 ++00508 void parse(const ODBCXX_STRING& str); ++00509 ++00511 int getHour() const { ++00512 return hour_; ++00513 } ++00514 ++00516 int getMinute() const { ++00517 return minute_; ++00518 } ++00519 ++00521 int getSecond() const { ++00522 return second_; ++00523 } ++00524 ++00526 void setHour(int h) { ++00527 hour_=this->_validateHour(h); ++00528 } ++00529 ++00531 void setMinute(int m) { ++00532 minute_=this->_validateMinute(m); ++00533 } ++00534 ++00536 void setSecond(int s) { ++00537 second_=this->_validateSecond(s); ++00538 } ++00539 ++00540 virtual ODBCXX_STRING toString() const; ++00541 }; ++00542 ++00543 ++00546 class ODBCXX_EXPORT Timestamp : public Date, public Time { ++00547 private: ++00548 int nanos_; ++00549 ++00550 virtual void _invalid(const char* what, int value); ++00551 ++00552 int _validateNanos(int n) { ++00553 if(n<0) { ++00554 this->_invalid("nanoseconds",n); ++00555 } ++00556 return n; ++00557 } ++00558 ++00559 public: ++00561 Timestamp(int year, int month, int day, ++00562 int hour, int minute, int second, ++00563 int nanos =0) ++00564 :Date(year,month,day), Time(hour,minute,second) { ++00565 this->setNanos(nanos); ++00566 } ++00567 ++00572 explicit Timestamp(); ++00573 ++00578 Timestamp(std::time_t t) { ++00579 this->setTime(t); ++00580 } ++00581 ++00586 Timestamp(const ODBCXX_STRING& s) { ++00587 this->parse(s); ++00588 } ++00589 ++00590 ++00592 Timestamp(const Timestamp& t) ++00593 :Date(t),Time(t),nanos_(t.nanos_) {} + 00594 +-00596 virtual void setTime(std::time_t t); +-00597 +-00599 virtual std::time_t getTime() { +-00600 return Date::getTime()+Time::getTime(); ++00596 Timestamp& operator=(const Timestamp& t) { ++00597 Date::operator=(t); ++00598 Time::operator=(t); ++00599 nanos_=t.nanos_; ++00600 return *this; + 00601 } + 00602 +-00605 void parse(const ODBCXX_STRING& s); +-00606 +-00608 int getNanos() const { +-00609 return nanos_; +-00610 } +-00611 +-00613 void setNanos(int nanos) { +-00614 nanos_=this->_validateNanos(nanos); +-00615 } +-00616 +-00617 virtual ODBCXX_STRING toString() const; +-00618 }; +-00619 +-00620 +-00621 //this is used for several 'lists of stuff' below +-00622 //expects T to be a pointer-to-something, and +-00623 //the contents will get deleted when the vector +-00624 //itself is deleted +-00625 template <class T> class CleanVector : public std::vector<T> { +-00626 private: +-00627 CleanVector(const CleanVector<T>&); //forbid +-00628 CleanVector<T>& operator=(const CleanVector<T>&); //forbid +-00629 +-00630 public: +-00631 explicit CleanVector() {} +-00632 virtual ~CleanVector() { +-00633 typename std::vector<T>::iterator i=this->begin(); +-00634 typename std::vector<T>::iterator end=this->end(); +-00635 while(i!=end) { +-00636 delete *i; +-00637 ++i; +-00638 } +-00639 this->clear(); +-00640 } +-00641 }; +-00642 +-00643 +-00646 class ODBCXX_EXPORT DriverMessage { +-00647 friend class ErrorHandler; +-00648 +-00649 private: +-00650 char state_[SQL_SQLSTATE_SIZE+1]; +-00651 char description_[SQL_MAX_MESSAGE_LENGTH]; +-00652 SQLINTEGER nativeCode_; ++00604 virtual ~Timestamp() {} ++00605 ++00607 virtual void setTime(std::time_t t); ++00608 ++00610 virtual std::time_t getTime() { ++00611 return Date::getTime()+Time::getTime(); ++00612 } ++00613 ++00616 void parse(const ODBCXX_STRING& s); ++00617 ++00619 int getNanos() const { ++00620 return nanos_; ++00621 } ++00622 ++00624 void setNanos(int nanos) { ++00625 nanos_=this->_validateNanos(nanos); ++00626 } ++00627 ++00628 virtual ODBCXX_STRING toString() const; ++00629 }; ++00630 ++00631 ++00632 //this is used for several 'lists of stuff' below ++00633 //expects T to be a pointer-to-something, and ++00634 //the contents will get deleted when the vector ++00635 //itself is deleted ++00636 template <class T> class CleanVector : public std::vector<T> { ++00637 private: ++00638 CleanVector(const CleanVector<T>&); //forbid ++00639 CleanVector<T>& operator=(const CleanVector<T>&); //forbid ++00640 ++00641 public: ++00642 explicit CleanVector() {} ++00643 virtual ~CleanVector() { ++00644 typename std::vector<T>::iterator i=this->begin(); ++00645 typename std::vector<T>::iterator end=this->end(); ++00646 while(i!=end) { ++00647 delete *i; ++00648 ++i; ++00649 } ++00650 this->clear(); ++00651 } ++00652 }; + 00653 +-00654 DriverMessage() {} +-00655 #if ODBCVER < 0x0300 +-00656 static DriverMessage* fetchMessage(SQLHENV henv, +-00657 SQLHDBC hdbc, +-00658 SQLHSTMT hstmt); +-00659 #else +-00660 static DriverMessage* fetchMessage(SQLINTEGER handleType, +-00661 SQLHANDLE h, +-00662 int idx); +-00663 #endif +-00664 +-00665 public: +-00666 virtual ~DriverMessage() {} +-00667 +-00668 const char* getSQLState() const { +-00669 return state_; +-00670 } +-00671 +-00672 const char* getDescription() const { +-00673 return description_; +-00674 } +-00675 +-00676 int getNativeCode() const { +-00677 return nativeCode_; +-00678 } +-00679 }; +-00680 +-00681 +-00684 class SQLException : public std::exception { +-00685 private: +-00686 ODBCXX_STRING reason_; +-00687 ODBCXX_STRING sqlState_; +-00688 int errorCode_; +-00689 #if defined(ODBCXX_QT) +-00690 QCString reason8_; +-00691 #endif +-00692 +-00693 public: +-00695 SQLException(const ODBCXX_STRING& reason ="", +-00696 const ODBCXX_STRING& sqlState ="", +-00697 int vendorCode =0) +-00698 :reason_(reason), +-00699 sqlState_(sqlState), +-00700 errorCode_(vendorCode) +-00701 #if defined(ODBCXX_QT) +-00702 ,reason8_(reason.local8Bit()) +-00703 #endif +-00704 {} +-00705 +-00707 SQLException(const DriverMessage& dm) +-00708 :reason_(dm.getDescription()), +-00709 sqlState_(dm.getSQLState()), +-00710 errorCode_(dm.getNativeCode()) {} +-00711 +-00713 virtual ~SQLException() throw() {} +-00714 +-00716 int getErrorCode() const { +-00717 return errorCode_; +-00718 } +-00719 +-00724 const ODBCXX_STRING& getSQLState() const { +-00725 return sqlState_; +-00726 } +-00727 +-00729 const ODBCXX_STRING& getMessage() const { +-00730 return reason_; +-00731 } +-00732 +-00733 +-00735 virtual const char* what() const throw() { +-00736 // the conversion from QString involves a temporary, which +-00737 // doesn't survive this scope. So here, we do a conditional +-00738 #if defined(ODBCXX_QT) +-00739 return reason8_.data(); +-00740 #else +-00741 return reason_.c_str(); +-00742 #endif +-00743 } +-00744 }; +-00745 +-00746 +-00751 class SQLWarning : public SQLException { +-00752 +-00753 SQLWarning(const SQLWarning&); //forbid +-00754 SQLWarning& operator=(const SQLWarning&); //forbid +-00755 +-00756 public: +-00758 SQLWarning(const ODBCXX_STRING& reason ="", +-00759 const ODBCXX_STRING& sqlState ="", +-00760 int vendorCode =0) +-00761 :SQLException(reason,sqlState,vendorCode) {} +-00762 +-00764 SQLWarning(const DriverMessage& dm) +-00765 :SQLException(dm) {} +-00766 +-00768 virtual ~SQLWarning() throw() {} +-00769 }; +-00770 +-00771 typedef CleanVector<SQLWarning*> WarningList; +-00772 ++00654 ++00657 class ODBCXX_EXPORT DriverMessage { ++00658 friend class ErrorHandler; ++00659 ++00660 private: ++00661 char state_[SQL_SQLSTATE_SIZE+1]; ++00662 char description_[SQL_MAX_MESSAGE_LENGTH]; ++00663 SQLINTEGER nativeCode_; ++00664 ++00665 DriverMessage() {} ++00666 #if ODBCVER < 0x0300 ++00667 static DriverMessage* fetchMessage(SQLHENV henv, ++00668 SQLHDBC hdbc, ++00669 SQLHSTMT hstmt); ++00670 #else ++00671 static DriverMessage* fetchMessage(SQLINTEGER handleType, ++00672 SQLHANDLE h, ++00673 int idx); ++00674 #endif ++00675 ++00676 public: ++00677 virtual ~DriverMessage() {} ++00678 ++00679 const char* getSQLState() const { ++00680 return state_; ++00681 } ++00682 ++00683 const char* getDescription() const { ++00684 return description_; ++00685 } ++00686 ++00687 int getNativeCode() const { ++00688 return nativeCode_; ++00689 } ++00690 }; ++00691 ++00692 ++00695 class SQLException : public std::exception { ++00696 private: ++00697 ODBCXX_STRING reason_; ++00698 ODBCXX_STRING sqlState_; ++00699 int errorCode_; ++00700 #if defined(ODBCXX_QT) ++00701 QCString reason8_; ++00702 #endif ++00703 ++00704 public: ++00706 SQLException(const ODBCXX_STRING& reason ="", ++00707 const ODBCXX_STRING& sqlState ="", ++00708 int vendorCode =0) ++00709 :reason_(reason), ++00710 sqlState_(sqlState), ++00711 errorCode_(vendorCode) ++00712 #if defined(ODBCXX_QT) ++00713 ,reason8_(reason.local8Bit()) ++00714 #endif ++00715 {} ++00716 ++00718 SQLException(const DriverMessage& dm) ++00719 :reason_(dm.getDescription()), ++00720 sqlState_(dm.getSQLState()), ++00721 errorCode_(dm.getNativeCode()) {} ++00722 ++00724 virtual ~SQLException() throw() {} ++00725 ++00727 int getErrorCode() const { ++00728 return errorCode_; ++00729 } ++00730 ++00735 const ODBCXX_STRING& getSQLState() const { ++00736 return sqlState_; ++00737 } ++00738 ++00740 const ODBCXX_STRING& getMessage() const { ++00741 return reason_; ++00742 } ++00743 ++00744 ++00746 virtual const char* what() const throw() { ++00747 // the conversion from QString involves a temporary, which ++00748 // doesn't survive this scope. So here, we do a conditional ++00749 #if defined(ODBCXX_QT) ++00750 return reason8_.data(); ++00751 #else ++00752 return reason_.c_str(); ++00753 #endif ++00754 } ++00755 }; ++00756 ++00757 ++00762 class SQLWarning : public SQLException { ++00763 ++00764 SQLWarning(const SQLWarning&); //forbid ++00765 SQLWarning& operator=(const SQLWarning&); //forbid ++00766 ++00767 public: ++00769 SQLWarning(const ODBCXX_STRING& reason ="", ++00770 const ODBCXX_STRING& sqlState ="", ++00771 int vendorCode =0) ++00772 :SQLException(reason,sqlState,vendorCode) {} + 00773 +-00774 template <class T> class Deleter { +-00775 private: +-00776 T* ptr_; +-00777 bool isArray_; +-00778 +-00779 Deleter(const Deleter<T>&); +-00780 Deleter<T>& operator=(const Deleter<T>&); ++00775 SQLWarning(const DriverMessage& dm) ++00776 :SQLException(dm) {} ++00777 ++00779 virtual ~SQLWarning() throw() {} ++00780 }; + 00781 +-00782 public: +-00783 explicit Deleter(T* ptr, bool isArray =false) +-00784 :ptr_(ptr), isArray_(isArray) {} +-00785 ~Deleter() { +-00786 if(!isArray_) { +-00787 delete ptr_; +-00788 } else { +-00789 delete[] ptr_; +-00790 } +-00791 } +-00792 }; +-00793 +-00794 }; // namespace odbc +-00795 +-00796 +-00797 #endif // __ODBCXX_TYPES_H +-

    ++00782 typedef CleanVector<SQLWarning*> WarningList; ++00783 ++00784 ++00785 template <class T> class Deleter { ++00786 private: ++00787 T* ptr_; ++00788 bool isArray_; ++00789 ++00790 Deleter(const Deleter<T>&); ++00791 Deleter<T>& operator=(const Deleter<T>&); ++00792 ++00793 public: ++00794 explicit Deleter(T* ptr, bool isArray =false) ++00795 :ptr_(ptr), isArray_(isArray) {} ++00796 ~Deleter() { ++00797 if(!isArray_) { ++00798 delete ptr_; ++00799 } else { ++00800 delete[] ptr_; ++00801 } ++00802 } ++00803 }; ++00804 ++00805 }; // namespace odbc ++00806 ++00807 ++00808 #endif // __ODBCXX_TYPES_H ++

    + +diff -Naur libodbc++-0.2.3/include/Makefile.in libodbc++-0.2.3-20050404/include/Makefile.in +--- libodbc++-0.2.3/include/Makefile.in 2003-06-17 12:20:51.000000000 +0200 ++++ libodbc++-0.2.3-20050404/include/Makefile.in 2005-04-04 18:21:21.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,106 +32,162 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = .. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + SUBDIRS = odbc++ + subdir = include ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = + DIST_SOURCES = + +-RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ +- uninstall-info-recursive all-recursive install-data-recursive \ +- install-exec-recursive installdirs-recursive install-recursive \ +- uninstall-recursive check-recursive installcheck-recursive +-DIST_COMMON = Makefile.am Makefile.in ++RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ++ ps-recursive install-info-recursive uninstall-info-recursive \ ++ all-recursive install-data-recursive install-exec-recursive \ ++ installdirs-recursive install-recursive uninstall-recursive \ ++ check-recursive installcheck-recursive ++DIST_COMMON = $(srcdir)/Makefile.in Makefile.am + DIST_SUBDIRS = $(SUBDIRS) + all: all-recursive + +@@ -206,10 +262,17 @@ + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done ++ctags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ ++ done + + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -225,9 +288,15 @@ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ ++ if (etags --etags-include --version) >/dev/null 2>&1; then \ ++ include_option=--etags-include; \ ++ else \ ++ include_option=--include; \ ++ fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ +- test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ ++ test -f $$subdir/TAGS && \ ++ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +@@ -240,20 +309,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = .. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -303,7 +393,7 @@ + installcheck: installcheck-recursive + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -311,7 +401,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -321,7 +411,7 @@ + clean-am: clean-generic clean-libtool mostlyclean-am + + distclean: distclean-recursive +- ++ -rm -f Makefile + distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +@@ -344,30 +434,40 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-recursive +- ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-recursive + + mostlyclean-am: mostlyclean-generic mostlyclean-libtool + ++pdf: pdf-recursive ++ ++pdf-am: ++ ++ps: ps-recursive ++ ++ps-am: ++ + uninstall-am: uninstall-info-am + + uninstall-info: uninstall-info-recursive + +-.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ +- clean-generic clean-libtool clean-recursive distclean \ +- distclean-generic distclean-libtool distclean-recursive \ +- distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ +- info-recursive install install-am install-data install-data-am \ +- install-data-recursive install-exec install-exec-am \ +- install-exec-recursive install-info install-info-am \ +- install-info-recursive install-man install-recursive \ +- install-strip installcheck installcheck-am installdirs \ +- installdirs-am installdirs-recursive maintainer-clean \ +- maintainer-clean-generic maintainer-clean-recursive mostlyclean \ +- mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ +- tags tags-recursive uninstall uninstall-am uninstall-info-am \ ++.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ ++ clean-generic clean-libtool clean-recursive ctags \ ++ ctags-recursive distclean distclean-generic distclean-libtool \ ++ distclean-recursive distclean-tags distdir dvi dvi-am \ ++ dvi-recursive info info-am info-recursive install install-am \ ++ install-data install-data-am install-data-recursive \ ++ install-exec install-exec-am install-exec-recursive \ ++ install-info install-info-am install-info-recursive install-man \ ++ install-recursive install-strip installcheck installcheck-am \ ++ installdirs installdirs-am installdirs-recursive \ ++ maintainer-clean maintainer-clean-generic \ ++ maintainer-clean-recursive mostlyclean mostlyclean-generic \ ++ mostlyclean-libtool mostlyclean-recursive pdf pdf-am \ ++ pdf-recursive ps ps-am ps-recursive tags tags-recursive \ ++ uninstall uninstall-am uninstall-info-am \ + uninstall-info-recursive uninstall-recursive + + # Tell versions [3.59,3.63) of GNU make to not export all variables. +diff -Naur libodbc++-0.2.3/include/odbc++/Makefile.in libodbc++-0.2.3-20050404/include/odbc++/Makefile.in +--- libodbc++-0.2.3/include/odbc++/Makefile.in 2003-06-17 12:20:51.000000000 +0200 ++++ libodbc++-0.2.3-20050404/include/odbc++/Makefile.in 2005-04-04 18:21:22.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,93 +32,147 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + top_builddir = ../.. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ + +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ +- + pkgincludedir = @includedir@/odbc++ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + pkginclude_HEADERS = \ +@@ -141,13 +195,14 @@ + + CLEANFILES = config.h + subdir = include/odbc++ ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = + DIST_SOURCES = + HEADERS = $(pkginclude_HEADERS) + +-DIST_COMMON = $(pkginclude_HEADERS) Makefile.am Makefile.in ++DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.in Makefile.am + all: all-am + + .SUFFIXES: +@@ -188,6 +243,9 @@ + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -213,20 +271,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = ../.. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -247,7 +326,7 @@ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ +- top_distdir="${top_distdir}" distdir="$(distdir)" \ ++ top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + check-am: all-am + check: check-am +@@ -255,7 +334,6 @@ + + installdirs: + $(mkinstalldirs) $(DESTDIR)$(pkgincludedir) +- + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -267,7 +345,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -276,7 +354,7 @@ + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -286,7 +364,7 @@ + clean-am: clean-generic clean-libtool mostlyclean-am + + distclean: distclean-am +- ++ -rm -f Makefile + distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +@@ -309,26 +387,35 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-am +- ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-am + + mostlyclean-am: mostlyclean-generic mostlyclean-libtool + ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ + uninstall-am: uninstall-info-am uninstall-local \ + uninstall-pkgincludeHEADERS + +-.PHONY: GTAGS all all-am check check-am clean clean-generic \ +- clean-libtool distclean distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am info info-am install \ +- install-am install-data install-data-am install-exec \ +- install-exec-am install-info install-info-am install-man \ +- install-pkgincludeHEADERS install-strip installcheck \ +- installcheck-am installdirs maintainer-clean \ ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ++ clean-libtool ctags distclean distclean-generic \ ++ distclean-libtool distclean-tags distdir dvi dvi-am info \ ++ info-am install install-am install-data install-data-am \ ++ install-exec install-exec-am install-info install-info-am \ ++ install-man install-pkgincludeHEADERS install-strip \ ++ installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ +- mostlyclean-libtool tags uninstall uninstall-am \ +- uninstall-info-am uninstall-local uninstall-pkgincludeHEADERS ++ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ ++ uninstall-am uninstall-info-am uninstall-local \ ++ uninstall-pkgincludeHEADERS + + + config.h: $(CONFIG_HEADER) config.h.in +diff -Naur libodbc++-0.2.3/include/odbc++/types.h libodbc++-0.2.3-20050404/include/odbc++/types.h +--- libodbc++-0.2.3/include/odbc++/types.h 2003-06-17 12:08:02.000000000 +0200 ++++ libodbc++-0.2.3-20050404/include/odbc++/types.h 2005-02-27 23:39:41.000000000 +0100 +@@ -1,18 +1,18 @@ +-/* ++/* + This file is part of libodbc++. +- ++ + Copyright (C) 1999-2000 Manush Dodunekov +- ++ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. +- ++ + This library 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 + Library General Public License for more details. +- ++ + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +@@ -114,7 +114,7 @@ + // We want Long to be at least 64 bits + + #if defined(WIN32) +- ++ + typedef __int64 Long; + + #elif defined(ODBCXX_HAVE_INTTYPES_H) +@@ -128,7 +128,7 @@ + typedef int Long; + + # elif ODBCXX_SIZEOF_LONG == 8 +- ++ + typedef long Long; + + # elif ODBCXX_SIZEOF_LONG_LONG == 8 +@@ -136,7 +136,7 @@ + typedef long long Long; + + # else +- ++ + # error "Can't find an appropriate at-least-64-bit integer" + + # endif +@@ -166,7 +166,7 @@ + */ + enum SQLType { + /** An SQL BIGINT */ +- BIGINT = SQL_BIGINT, ++ BIGINT = SQL_BIGINT, + /** An SQL BINARY (fixed length) */ + BINARY = SQL_BINARY, + /** An SQL BIT */ +@@ -217,8 +217,8 @@ + + + #if !defined(ODBCXX_QT) +- /** A chunk of bytes. +- * ++ /** A chunk of bytes. ++ * + * Used for setting and getting binary values. + * @warning This class uses reference counting. An instance that is + * referred to from different threads is likely to cause trouble. +@@ -272,16 +272,27 @@ + rep_->refCount_++; + return *this; + } +- ++ ++ /** Comparison */ ++ bool operator==(const Bytes& b) { ++ if (getSize()!=b.getSize()) ++ return false; ++ for(size_t i=0;irefCount_==0) { + delete rep_; + } + } + + /** Returns a pointer to the data */ +- const signed char* getData() const { ++ const signed char* getData() const { + return rep_->buf_; + } + +@@ -304,14 +315,14 @@ + int _validateYear(int y) { + return y; + } +- ++ + int _validateMonth(int m) { + if(m<1 || m>12) { + this->_invalid("month",m); + } + return m; + } +- ++ + int _validateDay(int d) { + if(d<1 || d>31) { + this->_invalid("day",d); +@@ -320,7 +331,7 @@ + } + + public: +- /** Constructor. ++ /** Constructor. + */ + Date(int year, int month, int day) { + this->setYear(year); +@@ -328,14 +339,14 @@ + this->setDay(day); + } + +- /** Constructor. +- * ++ /** Constructor. ++ * + * Sets this date to today. + */ + explicit Date(); + + /** Constructor. +- * ++ * + * Sets this date to the specified time_t value. + */ + Date(std::time_t t) { +@@ -343,7 +354,7 @@ + } + + /** Constructor. +- * ++ * + * Sets this date to the specified string in the YYYY-MM-DD format. + */ + Date(const ODBCXX_STRING& str) { +@@ -449,13 +460,13 @@ + } + + /** Constructor. +- * ++ * + * Sets the time to now. + */ + explicit Time(); + + /** Constructor. +- * ++ * + * Sets the time to the specified time_t value. + */ + Time(std::time_t t) { +@@ -463,7 +474,7 @@ + } + + /** Constructor. +- * ++ * + * Sets the time to the specified string in the HH:MM:SS format. + */ + Time(const ODBCXX_STRING& str) { +@@ -530,12 +541,12 @@ + }; + + +- /** An SQL TIMESTAMP ++ /** An SQL TIMESTAMP + */ + class ODBCXX_EXPORT Timestamp : public Date, public Time { + private: + int nanos_; +- ++ + virtual void _invalid(const char* what, int value); + + int _validateNanos(int n) { +@@ -594,7 +605,7 @@ + + /** Sets this timestamp to the specified time_t value */ + virtual void setTime(std::time_t t); +- ++ + /** Gets the time_t value of this timestamp */ + virtual std::time_t getTime() { + return Date::getTime()+Time::getTime(); +@@ -620,7 +631,7 @@ + + //this is used for several 'lists of stuff' below + //expects T to be a pointer-to-something, and +- //the contents will get deleted when the vector ++ //the contents will get deleted when the vector + //itself is deleted + template class CleanVector : public std::vector { + private: +@@ -641,7 +652,7 @@ + }; + + +- /** Used internally - represents the result of an SQLError call ++ /** Used internally - represents the result of an SQLError call + */ + class ODBCXX_EXPORT DriverMessage { + friend class ErrorHandler; +@@ -678,7 +689,7 @@ + } + }; + +- ++ + /** The exception thrown when errors occur inside the library. + */ + class SQLException : public std::exception { +@@ -689,15 +700,15 @@ + #if defined(ODBCXX_QT) + QCString reason8_; + #endif +- ++ + public: + /** Constructor */ +- SQLException(const ODBCXX_STRING& reason ="", ++ SQLException(const ODBCXX_STRING& reason ="", + const ODBCXX_STRING& sqlState ="", + int vendorCode =0) +- :reason_(reason), ++ :reason_(reason), + sqlState_(sqlState), +- errorCode_(vendorCode) ++ errorCode_(vendorCode) + #if defined(ODBCXX_QT) + ,reason8_(reason.local8Bit()) + #endif +@@ -716,15 +727,15 @@ + int getErrorCode() const { + return errorCode_; + } +- +- /** Gets the SQLSTATE of this exception. +- * ++ ++ /** Gets the SQLSTATE of this exception. ++ * + * Consult your local ODBC reference for SQLSTATE values. + */ + const ODBCXX_STRING& getSQLState() const { + return sqlState_; + } +- ++ + /** Gets the description of this message */ + const ODBCXX_STRING& getMessage() const { + return reason_; +@@ -745,7 +756,7 @@ + + + /** Represents an SQL warning. +- * ++ * + * Contains the same info as an SQLException. + */ + class SQLWarning : public SQLException { +@@ -759,17 +770,17 @@ + const ODBCXX_STRING& sqlState ="", + int vendorCode =0) + :SQLException(reason,sqlState,vendorCode) {} +- ++ + /** Copy from a DriverMessage */ + SQLWarning(const DriverMessage& dm) + :SQLException(dm) {} +- ++ + /** Destructor */ + virtual ~SQLWarning() throw() {} + }; + + typedef CleanVector WarningList; +- ++ + + template class Deleter { + private: +@@ -780,7 +791,7 @@ + Deleter& operator=(const Deleter&); + + public: +- explicit Deleter(T* ptr, bool isArray =false) ++ explicit Deleter(T* ptr, bool isArray =false) + :ptr_(ptr), isArray_(isArray) {} + ~Deleter() { + if(!isArray_) { +diff -Naur libodbc++-0.2.3/install-sh libodbc++-0.2.3-20050404/install-sh +--- libodbc++-0.2.3/install-sh 2003-03-28 16:57:09.000000000 +0100 ++++ libodbc++-0.2.3-20050404/install-sh 2005-04-04 18:10:27.000000000 +0200 +@@ -1,19 +1,37 @@ + #!/bin/sh + # + # install - install a program, script, or datafile +-# This comes from X11R5 (mit/util/scripts/install.sh). + # +-# Copyright 1991 by the Massachusetts Institute of Technology ++# This originates from X11R5 (mit/util/scripts/install.sh), which was ++# later released in X11R6 (xc/config/util/install.sh) with the ++# following copyright and license. + # +-# Permission to use, copy, modify, distribute, and sell this software and its +-# documentation for any purpose is hereby granted without fee, provided that +-# the above copyright notice appear in all copies and that both that +-# copyright notice and this permission notice appear in supporting +-# documentation, and that the name of M.I.T. not be used in advertising or +-# publicity pertaining to distribution of the software without specific, +-# written prior permission. M.I.T. makes no representations about the +-# suitability of this software for any purpose. It is provided "as is" +-# without express or implied warranty. ++# Copyright (C) 1994 X Consortium ++# ++# Permission is hereby granted, free of charge, to any person obtaining a copy ++# of this software and associated documentation files (the "Software"), to ++# deal in the Software without restriction, including without limitation the ++# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++# sell copies of the Software, and to permit persons to whom the Software is ++# furnished to do so, subject to the following conditions: ++# ++# The above copyright notice and this permission notice shall be included in ++# all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- ++# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++# ++# Except as contained in this notice, the name of the X Consortium shall not ++# be used in advertising or otherwise to promote the sale, use or other deal- ++# ings in this Software without prior written authorization from the X Consor- ++# tium. ++# ++# ++# FSF changes to this file are in the public domain. + # + # Calling this script install-sh is preferred over install.sh, to prevent + # `make' implicit rules from creating a file called install from it +@@ -56,7 +74,7 @@ + + while [ x"$1" != x ]; do + case $1 in +- -c) instcmd="$cpprog" ++ -c) instcmd=$cpprog + shift + continue;; + +@@ -79,7 +97,7 @@ + shift + continue;; + +- -s) stripcmd="$stripprog" ++ -s) stripcmd=$stripprog + shift + continue;; + +@@ -106,7 +124,7 @@ + + if [ x"$src" = x ] + then +- echo "install: no input file specified" ++ echo "$0: no input file specified" >&2 + exit 1 + else + : +@@ -115,8 +133,8 @@ + if [ x"$dir_arg" != x ]; then + dst=$src + src="" +- +- if [ -d $dst ]; then ++ ++ if [ -d "$dst" ]; then + instcmd=: + chmodcmd="" + else +@@ -125,20 +143,20 @@ + else + + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command +-# might cause directories to be created, which would be especially bad ++# might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + +- if [ -f $src -o -d $src ] ++ if [ -f "$src" ] || [ -d "$src" ] + then + : + else +- echo "install: $src does not exist" ++ echo "$0: $src does not exist" >&2 + exit 1 + fi +- ++ + if [ x"$dst" = x ] + then +- echo "install: no destination specified" ++ echo "$0: no destination specified" >&2 + exit 1 + else + : +@@ -147,16 +165,16 @@ + # If destination is a directory, append the input filename; if your system + # does not like double slashes in filenames, you may need to add some logic + +- if [ -d $dst ] ++ if [ -d "$dst" ] + then +- dst="$dst"/`basename $src` ++ dst=$dst/`basename "$src"` + else + : + fi + fi + + ## this sed command emulates the dirname command +-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` ++dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + # this part is taken from Noah Friedman's mkinstalldirs script +@@ -165,69 +183,73 @@ + if [ ! -d "$dstdir" ]; then + defaultIFS=' + ' +-IFS="${IFS-${defaultIFS}}" ++IFS="${IFS-$defaultIFS}" + +-oIFS="${IFS}" ++oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' +-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +-IFS="${oIFS}" ++set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` ++IFS=$oIFS + + pathcomp='' + + while [ $# -ne 0 ] ; do +- pathcomp="${pathcomp}${1}" ++ pathcomp=$pathcomp$1 + shift + +- if [ ! -d "${pathcomp}" ] ; ++ if [ ! -d "$pathcomp" ] ; + then +- $mkdirprog "${pathcomp}" ++ $mkdirprog "$pathcomp" + else + : + fi + +- pathcomp="${pathcomp}/" ++ pathcomp=$pathcomp/ + done + fi + + if [ x"$dir_arg" != x ] + then +- $doit $instcmd $dst && ++ $doit $instcmd "$dst" && + +- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && +- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && +- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && +- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi ++ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && ++ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && ++ if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && ++ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi + else + + # If we're going to rename the final executable, determine the name now. + +- if [ x"$transformarg" = x ] ++ if [ x"$transformarg" = x ] + then +- dstfile=`basename $dst` ++ dstfile=`basename "$dst"` + else +- dstfile=`basename $dst $transformbasename | ++ dstfile=`basename "$dst" $transformbasename | + sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename + +- if [ x"$dstfile" = x ] ++ if [ x"$dstfile" = x ] + then +- dstfile=`basename $dst` ++ dstfile=`basename "$dst"` + else + : + fi + +-# Make a temp file name in the proper directory. ++# Make a couple of temp file names in the proper directory. + +- dsttmp=$dstdir/#inst.$$# ++ dsttmp=$dstdir/_inst.$$_ ++ rmtmp=$dstdir/_rm.$$_ + +-# Move or copy the file name to the temp name ++# Trap to clean up temp files at exit. ++ ++ trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 ++ trap '(exit $?); exit' 1 2 13 15 + +- $doit $instcmd $src $dsttmp && ++# Move or copy the file name to the temp name + +- trap "rm -f ${dsttmp}" 0 && ++ $doit $instcmd "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits + +@@ -235,17 +257,38 @@ + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $instcmd $src $dsttmp" command. + +- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && +- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && +- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && +- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && ++ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && ++ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && ++ if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && ++ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && ++ ++# Now remove or move aside any old file at destination location. We try this ++# two ways since rm can't unlink itself on some systems and the destination ++# file might be busy for other reasons. In this case, the final cleanup ++# might fail but the new file should still install successfully. ++ ++{ ++ if [ -f "$dstdir/$dstfile" ] ++ then ++ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || ++ $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || ++ { ++ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 ++ (exit 1); exit ++ } ++ else ++ : ++ fi ++} && + + # Now rename the file to the real destination. + +- $doit $rmcmd -f $dstdir/$dstfile && +- $doit $mvcmd $dsttmp $dstdir/$dstfile ++ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + + fi && + ++# The final little trick to "correctly" pass the exit status to the exit trap. + +-exit 0 ++{ ++ (exit 0); exit ++} +diff -Naur libodbc++-0.2.3/isql++/Makefile.in libodbc++-0.2.3-20050404/isql++/Makefile.in +--- libodbc++-0.2.3/isql++/Makefile.in 2003-06-17 12:20:51.000000000 +0200 ++++ libodbc++-0.2.3-20050404/isql++/Makefile.in 2005-04-04 18:21:25.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,97 +32,151 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = .. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + + INCLUDES = @INCLUDES@ -I$(top_srcdir)/src ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ ++@THREADS_FALSE@thelibs = ../src/libodbc++.la + + @THREADS_TRUE@thelibs = @THREAD_LIBS@ ../src/libodbc++-mt.la +-@THREADS_FALSE@thelibs = ../src/libodbc++.la + + @BUILD_ISQLXX_TRUE@bin_PROGRAMS = isql++ + @BUILD_ISQLXX_FALSE@EXTRA_PROGRAMS = isql++ +@@ -136,6 +190,7 @@ + + EXTRA_DIST = README + subdir = isql++ ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = +@@ -151,11 +206,7 @@ + @THREADS_FALSE@isql___DEPENDENCIES = ../src/libodbc++.la + isql___LDFLAGS = + +-DEFS = @DEFS@ + DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +-CPPFLAGS = @CPPFLAGS@ +-LDFLAGS = @LDFLAGS@ +-LIBS = @LIBS@ + depcomp = $(SHELL) $(top_srcdir)/depcomp + am__depfiles_maybe = depfiles + @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/isql++.Po +@@ -167,8 +218,6 @@ + CXXLD = $(CXX) + CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-CXXFLAGS = @CXXFLAGS@ +-CFLAGS = @CFLAGS@ + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) + LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ +@@ -177,7 +226,7 @@ + LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + DIST_SOURCES = $(isql___SOURCES) +-DIST_COMMON = README Makefile.am Makefile.in ++DIST_COMMON = README $(srcdir)/Makefile.in Makefile.am + SOURCES = $(isql___SOURCES) + + all: all-am +@@ -200,7 +249,7 @@ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ +- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f; \ ++ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \ + else :; fi; \ + done + +@@ -230,27 +279,38 @@ + + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isql++.Po@am__quote@ + +-distclean-depend: +- -rm -rf ./$(DEPDIR) +- + .cpp.o: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + .cpp.obj: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `cygpath -w $<` ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` + + .cpp.lo: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< +-CXXDEPMODE = @CXXDEPMODE@ ++@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + mostlyclean-libtool: + -rm -f *.lo +@@ -265,6 +325,9 @@ + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -290,20 +353,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = .. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -329,7 +413,6 @@ + + installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) +- + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -341,7 +424,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -349,7 +432,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -359,9 +442,10 @@ + clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + + distclean: distclean-am +- +-distclean-am: clean-am distclean-compile distclean-depend \ +- distclean-generic distclean-libtool distclean-tags ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags + + dvi: dvi-am + +@@ -382,7 +466,8 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-am +- ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-am +@@ -390,19 +475,27 @@ + mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ + uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +-.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \ +- clean-generic clean-libtool distclean distclean-compile \ +- distclean-depend distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am info info-am install \ +- install-am install-binPROGRAMS install-data install-data-am \ +- install-exec install-exec-am install-info install-info-am \ +- install-man install-strip installcheck installcheck-am \ +- installdirs maintainer-clean maintainer-clean-generic \ +- mostlyclean mostlyclean-compile mostlyclean-generic \ +- mostlyclean-libtool tags uninstall uninstall-am \ +- uninstall-binPROGRAMS uninstall-info-am ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ ++ clean-generic clean-libtool ctags distclean distclean-compile \ ++ distclean-generic distclean-libtool distclean-tags distdir dvi \ ++ dvi-am info info-am install install-am install-binPROGRAMS \ ++ install-data install-data-am install-exec install-exec-am \ ++ install-info install-info-am install-man install-strip \ ++ installcheck installcheck-am installdirs maintainer-clean \ ++ maintainer-clean-generic mostlyclean mostlyclean-compile \ ++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ ++ tags uninstall uninstall-am uninstall-binPROGRAMS \ ++ uninstall-info-am + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. +diff -Naur libodbc++-0.2.3/ltconfig libodbc++-0.2.3-20050404/ltconfig +--- libodbc++-0.2.3/ltconfig 2003-03-20 16:53:18.000000000 +0100 ++++ libodbc++-0.2.3-20050404/ltconfig 1970-01-01 01:00:00.000000000 +0100 +@@ -1,3078 +0,0 @@ +-#! /bin/sh +- +-# ltconfig - Create a system-specific libtool. +-# Copyright (C) 1996-1999 Free Software Foundation, Inc. +-# Originally by Gordon Matzigkeit , 1996 +-# +-# This file 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. +-# +-# This program 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 this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +-# +-# As a special exception to the GNU General Public License, if you +-# distribute this file as part of a program that contains a +-# configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. +- +-# A lot of this script is taken from autoconf-2.10. +- +-# Check that we are running under the correct shell. +-SHELL=${CONFIG_SHELL-/bin/sh} +-echo=echo +-if test "X$1" = X--no-reexec; then +- # Discard the --no-reexec flag, and continue. +- shift +-elif test "X$1" = X--fallback-echo; then +- # Avoid inline document here, it may be left over +- : +-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then +- # Yippee, $echo works! +- : +-else +- # Restart under the correct shell. +- exec "$SHELL" "$0" --no-reexec ${1+"$@"} +-fi +- +-if test "X$1" = X--fallback-echo; then +- # used as fallback echo +- shift +- cat </dev/null`} +- case X$UNAME in +- *-DOS) PATH_SEPARATOR=';' ;; +- *) PATH_SEPARATOR=':' ;; +- esac +-fi +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi +- +-if test "X${echo_test_string+set}" != Xset; then +- # find a string as large as possible, as long as the shell can cope with it +- for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do +- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... +- if (echo_test_string="`eval $cmd`") 2>/dev/null && +- echo_test_string="`eval $cmd`" && +- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then +- break +- fi +- done +-fi +- +-if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || +- test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then +- # The Solaris, AIX, and Digital Unix default echo programs unquote +- # backslashes. This makes it impossible to quote backslashes using +- # echo "$something" | sed 's/\\/\\\\/g' +- # +- # So, first we look for a working echo in the user's PATH. +- +- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" +- for dir in $PATH /usr/ucb; do +- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && +- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && +- test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then +- echo="$dir/echo" +- break +- fi +- done +- IFS="$save_ifs" +- +- if test "X$echo" = Xecho; then +- # We didn't find a better echo, so look for alternatives. +- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && +- test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then +- # This shell has a builtin print -r that does the trick. +- echo='print -r' +- elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && +- test "X$CONFIG_SHELL" != X/bin/ksh; then +- # If we have ksh, try running ltconfig again with it. +- ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" +- export ORIGINAL_CONFIG_SHELL +- CONFIG_SHELL=/bin/ksh +- export CONFIG_SHELL +- exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} +- else +- # Try using printf. +- echo='printf "%s\n"' +- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && +- test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then +- # Cool, printf works +- : +- elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && +- test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then +- CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" +- export CONFIG_SHELL +- SHELL="$CONFIG_SHELL" +- export SHELL +- echo="$CONFIG_SHELL $0 --fallback-echo" +- elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && +- test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then +- echo="$CONFIG_SHELL $0 --fallback-echo" +- else +- # maybe with a smaller string... +- prev=: +- +- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do +- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then +- break +- fi +- prev="$cmd" +- done +- +- if test "$prev" != 'sed 50q "$0"'; then +- echo_test_string=`eval $prev` +- export echo_test_string +- exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} +- else +- # Oops. We lost completely, so just stick with echo. +- echo=echo +- fi +- fi +- fi +- fi +-fi +- +-# Sed substitution that helps us do robust quoting. It backslashifies +-# metacharacters that are still active within double-quoted strings. +-Xsed='sed -e s/^X//' +-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' +- +-# Same as above, but do not quote variable references. +-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' +- +-# Sed substitution to delay expansion of an escaped shell variable in a +-# double_quote_subst'ed string. +-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +- +-# The name of this program. +-progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` +- +-# Constants: +-PROGRAM=ltconfig +-PACKAGE=libtool +-VERSION=1.3.4 +-TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)" +-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +-rm="rm -f" +- +-help="Try \`$progname --help' for more information." +- +-# Global variables: +-default_ofile=libtool +-can_build_shared=yes +-enable_shared=yes +-# All known linkers require a `.a' archive for static linking (except M$VC, +-# which needs '.lib'). +-enable_static=yes +-enable_fast_install=yes +-enable_dlopen=unknown +-enable_win32_dll=no +-ltmain= +-silent= +-srcdir= +-ac_config_guess= +-ac_config_sub= +-host= +-nonopt= +-ofile="$default_ofile" +-verify_host=yes +-with_gcc=no +-with_gnu_ld=no +-need_locks=yes +-ac_ext=c +-objext=o +-libext=a +-exeext= +-cache_file= +- +-old_AR="$AR" +-old_CC="$CC" +-old_CFLAGS="$CFLAGS" +-old_CPPFLAGS="$CPPFLAGS" +-old_LDFLAGS="$LDFLAGS" +-old_LD="$LD" +-old_LN_S="$LN_S" +-old_LIBS="$LIBS" +-old_NM="$NM" +-old_RANLIB="$RANLIB" +-old_DLLTOOL="$DLLTOOL" +-old_OBJDUMP="$OBJDUMP" +-old_AS="$AS" +- +-# Parse the command line options. +-args= +-prev= +-for option +-do +- case "$option" in +- -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; +- *) optarg= ;; +- esac +- +- # If the previous option needs an argument, assign it. +- if test -n "$prev"; then +- eval "$prev=\$option" +- prev= +- continue +- fi +- +- case "$option" in +- --help) cat <&2 +- echo "$help" 1>&2 +- exit 1 +- ;; +- +- *) +- if test -z "$ltmain"; then +- ltmain="$option" +- elif test -z "$host"; then +-# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 +-# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then +-# echo "$progname: warning \`$option' is not a valid host type" 1>&2 +-# fi +- host="$option" +- else +- echo "$progname: too many arguments" 1>&2 +- echo "$help" 1>&2 +- exit 1 +- fi ;; +- esac +-done +- +-if test -z "$ltmain"; then +- echo "$progname: you must specify a LTMAIN file" 1>&2 +- echo "$help" 1>&2 +- exit 1 +-fi +- +-if test ! -f "$ltmain"; then +- echo "$progname: \`$ltmain' does not exist" 1>&2 +- echo "$help" 1>&2 +- exit 1 +-fi +- +-# Quote any args containing shell metacharacters. +-ltconfig_args= +-for arg +-do +- case "$arg" in +- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) +- ltconfig_args="$ltconfig_args '$arg'" ;; +- *) ltconfig_args="$ltconfig_args $arg" ;; +- esac +-done +- +-# A relevant subset of AC_INIT. +- +-# File descriptor usage: +-# 0 standard input +-# 1 file creation +-# 2 errors and warnings +-# 3 some systems may open it to /dev/tty +-# 4 used on the Kubota Titan +-# 5 compiler messages saved in config.log +-# 6 checking for... messages and results +-if test "$silent" = yes; then +- exec 6>/dev/null +-else +- exec 6>&1 +-fi +-exec 5>>./config.log +- +-# NLS nuisances. +-# Only set LANG and LC_ALL to C if already set. +-# These must not be set unconditionally because not all systems understand +-# e.g. LANG=C (notably SCO). +-if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi +-if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi +- +-if test -n "$cache_file" && test -r "$cache_file"; then +- echo "loading cache $cache_file within ltconfig" +- . $cache_file +-fi +- +-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then +- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. +- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then +- ac_n= ac_c=' +-' ac_t=' ' +- else +- ac_n=-n ac_c= ac_t= +- fi +-else +- ac_n= ac_c='\c' ac_t= +-fi +- +-if test -z "$srcdir"; then +- # Assume the source directory is the same one as the path to LTMAIN. +- srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` +- test "$srcdir" = "$ltmain" && srcdir=. +-fi +- +-trap "$rm conftest*; exit 1" 1 2 15 +-if test "$verify_host" = yes; then +- # Check for config.guess and config.sub. +- ac_aux_dir= +- for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do +- if test -f $ac_dir/config.guess; then +- ac_aux_dir=$ac_dir +- break +- fi +- done +- if test -z "$ac_aux_dir"; then +- echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 +- echo "$help" 1>&2 +- exit 1 +- fi +- ac_config_guess=$ac_aux_dir/config.guess +- ac_config_sub=$ac_aux_dir/config.sub +- +- # Make sure we can run config.sub. +- if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : +- else +- echo "$progname: cannot run $ac_config_sub" 1>&2 +- echo "$help" 1>&2 +- exit 1 +- fi +- +- echo $ac_n "checking host system type""... $ac_c" 1>&6 +- +- host_alias=$host +- case "$host_alias" in +- "") +- if host_alias=`$SHELL $ac_config_guess`; then : +- else +- echo "$progname: cannot guess host type; you must specify one" 1>&2 +- echo "$help" 1>&2 +- exit 1 +- fi ;; +- esac +- host=`$SHELL $ac_config_sub $host_alias` +- echo "$ac_t$host" 1>&6 +- +- # Make sure the host verified. +- test -z "$host" && exit 1 +- +-elif test -z "$host"; then +- echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 +- echo "$help" 1>&2 +- exit 1 +-else +- host_alias=$host +-fi +- +-# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +-case "$host_os" in +-linux-gnu*) ;; +-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +-esac +- +-host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +-host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +-host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +- +-case "$host_os" in +-aix3*) +- # AIX sometimes has problems with the GCC collect2 program. For some +- # reason, if we set the COLLECT_NAMES environment variable, the problems +- # vanish in a puff of smoke. +- if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +- fi +- ;; +-esac +- +-# Determine commands to create old-style static archives. +-old_archive_cmds='$AR cru $oldlib$oldobjs' +-old_postinstall_cmds='chmod 644 $oldlib' +-old_postuninstall_cmds= +- +-# Set a sane default for `AR'. +-test -z "$AR" && AR=ar +- +-# Set a sane default for `OBJDUMP'. +-test -z "$OBJDUMP" && OBJDUMP=objdump +- +-# If RANLIB is not set, then run the test. +-if test "${RANLIB+set}" != "set"; then +- result=no +- +- echo $ac_n "checking for ranlib... $ac_c" 1>&6 +- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" +- for dir in $PATH; do +- test -z "$dir" && dir=. +- if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then +- RANLIB="ranlib" +- result="ranlib" +- break +- fi +- done +- IFS="$save_ifs" +- +- echo "$ac_t$result" 1>&6 +-fi +- +-if test -n "$RANLIB"; then +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +-fi +- +-# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. +-test -z "$DLLTOOL" && DLLTOOL=dlltool +-test -z "$OBJDUMP" && OBJDUMP=objdump +-test -z "$AS" && AS=as +- +-# Check to see if we are using GCC. +-if test "$with_gcc" != yes || test -z "$CC"; then +- # If CC is not set, then try to find GCC or a usable CC. +- if test -z "$CC"; then +- echo $ac_n "checking for gcc... $ac_c" 1>&6 +- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" +- for dir in $PATH; do +- test -z "$dir" && dir=. +- if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then +- CC="gcc" +- break +- fi +- done +- IFS="$save_ifs" +- +- if test -n "$CC"; then +- echo "$ac_t$CC" 1>&6 +- else +- echo "$ac_t"no 1>&6 +- fi +- fi +- +- # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". +- if test -z "$CC"; then +- echo $ac_n "checking for cc... $ac_c" 1>&6 +- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" +- cc_rejected=no +- for dir in $PATH; do +- test -z "$dir" && dir=. +- if test -f $dir/cc || test -f $dir/cc$ac_exeext; then +- if test "$dir/cc" = "/usr/ucb/cc"; then +- cc_rejected=yes +- continue +- fi +- CC="cc" +- break +- fi +- done +- IFS="$save_ifs" +- if test $cc_rejected = yes; then +- # We found a bogon in the path, so make sure we never use it. +- set dummy $CC +- shift +- if test $# -gt 0; then +- # We chose a different compiler from the bogus one. +- # However, it has the same name, so the bogon will be chosen +- # first if we set CC to just the name; use the full file name. +- shift +- set dummy "$dir/cc" "$@" +- shift +- CC="$@" +- fi +- fi +- +- if test -n "$CC"; then +- echo "$ac_t$CC" 1>&6 +- else +- echo "$ac_t"no 1>&6 +- fi +- +- if test -z "$CC"; then +- echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 +- exit 1 +- fi +- fi +- +- # Now see if the compiler is really GCC. +- with_gcc=no +- echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 +- echo "$progname:581: checking whether we are using GNU C" >&5 +- +- $rm conftest.c +- cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +- with_gcc=yes +- fi +- $rm conftest.c +- echo "$ac_t$with_gcc" 1>&6 +-fi +- +-# Allow CC to be a program name with arguments. +-set dummy $CC +-compiler="$2" +- +-echo $ac_n "checking for object suffix... $ac_c" 1>&6 +-$rm conftest* +-echo 'int i = 1;' > conftest.c +-echo "$progname:603: checking for object suffix" >& 5 +-if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then +- # Append any warnings to the config.log. +- cat conftest.err 1>&5 +- +- for ac_file in conftest.*; do +- case $ac_file in +- *.c) ;; +- *) objext=`echo $ac_file | sed -e s/conftest.//` ;; +- esac +- done +-else +- cat conftest.err 1>&5 +- echo "$progname: failed program was:" >&5 +- cat conftest.c >&5 +-fi +-$rm conftest* +-echo "$ac_t$objext" 1>&6 +- +-echo $ac_n "checking for executable suffix... $ac_c" 1>&6 +-if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- ac_cv_exeext="no" +- $rm conftest* +- echo 'main () { return 0; }' > conftest.c +- echo "$progname:629: checking for executable suffix" >& 5 +- if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then +- # Append any warnings to the config.log. +- cat conftest.err 1>&5 +- +- for ac_file in conftest.*; do +- case $ac_file in +- *.c | *.err | *.$objext ) ;; +- *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; +- esac +- done +- else +- cat conftest.err 1>&5 +- echo "$progname: failed program was:" >&5 +- cat conftest.c >&5 +- fi +- $rm conftest* +-fi +-if test "X$ac_cv_exeext" = Xno; then +- exeext="" +-else +- exeext="$ac_cv_exeext" +-fi +-echo "$ac_t$ac_cv_exeext" 1>&6 +- +-echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 +-pic_flag= +-special_shlib_compile_flags= +-wl= +-link_static_flag= +-no_builtin_flag= +- +-if test "$with_gcc" = yes; then +- wl='-Wl,' +- link_static_flag='-static' +- +- case "$host_os" in +- beos* | irix5* | irix6* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- aix*) +- # Below there is a dirty hack to force normal static linking with -ldl +- # The problem is because libdl dynamically linked with both libc and +- # libC (AIX C++ library), which obviously doesn't included in libraries +- # list by gcc. This cause undefined symbols with -static flags. +- # This hack allows C programs to be linked with "-static -ldl", but +- # we not sure about C++ programs. +- link_static_flag="$link_static_flag ${wl}-lC" +- ;; +- cygwin* | mingw* | os2*) +- # We can build DLLs from non-PIC. +- ;; +- amigaos*) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- pic_flag='-m68020 -resident32 -malways-restore-a4' +- ;; +- sysv4*MP*) +- if test -d /usr/nec; then +- pic_flag=-Kconform_pic +- fi +- ;; +- *) +- pic_flag='-fPIC' +- ;; +- esac +-else +- # PORTME Check for PIC flags for the system compiler. +- case "$host_os" in +- aix3* | aix4*) +- # All AIX code is PIC. +- link_static_flag='-bnso -bI:/lib/syscalls.exp' +- ;; +- +- hpux9* | hpux10* | hpux11*) +- # Is there a better link_static_flag that works with the bundled CC? +- wl='-Wl,' +- link_static_flag="${wl}-a ${wl}archive" +- pic_flag='+Z' +- ;; +- +- irix5* | irix6*) +- wl='-Wl,' +- link_static_flag='-non_shared' +- # PIC (with -KPIC) is the default. +- ;; +- +- cygwin* | mingw* | os2*) +- # We can build DLLs from non-PIC. +- ;; +- +- osf3* | osf4* | osf5*) +- # All OSF/1 code is PIC. +- wl='-Wl,' +- link_static_flag='-non_shared' +- ;; +- +- sco3.2v5*) +- pic_flag='-Kpic' +- link_static_flag='-dn' +- special_shlib_compile_flags='-belf' +- ;; +- +- solaris*) +- pic_flag='-KPIC' +- link_static_flag='-Bstatic' +- wl='-Wl,' +- ;; +- +- sunos4*) +- pic_flag='-PIC' +- link_static_flag='-Bstatic' +- wl='-Qoption ld ' +- ;; +- +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- pic_flag='-KPIC' +- link_static_flag='-Bstatic' +- wl='-Wl,' +- ;; +- +- uts4*) +- pic_flag='-pic' +- link_static_flag='-Bstatic' +- ;; +- sysv4*MP*) +- if test -d /usr/nec ;then +- pic_flag='-Kconform_pic' +- link_static_flag='-Bstatic' +- fi +- ;; +- *) +- can_build_shared=no +- ;; +- esac +-fi +- +-if test -n "$pic_flag"; then +- echo "$ac_t$pic_flag" 1>&6 +- +- # Check to make sure the pic_flag actually works. +- echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 +- $rm conftest* +- echo "int some_variable = 0;" > conftest.c +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS $pic_flag -DPIC" +- echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 +- if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then +- # Append any warnings to the config.log. +- cat conftest.err 1>&5 +- +- case "$host_os" in +- hpux9* | hpux10* | hpux11*) +- # On HP-UX, both CC and GCC only warn that PIC is supported... then they +- # create non-PIC objects. So, if there were any warnings, we assume that +- # PIC is not supported. +- if test -s conftest.err; then +- echo "$ac_t"no 1>&6 +- can_build_shared=no +- pic_flag= +- else +- echo "$ac_t"yes 1>&6 +- pic_flag=" $pic_flag" +- fi +- ;; +- *) +- echo "$ac_t"yes 1>&6 +- pic_flag=" $pic_flag" +- ;; +- esac +- else +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- can_build_shared=no +- pic_flag= +- echo "$ac_t"no 1>&6 +- fi +- CFLAGS="$save_CFLAGS" +- $rm conftest* +-else +- echo "$ac_t"none 1>&6 +-fi +- +-# Check to see if options -o and -c are simultaneously supported by compiler +-echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 +-$rm -r conftest 2>/dev/null +-mkdir conftest +-cd conftest +-$rm conftest* +-echo "int some_variable = 0;" > conftest.c +-mkdir out +-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +-# that will create temporary files in the current directory regardless of +-# the output directory. Thus, making CWD read-only will cause this test +-# to fail, enabling locking or at least warning the user not to do parallel +-# builds. +-chmod -w . +-save_CFLAGS="$CFLAGS" +-CFLAGS="$CFLAGS -o out/conftest2.o" +-echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 +-if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then +- +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s out/conftest.err; then +- echo "$ac_t"no 1>&6 +- compiler_c_o=no +- else +- echo "$ac_t"yes 1>&6 +- compiler_c_o=yes +- fi +-else +- # Append any errors to the config.log. +- cat out/conftest.err 1>&5 +- compiler_c_o=no +- echo "$ac_t"no 1>&6 +-fi +-CFLAGS="$save_CFLAGS" +-chmod u+w . +-$rm conftest* out/* +-rmdir out +-cd .. +-rmdir conftest +-$rm -r conftest 2>/dev/null +- +-if test x"$compiler_c_o" = x"yes"; then +- # Check to see if we can write to a .lo +- echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 +- $rm conftest* +- echo "int some_variable = 0;" > conftest.c +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -c -o conftest.lo" +- echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 +-if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then +- +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- echo "$ac_t"no 1>&6 +- compiler_o_lo=no +- else +- echo "$ac_t"yes 1>&6 +- compiler_o_lo=yes +- fi +- else +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- compiler_o_lo=no +- echo "$ac_t"no 1>&6 +- fi +- CFLAGS="$save_CFLAGS" +- $rm conftest* +-else +- compiler_o_lo=no +-fi +- +-# Check to see if we can do hard links to lock some files if needed +-hard_links="nottested" +-if test "$compiler_c_o" = no && test "$need_locks" != no; then +- # do not overwrite the value of need_locks provided by the user +- echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 +- hard_links=yes +- $rm conftest* +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- touch conftest.a +- ln conftest.a conftest.b 2>&5 || hard_links=no +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- echo "$ac_t$hard_links" 1>&6 +- $rm conftest* +- if test "$hard_links" = no; then +- echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 +- need_locks=warn +- fi +-else +- need_locks=no +-fi +- +-if test "$with_gcc" = yes; then +- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler +- echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 +- $rm conftest* +- echo "int some_variable = 0;" > conftest.c +- save_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" +- echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +- if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then +- +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- echo "$ac_t"no 1>&6 +- compiler_rtti_exceptions=no +- else +- echo "$ac_t"yes 1>&6 +- compiler_rtti_exceptions=yes +- fi +- else +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- compiler_rtti_exceptions=no +- echo "$ac_t"no 1>&6 +- fi +- CFLAGS="$save_CFLAGS" +- $rm conftest* +- +- if test "$compiler_rtti_exceptions" = "yes"; then +- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' +- else +- no_builtin_flag=' -fno-builtin' +- fi +- +-fi +- +-# Check for any special shared library compilation flags. +-if test -n "$special_shlib_compile_flags"; then +- echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 +- if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : +- else +- echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 +- can_build_shared=no +- fi +-fi +- +-echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 +-$rm conftest* +-echo 'main(){return(0);}' > conftest.c +-save_LDFLAGS="$LDFLAGS" +-LDFLAGS="$LDFLAGS $link_static_flag" +-echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 +-if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +- echo "$ac_t$link_static_flag" 1>&6 +-else +- echo "$ac_t"none 1>&6 +- link_static_flag= +-fi +-LDFLAGS="$save_LDFLAGS" +-$rm conftest* +- +-if test -z "$LN_S"; then +- # Check to see if we can use ln -s, or we need hard links. +- echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 +- $rm conftest.dat +- if ln -s X conftest.dat 2>/dev/null; then +- $rm conftest.dat +- LN_S="ln -s" +- else +- LN_S=ln +- fi +- if test "$LN_S" = "ln -s"; then +- echo "$ac_t"yes 1>&6 +- else +- echo "$ac_t"no 1>&6 +- fi +-fi +- +-# Make sure LD is an absolute path. +-if test -z "$LD"; then +- ac_prog=ld +- if test "$with_gcc" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 +- echo "$progname:991: checking for ld used by GCC" >&5 +- ac_prog=`($CC -print-prog-name=ld) 2>&5` +- case "$ac_prog" in +- # Accept absolute paths. +- [\\/]* | [A-Za-z]:[\\/]*) +- re_direlt='/[^/][^/]*/\.\./' +- # Canonicalize the path of ld +- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` +- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" +- ;; +- "") +- # If it fails, then pretend we are not using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +- elif test "$with_gnu_ld" = yes; then +- echo $ac_n "checking for GNU ld... $ac_c" 1>&6 +- echo "$progname:1015: checking for GNU ld" >&5 +- else +- echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 +- echo "$progname:1018: checking for non-GNU ld" >&5 +- fi +- +- if test -z "$LD"; then +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" +- for ac_dir in $PATH; do +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some GNU ld's only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then +- test "$with_gnu_ld" != no && break +- else +- test "$with_gnu_ld" != yes && break +- fi +- fi +- done +- IFS="$ac_save_ifs" +- fi +- +- if test -n "$LD"; then +- echo "$ac_t$LD" 1>&6 +- else +- echo "$ac_t"no 1>&6 +- fi +- +- if test -z "$LD"; then +- echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 +- exit 1 +- fi +-fi +- +-# Check to see if it really is or is not GNU ld. +-echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 +-# I'd rather use --version here, but apparently some GNU ld's only accept -v. +-if $LD -v 2>&1 &5; then +- with_gnu_ld=yes +-else +- with_gnu_ld=no +-fi +-echo "$ac_t$with_gnu_ld" 1>&6 +- +-# See if the linker supports building shared libraries. +-echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 +- +-allow_undefined_flag= +-no_undefined_flag= +-need_lib_prefix=unknown +-need_version=unknown +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-archive_cmds= +-archive_expsym_cmds= +-old_archive_from_new_cmds= +-export_dynamic_flag_spec= +-whole_archive_flag_spec= +-thread_safe_flag_spec= +-hardcode_libdir_flag_spec= +-hardcode_libdir_separator= +-hardcode_direct=no +-hardcode_minus_L=no +-hardcode_shlibpath_var=unsupported +-runpath_var= +-always_export_symbols=no +-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +-# include_expsyms should be a list of space-separated symbols to be *always* +-# included in the symbol list +-include_expsyms= +-# exclude_expsyms can be an egrep regular expression of symbols to exclude +-# it will be wrapped by ` (' and `)$', so one must not match beginning or +-# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +-# as well as any symbol that contains `d'. +-exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +-# platforms (ab)use it in PIC code, but their linkers get confused if +-# the symbol is explicitly referenced. Since portable code cannot +-# rely on this symbol name, it's probably fine to never include it in +-# preloaded symbol tables. +- +-case "$host_os" in +-cygwin* | mingw*) +- # FIXME: the MSVC++ port hasn't been tested in a loooong time +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- if test "$with_gcc" != yes; then +- with_gnu_ld=no +- fi +- ;; +- +-esac +- +-ld_shlibs=yes +-if test "$with_gnu_ld" = yes; then +- # If archive_cmds runs LD, not CC, wlarc should be empty +- wlarc='${wl}' +- +- # See if GNU ld supports shared libraries. +- case "$host_os" in +- aix3* | aix4*) +- # On AIX, the GNU linker is very broken +- ld_shlibs=no +- cat <&2 +- +-*** Warning: the GNU linker, at least up to release 2.9.1, is reported +-*** to be unable to reliably create shared libraries on AIX. +-*** Therefore, libtool is disabling shared libraries support. If you +-*** really care for shared libraries, you may want to modify your PATH +-*** so that a non-GNU linker is found, and then restart. +- +-EOF +- ;; +- +- amigaos*) +- archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- +- # Samuel A. Falvo II reports +- # that the semantics of dynamic libraries on AmigaOS, at least up +- # to version 4, is to share data among multiple programs linked +- # with the same dynamic library. Since this doesn't match the +- # behavior of shared libraries on other platforms, we can use +- # them. +- ld_shlibs=no +- ;; +- +- beos*) +- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- allow_undefined_flag=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- +- cygwin* | mingw*) +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec='-L$libdir' +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- +- # Extract the symbol export list from an `--export-all' def file, +- # then regenerate the def file from the symbol export list, so that +- # the compiled dll only exports the symbol export list. +- export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ +- test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ +- $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ +- sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' +- +- archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ +- _lt_hint=1; +- for symbol in `cat $export_symbols`; do +- echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def; +- _lt_hint=`expr 1 + \$_lt_hint`; +- done~ +- test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ +- test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ +- $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ +- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ +- $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ +- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ +- $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' +- +- old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' +- ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' +- # can we support soname and/or expsyms with a.out? -oliva +- fi +- ;; +- +- solaris* | sysv5*) +- if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then +- ld_shlibs=no +- cat <&2 +- +-*** Warning: The releases 2.8.* of the GNU linker cannot reliably +-*** create shared libraries on Solaris systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.9.1 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. +- +-EOF +- elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- +- sunos4*) +- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' +- wlarc= +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- *) +- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- esac +- +- if test "$ld_shlibs" = yes; then +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec='${wl}--export-dynamic' +- case $host_os in +- cygwin* | mingw*) +- # dlltool doesn't understand --whole-archive et. al. +- whole_archive_flag_spec= +- ;; +- *) +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec= +- fi +- ;; +- esac +- fi +-else +- # PORTME fill in a description of your system's linker (not GNU ld) +- case "$host_os" in +- aix3*) +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' +- # Note: this linker hardcodes the directories in LIBPATH if there +- # are no directories specified by -L. +- hardcode_minus_L=yes +- if test "$with_gcc" = yes && test -z "$link_static_flag"; then +- # Neither direct hardcoding nor static linking is supported with a +- # broken collect2. +- hardcode_direct=unsupported +- fi +- ;; +- +- aix4*) +- hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' +- hardcode_libdir_separator=':' +- if test "$with_gcc" = yes; then +- collect2name=`${CC} -print-prog-name=collect2` +- if test -f "$collect2name" && \ +- strings "$collect2name" | grep resolve_lib_name >/dev/null +- then +- # We have reworked collect2 +- hardcode_direct=yes +- else +- # We have old collect2 +- hardcode_direct=unsupported +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- hardcode_minus_L=yes +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_libdir_separator= +- fi +- shared_flag='-shared' +- else +- shared_flag='${wl}-bM:SRE' +- hardcode_direct=yes +- fi +- allow_undefined_flag=' ${wl}-berok' +- archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' +- archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' +- case "$host_os" in aix4.[01]|aix4.[01].*) +- # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on +- always_export_symbols=yes ;; +- esac +- ;; +- +- amigaos*) +- archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- # see comment about different semantics on the GNU ld section +- ld_shlibs=no +- ;; +- +- cygwin* | mingw*) +- # When not using gcc, we currently assume that we are using +- # Microsoft Visual C++. +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- old_archive_from_new_cmds='true' +- # FIXME: Should let the user specify the lib program. +- old_archive_cmds='lib /OUT:$oldlib$oldobjs' +- fix_srcfile_path='`cygpath -w $srcfile`' +- ;; +- +- freebsd1*) +- ld_shlibs=no +- ;; +- +- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor +- # support. Future versions do this automatically, but an explicit c++rt0.o +- # does not break anything, and helps significantly (at the cost of a little +- # extra space). +- freebsd2.2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; +- +- # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd*) +- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- hpux9* | hpux10* | hpux11*) +- case "$host_os" in +- hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; +- *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; +- esac +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_direct=yes +- hardcode_minus_L=yes # Not in the search PATH, but as the default +- # location of the library. +- export_dynamic_flag_spec='${wl}-E' +- ;; +- +- irix5* | irix6*) +- if test "$with_gcc" = yes; then +- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' +- else +- archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' +- fi +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out +- else +- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF +- fi +- hardcode_libdir_flag_spec='${wl}-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- openbsd*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- os2*) +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- allow_undefined_flag=unsupported +- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' +- old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' +- ;; +- +- osf3*) +- if test "$with_gcc" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' +- fi +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- +- osf4* | osf5*) # As osf3* with the addition of the -msym flag +- if test "$with_gcc" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' +- fi +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- +- sco3.2v5*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ;; +- +- solaris*) +- no_undefined_flag=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' +- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_shlibpath_var=no +- case "$host_os" in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; +- esac +- ;; +- +- sunos4*) +- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; +- +- sysv4) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- hardcode_direct=no #Motorola manual says yes, but my tests say they lie +- ;; +- +- sysv4.3*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' +- hardcode_shlibpath_var=no +- export_dynamic_flag_spec='-Bexport' +- ;; +- +- sysv5*) +- no_undefined_flag=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' +- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' +- hardcode_libdir_flag_spec= +- hardcode_shlibpath_var=no +- runpath_var='LD_RUN_PATH' +- ;; +- +- uts4*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; +- +- dgux*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ld_shlibs=yes +- fi +- ;; +- +- sysv4.2uw2*) +- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts' +- hardcode_direct=yes +- hardcode_minus_L=no +- hardcode_shlibpath_var=no +- hardcode_runpath_var=yes +- runpath_var=LD_RUN_PATH +- ;; +- +- unixware7*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- ;; +- +- *) +- ld_shlibs=no +- ;; +- esac +-fi +-echo "$ac_t$ld_shlibs" 1>&6 +-test "$ld_shlibs" = no && can_build_shared=no +- +-if test -z "$NM"; then +- echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 +- case "$NM" in +- [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. +- *) +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" +- for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then +- NM="$ac_dir/nm -B" +- break +- elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then +- NM="$ac_dir/nm -p" +- break +- else +- NM=${NM="$ac_dir/nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- fi +- fi +- done +- IFS="$ac_save_ifs" +- test -z "$NM" && NM=nm +- ;; +- esac +- echo "$ac_t$NM" 1>&6 +-fi +- +-# Check for command to grab the raw symbol name followed by C symbol from nm. +-echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 +- +-# These are sane defaults that work on at least a few old systems. +-# [They come from Ultrix. What could be older than Ultrix?!! ;)] +- +-# Character class describing NM global symbol codes. +-symcode='[BCDEGRST]' +- +-# Regexp to match symbols that can be accessed directly from C. +-sympat='\([_A-Za-z][_A-Za-z0-9]*\)' +- +-# Transform the above into a raw symbol and a C symbol. +-symxfrm='\1 \2\3 \3' +- +-# Transform an extracted symbol line into a proper C declaration +-global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" +- +-# Define system-specific variables. +-case "$host_os" in +-aix*) +- symcode='[BCDT]' +- ;; +-cygwin* | mingw*) +- symcode='[ABCDGISTW]' +- ;; +-hpux*) # Its linker distinguishes data from code symbols +- global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" +- ;; +-irix*) +- symcode='[BCDEGRST]' +- ;; +-solaris*) +- symcode='[BDT]' +- ;; +-sysv4) +- symcode='[DFNSTU]' +- ;; +-esac +- +-# If we're using GNU nm, then use its standard symbol codes. +-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then +- symcode='[ABCDGISTW]' +-fi +- +-# Try without a prefix undercore, then with it. +-for ac_symprfx in "" "_"; do +- +- # Write the raw and C identifiers. +- global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" +- +- # Check to see that the pipe works correctly. +- pipe_works=no +- $rm conftest* +- cat > conftest.c <&5 +- if { (eval echo $progname:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then +- # Now try to grab the symbols. +- nlist=conftest.nm +- if { echo "$progname:1639: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then +- +- # Try sorting and uniquifying the output. +- if sort "$nlist" | uniq > "$nlist"T; then +- mv -f "$nlist"T "$nlist" +- else +- rm -f "$nlist"T +- fi +- +- # Make sure that we snagged all the symbols we need. +- if egrep ' nm_test_var$' "$nlist" >/dev/null; then +- if egrep ' nm_test_func$' "$nlist" >/dev/null; then +- cat < conftest.c +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-EOF +- # Now generate the symbol file. +- eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' +- +- cat <> conftest.c +-#if defined (__STDC__) && __STDC__ +-# define lt_ptr_t void * +-#else +-# define lt_ptr_t char * +-# define const +-#endif +- +-/* The mapping between symbol names and symbols. */ +-const struct { +- const char *name; +- lt_ptr_t address; +-} +-lt_preloaded_symbols[] = +-{ +-EOF +- sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c +- cat <<\EOF >> conftest.c +- {0, (lt_ptr_t) 0} +-}; +- +-#ifdef __cplusplus +-} +-#endif +-EOF +- # Now try linking the two files. +- mv conftest.$objext conftstm.$objext +- save_LIBS="$LIBS" +- save_CFLAGS="$CFLAGS" +- LIBS="conftstm.$objext" +- CFLAGS="$CFLAGS$no_builtin_flag" +- if { (eval echo $progname:1691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +- pipe_works=yes +- else +- echo "$progname: failed program was:" >&5 +- cat conftest.c >&5 +- fi +- LIBS="$save_LIBS" +- else +- echo "cannot find nm_test_func in $nlist" >&5 +- fi +- else +- echo "cannot find nm_test_var in $nlist" >&5 +- fi +- else +- echo "cannot run $global_symbol_pipe" >&5 +- fi +- else +- echo "$progname: failed program was:" >&5 +- cat conftest.c >&5 +- fi +- $rm conftest* conftst* +- +- # Do not use the global_symbol_pipe unless it works. +- if test "$pipe_works" = yes; then +- break +- else +- global_symbol_pipe= +- fi +-done +-if test "$pipe_works" = yes; then +- echo "${ac_t}ok" 1>&6 +-else +- echo "${ac_t}failed" 1>&6 +-fi +- +-if test -z "$global_symbol_pipe"; then +- global_symbol_to_cdecl= +-fi +- +-# Check hardcoding attributes. +-echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 +-hardcode_action= +-if test -n "$hardcode_libdir_flag_spec" || \ +- test -n "$runpath_var"; then +- +- # We can hardcode non-existant directories. +- if test "$hardcode_direct" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$hardcode_shlibpath_var" != no && +- test "$hardcode_minus_L" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action=immediate +- fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action=unsupported +-fi +-echo "$ac_t$hardcode_action" 1>&6 +- +- +-reload_flag= +-reload_cmds='$LD$reload_flag -o $output$reload_objs' +-echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 +-# PORTME Some linkers may need a different reload flag. +-reload_flag='-r' +-echo "$ac_t$reload_flag" 1>&6 +-test -n "$reload_flag" && reload_flag=" $reload_flag" +- +-# PORTME Fill in your ld.so characteristics +-library_names_spec= +-libname_spec='lib$name' +-soname_spec= +-postinstall_cmds= +-postuninstall_cmds= +-finish_cmds= +-finish_eval= +-shlibpath_var= +-shlibpath_overrides_runpath=unknown +-version_type=none +-dynamic_linker="$host_os ld.so" +-sys_lib_dlsearch_path_spec="/lib /usr/lib" +-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +-file_magic_cmd= +-file_magic_test_file= +-deplibs_check_method='unknown' +-# Need to set the preceding variable on all platforms that support +-# interlibrary dependencies. +-# 'none' -- dependencies not supported. +-# `unknown' -- same as none, but documents that we really don't know. +-# 'pass_all' -- all dependencies passed with no checks. +-# 'test_compile' -- check by making test program. +-# 'file_magic [regex]' -- check by looking for files in library path +-# which responds to the $file_magic_cmd with a given egrep regex. +-# If you have `file' or equivalent on your system and you're not sure +-# whether `pass_all' will *always* work, you probably want this one. +-echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 +-case "$host_os" in +-aix3*) +- version_type=linux +- library_names_spec='${libname}${release}.so$versuffix $libname.a' +- shlibpath_var=LIBPATH +- +- # AIX has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}.so$major' +- ;; +- +-aix4*) +- version_type=linux +- # AIX has no versioning support, so currently we can not hardcode correct +- # soname into executable. Probably we can add versioning support to +- # collect2, so additional links can be useful in future. +- # We preserve .a as extension for shared libraries though AIX4.2 +- # and later linker supports .so +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' +- shlibpath_var=LIBPATH +- deplibs_check_method=pass_all +- ;; +- +-amigaos*) +- library_names_spec='$libname.ixlibrary $libname.a' +- # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' +- ;; +- +-beos*) +- library_names_spec='${libname}.so' +- dynamic_linker="$host_os ld.so" +- shlibpath_var=LIBRARY_PATH +- deplibs_check_method=pass_all +- lt_cv_dlopen="load_add_on" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ;; +- +-bsdi4*) +- version_type=linux +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' +- file_magic_cmd=/usr/bin/file +- file_magic_test_file=/shlib/libc.so +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- export_dynamic_flag_spec=-rdynamic +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; +- +-cygwin* | mingw*) +- version_type=windows +- need_version=no +- need_lib_prefix=no +- if test "$with_gcc" = yes; then +- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' +- else +- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' +- fi +- dynamic_linker='Win32 ld.exe' +- deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' +- file_magic_cmd='${OBJDUMP} -f' +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- lt_cv_dlopen="LoadLibrary" +- lt_cv_dlopen_libs= +- ;; +- +-freebsd1*) +- dynamic_linker=no +- ;; +- +-freebsd*) +- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` +- version_type=freebsd-$objformat +- case "$version_type" in +- freebsd-elf*) +- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' +- file_magic_cmd=/usr/bin/file +- file_magic_test_file=`echo /usr/lib/libc.so*` +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- deplibs_check_method=unknown +- library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' +- need_version=yes +- ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case "$host_os" in +- freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) +- shlibpath_overrides_runpath=yes +- ;; +- *) # from 3.2 on +- shlibpath_overrides_runpath=no +- ;; +- esac +- ;; +- +-gnu*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- dynamic_linker="$host_os dld.sl" +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' +- soname_spec='${libname}${release}.sl$major' +- # HP-UX runs *really* slowly unless shared libraries are mode 555. +- postinstall_cmds='chmod 555 $lib' +- ;; +- +-irix5* | irix6*) +- version_type=irix +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}.so.$major' +- library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' +- case "$host_os" in +- irix5*) +- libsuff= shlibsuff= +- # this will be overridden with pass_all, but let us keep it just in case +- deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" +- ;; +- *) +- case "$LD" in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- file_magic_cmd=/usr/bin/file +- file_magic_test_file=`echo /lib${libsuff}/libc.so*` +- deplibs_check_method='pass_all' +- ;; +- +-# No shared lib support for Linux oldld, aout, or coff. +-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) +- dynamic_linker=no +- ;; +- +-# This must be Linux ELF. +-linux-gnu*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' +- file_magic_cmd=/usr/bin/file +- file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +- +- if test -f /lib/ld.so.1; then +- dynamic_linker='GNU ld.so' +- else +- # Only the GNU ld.so supports shared libraries on MkLinux. +- case "$host_cpu" in +- powerpc*) dynamic_linker=no ;; +- *) dynamic_linker='Linux ld.so' ;; +- esac +- fi +- ;; +- +-netbsd*) +- version_type=sunos +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' +- soname_spec='${libname}${release}.so$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-openbsd*) +- version_type=sunos +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- need_version=no +- fi +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-os2*) +- libname_spec='$name' +- need_lib_prefix=no +- library_names_spec='$libname.dll $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; +- +-osf3* | osf4* | osf5*) +- version_type=osf +- need_version=no +- soname_spec='${libname}${release}.so' +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' +- shlibpath_var=LD_LIBRARY_PATH +- # this will be overridden with pass_all, but let us keep it just in case +- deplibs_check_method='file_magic COFF format alpha shared library' +- file_magic_cmd=/usr/bin/file +- file_magic_test_file=/shlib/libc.so +- deplibs_check_method='pass_all' +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; +- +-sco3.2v5*) +- version_type=osf +- soname_spec='${libname}${release}.so$major' +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-solaris*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- # ldd complains unless libraries are executable +- postinstall_cmds='chmod +x $lib' +- deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" +- file_magic_cmd=/usr/bin/file +- file_magic_test_file=/lib/libc.so +- ;; +- +-sunos4*) +- version_type=sunos +- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' +- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- fi +- need_version=yes +- ;; +- +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- version_type=linux +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- case "$host_vendor" in +- ncr) +- deplibs_check_method='pass_all' +- ;; +- motorola) +- need_lib_prefix=no +- need_version=no +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' +- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' +- file_magic_cmd=/usr/bin/file +- file_magic_test_file=`echo /usr/lib/libc.so*` +- ;; +- esac +- ;; +- +-uts4*) +- version_type=linux +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-dgux*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' +- soname_spec='${libname}${release}.so$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-sysv4*MP*) +- if test -d /usr/nec ;then +- version_type=linux +- library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' +- soname_spec='$libname.so.$major' +- shlibpath_var=LD_LIBRARY_PATH +- fi +- ;; +- +-*) +- dynamic_linker=no +- ;; +-esac +-echo "$ac_t$dynamic_linker" 1>&6 +-test "$dynamic_linker" = no && can_build_shared=no +- +-# Report the final consequences. +-echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 +- +-# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in +-# configure.in, otherwise build static only libraries. +-case "$host_os" in +-cygwin* | mingw* | os2*) +- if test x$can_build_shared = xyes; then +- test x$enable_win32_dll = xno && can_build_shared=no +- echo "checking if package supports dlls... $can_build_shared" 1>&6 +- fi +-;; +-esac +- +-if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then +- case "$deplibs_check_method" in +- "file_magic "*) +- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- egrep "$file_magic_regex" > /dev/null; then +- : +- else +- cat <&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-EOF +- fi ;; +- esac +-fi +- +-echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 +-test "$can_build_shared" = "no" && enable_shared=no +- +-# On AIX, shared libraries and static libraries use the same namespace, and +-# are all built from PIC. +-case "$host_os" in +-aix3*) +- test "$enable_shared" = yes && enable_static=no +- if test -n "$RANLIB"; then +- archive_cmds="$archive_cmds~\$RANLIB \$lib" +- postinstall_cmds='$RANLIB $lib' +- fi +- ;; +- +-aix4*) +- test "$enable_shared" = yes && enable_static=no +- ;; +-esac +- +-echo "$ac_t$enable_shared" 1>&6 +- +-# Make sure either enable_shared or enable_static is yes. +-test "$enable_shared" = yes || enable_static=yes +- +-echo "checking whether to build static libraries... $enable_static" 1>&6 +- +-if test "$hardcode_action" = relink; then +- # Fast installation is not supported +- enable_fast_install=no +-elif test "$shlibpath_overrides_runpath" = yes || +- test "$enable_shared" = no; then +- # Fast installation is not necessary +- enable_fast_install=needless +-fi +- +-echo $ac_n "checking for objdir... $ac_c" 1>&6 +-rm -f .libs 2>/dev/null +-mkdir .libs 2>/dev/null +-if test -d .libs; then +- objdir=.libs +-else +- # MS-DOS does not allow filenames that begin with a dot. +- objdir=_libs +-fi +-rmdir .libs 2>/dev/null +-echo "$ac_t$objdir" 1>&6 +- +-if test "x$enable_dlopen" != xyes; then +- enable_dlopen=unknown +- enable_dlopen_self=unknown +- enable_dlopen_self_static=unknown +-else +-if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then +- lt_cv_dlopen=no lt_cv_dlopen_libs= +-echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +-echo "$progname:2212: checking for dlopen in -ldl" >&5 +-ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- ac_save_LIBS="$LIBS" +-LIBS="-ldl $LIBS" +-cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" +- +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- echo "$ac_t""no" 1>&6 +-echo $ac_n "checking for dlopen""... $ac_c" 1>&6 +-echo "$progname:2252: checking for dlopen" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext < +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dlopen(); +- +-int main() { +- +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_dlopen) || defined (__stub___dlopen) +-choke me +-#else +-dlopen(); +-#endif +- +-; return 0; } +-EOF +-if { (eval echo $progname:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_dlopen=yes" +-else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_dlopen=no" +-fi +-rm -f conftest* +-fi +-if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- lt_cv_dlopen="dlopen" +-else +- echo "$ac_t""no" 1>&6 +-echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 +-echo "$progname:2299: checking for dld_link in -ldld" >&5 +-ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- ac_save_LIBS="$LIBS" +-LIBS="-ldld $LIBS" +-cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" +- +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +-else +- echo "$ac_t""no" 1>&6 +-echo $ac_n "checking for shl_load""... $ac_c" 1>&6 +-echo "$progname:2339: checking for shl_load" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext < +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char shl_load(); +- +-int main() { +- +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_shl_load) || defined (__stub___shl_load) +-choke me +-#else +-shl_load(); +-#endif +- +-; return 0; } +-EOF +-if { (eval echo $progname:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_shl_load=yes" +-else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_shl_load=no" +-fi +-rm -f conftest* +-fi +- +-if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- lt_cv_dlopen="shl_load" +-else +- echo "$ac_t""no" 1>&6 +-echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 +-echo "$progname:2387: checking for shl_load in -ldld" >&5 +-ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- ac_save_LIBS="$LIBS" +-LIBS="-ldld $LIBS" +-cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" +- +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +-else +- echo "$ac_t""no" 1>&6 +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +-fi +- +- if test "x$lt_cv_dlopen" != xno; then +- enable_dlopen=yes +- fi +- +- case "$lt_cv_dlopen" in +- dlopen) +-for ac_hdr in dlfcn.h; do +-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +-echo "$progname:2452: checking for $ac_hdr" >&5 +-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext < +-int fnord = 0; +-EOF +-ac_try="$ac_compile >/dev/null 2>conftest.out" +-{ (eval echo $progname:2462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +-if test -z "$ac_err"; then +- rm -rf conftest* +- eval "ac_cv_header_$ac_safe=yes" +-else +- echo "$ac_err" >&5 +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_header_$ac_safe=no" +-fi +-rm -f conftest* +-fi +-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +-else +- echo "$ac_t""no" 1>&6 +-fi +-done +- +- if test "x$ac_cv_header_dlfcn_h" = xyes; then +- CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +- fi +- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +- LIBS="$lt_cv_dlopen_libs $LIBS" +- +- echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 +-echo "$progname:2490: checking whether a program can dlopen itself" >&5 +-if test "${lt_cv_dlopen_self+set}" = set; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- if test "$cross_compiling" = yes; then +- lt_cv_dlopen_self=cross +- else +- cat > conftest.c < +-#endif +- +-#include +- +-#ifdef RTLD_GLOBAL +-# define LTDL_GLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LTDL_GLOBAL DL_GLOBAL +-# else +-# define LTDL_GLOBAL 0 +-# endif +-#endif +- +-/* We may have to define LTDL_LAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LTDL_LAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LTDL_LAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LTDL_LAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LTDL_LAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LTDL_LAZY_OR_NOW DL_NOW +-# else +-# define LTDL_LAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif +- +-fnord() { int i=42;} +-main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); +- if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); +- if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } +- +-EOF +-if { (eval echo $progname:2544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +-then +- lt_cv_dlopen_self=yes +-else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -fr conftest* +- lt_cv_dlopen_self=no +-fi +-rm -fr conftest* +-fi +- +-fi +- +-echo "$ac_t""$lt_cv_dlopen_self" 1>&6 +- +- if test "$lt_cv_dlopen_self" = yes; then +- LDFLAGS="$LDFLAGS $link_static_flag" +- echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 +-echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5 +-if test "${lt_cv_dlopen_self_static+set}" = set; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- if test "$cross_compiling" = yes; then +- lt_cv_dlopen_self_static=cross +- else +- cat > conftest.c < +-#endif +- +-#include +- +-#ifdef RTLD_GLOBAL +-# define LTDL_GLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LTDL_GLOBAL DL_GLOBAL +-# else +-# define LTDL_GLOBAL 0 +-# endif +-#endif +- +-/* We may have to define LTDL_LAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LTDL_LAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LTDL_LAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LTDL_LAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LTDL_LAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LTDL_LAZY_OR_NOW DL_NOW +-# else +-# define LTDL_LAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif +- +-fnord() { int i=42;} +-main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); +- if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); +- if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } +- +-EOF +-if { (eval echo $progname:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +-then +- lt_cv_dlopen_self_static=yes +-else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -fr conftest* +- lt_cv_dlopen_self_static=no +-fi +-rm -fr conftest* +-fi +- +-fi +- +-echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 +-fi +- ;; +- esac +- +- case "$lt_cv_dlopen_self" in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac +- +- case "$lt_cv_dlopen_self_static" in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac +-fi +- +-# Copy echo and quote the copy, instead of the original, because it is +-# used later. +-ltecho="$echo" +-if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then +- ltecho="$CONFIG_SHELL \$0 --fallback-echo" +-fi +-LTSHELL="$SHELL" +- +-LTCONFIG_VERSION="$VERSION" +- +-# Only quote variables if we're using ltmain.sh. +-case "$ltmain" in +-*.sh) +- # Now quote all the things that may contain metacharacters. +- for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ +- old_LD old_LDFLAGS old_LIBS \ +- old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ +- AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ +- reload_flag reload_cmds wl \ +- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ +- thread_safe_flag_spec whole_archive_flag_spec libname_spec \ +- library_names_spec soname_spec \ +- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ +- old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ +- file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ +- finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ +- hardcode_libdir_flag_spec hardcode_libdir_separator \ +- sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ +- compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do +- +- case "$var" in +- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ +- old_postinstall_cmds | old_postuninstall_cmds | \ +- export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ +- postinstall_cmds | postuninstall_cmds | \ +- finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) +- # Double-quote double-evaled strings. +- eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" +- ;; +- *) +- eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" +- ;; +- esac +- done +- +- case "$ltecho" in +- *'\$0 --fallback-echo"') +- ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` +- ;; +- esac +- +- trap "$rm \"$ofile\"; exit 1" 1 2 15 +- echo "creating $ofile" +- $rm "$ofile" +- cat < "$ofile" +-#! $SHELL +- +-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +-# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. +-# +-# Copyright (C) 1996-1999 Free Software Foundation, Inc. +-# Originally by Gordon Matzigkeit , 1996 +-# +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. +-# +-# This program 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 this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +-# +-# As a special exception to the GNU General Public License, if you +-# distribute this file as part of a program that contains a +-# configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. +- +-# Sed that helps us avoid accidentally triggering echo(1) options like -n. +-Xsed="sed -e s/^X//" +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi +- +-### BEGIN LIBTOOL CONFIG +-EOF +- cfgfile="$ofile" +- ;; +- +-*) +- # Double-quote the variables that need it (for aesthetics). +- for var in old_CC old_CFLAGS old_CPPFLAGS \ +- old_LD old_LDFLAGS old_LIBS \ +- old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do +- eval "$var=\\\"\$var\\\"" +- done +- +- # Just create a config file. +- cfgfile="$ofile.cfg" +- trap "$rm \"$cfgfile\"; exit 1" 1 2 15 +- echo "creating $cfgfile" +- $rm "$cfgfile" +- cat < "$cfgfile" +-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. +-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +-EOF +- ;; +-esac +- +-cat <> "$cfgfile" +-# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +-# +-# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ +-# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ +-# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ +-# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ +-# $0$ltconfig_args +-# +-# Compiler and other test output produced by $progname, useful for +-# debugging $progname, is in ./config.log if it exists. +- +-# The version of $progname that generated this script. +-LTCONFIG_VERSION=$LTCONFIG_VERSION +- +-# Shell to use when invoking shell scripts. +-SHELL=$LTSHELL +- +-# Whether or not to build shared libraries. +-build_libtool_libs=$enable_shared +- +-# Whether or not to build static libraries. +-build_old_libs=$enable_static +- +-# Whether or not to optimize for fast installation. +-fast_install=$enable_fast_install +- +-# The host system. +-host_alias=$host_alias +-host=$host +- +-# An echo program that does not interpret backslashes. +-echo=$ltecho +- +-# The archiver. +-AR=$AR +- +-# The default C compiler. +-CC=$CC +- +-# The linker used to build libraries. +-LD=$LD +- +-# Whether we need hard or soft links. +-LN_S=$LN_S +- +-# A BSD-compatible nm program. +-NM=$NM +- +-# Used on cygwin: DLL creation program. +-DLLTOOL="$DLLTOOL" +- +-# Used on cygwin: object dumper. +-OBJDUMP="$OBJDUMP" +- +-# Used on cygwin: assembler. +-AS="$AS" +- +-# The name of the directory that contains temporary libtool files. +-objdir=$objdir +- +-# How to create reloadable object files. +-reload_flag=$reload_flag +-reload_cmds=$reload_cmds +- +-# How to pass a linker flag through the compiler. +-wl=$wl +- +-# Object file suffix (normally "o"). +-objext="$objext" +- +-# Old archive suffix (normally "a"). +-libext="$libext" +- +-# Executable file suffix (normally ""). +-exeext="$exeext" +- +-# Additional compiler flags for building library objects. +-pic_flag=$pic_flag +- +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$compiler_c_o +- +-# Can we write directly to a .lo ? +-compiler_o_lo=$compiler_o_lo +- +-# Must we lock files when doing compilation ? +-need_locks=$need_locks +- +-# Do we need the lib prefix for modules? +-need_lib_prefix=$need_lib_prefix +- +-# Do we need a version for libraries? +-need_version=$need_version +- +-# Whether dlopen is supported. +-dlopen=$enable_dlopen +- +-# Whether dlopen of programs is supported. +-dlopen_self=$enable_dlopen_self +- +-# Whether dlopen of statically linked programs is supported. +-dlopen_self_static=$enable_dlopen_self_static +- +-# Compiler flag to prevent dynamic linking. +-link_static_flag=$link_static_flag +- +-# Compiler flag to turn off builtin functions. +-no_builtin_flag=$no_builtin_flag +- +-# Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$export_dynamic_flag_spec +- +-# Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$whole_archive_flag_spec +- +-# Compiler flag to generate thread-safe objects. +-thread_safe_flag_spec=$thread_safe_flag_spec +- +-# Library versioning type. +-version_type=$version_type +- +-# Format of library name prefix. +-libname_spec=$libname_spec +- +-# List of archive names. First name is the real one, the rest are links. +-# The last name is the one that the linker finds with -lNAME. +-library_names_spec=$library_names_spec +- +-# The coded name of the library, if different from the real name. +-soname_spec=$soname_spec +- +-# Commands used to build and install an old-style archive. +-RANLIB=$RANLIB +-old_archive_cmds=$old_archive_cmds +-old_postinstall_cmds=$old_postinstall_cmds +-old_postuninstall_cmds=$old_postuninstall_cmds +- +-# Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$old_archive_from_new_cmds +- +-# Commands used to build and install a shared archive. +-archive_cmds=$archive_cmds +-archive_expsym_cmds=$archive_expsym_cmds +-postinstall_cmds=$postinstall_cmds +-postuninstall_cmds=$postuninstall_cmds +- +-# Method to check whether dependent libraries are shared objects. +-deplibs_check_method=$deplibs_check_method +- +-# Command to use when deplibs_check_method == file_magic. +-file_magic_cmd=$file_magic_cmd +- +-# Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$allow_undefined_flag +- +-# Flag that forces no undefined symbols. +-no_undefined_flag=$no_undefined_flag +- +-# Commands used to finish a libtool library installation in a directory. +-finish_cmds=$finish_cmds +- +-# Same as above, but a single script fragment to be evaled but not shown. +-finish_eval=$finish_eval +- +-# Take the output of nm and produce a listing of raw symbols and C names. +-global_symbol_pipe=$global_symbol_pipe +- +-# Transform the output of nm in a proper C declaration +-global_symbol_to_cdecl=$global_symbol_to_cdecl +- +-# This is the shared library runtime path variable. +-runpath_var=$runpath_var +- +-# This is the shared library path variable. +-shlibpath_var=$shlibpath_var +- +-# Is shlibpath searched before the hard-coded library search path? +-shlibpath_overrides_runpath=$shlibpath_overrides_runpath +- +-# How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action +- +-# Flag to hardcode \$libdir into a binary during linking. +-# This must work even if \$libdir does not exist. +-hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec +- +-# Whether we need a single -rpath flag with a separated argument. +-hardcode_libdir_separator=$hardcode_libdir_separator +- +-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +-# resulting binary. +-hardcode_direct=$hardcode_direct +- +-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +-# resulting binary. +-hardcode_minus_L=$hardcode_minus_L +- +-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +-# the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var +- +-# Compile-time system search path for libraries +-sys_lib_search_path_spec=$sys_lib_search_path_spec +- +-# Run-time system search path for libraries +-sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec +- +-# Fix the shell variable \$srcfile for the compiler. +-fix_srcfile_path="$fix_srcfile_path" +- +-# Set to yes if exported symbols are required. +-always_export_symbols=$always_export_symbols +- +-# The commands to list exported symbols. +-export_symbols_cmds=$export_symbols_cmds +- +-# Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$exclude_expsyms +- +-# Symbols that must always be exported. +-include_expsyms=$include_expsyms +- +-EOF +- +-case "$ltmain" in +-*.sh) +- echo '### END LIBTOOL CONFIG' >> "$ofile" +- echo >> "$ofile" +- case "$host_os" in +- aix3*) +- cat <<\EOF >> "$ofile" +- +-# AIX sometimes has problems with the GCC collect2 program. For some +-# reason, if we set the COLLECT_NAMES environment variable, the problems +-# vanish in a puff of smoke. +-if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +-fi +-EOF +- ;; +- esac +- +- # Append the ltmain.sh script. +- sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) +- # We use sed instead of cat because bash on DJGPP gets confused if +- # if finds mixed CR/LF and LF-only lines. Since sed operates in +- # text mode, it properly converts lines to CR/LF. This bash problem +- # is reportedly fixed, but why not run on old versions too? +- +- chmod +x "$ofile" +- ;; +- +-*) +- # Compile the libtool program. +- echo "FIXME: would compile $ltmain" +- ;; +-esac +- +-test -n "$cache_file" || exit 0 +- +-# AC_CACHE_SAVE +-trap '' 1 2 15 +-cat > confcache <<\EOF +-# This file is a shell script that caches the results of configure +-# tests run on this system so they can be shared between configure +-# scripts and configure runs. It is not useful on other systems. +-# If it contains results you don't want to keep, you may remove or edit it. +-# +-# By default, configure uses ./config.cache as the cache file, +-# creating it if it does not exist already. You can give configure +-# the --cache-file=FILE option to use a different cache file; that is +-# what configure does when it calls configure scripts in +-# subdirectories, so they share the cache. +-# Giving --cache-file=/dev/null disables caching, for debugging configure. +-# config.status only pays attention to the cache file if you give it the +-# --recheck option to rerun configure. +-# +-EOF +-# The following way of writing the cache mishandles newlines in values, +-# but we know of no workaround that is simple, portable, and efficient. +-# So, don't put newlines in cache variables' values. +-# Ultrix sh set writes to stderr and can't be redirected directly, +-# and sets the high bit in the cache file unless we assign to the vars. +-(set) 2>&1 | +- case `(ac_space=' '; set | grep ac_space) 2>&1` in +- *ac_space=\ *) +- # `set' does not quote correctly, so add quotes (double-quote substitution +- # turns \\\\ into \\, and sed turns \\ into \). +- sed -n \ +- -e "s/'/'\\\\''/g" \ +- -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" +- ;; +- *) +- # `set' quotes correctly as required by POSIX, so do not add quotes. +- sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' +- ;; +- esac >> confcache +-if cmp -s $cache_file confcache; then +- : +-else +- if test -w $cache_file; then +- echo "updating cache $cache_file" +- cat confcache > $cache_file +- else +- echo "not updating unwritable cache $cache_file" +- fi +-fi +-rm -f confcache +- +-exit 0 +- +-# Local Variables: +-# mode:shell-script +-# sh-indentation:2 +-# End: +diff -Naur libodbc++-0.2.3/ltmain.sh libodbc++-0.2.3-20050404/ltmain.sh +--- libodbc++-0.2.3/ltmain.sh 2003-06-17 12:20:46.000000000 +0200 ++++ libodbc++-0.2.3-20050404/ltmain.sh 2005-04-04 18:10:50.000000000 +0200 +@@ -1,7 +1,7 @@ + # ltmain.sh - Provide generalized library-building support services. + # NOTE: Changing this file will not affect anything until you rerun configure. + # +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 + # Free Software Foundation, Inc. + # Originally by Gordon Matzigkeit , 1996 + # +@@ -24,6 +24,37 @@ + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + ++basename="s,^.*/,,g" ++ ++# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh ++# is ksh but when the shell is invoked as "sh" and the current value of ++# the _XPG environment variable is not equal to 1 (one), the special ++# positional parameter $0, within a function call, is the name of the ++# function. ++progpath="$0" ++ ++# define SED for historic ltconfig's generated by Libtool 1.3 ++test -z "$SED" && SED=sed ++ ++# The name of this program: ++progname=`echo "$progpath" | $SED $basename` ++modename="$progname" ++ ++# Global variables: ++EXIT_SUCCESS=0 ++EXIT_FAILURE=1 ++ ++PROGRAM=ltmain.sh ++PACKAGE=libtool ++VERSION=1.5.10 ++TIMESTAMP=" (1.1220.2.131 2004/09/19 12:46:56)" ++ ++# See if we are running on zsh, and set the options which allow our ++# commands through without removal of \ escapes. ++if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++fi ++ + # Check that we have a working $echo. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. +@@ -36,7 +67,7 @@ + : + else + # Restart under the correct shell, and then maybe $echo will work. +- exec $SHELL "$0" --no-reexec ${1+"$@"} ++ exec $SHELL "$progpath" --no-reexec ${1+"$@"} + fi + + if test "X$1" = X--fallback-echo; then +@@ -45,19 +76,9 @@ + cat <&2 +- echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 +- exit 1 ++ $echo "$modename: not configured to build any kind of library" 1>&2 ++ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 ++ exit $EXIT_FAILURE + fi + + # Global variables. +@@ -105,8 +136,271 @@ + lo2o="s/\\.lo\$/.${objext}/" + o2lo="s/\\.${objext}\$/.lo/" + ++if test -z "$max_cmd_len"; then ++ i=0 ++ testring="ABCD" ++ new_result= ++ ++ # If test is not a shell built-in, we'll probably end up computing a ++ # maximum length that is only half of the actual maximum length, but ++ # we can't tell. ++ while (test "X"`$SHELL $0 --fallback-echo "X$testring" 2>/dev/null` \ ++ = "XX$testring") >/dev/null 2>&1 && ++ new_result=`expr "X$testring" : ".*" 2>&1` && ++ max_cmd_len="$new_result" && ++ test "$i" != 17 # 1/2 MB should be enough ++ do ++ i=`expr $i + 1` ++ testring="$testring$testring" ++ done ++ testring= ++ # Add a significant safety factor because C++ compilers can tack on massive ++ # amounts of additional arguments before passing them to the linker. ++ # It appears as though 1/2 is a usable value. ++ max_cmd_len=`expr $max_cmd_len \/ 2` ++fi ++ ++##################################### ++# Shell function definitions: ++# This seems to be the best place for them ++ ++# func_win32_libid arg ++# return the library type of file 'arg' ++# ++# Need a lot of goo to handle *both* DLLs and import libs ++# Has to be a shell function in order to 'eat' the argument ++# that is supplied when $file_magic_command is called. ++func_win32_libid () { ++ win32_libid_type="unknown" ++ win32_fileres=`file -L $1 2>/dev/null` ++ case $win32_fileres in ++ *ar\ archive\ import\ library*) # definitely import ++ win32_libid_type="x86 archive import" ++ ;; ++ *ar\ archive*) # could be an import, or static ++ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ ++ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then ++ win32_nmres=`eval $NM -f posix -A $1 | \ ++ sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` ++ if test "X$win32_nmres" = "Ximport" ; then ++ win32_libid_type="x86 archive import" ++ else ++ win32_libid_type="x86 archive static" ++ fi ++ fi ++ ;; ++ *DLL*) ++ win32_libid_type="x86 DLL" ++ ;; ++ *executable*) # but shell scripts are "executable" too... ++ case $win32_fileres in ++ *MS\ Windows\ PE\ Intel*) ++ win32_libid_type="x86 DLL" ++ ;; ++ esac ++ ;; ++ esac ++ $echo $win32_libid_type ++} ++ ++ ++# func_infer_tag arg ++# Infer tagged configuration to use if any are available and ++# if one wasn't chosen via the "--tag" command line option. ++# Only attempt this if the compiler in the base compile ++# command doesn't match the default compiler. ++# arg is usually of the form 'gcc ...' ++func_infer_tag () { ++ if test -n "$available_tags" && test -z "$tagname"; then ++ CC_quoted= ++ for arg in $CC; do ++ case $arg in ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") ++ arg="\"$arg\"" ++ ;; ++ esac ++ CC_quoted="$CC_quoted $arg" ++ done ++ case $@ in ++ # Blanks in the command may have been stripped by the calling shell, ++ # but not from the CC environment variable when configure was run. ++ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; ++ # Blanks at the start of $base_compile will cause this to fail ++ # if we don't check for them as well. ++ *) ++ for z in $available_tags; do ++ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then ++ # Evaluate the configuration. ++ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" ++ CC_quoted= ++ for arg in $CC; do ++ # Double-quote args containing other shell metacharacters. ++ case $arg in ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") ++ arg="\"$arg\"" ++ ;; ++ esac ++ CC_quoted="$CC_quoted $arg" ++ done ++ # user sometimes does CC=-gcc so we need to match that to 'gcc' ++ trimedcc=`echo ${CC} | $SED -e "s/${host}-//g"` ++ # and sometimes libtool has CC=-gcc but user does CC=gcc ++ extendcc=${host}-${CC} ++ case "$@ " in ++ "cc "* | " cc "* | "${host}-cc "* | " ${host}-cc "*|\ ++ "gcc "* | " gcc "* | "${host}-gcc "* | " ${host}-gcc "*) ++ tagname=CC ++ break ;; ++ "$trimedcc "* | " $trimedcc "* | "`$echo $trimedcc` "* | " `$echo $trimedcc` "*|\ ++ "$extendcc "* | " $extendcc "* | "`$echo $extendcc` "* | " `$echo $extendcc` "*|\ ++ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ++ # The compiler in the base compile command matches ++ # the one in the tagged configuration. ++ # Assume this is the tagged configuration we want. ++ tagname=$z ++ break ++ ;; ++ esac ++ fi ++ done ++ # If $tagname still isn't set, then no tagged configuration ++ # was found and let the user know that the "--tag" command ++ # line option must be used. ++ if test -z "$tagname"; then ++ $echo "$modename: unable to infer tagged configuration" ++ $echo "$modename: specify a tag with \`--tag'" 1>&2 ++ exit $EXIT_FAILURE ++# else ++# $echo "$modename: using $tagname tagged configuration" ++ fi ++ ;; ++ esac ++ fi ++} ++ ++ ++# func_extract_archives gentop oldlib ... ++func_extract_archives () { ++ my_gentop="$1"; shift ++ my_oldlibs=${1+"$@"} ++ my_oldobjs="" ++ my_xlib="" ++ my_xabs="" ++ my_xdir="" ++ my_status="" ++ ++ $show "${rm}r $my_gentop" ++ $run ${rm}r "$my_gentop" ++ $show "$mkdir $my_gentop" ++ $run $mkdir "$my_gentop" ++ my_status=$? ++ if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then ++ exit $my_status ++ fi ++ ++ for my_xlib in $my_oldlibs; do ++ # Extract the objects. ++ case $my_xlib in ++ [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; ++ *) my_xabs=`pwd`"/$my_xlib" ;; ++ esac ++ my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` ++ my_xdir="$my_gentop/$my_xlib" ++ ++ $show "${rm}r $my_xdir" ++ $run ${rm}r "$my_xdir" ++ $show "$mkdir $my_xdir" ++ $run $mkdir "$my_xdir" ++ status=$? ++ if test "$status" -ne 0 && test ! -d "$my_xdir"; then ++ exit $status ++ fi ++ case $host in ++ *-darwin*) ++ $show "Extracting $my_xabs" ++ # Do not bother doing anything if just a dry run ++ if test -z "$run"; then ++ darwin_orig_dir=`pwd` ++ cd $my_xdir || exit $? ++ darwin_archive=$my_xabs ++ darwin_curdir=`pwd` ++ darwin_base_archive=`basename $darwin_archive` ++ darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` ++ if test -n "$darwin_arches"; then ++ darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` ++ darwin_arch= ++ $show "$darwin_base_archive has multiple architectures $darwin_arches" ++ for darwin_arch in $darwin_arches ; do ++ mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" ++ lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" ++ # Remove the table of contents from the thin files. ++ $AR -d "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" __.SYMDEF 2>/dev/null || true ++ $AR -d "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" __.SYMDEF\ SORTED 2>/dev/null || true ++ cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" ++ $AR -xo "${darwin_base_archive}" ++ rm "${darwin_base_archive}" ++ cd "$darwin_curdir" ++ done # $darwin_arches ++ ## Okay now we have a bunch of thin objects, gotta fatten them up :) ++ darwin_filelist=`find unfat-$$ -type f | xargs basename | sort -u | $NL2SP` ++ darwin_file= ++ darwin_files= ++ for darwin_file in $darwin_filelist; do ++ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` ++ lipo -create -output "$darwin_file" $darwin_files ++ done # $darwin_filelist ++ rm -rf unfat-$$ ++ cd "$darwin_orig_dir" ++ else ++ cd $darwin_orig_dir ++ (cd $my_xdir && $AR x $my_xabs) || exit $? ++ fi # $darwin_arches ++ fi # $run ++ ;; ++ *) ++ # We will extract separately just the conflicting names and we will ++ # no longer touch any unique names. It is faster to leave these ++ # extract automatically by $AR in one run. ++ $show "(cd $my_xdir && $AR x $my_xabs)" ++ $run eval "(cd \$my_xdir && $AR x \$my_xabs)" || exit $? ++ if ($AR t "$my_xabs" | sort | sort -uc >/dev/null 2>&1); then ++ : ++ else ++ $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 ++ $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 ++ $AR t "$my_xabs" | sort | uniq -cd | while read -r count name ++ do ++ i=1 ++ while test "$i" -le "$count" ++ do ++ # Put our $i before any first dot (extension) ++ # Never overwrite any file ++ name_to="$name" ++ while test "X$name_to" = "X$name" || test -f "$my_xdir/$name_to" ++ do ++ name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` ++ done ++ $show "(cd $my_xdir && $AR xN $i $my_xabs '$name' && $mv '$name' '$name_to')" ++ $run eval "(cd \$my_xdir && $AR xN $i \$my_xabs '$name' && $mv '$name' '$name_to')" || exit $? ++ i=`expr $i + 1` ++ done ++ done ++ fi ++ ;; ++ esac ++ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` ++ done ++ ++ func_extract_archives_result="$my_oldobjs" ++} ++# End of Shell function definitions ++##################################### ++ ++# Darwin sucks ++eval std_shrext=\"$shrext_cmds\" ++ + # Parse our command line options once, thoroughly. +-while test $# -gt 0 ++while test "$#" -gt 0 + do + arg="$1" + shift +@@ -122,6 +416,34 @@ + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; ++ tag) ++ tagname="$arg" ++ preserve_args="${preserve_args}=$arg" ++ ++ # Check whether tagname contains only valid characters ++ case $tagname in ++ *[!-_A-Za-z0-9,/]*) ++ $echo "$progname: invalid tag name: $tagname" 1>&2 ++ exit $EXIT_FAILURE ++ ;; ++ esac ++ ++ case $tagname in ++ CC) ++ # Don't test for the "default" C tag, as we know, it's there, but ++ # not specially marked. ++ ;; ++ *) ++ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then ++ taglist="$taglist $tagname" ++ # Evaluate the configuration. ++ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" ++ else ++ $echo "$progname: ignoring unknown tag $tagname" 1>&2 ++ fi ++ ;; ++ esac ++ ;; + *) + eval "$prev=\$arg" + ;; +@@ -139,18 +461,27 @@ + ;; + + --version) +- echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" +- exit 0 ++ $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" ++ $echo ++ $echo "Copyright (C) 2003 Free Software Foundation, Inc." ++ $echo "This is free software; see the source for copying conditions. There is NO" ++ $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ++ exit $EXIT_SUCCESS + ;; + + --config) +- sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 +- exit 0 ++ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath ++ # Now print the configurations for the tags. ++ for tagname in $taglist; do ++ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" ++ done ++ exit $EXIT_SUCCESS + ;; + + --debug) +- echo "$progname: enabling shell trace mode" ++ $echo "$progname: enabling shell trace mode" + set -x ++ preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) +@@ -158,18 +489,18 @@ + ;; + + --features) +- echo "host: $host" ++ $echo "host: $host" + if test "$build_libtool_libs" = yes; then +- echo "enable shared libraries" ++ $echo "enable shared libraries" + else +- echo "disable shared libraries" ++ $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then +- echo "enable static libraries" ++ $echo "enable static libraries" + else +- echo "disable static libraries" ++ $echo "disable static libraries" + fi +- exit 0 ++ exit $EXIT_SUCCESS + ;; + + --finish) mode="finish" ;; +@@ -181,6 +512,15 @@ + + --quiet | --silent) + show=: ++ preserve_args="$preserve_args $arg" ++ ;; ++ ++ --tag) prevopt="--tag" prev=tag ;; ++ --tag=*) ++ set tag "$optarg" ${1+"$@"} ++ shift ++ prev=tag ++ preserve_args="$preserve_args --tag" + ;; + + -dlopen) +@@ -191,7 +531,7 @@ + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + + *) +@@ -204,7 +544,7 @@ + if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # If this variable is set in any of the actions, the command in it +@@ -216,8 +556,10 @@ + + # Infer the operation mode. + if test -z "$mode"; then ++ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 ++ $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 + case $nonopt in +- *cc | *++ | gcc* | *-gcc*) ++ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do +@@ -258,7 +600,7 @@ + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. +@@ -272,158 +614,124 @@ + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= +- prev= +- lastarg= +- srcfile="$nonopt" ++ srcfile="$nonopt" # always keep a non-empty value in "srcfile" ++ suppress_opt=yes + suppress_output= ++ arg_mode=normal ++ libobj= ++ later= + +- user_target=no + for arg + do +- case $prev in +- "") ;; +- xcompiler) +- # Aesthetically quote the previous argument. +- prev= +- lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` +- +- case $arg in +- # Double-quote args containing other shell metacharacters. +- # Many Bourne shells cannot handle close brackets correctly +- # in scan sets, so we specify it separately. +- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") +- arg="\"$arg\"" +- ;; +- esac +- +- # Add the previous argument to base_compile. +- if test -z "$base_compile"; then +- base_compile="$lastarg" +- else +- base_compile="$base_compile $lastarg" +- fi +- continue ++ case "$arg_mode" in ++ arg ) ++ # do not "continue". Instead, add this to base_compile ++ lastarg="$arg" ++ arg_mode=normal + ;; +- esac + +- # Accept any command-line options. +- case $arg in +- -o) +- if test "$user_target" != "no"; then +- $echo "$modename: you cannot specify \`-o' more than once" 1>&2 +- exit 1 +- fi +- user_target=next +- ;; +- +- -static) +- build_old_libs=yes ++ target ) ++ libobj="$arg" ++ arg_mode=normal + continue + ;; + +- -prefer-pic) +- pic_mode=yes +- continue +- ;; ++ normal ) ++ # Accept any command-line options. ++ case $arg in ++ -o) ++ if test -n "$libobj" ; then ++ $echo "$modename: you cannot specify \`-o' more than once" 1>&2 ++ exit $EXIT_FAILURE ++ fi ++ arg_mode=target ++ continue ++ ;; + +- -prefer-non-pic) +- pic_mode=no +- continue +- ;; ++ -static | -prefer-pic | -prefer-non-pic) ++ later="$later $arg" ++ continue ++ ;; + +- -Xcompiler) +- prev=xcompiler +- continue +- ;; ++ -no-suppress) ++ suppress_opt=no ++ continue ++ ;; + +- -Wc,*) +- args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` +- lastarg= +- save_ifs="$IFS"; IFS=',' +- for arg in $args; do +- IFS="$save_ifs" ++ -Xcompiler) ++ arg_mode=arg # the next one goes into the "base_compile" arg list ++ continue # The current "srcfile" will either be retained or ++ ;; # replaced later. I would guess that would be a bug. ++ ++ -Wc,*) ++ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` ++ lastarg= ++ save_ifs="$IFS"; IFS=',' ++ for arg in $args; do ++ IFS="$save_ifs" + +- # Double-quote args containing other shell metacharacters. +- # Many Bourne shells cannot handle close brackets correctly +- # in scan sets, so we specify it separately. +- case $arg in +- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") +- arg="\"$arg\"" +- ;; +- esac +- lastarg="$lastarg $arg" +- done +- IFS="$save_ifs" +- lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` ++ # Double-quote args containing other shell metacharacters. ++ # Many Bourne shells cannot handle close brackets correctly ++ # in scan sets, so we specify it separately. ++ case $arg in ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") ++ arg="\"$arg\"" ++ ;; ++ esac ++ lastarg="$lastarg $arg" ++ done ++ IFS="$save_ifs" ++ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + +- # Add the arguments to base_compile. +- if test -z "$base_compile"; then +- base_compile="$lastarg" +- else ++ # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" +- fi +- continue +- ;; +- esac ++ continue ++ ;; + +- case $user_target in +- next) +- # The next one is the -o target name +- user_target=yes +- continue +- ;; +- yes) +- # We got the output file +- user_target=set +- libobj="$arg" +- continue ++ * ) ++ # Accept the current argument as the source file. ++ # The previous "srcfile" becomes the current argument. ++ # ++ lastarg="$srcfile" ++ srcfile="$arg" ++ ;; ++ esac # case $arg + ;; +- esac +- +- # Accept the current argument as the source file. +- lastarg="$srcfile" +- srcfile="$arg" ++ esac # case $arg_mode + + # Aesthetically quote the previous argument. +- +- # Backslashify any backslashes, double quotes, and dollar signs. +- # These are the only characters that are still specially +- # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + ++ case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. +- case $lastarg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + +- # Add the previous argument to base_compile. +- if test -z "$base_compile"; then +- base_compile="$lastarg" +- else +- base_compile="$base_compile $lastarg" +- fi +- done ++ base_compile="$base_compile $lastarg" ++ done # for arg + +- case $user_target in +- set) ++ case $arg_mode in ++ arg) ++ $echo "$modename: you must specify an argument for -Xcompile" ++ exit $EXIT_FAILURE + ;; +- no) +- # Get the name of the library object. +- libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ++ target) ++ $echo "$modename: you must specify a target with \`-o'" 1>&2 ++ exit $EXIT_FAILURE + ;; + *) +- $echo "$modename: you must specify a target with \`-o'" 1>&2 +- exit 1 ++ # Get the name of the library object. ++ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo +- xform='[cCFSfmso]' ++ xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; +@@ -431,10 +739,13 @@ + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; ++ *.ii) xform=ii ;; ++ *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; ++ *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` +@@ -443,25 +754,55 @@ + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + ++ func_infer_tag $base_compile ++ ++ for arg in $later; do ++ case $arg in ++ -static) ++ build_old_libs=yes ++ continue ++ ;; ++ ++ -prefer-pic) ++ pic_mode=yes ++ continue ++ ;; ++ ++ -prefer-non-pic) ++ pic_mode=no ++ continue ++ ;; ++ esac ++ done ++ ++ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` ++ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` ++ if test "X$xdir" = "X$obj"; then ++ xdir= ++ else ++ xdir=$xdir/ ++ fi ++ lobj=${xdir}$objdir/$objname ++ + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then +- removelist="$obj $libobj" ++ removelist="$obj $lobj $libobj ${libobj}T" + else +- removelist="$libobj" ++ removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist +- trap "$run $rm $removelist; exit 1" 1 2 15 ++ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in +@@ -480,8 +821,9 @@ + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" +- trap "$run $rm $removelist; exit 1" 1 2 15 ++ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else ++ output_obj= + need_locks=no + lockfile= + fi +@@ -489,13 +831,13 @@ + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then +- until $run ln "$0" "$lockfile" 2>/dev/null; do ++ until $run ln "$srcfile" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then +- echo "\ ++ $echo "\ + *** ERROR, $lockfile exists and contains: + `cat $lockfile 2>/dev/null` + +@@ -507,68 +849,67 @@ + compiler." + + $run $rm $removelist +- exit 1 ++ exit $EXIT_FAILURE + fi +- echo $srcfile > "$lockfile" ++ $echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + ++ $run $rm "$libobj" "${libobj}T" ++ ++ # Create a libtool object file (analogous to a ".la" file), ++ # but don't create it if we're doing a dry run. ++ test -z "$run" && cat > ${libobj}T </dev/null`" != x"$srcfile"; then +- echo "\ ++ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then ++ $echo "\ + *** ERROR, $lockfile contains: + `cat $lockfile 2>/dev/null` + +@@ -583,13 +924,13 @@ + compiler." + + $run $rm $removelist +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one +- if test x"$output_obj" != x"$libobj"; then +- $show "$mv $output_obj $libobj" +- if $run $mv $output_obj $libobj; then : ++ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then ++ $show "$mv $output_obj $lobj" ++ if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist +@@ -597,48 +938,23 @@ + fi + fi + +- # If we have no pic_flag, then copy the object into place and finish. +- if (test -z "$pic_flag" || test "$pic_mode" != default) && +- test "$build_old_libs" = yes; then +- # Rename the .lo from within objdir to obj +- if test -f $obj; then +- $show $rm $obj +- $run $rm $obj +- fi ++ # Append the name of the PIC object to the libtool object file. ++ test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != x"$srcfile"; then +- echo "\ ++ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then ++ $echo "\ + *** ERROR, $lockfile contains: + `cat $lockfile 2>/dev/null` + +@@ -682,11 +996,11 @@ + compiler." + + $run $rm $removelist +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Just move the object if needed +- if test x"$output_obj" != x"$obj"; then ++ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else +@@ -696,29 +1010,31 @@ + fi + fi + +- # Create an invalid libtool object if no PIC, so that we do not +- # accidentally link it into a program. +- if test "$build_libtool_libs" != yes; then +- $show "echo timestamp > $libobj" +- $run eval "echo timestamp > \$libobj" || exit $? +- else +- # Move the .lo from within objdir +- $show "$mv $libobj $lo_libobj" +- if $run $mv $libobj $lo_libobj; then : +- else +- error=$? +- $run $rm $removelist +- exit $error +- fi +- fi ++ # Append the name of the non-PIC object the libtool object file. ++ # Only append if the libtool object file exists. ++ test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null 2>&1; then ++ pic_object= ++ non_pic_object= ++ ++ # Read the .lo file ++ # If there is no directory component, then add one. ++ case $arg in ++ */* | *\\*) . $arg ;; ++ *) . ./$arg ;; ++ esac ++ ++ if test -z "$pic_object" || \ ++ test -z "$non_pic_object" || ++ test "$pic_object" = none && \ ++ test "$non_pic_object" = none; then ++ $echo "$modename: cannot find name of object for \`$arg'" 1>&2 ++ exit $EXIT_FAILURE ++ fi ++ ++ # Extract subdirectory from the argument. ++ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` ++ if test "X$xdir" = "X$arg"; then ++ xdir= ++ else ++ xdir="$xdir/" ++ fi ++ ++ if test "$pic_object" != none; then ++ # Prepend the subdirectory the object is found in. ++ pic_object="$xdir$pic_object" ++ ++ if test "$prev" = dlfiles; then ++ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then ++ dlfiles="$dlfiles $pic_object" ++ prev= ++ continue ++ else ++ # If libtool objects are unsupported, then we need to preload. ++ prev=dlprefiles ++ fi ++ fi ++ ++ # CHECK ME: I think I busted this. -Ossama ++ if test "$prev" = dlprefiles; then ++ # Preload the old-style object. ++ dlprefiles="$dlprefiles $pic_object" ++ prev= ++ fi ++ ++ # A PIC object. ++ libobjs="$libobjs $pic_object" ++ arg="$pic_object" ++ fi ++ ++ # Non-PIC object. ++ if test "$non_pic_object" != none; then ++ # Prepend the subdirectory the object is found in. ++ non_pic_object="$xdir$non_pic_object" ++ ++ # A standard non-PIC object ++ non_pic_objects="$non_pic_objects $non_pic_object" ++ if test -z "$pic_object" || test "$pic_object" = none ; then ++ arg="$non_pic_object" ++ fi ++ fi ++ else ++ # Only an error if not doing a dry-run. ++ if test -z "$run"; then ++ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 ++ exit $EXIT_FAILURE ++ else ++ # Dry-run case. ++ ++ # Extract subdirectory from the argument. ++ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` ++ if test "X$xdir" = "X$arg"; then ++ xdir= ++ else ++ xdir="$xdir/" ++ fi ++ ++ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` ++ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` ++ libobjs="$libobjs $pic_object" ++ non_pic_objects="$non_pic_objects $non_pic_object" ++ fi ++ fi ++ done ++ else ++ $echo "$modename: link input file \`$save_arg' does not exist" ++ exit $EXIT_FAILURE ++ fi ++ arg=$save_arg ++ prev= ++ continue ++ ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then +@@ -938,13 +1372,26 @@ + finalize_command="$finalize_command $wl$qarg" + continue + ;; ++ xcclinker) ++ linker_flags="$linker_flags $qarg" ++ compiler_flags="$compiler_flags $qarg" ++ prev= ++ compile_command="$compile_command $qarg" ++ finalize_command="$finalize_command $qarg" ++ continue ++ ;; ++ shrext) ++ shrext_cmds="$arg" ++ prev= ++ continue ++ ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac +- fi # test -n $prev ++ fi # test -n "$prev" + + prevarg="$arg" + +@@ -986,7 +1433,7 @@ + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" +- exit 1 ++ exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms +@@ -1005,7 +1452,7 @@ + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in +- no/*-*-irix*) ++ no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; +@@ -1022,7 +1469,7 @@ + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + dir="$absdir" + ;; +@@ -1056,28 +1503,65 @@ + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; +- *-*-openbsd*) ++ *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; +- esac +- elif test "X$arg" = "X-lc_r"; then +- case $host in +- *-*-openbsd*) +- # Do not include libc_r directly, use -pthread flag. ++ *-*-rhapsody* | *-*-darwin1.[012]) ++ # Rhapsody C and math libraries are in the System framework ++ deplibs="$deplibs -framework System" + continue +- ;; + esac ++ elif test "X$arg" = "X-lc_r"; then ++ case $host in ++ *-*-openbsd* | *-*-freebsd*) ++ # Do not include libc_r directly, use -pthread flag. ++ continue ++ ;; ++ esac + fi + deplibs="$deplibs $arg" + continue + ;; + ++ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) ++ deplibs="$deplibs $arg" ++ continue ++ ;; ++ + -module) + module=yes + continue + ;; + ++ # gcc -m* arguments should be passed to the linker via $compiler_flags ++ # in order to pass architecture information to the linker ++ # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo ++ # but this is not reliable with gcc because gcc may use -mfoo to ++ # select a different linker, different libraries, etc, while ++ # -Wl,-mfoo simply passes -mfoo to the linker. ++ -m*) ++ # Unknown arguments in both finalize_command and compile_command need ++ # to be aesthetically quoted because they are evaled later. ++ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` ++ case $arg in ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") ++ arg="\"$arg\"" ++ ;; ++ esac ++ compile_command="$compile_command $arg" ++ finalize_command="$finalize_command $arg" ++ if test "$with_gcc" = "yes" ; then ++ compiler_flags="$compiler_flags $arg" ++ fi ++ continue ++ ;; ++ ++ -shrext) ++ prev=shrext ++ continue ++ ;; ++ + -no-fast-install) + fast_install=no + continue +@@ -1102,8 +1586,18 @@ + continue + ;; + ++ -objectlist) ++ prev=objectlist ++ continue ++ ;; ++ + -o) prev=output ;; + ++ -precious-files-regex) ++ prev=precious_regex ++ continue ++ ;; ++ + -release) + prev=release + continue +@@ -1126,7 +1620,7 @@ + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in +@@ -1154,6 +1648,11 @@ + prev=vinfo + continue + ;; ++ -version-number) ++ prev=vinfo ++ vinfo_number=yes ++ continue ++ ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` +@@ -1202,6 +1701,16 @@ + continue + ;; + ++ -XCClinker) ++ prev=xcclinker ++ continue ++ ;; ++ ++ -Kthread | -mthreads | -mt | -pthread | -pthreads | -threads | -qthreaded | -kthread ) ++ compiler_flags="$compiler_flags $arg" ++ continue ++ ;; ++ + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need +@@ -1214,29 +1723,101 @@ + esac + ;; + +- *.lo | *.$objext) +- # A library or standard object. +- if test "$prev" = dlfiles; then +- # This file was specified with -dlopen. +- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then +- dlfiles="$dlfiles $arg" +- prev= +- continue +- else +- # If libtool objects are unsupported, then we need to preload. +- prev=dlprefiles +- fi +- fi ++ *.$objext) ++ # A standard object. ++ objs="$objs $arg" ++ ;; + +- if test "$prev" = dlprefiles; then +- # Preload the old-style object. +- dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` +- prev= +- else ++ *.lo) ++ # A libtool-controlled object. ++ ++ # Check to see that this really is a libtool object. ++ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then ++ pic_object= ++ non_pic_object= ++ ++ # Read the .lo file ++ # If there is no directory component, then add one. + case $arg in +- *.lo) libobjs="$libobjs $arg" ;; +- *) objs="$objs $arg" ;; ++ */* | *\\*) . $arg ;; ++ *) . ./$arg ;; + esac ++ ++ if test -z "$pic_object" || \ ++ test -z "$non_pic_object" || ++ test "$pic_object" = none && \ ++ test "$non_pic_object" = none; then ++ $echo "$modename: cannot find name of object for \`$arg'" 1>&2 ++ exit $EXIT_FAILURE ++ fi ++ ++ # Extract subdirectory from the argument. ++ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` ++ if test "X$xdir" = "X$arg"; then ++ xdir= ++ else ++ xdir="$xdir/" ++ fi ++ ++ if test "$pic_object" != none; then ++ # Prepend the subdirectory the object is found in. ++ pic_object="$xdir$pic_object" ++ ++ if test "$prev" = dlfiles; then ++ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then ++ dlfiles="$dlfiles $pic_object" ++ prev= ++ continue ++ else ++ # If libtool objects are unsupported, then we need to preload. ++ prev=dlprefiles ++ fi ++ fi ++ ++ # CHECK ME: I think I busted this. -Ossama ++ if test "$prev" = dlprefiles; then ++ # Preload the old-style object. ++ dlprefiles="$dlprefiles $pic_object" ++ prev= ++ fi ++ ++ # A PIC object. ++ libobjs="$libobjs $pic_object" ++ arg="$pic_object" ++ fi ++ ++ # Non-PIC object. ++ if test "$non_pic_object" != none; then ++ # Prepend the subdirectory the object is found in. ++ non_pic_object="$xdir$non_pic_object" ++ ++ # A standard non-PIC object ++ non_pic_objects="$non_pic_objects $non_pic_object" ++ if test -z "$pic_object" || test "$pic_object" = none ; then ++ arg="$non_pic_object" ++ fi ++ fi ++ else ++ # Only an error if not doing a dry-run. ++ if test -z "$run"; then ++ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 ++ exit $EXIT_FAILURE ++ else ++ # Dry-run case. ++ ++ # Extract subdirectory from the argument. ++ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` ++ if test "X$xdir" = "X$arg"; then ++ xdir= ++ else ++ xdir="$xdir/" ++ fi ++ ++ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` ++ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` ++ libobjs="$libobjs $pic_object" ++ non_pic_objects="$non_pic_objects $non_pic_object" ++ fi + fi + ;; + +@@ -1287,7 +1868,7 @@ + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then +@@ -1296,6 +1877,7 @@ + finalize_command="$finalize_command $arg" + fi + ++ oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" +@@ -1330,7 +1912,7 @@ + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; +@@ -1338,7 +1920,17 @@ + *) linkmode=prog ;; # Anything else should be a program. + esac + ++ case $host in ++ *cygwin* | *mingw* | *pw32*) ++ # don't eliminate duplications in $postdeps and $predeps ++ duplicate_compiler_generated_deps=yes ++ ;; ++ *) ++ duplicate_compiler_generated_deps=$duplicate_deps ++ ;; ++ esac + specialdeplibs= ++ + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) +@@ -1358,7 +1950,7 @@ + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= +- if test "X$duplicate_deps" = "Xyes" ; then ++ if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; +@@ -1383,7 +1975,7 @@ + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + done +@@ -1400,25 +1992,39 @@ + ;; + esac + for pass in $passes; do ++ if test "$linkmode,$pass" = "lib,link" || ++ test "$linkmode,$pass" = "prog,scan"; then ++ libs="$deplibs" ++ deplibs= ++ fi + if test "$linkmode" = prog; then +- # Determine which files to process + case $pass in +- dlopen) +- libs="$dlfiles" +- save_deplibs="$deplibs" # Collect dlpreopened libraries +- deplibs= +- ;; ++ dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi ++ if test "$pass" = dlopen; then ++ # Collect dlpreopened libraries ++ save_deplibs="$deplibs" ++ deplibs= ++ fi + for deplib in $libs; do + lib= + found=no + case $deplib in ++ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) ++ if test "$linkmode,$pass" = "prog,link"; then ++ compile_deplibs="$deplib $compile_deplibs" ++ finalize_deplibs="$deplib $finalize_deplibs" ++ else ++ deplibs="$deplib $deplibs" ++ fi ++ continue ++ ;; + -l*) +- if test "$linkmode" = oldlib && test "$linkmode" = obj; then +- $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 ++ if test "$linkmode" != lib && test "$linkmode" != prog; then ++ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + if test "$pass" = conv; then +@@ -1427,12 +2033,18 @@ + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do +- # Search the libtool library +- lib="$searchdir/lib${name}.la" +- if test -f "$lib"; then +- found=yes +- break +- fi ++ for search_ext in .la $std_shrext .so .a; do ++ # Search the libtool library ++ lib="$searchdir/lib${name}${search_ext}" ++ if test -f "$lib"; then ++ if test "$search_ext" = ".la"; then ++ found=yes ++ else ++ found=no ++ fi ++ break 2 ++ fi ++ done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library +@@ -1444,6 +2056,42 @@ + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue ++ else # deplib is a libtool library ++ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, ++ # We need to do some special things here, and not later. ++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then ++ case " $predeps $postdeps " in ++ *" $deplib "*) ++ if (${SED} -e '2q' $lib | ++ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then ++ library_names= ++ old_library= ++ case $lib in ++ */* | *\\*) . $lib ;; ++ *) . ./$lib ;; ++ esac ++ for l in $old_library $library_names; do ++ ll="$l" ++ done ++ if test "X$ll" = "X$old_library" ; then # only static version available ++ found=no ++ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` ++ test "X$ladir" = "X$lib" && ladir="." ++ lib=$ladir/$old_library ++ if test "$linkmode,$pass" = "prog,link"; then ++ compile_deplibs="$deplib $compile_deplibs" ++ finalize_deplibs="$deplib $finalize_deplibs" ++ else ++ deplibs="$deplib $deplibs" ++ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" ++ fi ++ continue ++ fi ++ fi ++ ;; ++ *) ;; ++ esac ++ fi + fi + ;; # -l + -L*) +@@ -1461,14 +2109,14 @@ + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" +- newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi ++ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) +- $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2 ++ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue +@@ -1493,16 +2141,33 @@ + fi + case $linkmode in + lib) +- if test "$deplibs_check_method" != pass_all; then +- echo +- echo "*** Warning: This library needs some functionality provided by $deplib." +- echo "*** I have the capability to make that library automatically link in when" +- echo "*** you link to this library. But I can only do this if you have a" +- echo "*** shared version of the library, which you do not appear to have." ++ valid_a_lib=no ++ case $deplibs_check_method in ++ match_pattern*) ++ set dummy $deplibs_check_method ++ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` ++ if eval $echo \"$deplib\" 2>/dev/null \ ++ | $SED 10q \ ++ | $EGREP "$match_pattern_regex" > /dev/null; then ++ valid_a_lib=yes ++ fi ++ ;; ++ pass_all) ++ valid_a_lib=yes ++ ;; ++ esac ++ if test "$valid_a_lib" != yes; then ++ $echo ++ $echo "*** Warning: Trying to link with static lib archive $deplib." ++ $echo "*** I have the capability to make that library automatically link in when" ++ $echo "*** you link to this library. But I can only do this if you have a" ++ $echo "*** shared version of the library, which you do not appear to have" ++ $echo "*** because the file extensions .$libext of this argument makes me believe" ++ $echo "*** that it is just a static archive that I should not used here." + else +- echo +- echo "*** Warning: Linking the shared library $output against the" +- echo "*** static library $deplib is not portable!" ++ $echo ++ $echo "*** Warning: Linking the shared library $output against the" ++ $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue +@@ -1519,14 +2184,18 @@ + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) +- if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then +- # If there is no dlopen support or we're linking statically, +- # we need to preload. +- newdlprefiles="$newdlprefiles $deplib" +- compile_deplibs="$deplib $compile_deplibs" +- finalize_deplibs="$deplib $finalize_deplibs" +- else +- newdlfiles="$newdlfiles $deplib" ++ if test "$pass" = conv; then ++ deplibs="$deplib $deplibs" ++ elif test "$linkmode" = prog; then ++ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then ++ # If there is no dlopen support or we're linking statically, ++ # we need to preload. ++ newdlprefiles="$newdlprefiles $deplib" ++ compile_deplibs="$deplib $compile_deplibs" ++ finalize_deplibs="$deplib $finalize_deplibs" ++ else ++ newdlfiles="$newdlfiles $deplib" ++ fi + fi + continue + ;; +@@ -1538,14 +2207,14 @@ + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. +- if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : ++ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` +@@ -1558,8 +2227,9 @@ + library_names= + old_library= + # If the library was installed with an old release of libtool, +- # it will not redefine variable installed. ++ # it will not redefine variables installed, or shouldnotlink + installed=yes ++ shouldnotlink=no + + # Read the .la file + case $lib in +@@ -1569,8 +2239,7 @@ + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || +- { test "$linkmode" = oldlib && test "$linkmode" = obj; }; then +- # Add dl[pre]opened files of deplib ++ { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi +@@ -1581,7 +2250,7 @@ + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" +@@ -1598,11 +2267,12 @@ + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + ++ + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do +@@ -1610,19 +2280,23 @@ + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi +- if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then ++ if test -z "$dlname" || ++ test "$dlopen_support" != yes || ++ test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking +- # statically, we need to preload. +- dlprefiles="$dlprefiles $lib" ++ # statically, we need to preload. We also need to preload any ++ # dependent libraries so libltdl's deplib preloader doesn't ++ # bomb out in the load deplibs phase. ++ dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi +@@ -1655,10 +2329,17 @@ + absdir="$libdir" + fi + else +- dir="$ladir/$objdir" +- absdir="$abs_ladir/$objdir" +- # Remove this search path later +- notinst_path="$notinst_path $abs_ladir" ++ if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then ++ dir="$ladir" ++ absdir="$abs_ladir" ++ # Remove this search path later ++ notinst_path="$notinst_path $abs_ladir" ++ else ++ dir="$ladir/$objdir" ++ absdir="$abs_ladir/$objdir" ++ # Remove this search path later ++ notinst_path="$notinst_path $abs_ladir" ++ fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + +@@ -1666,7 +2347,7 @@ + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). +@@ -1688,11 +2369,12 @@ + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else +- deplibs="$lib $deplibs" ++ deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + ++ + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" +@@ -1726,13 +2408,19 @@ + continue + fi # $linkmode = prog... + +- link_static=no # Whether the deplib will be linked statically +- if test -n "$library_names" && +- { test "$prefer_static_libs" = no || test -z "$old_library"; }; then +- # Link against this shared library ++ if test "$linkmode,$pass" = "prog,link"; then ++ if test -n "$library_names" && ++ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then ++ # We need to hardcode the library path ++ if test -n "$shlibpath_var"; then ++ # Make sure the rpath contains only unique directories. ++ case "$temp_rpath " in ++ *" $dir "*) ;; ++ *" $absdir "*) ;; ++ *) temp_rpath="$temp_rpath $dir" ;; ++ esac ++ fi + +- if test "$linkmode,$pass" = "prog,link" || +- { test "$linkmode" = lib && test "$hardcode_into_libs" = yes; }; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. +@@ -1754,17 +2442,6 @@ + esac + ;; + esac +- if test "$linkmode" = prog; then +- # We need to hardcode the library path +- if test -n "$shlibpath_var"; then +- # Make sure the rpath contains only unique directories. +- case "$temp_rpath " in +- *" $dir "*) ;; +- *" $absdir "*) ;; +- *) temp_rpath="$temp_rpath $dir" ;; +- esac +- fi +- fi + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && +@@ -1774,11 +2451,52 @@ + # We only need to search for static libraries + continue + fi ++ fi + ++ link_static=no # Whether the deplib will be linked statically ++ if test -n "$library_names" && ++ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi ++ # This is a shared library ++ ++ # Warn about portability, can't link against -module's on ++ # some systems (darwin) ++ if test "$shouldnotlink" = yes && test "$pass" = link ; then ++ $echo ++ if test "$linkmode" = prog; then ++ $echo "*** Warning: Linking the executable $output against the loadable module" ++ else ++ $echo "*** Warning: Linking the shared library $output against the loadable module" ++ fi ++ $echo "*** $linklib is not portable!" ++ fi ++ if test "$linkmode" = lib && ++ test "$hardcode_into_libs" = yes; then ++ # Hardcode the library path. ++ # Skip directories that are in the system default run-time ++ # search path. ++ case " $sys_lib_dlsearch_path " in ++ *" $absdir "*) ;; ++ *) ++ case "$compile_rpath " in ++ *" $absdir "*) ;; ++ *) compile_rpath="$compile_rpath $absdir" ++ esac ++ ;; ++ esac ++ case " $sys_lib_dlsearch_path " in ++ *" $libdir "*) ;; ++ *) ++ case "$finalize_rpath " in ++ *" $libdir "*) ;; ++ *) finalize_rpath="$finalize_rpath $libdir" ++ esac ++ ;; ++ esac ++ fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname +@@ -1792,7 +2510,7 @@ + elif test -n "$soname_spec"; then + # bleh windows + case $host in +- *cygwin*) ++ *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; +@@ -1804,17 +2522,18 @@ + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" +- soname=`echo $soroot | sed -e 's/^.*\///'` +- newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a" ++ soname=`$echo $soroot | ${SED} -e 's/^.*\///'` ++ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' +- eval cmds=\"$extract_expsyms_cmds\" ++ cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done +@@ -1825,9 +2544,10 @@ + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' +- eval cmds=\"$old_archive_from_expsyms_cmds\" ++ cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done +@@ -1847,6 +2567,22 @@ + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" ++ case $host in ++ *-*-sco3.2v5* ) add_dir="-L$dir" ;; ++ *-*-darwin* ) ++ # if the lib is a module then we can not link against ++ # it, someone is ignoring the new warnings I added ++ if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then ++ $echo "** Warning, lib $linklib is a module, not a shared library" ++ if test -z "$old_library" ; then ++ $echo ++ $echo "** And there doesn't seem to be a static archive available" ++ $echo "** The link will probably fail, sorry" ++ else ++ add="$dir/$old_library" ++ fi ++ fi ++ esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; +@@ -1865,6 +2601,14 @@ + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" ++ # Try looking first in the location we're being installed to. ++ if test -n "$inst_prefix_dir"; then ++ case "$libdir" in ++ [\\/]*) ++ add_dir="$add_dir -L$inst_prefix_dir$libdir" ++ ;; ++ esac ++ fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" +@@ -1878,7 +2622,7 @@ + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" +- exit 1 ++ exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then +@@ -1912,16 +2656,7 @@ + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then +- # Try looking first in the location we're being installed to. +- add_dir= +- if test -n "$inst_prefix_dir"; then +- case "$libdir" in +- [\\/]*) +- add_dir="-L$inst_prefix_dir$libdir" +- ;; +- esac +- fi +- add_dir="$add_dir -L$libdir" ++ add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in +@@ -1929,18 +2664,24 @@ + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" ++ elif test "$hardcode_automatic" = yes; then ++ if test -n "$inst_prefix_dir" && ++ test -f "$inst_prefix_dir$libdir/$linklib" ; then ++ add="$inst_prefix_dir$libdir/$linklib" ++ else ++ add="$libdir/$linklib" ++ fi + else + # We cannot seem to hardcode it, guess we'll fake it. ++ add_dir="-L$libdir" + # Try looking first in the location we're being installed to. +- add_dir= + if test -n "$inst_prefix_dir"; then + case "$libdir" in +- [\\/]*) +- add_dir="-L$inst_prefix_dir$libdir" +- ;; ++ [\\/]*) ++ add_dir="$add_dir -L$inst_prefix_dir$libdir" ++ ;; + esac + fi +- add_dir="$add_dir -L$libdir" + add="-l$name" + fi + +@@ -1953,15 +2694,6 @@ + fi + fi + elif test "$linkmode" = prog; then +- if test "$alldeplibs" = yes && +- { test "$deplibs_check_method" = pass_all || +- { test "$build_libtool_libs" = yes && +- test -n "$library_names"; }; }; then +- # We only need to search for static libraries +- continue +- fi +- +- # Try to link the static library + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. +@@ -1981,20 +2713,21 @@ + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. +- echo +- echo "*** Warning: This library needs some functionality provided by $lib." +- echo "*** I have the capability to make that library automatically link in when" +- echo "*** you link to this library. But I can only do this if you have a" +- echo "*** shared version of the library, which you do not appear to have." ++ $echo ++ $echo "*** Warning: This system can not link to static lib archive $lib." ++ $echo "*** I have the capability to make that library automatically link in when" ++ $echo "*** you link to this library. But I can only do this if you have a" ++ $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then +- echo "*** Therefore, libtool will create a static module, that should work " +- echo "*** as long as the dlopening application is linked with the -dlopen flag." ++ $echo "*** But as you try to build a module library, libtool will still create " ++ $echo "*** a static module, that should work as long as the dlopening application" ++ $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then +- echo +- echo "*** However, this would only work if libtool was able to extract symbol" +- echo "*** lists from a program, using \`nm' or equivalent, but libtool could" +- echo "*** not find such a program. So, this module is probably useless." +- echo "*** \`nm' from GNU binutils and a full rebuild may help." ++ $echo ++ $echo "*** However, this would only work if libtool was able to extract symbol" ++ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" ++ $echo "*** not find such a program. So, this module is probably useless." ++ $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module +@@ -2013,7 +2746,8 @@ + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && +- { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || ++ { test "$hardcode_into_libs" != yes || ++ test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= +@@ -2065,22 +2799,67 @@ + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then +- path="-L$absdir/$objdir" ++ path="$absdir/$objdir" + else +- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` ++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi +- path="-L$absdir" ++ path="$absdir" + fi ++ depdepl= ++ case $host in ++ *-*-darwin*) ++ # we do not want to link against static libs, ++ # but need to link against shared ++ eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` ++ if test -n "$deplibrary_names" ; then ++ for tmp in $deplibrary_names ; do ++ depdepl=$tmp ++ done ++ if test -f "$path/$depdepl" ; then ++ depdepl="$path/$depdepl" ++ fi ++ # do not add paths which are already there ++ case " $newlib_search_path " in ++ *" $path "*) ;; ++ *) newlib_search_path="$newlib_search_path $path";; ++ esac ++ fi ++ path="" ++ ;; ++ *) ++ path="-L$path" ++ ;; ++ esac ++ ;; ++ -l*) ++ case $host in ++ *-*-darwin*) ++ # Again, we only want to link against shared libraries ++ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` ++ for tmp in $newlib_search_path ; do ++ if test -f "$tmp/lib$tmp_libs.dylib" ; then ++ eval depdepl="$tmp/lib$tmp_libs.dylib" ++ break ++ fi ++ done ++ path="" ++ ;; ++ *) continue ;; ++ esac + ;; + *) continue ;; + esac + case " $deplibs " in ++ *" $depdepl "*) ;; ++ *) deplibs="$depdepl $deplibs" ;; ++ esac ++ case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac +@@ -2088,6 +2867,7 @@ + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs ++ dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do +@@ -2095,7 +2875,6 @@ + done + fi + if test "$pass" != dlopen; then +- test "$pass" != scan && dependency_libs="$newdependency_libs" + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= +@@ -2118,9 +2897,30 @@ + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do ++ # FIXME: Pedantically, this is the right thing to do, so ++ # that some nasty dependency loop isn't accidentally ++ # broken: ++ #new_libs="$deplib $new_libs" ++ # Pragmatically, this seems to cause very few problems in ++ # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; ++ -R*) ;; + *) ++ # And here is the reason: when a library appears more ++ # than once as an explicit dependence of a library, or ++ # is implicitly linked in more than once by the ++ # compiler, it is considered special, and multiple ++ # occurrences thereof are not removed. Compare this ++ # with having the same library being listed as a ++ # dependency of multiple other libraries: in this case, ++ # we know (pedantically, we assume) the library does not ++ # need to be listed more than once, so we keep only the ++ # last copy. This is not always right, but it is rare ++ # enough that we require users that really mean to play ++ # such unportable linking tricks to link the library ++ # using -Wl,-lname, so that libtool does not consider it ++ # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) +@@ -2148,11 +2948,20 @@ + eval $var=\"$tmp_libs\" + done # for var + fi +- if test "$pass" = "conv" && +- { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then +- libs="$deplibs" # reset libs +- deplibs= +- fi ++ # Last step: remove runtime libs from dependency_libs ++ # (they stay in deplibs) ++ tmp_libs= ++ for i in $dependency_libs ; do ++ case " $predeps $postdeps $compiler_lib_search_path " in ++ *" $i "*) ++ i="" ++ ;; ++ esac ++ if test -n "$i" ; then ++ tmp_libs="$tmp_libs $i" ++ fi ++ done ++ dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" +@@ -2161,6 +2970,10 @@ + + case $linkmode in + oldlib) ++ if test -n "$deplibs"; then ++ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ++ fi ++ + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi +@@ -2174,7 +2987,7 @@ + fi + + if test -n "$vinfo"; then +- $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 ++ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then +@@ -2196,17 +3009,19 @@ + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` ++ eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` ++ eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` +@@ -2217,11 +3032,11 @@ + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 +- exit 1 ++ exit $EXIT_FAILURE + else +- echo +- echo "*** Warning: Linking the shared library $output against the non-libtool" +- echo "*** objects $objs is not portable!" ++ $echo ++ $echo "*** Warning: Linking the shared library $output against the non-libtool" ++ $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi +@@ -2240,14 +3055,16 @@ + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. +- libext=al ++ # Some compilers have problems with a `.al' extension so ++ # convenience libraries should have the same extension an ++ # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then +- $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 ++ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then +@@ -2263,12 +3080,49 @@ + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + +- current="$2" +- revision="$3" +- age="$4" ++ # convert absolute version numbers to libtool ages ++ # this retains compatibility with .la files and attempts ++ # to make the code below a bit more comprehensible ++ ++ case $vinfo_number in ++ yes) ++ number_major="$2" ++ number_minor="$3" ++ number_revision="$4" ++ # ++ # There are really only two kinds -- those that ++ # use the current revision as the major version ++ # and those that subtract age and use age as ++ # a minor version. But, then there is irix ++ # which has an extra 1 added just for fun ++ # ++ case $version_type in ++ darwin|linux|osf|windows) ++ current=`expr $number_major + $number_minor` ++ age="$number_minor" ++ revision="$number_revision" ++ ;; ++ freebsd-aout|freebsd-elf|sunos) ++ current="$number_major" ++ revision="$number_minor" ++ age="0" ++ ;; ++ irix|nonstopux) ++ current=`expr $number_major + $number_minor - 1` ++ age="$number_minor" ++ revision="$number_minor" ++ ;; ++ esac ++ ;; ++ no) ++ current="$2" ++ revision="$3" ++ age="$4" ++ ;; ++ esac + + # Check that each of the things are valid numbers. + case $current in +@@ -2276,7 +3130,7 @@ + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + +@@ -2285,7 +3139,7 @@ + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + +@@ -2294,14 +3148,14 @@ + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Calculate the version variables. +@@ -2318,7 +3172,7 @@ + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` +- verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ++ verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + ;; + + freebsd-aout) +@@ -2331,16 +3185,21 @@ + versuffix=".$current"; + ;; + +- irix) ++ irix | nonstopux) + major=`expr $current - $age + 1` +- verstring="sgi$major.$revision" ++ ++ case $version_type in ++ nonstopux) verstring_prefix=nonstopux ;; ++ *) verstring_prefix=sgi ;; ++ esac ++ verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` +- verstring="sgi$major.$iface:$verstring" ++ verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. +@@ -2354,7 +3213,7 @@ + ;; + + osf) +- major=`expr $current - $age` ++ major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + +@@ -2384,20 +3243,19 @@ + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 +- echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 +- exit 1 ++ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 ++ exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= +- verstring="0.0" + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely +- verstring="" ++ verstring= + ;; + *) + verstring="0.0" +@@ -2431,9 +3289,30 @@ + fi + + if test "$mode" != relink; then +- # Remove our outputs. +- $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" +- $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* ++ # Remove our outputs, but don't remove object files since they ++ # may have been created when compiling PIC objects. ++ removelist= ++ tempremovelist=`$echo "$output_objdir/*"` ++ for p in $tempremovelist; do ++ case $p in ++ *.$objext) ++ ;; ++ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) ++ if test "X$precious_files_regex" != "X"; then ++ if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 ++ then ++ continue ++ fi ++ fi ++ removelist="$removelist $p" ++ ;; ++ *) ;; ++ esac ++ done ++ if test -n "$removelist"; then ++ $show "${rm}r $removelist" ++ $run ${rm}r $removelist ++ fi + fi + + # Now set the variables for building old libraries. +@@ -2446,9 +3325,9 @@ + + # Eliminate all temporary directories. + for path in $notinst_path; do +- lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'` +- deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'` +- dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'` ++ lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` ++ deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` ++ dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + done + + if test -n "$xrpath"; then +@@ -2499,10 +3378,11 @@ + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; +- *-*-openbsd*) ++ *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. ++ test "X$arg" = "X-lc" && continue + ;; +- *) ++ *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" +@@ -2531,7 +3411,7 @@ + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just +- # implementing what was already the behaviour. ++ # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) +@@ -2544,64 +3424,88 @@ + int main() { return 0; } + EOF + $rm conftest +- $CC -o conftest conftest.c $deplibs ++ $LTCC -o conftest conftest.c $deplibs + if test "$?" -eq 0 ; then + ldd_output=`ldd conftest` + for i in $deplibs; do + name="`expr $i : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. +- if test -n "$name" && test "$name" != "0"; then +- libname=`eval \\$echo \"$libname_spec\"` +- deplib_matches=`eval \\$echo \"$library_names_spec\"` +- set dummy $deplib_matches +- deplib_match=$2 +- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then +- newdeplibs="$newdeplibs $i" +- else +- droppeddeps=yes +- echo +- echo "*** Warning: This library needs some functionality provided by $i." +- echo "*** I have the capability to make that library automatically link in when" +- echo "*** you link to this library. But I can only do this if you have a" +- echo "*** shared version of the library, which you do not appear to have." ++ if test "$name" != "" && test "$name" -ne "0"; then ++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then ++ case " $predeps $postdeps " in ++ *" $i "*) ++ newdeplibs="$newdeplibs $i" ++ i="" ++ ;; ++ esac ++ fi ++ if test -n "$i" ; then ++ libname=`eval \\$echo \"$libname_spec\"` ++ deplib_matches=`eval \\$echo \"$library_names_spec\"` ++ set dummy $deplib_matches ++ deplib_match=$2 ++ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then ++ newdeplibs="$newdeplibs $i" ++ else ++ droppeddeps=yes ++ $echo ++ $echo "*** Warning: dynamic linker does not accept needed library $i." ++ $echo "*** I have the capability to make that library automatically link in when" ++ $echo "*** you link to this library. But I can only do this if you have a" ++ $echo "*** shared version of the library, which I believe you do not have" ++ $echo "*** because a test_compile did reveal that the linker did not use it for" ++ $echo "*** its dynamic dependency list that programs get resolved with at runtime." ++ fi + fi + else + newdeplibs="$newdeplibs $i" + fi + done + else +- # Error occured in the first compile. Let's try to salvage the situation: +- # Compile a seperate program for each library. ++ # Error occurred in the first compile. Let's try to salvage ++ # the situation: Compile a separate program for each library. + for i in $deplibs; do + name="`expr $i : '-l\(.*\)'`" +- # If $name is empty we are operating on a -L argument. +- if test -n "$name" && test "$name" != "0"; then ++ # If $name is empty we are operating on a -L argument. ++ if test "$name" != "" && test "$name" != "0"; then + $rm conftest +- $CC -o conftest conftest.c $i ++ $LTCC -o conftest conftest.c $i + # Did it work? + if test "$?" -eq 0 ; then + ldd_output=`ldd conftest` +- libname=`eval \\$echo \"$libname_spec\"` +- deplib_matches=`eval \\$echo \"$library_names_spec\"` +- set dummy $deplib_matches +- deplib_match=$2 +- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then +- newdeplibs="$newdeplibs $i" +- else +- droppeddeps=yes +- echo +- echo "*** Warning: This library needs some functionality provided by $i." +- echo "*** I have the capability to make that library automatically link in when" +- echo "*** you link to this library. But I can only do this if you have a" +- echo "*** shared version of the library, which you do not appear to have." ++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then ++ case " $predeps $postdeps " in ++ *" $i "*) ++ newdeplibs="$newdeplibs $i" ++ i="" ++ ;; ++ esac ++ fi ++ if test -n "$i" ; then ++ libname=`eval \\$echo \"$libname_spec\"` ++ deplib_matches=`eval \\$echo \"$library_names_spec\"` ++ set dummy $deplib_matches ++ deplib_match=$2 ++ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then ++ newdeplibs="$newdeplibs $i" ++ else ++ droppeddeps=yes ++ $echo ++ $echo "*** Warning: dynamic linker does not accept needed library $i." ++ $echo "*** I have the capability to make that library automatically link in when" ++ $echo "*** you link to this library. But I can only do this if you have a" ++ $echo "*** shared version of the library, which you do not appear to have" ++ $echo "*** because a test_compile did reveal that the linker did not use this one" ++ $echo "*** as a dynamic dependency that programs can get resolved with at runtime." ++ fi + fi + else + droppeddeps=yes +- echo +- echo "*** Warning! Library $i is needed by this library but I was not able to" +- echo "*** make it link in! You will probably need to install it or some" +- echo "*** library that it depends on before this library will be fully" +- echo "*** functional. Installing it before continuing would be even better." ++ $echo ++ $echo "*** Warning! Library $i is needed by this library but I was not able to" ++ $echo "*** make it link in! You will probably need to install it or some" ++ $echo "*** library that it depends on before this library will be fully" ++ $echo "*** functional. Installing it before continuing would be even better." + fi + else + newdeplibs="$newdeplibs $i" +@@ -2615,11 +3519,20 @@ + for a_deplib in $deplibs; do + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. +- if test -n "$name" && test "$name" != "0"; then +- libname=`eval \\$echo \"$libname_spec\"` +- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do +- potential_libs=`ls $i/$libname[.-]* 2>/dev/null` +- for potent_lib in $potential_libs; do ++ if test "$name" != "" && test "$name" != "0"; then ++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then ++ case " $predeps $postdeps " in ++ *" $a_deplib "*) ++ newdeplibs="$newdeplibs $a_deplib" ++ a_deplib="" ++ ;; ++ esac ++ fi ++ if test -n "$a_deplib" ; then ++ libname=`eval \\$echo \"$libname_spec\"` ++ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do ++ potential_libs=`ls $i/$libname[.-]* 2>/dev/null` ++ for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then +@@ -2632,28 +3545,43 @@ + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do +- potliblink=`ls -ld $potlib | sed 's/.* -> //'` ++ potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done ++ # It is ok to link against an archive when ++ # building a shared library. ++ if $AR -t $potlib > /dev/null 2>&1; then ++ newdeplibs="$newdeplibs $a_deplib" ++ a_deplib="" ++ break 2 ++ fi + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ +- | sed 10q \ +- | egrep "$file_magic_regex" > /dev/null; then ++ | ${SED} 10q \ ++ | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi +- done +- done ++ done ++ done ++ fi + if test -n "$a_deplib" ; then + droppeddeps=yes +- echo +- echo "*** Warning: This library needs some functionality provided by $a_deplib." +- echo "*** I have the capability to make that library automatically link in when" +- echo "*** you link to this library. But I can only do this if you have a" +- echo "*** shared version of the library, which you do not appear to have." ++ $echo ++ $echo "*** Warning: linker path does not have real file for library $a_deplib." ++ $echo "*** I have the capability to make that library automatically link in when" ++ $echo "*** you link to this library. But I can only do this if you have a" ++ $echo "*** shared version of the library, which you do not appear to have" ++ $echo "*** because I did check the linker path looking for a file starting" ++ if test -z "$potlib" ; then ++ $echo "*** with $libname but no candidates were found. (...for file magic test)" ++ else ++ $echo "*** with $libname and none of the candidates passed a file format test" ++ $echo "*** using a file magic. Last file checked: $potlib" ++ fi + fi + else + # Add a -L argument. +@@ -2668,26 +3596,44 @@ + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then +- libname=`eval \\$echo \"$libname_spec\"` +- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do +- potential_libs=`ls $i/$libname[.-]* 2>/dev/null` +- for potent_lib in $potential_libs; do +- if eval echo \"$potent_lib\" 2>/dev/null \ +- | sed 10q \ +- | egrep "$match_pattern_regex" > /dev/null; then +- newdeplibs="$newdeplibs $a_deplib" +- a_deplib="" +- break 2 +- fi ++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then ++ case " $predeps $postdeps " in ++ *" $a_deplib "*) ++ newdeplibs="$newdeplibs $a_deplib" ++ a_deplib="" ++ ;; ++ esac ++ fi ++ if test -n "$a_deplib" ; then ++ libname=`eval \\$echo \"$libname_spec\"` ++ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do ++ potential_libs=`ls $i/$libname[.-]* 2>/dev/null` ++ for potent_lib in $potential_libs; do ++ potlib="$potent_lib" # see symlink-check above in file_magic test ++ if eval $echo \"$potent_lib\" 2>/dev/null \ ++ | ${SED} 10q \ ++ | $EGREP "$match_pattern_regex" > /dev/null; then ++ newdeplibs="$newdeplibs $a_deplib" ++ a_deplib="" ++ break 2 ++ fi ++ done + done +- done ++ fi + if test -n "$a_deplib" ; then + droppeddeps=yes +- echo +- echo "*** Warning: This library needs some functionality provided by $a_deplib." +- echo "*** I have the capability to make that library automatically link in when" +- echo "*** you link to this library. But I can only do this if you have a" +- echo "*** shared version of the library, which you do not appear to have." ++ $echo ++ $echo "*** Warning: linker path does not have real file for library $a_deplib." ++ $echo "*** I have the capability to make that library automatically link in when" ++ $echo "*** you link to this library. But I can only do this if you have a" ++ $echo "*** shared version of the library, which you do not appear to have" ++ $echo "*** because I did check the linker path looking for a file starting" ++ if test -z "$potlib" ; then ++ $echo "*** with $libname but no candidates were found. (...for regex pattern test)" ++ else ++ $echo "*** with $libname and none of the candidates passed a file format test" ++ $echo "*** using a regex pattern. Last file checked: $potlib" ++ fi + fi + else + # Add a -L argument. +@@ -2697,16 +3643,23 @@ + ;; + none | unknown | *) + newdeplibs="" +- if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ +- -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | +- grep . >/dev/null; then +- echo ++ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ ++ -e 's/ -[LR][^ ]*//g'` ++ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then ++ for i in $predeps $postdeps ; do ++ # can't use Xsed below, because $i might contain '/' ++ tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` ++ done ++ fi ++ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ ++ | grep . >/dev/null; then ++ $echo + if test "X$deplibs_check_method" = "Xnone"; then +- echo "*** Warning: inter-library dependencies are not supported in this platform." ++ $echo "*** Warning: inter-library dependencies are not supported in this platform." + else +- echo "*** Warning: inter-library dependencies are not known to be supported." ++ $echo "*** Warning: inter-library dependencies are not known to be supported." + fi +- echo "*** All declared inter-library dependencies are being dropped." ++ $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; +@@ -2726,17 +3679,17 @@ + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then +- echo +- echo "*** Warning: libtool could not satisfy all declared inter-library" +- echo "*** dependencies of module $libname. Therefore, libtool will create" +- echo "*** a static module, that should work as long as the dlopening" +- echo "*** application is linked with the -dlopen flag." ++ $echo ++ $echo "*** Warning: libtool could not satisfy all declared inter-library" ++ $echo "*** dependencies of module $libname. Therefore, libtool will create" ++ $echo "*** a static module, that should work as long as the dlopening" ++ $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then +- echo +- echo "*** However, this would only work if libtool was able to extract symbol" +- echo "*** lists from a program, using \`nm' or equivalent, but libtool could" +- echo "*** not find such a program. So, this module is probably useless." +- echo "*** \`nm' from GNU binutils and a full rebuild may help." ++ $echo ++ $echo "*** However, this would only work if libtool was able to extract symbol" ++ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" ++ $echo "*** not find such a program. So, this module is probably useless." ++ $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" +@@ -2746,16 +3699,16 @@ + build_libtool_libs=no + fi + else +- echo "*** The inter-library dependencies that have been dropped here will be" +- echo "*** automatically added whenever a program is linked with this library" +- echo "*** or is declared to -dlopen it." ++ $echo "*** The inter-library dependencies that have been dropped here will be" ++ $echo "*** automatically added whenever a program is linked with this library" ++ $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then +- echo +- echo "*** Since this library must not contain undefined symbols," +- echo "*** because either the platform does not support them or" +- echo "*** it was explicitly requested with -no-undefined," +- echo "*** libtool will only create a static version of it." ++ $echo ++ $echo "*** Since this library must not contain undefined symbols," ++ $echo "*** because either the platform does not support them or" ++ $echo "*** it was explicitly requested with -no-undefined," ++ $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module +@@ -2813,7 +3766,11 @@ + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" +- eval dep_rpath=\"$hardcode_libdir_flag_spec\" ++ if test -n "$hardcode_libdir_flag_spec_ld"; then ++ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ++ else ++ eval dep_rpath=\"$hardcode_libdir_flag_spec\" ++ fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. +@@ -2833,6 +3790,7 @@ + fi + + # Get the real and link names of the library. ++ eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" +@@ -2843,7 +3801,9 @@ + else + soname="$realname" + fi +- test -z "$dlname" && dlname=$soname ++ if test -z "$dlname"; then ++ dlname=$soname ++ fi + + lib="$output_objdir/$realname" + for link +@@ -2851,23 +3811,6 @@ + linknames="$linknames $link" + done + +- # Ensure that we have .o objects for linkers which dislike .lo +- # (e.g. aix) in case we are running --disable-static +- for obj in $libobjs; do +- xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` +- if test "X$xdir" = "X$obj"; then +- xdir="." +- else +- xdir="$xdir" +- fi +- baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` +- oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` +- if test ! -f $xdir/$oldobj; then +- $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" +- $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? +- fi +- done +- + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + +@@ -2877,17 +3820,26 @@ + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols +- eval cmds=\"$export_symbols_cmds\" ++ cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" +- $show "$cmd" +- $run eval "$cmd" || exit $? ++ eval cmd=\"$cmd\" ++ if len=`expr "X$cmd" : ".*"` && ++ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then ++ $show "$cmd" ++ $run eval "$cmd" || exit $? ++ skipped_export=false ++ else ++ # The command line is too long to execute in one step. ++ $show "using reloadable object file for export list..." ++ skipped_export=: ++ fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then +- $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" +- $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' ++ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" ++ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi +@@ -2898,46 +3850,30 @@ + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + ++ tmp_deplibs= ++ for test_deplib in $deplibs; do ++ case " $convenience " in ++ *" $test_deplib "*) ;; ++ *) ++ tmp_deplibs="$tmp_deplibs $test_deplib" ++ ;; ++ esac ++ done ++ deplibs="$tmp_deplibs" ++ + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then ++ save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" +- $show "${rm}r $gentop" +- $run ${rm}r "$gentop" +- $show "mkdir $gentop" +- $run mkdir "$gentop" +- status=$? +- if test "$status" -ne 0 && test ! -d "$gentop"; then +- exit $status +- fi + generated="$generated $gentop" + +- for xlib in $convenience; do +- # Extract the objects. +- case $xlib in +- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; +- *) xabs=`pwd`"/$xlib" ;; +- esac +- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` +- xdir="$gentop/$xlib" +- +- $show "${rm}r $xdir" +- $run ${rm}r "$xdir" +- $show "mkdir $xdir" +- $run mkdir "$xdir" +- status=$? +- if test "$status" -ne 0 && test ! -d "$xdir"; then +- exit $status +- fi +- $show "(cd $xdir && $AR x $xabs)" +- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? +- +- libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` +- done ++ func_extract_archives $gentop $convenience ++ libobjs="$libobjs $func_extract_archives_result" + fi + fi +- ++ + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" +@@ -2949,14 +3885,147 @@ + fi + + # Do each of the archive commands. ++ if test "$module" = yes && test -n "$module_cmds" ; then ++ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then ++ eval test_cmds=\"$module_expsym_cmds\" ++ cmds=$module_expsym_cmds ++ else ++ eval test_cmds=\"$module_cmds\" ++ cmds=$module_cmds ++ fi ++ else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then +- eval cmds=\"$archive_expsym_cmds\" ++ eval test_cmds=\"$archive_expsym_cmds\" ++ cmds=$archive_expsym_cmds ++ else ++ eval test_cmds=\"$archive_cmds\" ++ cmds=$archive_cmds ++ fi ++ fi ++ ++ if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && ++ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then ++ : + else +- eval cmds=\"$archive_cmds\" ++ # The command line is too long to link in one step, link piecewise. ++ $echo "creating reloadable object files..." ++ ++ # Save the value of $output and $libobjs because we want to ++ # use them later. If we have whole_archive_flag_spec, we ++ # want to use save_libobjs as it was before ++ # whole_archive_flag_spec was expanded, because we can't ++ # assume the linker understands whole_archive_flag_spec. ++ # This may have to be revisited, in case too many ++ # convenience libraries get linked in and end up exceeding ++ # the spec. ++ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then ++ save_libobjs=$libobjs ++ fi ++ save_output=$output ++ ++ # Clear the reloadable object creation command queue and ++ # initialize k to one. ++ test_cmds= ++ concat_cmds= ++ objlist= ++ delfiles= ++ last_robj= ++ k=1 ++ output=$output_objdir/$save_output-${k}.$objext ++ # Loop over the list of objects to be linked. ++ for obj in $save_libobjs ++ do ++ eval test_cmds=\"$reload_cmds $objlist $last_robj\" ++ if test "X$objlist" = X || ++ { len=`expr "X$test_cmds" : ".*"` && ++ test "$len" -le "$max_cmd_len"; }; then ++ objlist="$objlist $obj" ++ else ++ # The command $test_cmds is almost too long, add a ++ # command to the queue. ++ if test "$k" -eq 1 ; then ++ # The first file doesn't have a previous command to add. ++ eval concat_cmds=\"$reload_cmds $objlist $last_robj\" ++ else ++ # All subsequent reloadable object files will link in ++ # the last one created. ++ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" ++ fi ++ last_robj=$output_objdir/$save_output-${k}.$objext ++ k=`expr $k + 1` ++ output=$output_objdir/$save_output-${k}.$objext ++ objlist=$obj ++ len=1 ++ fi ++ done ++ # Handle the remaining objects by creating one last ++ # reloadable object file. All subsequent reloadable object ++ # files will link in the last one created. ++ test -z "$concat_cmds" || concat_cmds=$concat_cmds~ ++ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" ++ ++ if ${skipped_export-false}; then ++ $show "generating symbol list for \`$libname.la'" ++ export_symbols="$output_objdir/$libname.exp" ++ $run $rm $export_symbols ++ libobjs=$output ++ # Append the command to create the export file. ++ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" ++ fi ++ ++ # Set up a command to remove the reloadale object files ++ # after they are used. ++ i=0 ++ while test "$i" -lt "$k" ++ do ++ i=`expr $i + 1` ++ delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" ++ done ++ ++ $echo "creating a temporary reloadable object file: $output" ++ ++ # Loop through the commands generated above and execute them. ++ save_ifs="$IFS"; IFS='~' ++ for cmd in $concat_cmds; do ++ IFS="$save_ifs" ++ $show "$cmd" ++ $run eval "$cmd" || exit $? ++ done ++ IFS="$save_ifs" ++ ++ libobjs=$output ++ # Restore the value of output. ++ output=$save_output ++ ++ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then ++ eval libobjs=\"\$libobjs $whole_archive_flag_spec\" ++ fi ++ # Expand the library linking commands again to reset the ++ # value of $libobjs for piecewise linking. ++ ++ # Do each of the archive commands. ++ if test "$module" = yes && test -n "$module_cmds" ; then ++ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then ++ cmds=$module_expsym_cmds ++ else ++ cmds=$module_cmds ++ fi ++ else ++ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then ++ cmds=$archive_expsym_cmds ++ else ++ cmds=$archive_cmds ++ fi ++ fi ++ ++ # Append the command to remove the reloadable object files ++ # to the just-reset $cmds. ++ eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done +@@ -2965,7 +4034,7 @@ + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? +- exit 0 ++ exit $EXIT_SUCCESS + fi + + # Create links to the real library. +@@ -3013,7 +4082,7 @@ + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` +@@ -3042,38 +4111,10 @@ + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" +- $show "${rm}r $gentop" +- $run ${rm}r "$gentop" +- $show "mkdir $gentop" +- $run mkdir "$gentop" +- status=$? +- if test "$status" -ne 0 && test ! -d "$gentop"; then +- exit $status +- fi + generated="$generated $gentop" + +- for xlib in $convenience; do +- # Extract the objects. +- case $xlib in +- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; +- *) xabs=`pwd`"/$xlib" ;; +- esac +- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` +- xdir="$gentop/$xlib" +- +- $show "${rm}r $xdir" +- $run ${rm}r "$xdir" +- $show "mkdir $xdir" +- $run mkdir "$xdir" +- status=$? +- if test "$status" -ne 0 && test ! -d "$xdir"; then +- exit $status +- fi +- $show "(cd $xdir && $AR x $xabs)" +- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? +- +- reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` +- done ++ func_extract_archives $gentop $convenience ++ reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + +@@ -3081,10 +4122,11 @@ + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" +- eval cmds=\"$reload_cmds\" ++ cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done +@@ -3097,7 +4139,7 @@ + $run ${rm}r $gentop + fi + +- exit 0 ++ exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then +@@ -3108,37 +4150,24 @@ + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. +- $show "echo timestamp > $libobj" +- $run eval "echo timestamp > $libobj" || exit $? +- exit 0 ++ # $show "echo timestamp > $libobj" ++ # $run eval "echo timestamp > $libobj" || exit $? ++ exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" +- eval cmds=\"$reload_cmds\" ++ cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" +- else +- # Just create a symlink. +- $show $rm $libobj +- $run $rm $libobj +- xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` +- if test "X$xdir" = "X$libobj"; then +- xdir="." +- else +- xdir="$xdir" +- fi +- baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` +- oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` +- $show "(cd $xdir && $LN_S $oldobj $baseobj)" +- $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? + fi + + if test -n "$gentop"; then +@@ -3146,12 +4175,12 @@ + $run ${rm}r $gentop + fi + +- exit 0 ++ exit $EXIT_SUCCESS + ;; + + prog) + case $host in +- *cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;; ++ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 +@@ -3176,6 +4205,16 @@ + ;; + esac + ++ case $host in ++ *darwin*) ++ # Don't allow lazy linking, it breaks C++ global constructors ++ if test "$tagname" = CXX ; then ++ compile_command="$compile_command ${wl}-bind_at_load" ++ finalize_command="$finalize_command ${wl}-bind_at_load" ++ fi ++ ;; ++ esac ++ + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + +@@ -3326,12 +4365,12 @@ + done + + if test -n "$exclude_expsyms"; then +- $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' ++ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then +- $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' ++ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + +@@ -3339,9 +4378,9 @@ + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols +- $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' ++ $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else +- $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' ++ $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi +@@ -3349,8 +4388,8 @@ + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" +- name=`echo "$arg" | sed -e 's%^.*/%%'` +- $run eval 'echo ": $name " >> "$nlist"' ++ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` ++ $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + +@@ -3359,12 +4398,18 @@ + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then +- egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T ++ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. +- if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then ++ if grep -v "^: " < "$nlist" | ++ if sort -k 3 /dev/null 2>&1; then ++ sort -k 3 ++ else ++ sort +2 ++ fi | ++ uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S +@@ -3373,7 +4418,7 @@ + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else +- echo '/* NONE */' >> "$output_objdir/$dlsyms" ++ $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ +@@ -3425,18 +4470,18 @@ + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; +- *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; ++ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; +- *) pic_flag_for_symtable=" $pic_flag -DPIC";; ++ *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. +- $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" +- $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? ++ $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" ++ $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" +@@ -3448,7 +4493,7 @@ + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + else +@@ -3536,7 +4581,7 @@ + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? +- exit 0 ++ exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then +@@ -3591,10 +4636,10 @@ + fi + + # Quote $echo for shipping. +- if test "X$echo" = "X$SHELL $0 --fallback-echo"; then +- case $0 in +- [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; +- *) qecho="$SHELL `pwd`/$0 --fallback-echo";; ++ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then ++ case $progpath in ++ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; ++ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else +@@ -3606,15 +4651,230 @@ + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in +- *.exe) output=`echo $output|sed 's,.exe$,,'` ;; ++ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in +- *cygwin*) exeext=.exe ;; ++ *cygwin*) ++ exeext=.exe ++ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac ++ case $host in ++ *cygwin* | *mingw* ) ++ cwrappersource=`$echo ${objdir}/lt-${output}.c` ++ cwrapper=`$echo ${output}.exe` ++ $rm $cwrappersource $cwrapper ++ trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 ++ ++ cat > $cwrappersource <> $cwrappersource<<"EOF" ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if defined(PATH_MAX) ++# define LT_PATHMAX PATH_MAX ++#elif defined(MAXPATHLEN) ++# define LT_PATHMAX MAXPATHLEN ++#else ++# define LT_PATHMAX 1024 ++#endif ++ ++#ifndef DIR_SEPARATOR ++#define DIR_SEPARATOR '/' ++#endif ++ ++#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ ++ defined (__OS2__) ++#define HAVE_DOS_BASED_FILE_SYSTEM ++#ifndef DIR_SEPARATOR_2 ++#define DIR_SEPARATOR_2 '\\' ++#endif ++#endif ++ ++#ifndef DIR_SEPARATOR_2 ++# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) ++#else /* DIR_SEPARATOR_2 */ ++# define IS_DIR_SEPARATOR(ch) \ ++ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) ++#endif /* DIR_SEPARATOR_2 */ ++ ++#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) ++#define XFREE(stale) do { \ ++ if (stale) { free ((void *) stale); stale = 0; } \ ++} while (0) ++ ++const char *program_name = NULL; ++ ++void * xmalloc (size_t num); ++char * xstrdup (const char *string); ++char * basename (const char *name); ++char * fnqualify(const char *path); ++char * strendzap(char *str, const char *pat); ++void lt_fatal (const char *message, ...); ++ ++int ++main (int argc, char *argv[]) ++{ ++ char **newargz; ++ int i; ++ ++ program_name = (char *) xstrdup ((char *) basename (argv[0])); ++ newargz = XMALLOC(char *, argc+2); ++EOF ++ ++ cat >> $cwrappersource <> $cwrappersource <<"EOF" ++ newargz[1] = fnqualify(argv[0]); ++ /* we know the script has the same name, without the .exe */ ++ /* so make sure newargz[1] doesn't end in .exe */ ++ strendzap(newargz[1],".exe"); ++ for (i = 1; i < argc; i++) ++ newargz[i+1] = xstrdup(argv[i]); ++ newargz[argc+1] = NULL; ++EOF ++ ++ cat >> $cwrappersource <> $cwrappersource <<"EOF" ++} ++ ++void * ++xmalloc (size_t num) ++{ ++ void * p = (void *) malloc (num); ++ if (!p) ++ lt_fatal ("Memory exhausted"); ++ ++ return p; ++} ++ ++char * ++xstrdup (const char *string) ++{ ++ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ++; ++} ++ ++char * ++basename (const char *name) ++{ ++ const char *base; ++ ++#if defined (HAVE_DOS_BASED_FILE_SYSTEM) ++ /* Skip over the disk name in MSDOS pathnames. */ ++ if (isalpha (name[0]) && name[1] == ':') ++ name += 2; ++#endif ++ ++ for (base = name; *name; name++) ++ if (IS_DIR_SEPARATOR (*name)) ++ base = name + 1; ++ return (char *) base; ++} ++ ++char * ++fnqualify(const char *path) ++{ ++ size_t size; ++ char *p; ++ char tmp[LT_PATHMAX + 1]; ++ ++ assert(path != NULL); ++ ++ /* Is it qualified already? */ ++#if defined (HAVE_DOS_BASED_FILE_SYSTEM) ++ if (isalpha (path[0]) && path[1] == ':') ++ return xstrdup (path); ++#endif ++ if (IS_DIR_SEPARATOR (path[0])) ++ return xstrdup (path); ++ ++ /* prepend the current directory */ ++ /* doesn't handle '~' */ ++ if (getcwd (tmp, LT_PATHMAX) == NULL) ++ lt_fatal ("getcwd failed"); ++ size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ ++ p = XMALLOC(char, size); ++ sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); ++ return p; ++} ++ ++char * ++strendzap(char *str, const char *pat) ++{ ++ size_t len, patlen; ++ ++ assert(str != NULL); ++ assert(pat != NULL); ++ ++ len = strlen(str); ++ patlen = strlen(pat); ++ ++ if (patlen <= len) ++ { ++ str += len - patlen; ++ if (strcmp(str, pat) == 0) ++ *str = '\0'; ++ } ++ return str; ++} ++ ++static void ++lt_error_core (int exit_status, const char * mode, ++ const char * message, va_list ap) ++{ ++ fprintf (stderr, "%s: %s: ", program_name, mode); ++ vfprintf (stderr, message, ap); ++ fprintf (stderr, ".\n"); ++ ++ if (exit_status >= 0) ++ exit (exit_status); ++} ++ ++void ++lt_fatal (const char *message, ...) ++{ ++ va_list ap; ++ va_start (ap, message); ++ lt_error_core (EXIT_FAILURE, "FATAL", message, ap); ++ va_end (ap); ++} ++EOF ++ # we should really use a build-platform specific compiler ++ # here, but OTOH, the wrappers (shell script and this C one) ++ # are only useful if you want to execute the "real" binary. ++ # Since the "real" binary is built for $host, then this ++ # wrapper might as well be built for $host, too. ++ $run $LTCC -s -o $cwrapper $cwrappersource ++ ;; ++ esac + $rm $output +- trap "$rm $output; exit 1" 1 2 15 ++ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ + #! $SHELL +@@ -3630,12 +4890,12 @@ + + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. +-Xsed='sed -e 1s/^X//' ++Xsed='${SED} -e 1s/^X//' + sed_quote_subst='$sed_quote_subst' + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. +-if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + relink_command=\"$relink_command\" + +@@ -3668,7 +4928,7 @@ + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. +- file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` ++ file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + +@@ -3681,7 +4941,7 @@ + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` +- file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` ++ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. +@@ -3690,12 +4950,12 @@ + " + + if test "$fast_install" = yes; then +- echo >> $output "\ ++ $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ +- { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ ++ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" +@@ -3706,7 +4966,7 @@ + $rm \"\$progdir/\$file\" + fi" + +- echo >> $output "\ ++ $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then +@@ -3714,7 +4974,7 @@ + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" +- exit 1 ++ exit $EXIT_FAILURE + fi + fi + +@@ -3724,13 +4984,13 @@ + $rm \"\$progdir/\$file\" + fi" + else +- echo >> $output "\ ++ $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" + " + fi + +- echo >> $output "\ ++ $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + +@@ -3761,14 +5021,6 @@ + # Run the actual program with our arguments. + " + case $host in +- # win32 systems need to use the prog path for dll +- # lookup to work +- *-*-cygwin* | *-*-pw32*) +- $echo >> $output "\ +- exec \$progdir/\$program \${1+\"\$@\"} +-" +- ;; +- + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ +@@ -3778,30 +5030,26 @@ + + *) + $echo >> $output "\ +- # Export the path to the program. +- PATH=\"\$progdir:\$PATH\" +- export PATH +- +- exec \$program \${1+\"\$@\"} ++ exec \$progdir/\$program \${1+\"\$@\"} + " + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" +- exit 1 ++ exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 +- echo \"See the $PACKAGE documentation for more information.\" 1>&2 +- exit 1 ++ $echo \"See the $PACKAGE documentation for more information.\" 1>&2 ++ exit $EXIT_FAILURE + fi + fi\ + " + chmod +x $output + fi +- exit 0 ++ exit $EXIT_SUCCESS + ;; + esac + +@@ -3817,74 +5065,86 @@ + oldobjs="$libobjs_save" + build_libtool_libs=no + else +- oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` ++ oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" +- $show "${rm}r $gentop" +- $run ${rm}r "$gentop" +- $show "mkdir $gentop" +- $run mkdir "$gentop" +- status=$? +- if test "$status" -ne 0 && test ! -d "$gentop"; then +- exit $status +- fi + generated="$generated $gentop" + +- # Add in members from convenience archives. +- for xlib in $addlibs; do +- # Extract the objects. +- case $xlib in +- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; +- *) xabs=`pwd`"/$xlib" ;; +- esac +- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` +- xdir="$gentop/$xlib" +- +- $show "${rm}r $xdir" +- $run ${rm}r "$xdir" +- $show "mkdir $xdir" +- $run mkdir "$xdir" +- status=$? +- if test "$status" -ne 0 && test ! -d "$xdir"; then +- exit $status +- fi +- $show "(cd $xdir && $AR x $xabs)" +- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? +- +- oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` +- done ++ func_extract_archives $gentop $addlibs ++ oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then +- eval cmds=\"$old_archive_from_new_cmds\" ++ cmds=$old_archive_from_new_cmds + else +- # Ensure that we have .o objects in place in case we decided +- # not to build a shared library, and have fallen back to building +- # static libs even though --disable-static was passed! +- for oldobj in $oldobjs; do +- if test ! -f $oldobj; then +- xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` +- if test "X$xdir" = "X$oldobj"; then +- xdir="." ++ eval cmds=\"$old_archive_cmds\" ++ ++ if len=`expr "X$cmds" : ".*"` && ++ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then ++ cmds=$old_archive_cmds ++ else ++ # the command line is too long to link in one step, link in parts ++ $echo "using piecewise archive linking..." ++ save_RANLIB=$RANLIB ++ RANLIB=: ++ objlist= ++ concat_cmds= ++ save_oldobjs=$oldobjs ++ # GNU ar 2.10+ was changed to match POSIX; thus no paths are ++ # encoded into archives. This makes 'ar r' malfunction in ++ # this piecewise linking case whenever conflicting object ++ # names appear in distinct ar calls; check, warn and compensate. ++ if (for obj in $save_oldobjs ++ do ++ $echo "X$obj" | $Xsed -e 's%^.*/%%' ++ done | sort | sort -uc >/dev/null 2>&1); then ++ : ++ else ++ $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 ++ $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 ++ AR_FLAGS=cq ++ fi ++ # Is there a better way of finding the last object in the list? ++ for obj in $save_oldobjs ++ do ++ last_oldobj=$obj ++ done ++ for obj in $save_oldobjs ++ do ++ oldobjs="$objlist $obj" ++ objlist="$objlist $obj" ++ eval test_cmds=\"$old_archive_cmds\" ++ if len=`expr "X$test_cmds" : ".*"` && ++ test "$len" -le "$max_cmd_len"; then ++ : + else +- xdir="$xdir" ++ # the above command should be used before it gets too long ++ oldobjs=$objlist ++ if test "$obj" = "$last_oldobj" ; then ++ RANLIB=$save_RANLIB ++ fi ++ test -z "$concat_cmds" || concat_cmds=$concat_cmds~ ++ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" ++ objlist= + fi +- baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` +- obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` +- $show "(cd $xdir && ${LN_S} $obj $baseobj)" +- $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? ++ done ++ RANLIB=$save_RANLIB ++ oldobjs=$objlist ++ if test "X$oldobjs" = "X" ; then ++ eval cmds=\"\$concat_cmds\" ++ else ++ eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi +- done +- +- eval cmds=\"$old_archive_cmds\" ++ fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do ++ eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? +@@ -3916,8 +5176,12 @@ + fi + done + # Quote the link command for shipping. +- relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args @inst_prefix_dir@)" ++ relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` ++ if test "$hardcode_automatic" = yes ; then ++ relink_command= ++ fi ++ + + # Only create the output if not a dry run. + if test -z "$run"; then +@@ -3933,24 +5197,65 @@ + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` +- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` ++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE ++ fi ++ # We do not want portage's install root ($D) present. Check only for ++ # this if the .la is being installed. ++ if test "$installed" = yes && test "$D"; then ++ eval mynewdependency_lib=`echo "$libdir/$name" |sed -e "s:$D::g" -e 's://:/:g'` ++ else ++ mynewdependency_lib="$libdir/$name" ++ fi ++ # Do not add duplicates ++ if test "$mynewdependency_lib"; then ++ my_little_ninja_foo_1=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` ++ if test -z "$my_little_ninja_foo_1"; then ++ newdependency_libs="$newdependency_libs $mynewdependency_lib" ++ fi ++ fi ++ ;; ++ *) ++ if test "$installed" = yes; then ++ # Rather use S=WORKDIR if our version of portage supports it. ++ # This is because some ebuild (gcc) do not use $S as buildroot. ++ if test "$PWORKDIR"; then ++ S="$PWORKDIR" ++ fi ++ # We do not want portage's build root ($S) present. ++ my_little_ninja_foo_2=`echo $deplib |$EGREP -e "$S"` ++ if test -n "$my_little_ninja_foo_2" && test "$S"; then ++ mynewdependency_lib="" ++ # We do not want portage's install root ($D) present. ++ my_little_ninja_foo_3=`echo $deplib |$EGREP -e "$D"` ++ elif test -n "$my_little_ninja_foo_3" && test "$D"; then ++ eval mynewdependency_lib=`echo "$deplib" |sed -e "s:$D::g" -e 's://:/:g'` ++ else ++ mynewdependency_lib="$deplib" ++ fi ++ else ++ mynewdependency_lib="$deplib" ++ fi ++ # Do not add duplicates ++ if test "$mynewdependency_lib"; then ++ my_little_ninja_foo_4=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` ++ if test -z "$my_little_ninja_foo_4"; then ++ newdependency_libs="$newdependency_libs $mynewdependency_lib" ++ fi + fi +- newdependency_libs="$newdependency_libs $libdir/$name" + ;; +- *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` +- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` ++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done +@@ -3958,21 +5263,44 @@ + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` +- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` ++ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" ++ else ++ newdlfiles= ++ for lib in $dlfiles; do ++ case $lib in ++ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; ++ *) abs=`pwd`"/$lib" ;; ++ esac ++ newdlfiles="$newdlfiles $abs" ++ done ++ dlfiles="$newdlfiles" ++ newdlprefiles= ++ for lib in $dlprefiles; do ++ case $lib in ++ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; ++ *) abs=`pwd`"/$lib" ;; ++ esac ++ newdlprefiles="$newdlprefiles $abs" ++ done ++ dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in +- *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; ++ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac ++ # Do not add duplicates ++ if test "$installed" = yes && test "$D"; then ++ install_libdir=`echo "$install_libdir" |sed -e "s:$D::g" -e 's://:/:g'` ++ fi + $echo > $output "\ + # $outputname - a libtool library file + # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +@@ -4000,6 +5328,9 @@ + # Is this an already installed library? + installed=$installed + ++# Should we warn about portability when linking against -modules? ++shouldnotlink=$module ++ + # Files to dlopen/dlpreopen + dlopen='$dlfiles' + dlpreopen='$dlprefiles' +@@ -4019,7 +5350,7 @@ + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac +- exit 0 ++ exit $EXIT_SUCCESS + ;; + + # libtool install mode +@@ -4108,13 +5439,13 @@ + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + if test -z "$files"; then +@@ -4124,7 +5455,7 @@ + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. +@@ -4145,7 +5476,7 @@ + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + fi + case $destdir in +@@ -4157,7 +5488,7 @@ + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + done +@@ -4182,11 +5513,11 @@ + + *.la) + # Check to see that this really is a libtool archive. +- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : ++ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + library_names= +@@ -4218,21 +5549,24 @@ + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. +- inst_prefix_dir=`$echo "$destdir" | sed "s%$libdir\$%%"` ++ inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. ++ # At present, this check doesn't affect windows .dll's that ++ # are installed into $libdir/../bin (currently, that works fine) ++ # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. +- relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` ++ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else +- relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%%"` ++ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 +@@ -4240,7 +5574,7 @@ + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + fi + +@@ -4275,10 +5609,11 @@ + + # Do each command in the postinstall commands. + lib="$destdir/$realname" +- eval cmds=\"$postinstall_cmds\" ++ cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done +@@ -4318,7 +5653,7 @@ + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + +@@ -4336,7 +5671,7 @@ + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi +- exit 0 ++ exit $EXIT_SUCCESS + ;; + + *) +@@ -4348,21 +5683,49 @@ + destfile="$destdir/$destfile" + fi + ++ # If the file is missing, and there is a .exe on the end, strip it ++ # because it is most likely a libtool script we actually want to ++ # install ++ stripped_ext="" ++ case $file in ++ *.exe) ++ if test ! -f "$file"; then ++ file=`$echo $file|${SED} 's,.exe$,,'` ++ stripped_ext=".exe" ++ fi ++ ;; ++ esac ++ + # Do a test to see if this is really a libtool program. +- if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then ++ case $host in ++ *cygwin*|*mingw*) ++ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ++ ;; ++ *) ++ wrapper=$file ++ ;; ++ esac ++ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + ++ # To insure that "foo" is sourced, and not "foo.exe", ++ # finese the cygwin/MSYS system by explicitly sourcing "foo." ++ # which disallows the automatic-append-.exe behavior. ++ case $build in ++ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; ++ *) wrapperdot=${wrapper} ;; ++ esac + # If there is no directory component, then add one. + case $file in +- */* | *\\*) . $file ;; +- *) . ./$file ;; ++ */* | *\\*) . ${wrapperdot} ;; ++ *) . ./${wrapperdot} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then +- $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 +- exit 1 ++ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 ++ exit $EXIT_FAILURE + fi + + finalize=yes +@@ -4384,10 +5747,17 @@ + done + + relink_command= ++ # To insure that "foo" is sourced, and not "foo.exe", ++ # finese the cygwin/MSYS system by explicitly sourcing "foo." ++ # which disallows the automatic-append-.exe behavior. ++ case $build in ++ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; ++ *) wrapperdot=${wrapper} ;; ++ esac + # If there is no directory component, then add one. + case $file in +- */* | *\\*) . $file ;; +- *) . ./$file ;; ++ */* | *\\*) . ${wrapperdot} ;; ++ *) . ./${wrapperdot} ;; + esac + + outputname= +@@ -4395,17 +5765,17 @@ + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" +- tmpdir=`mktemp -d $tmpdir/libtool-XXXXXX 2> /dev/null` +- if test $? = 0 ; then : +- else +- tmpdir="$tmpdir/libtool-$$" +- fi +- if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : ++ tmpdir="$tmpdir/libtool-$$" ++ save_umask=`umask` ++ umask 0077 ++ if $mkdir "$tmpdir"; then ++ umask $save_umask + else ++ umask $save_umask + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi +- file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` ++ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` +@@ -4423,14 +5793,14 @@ + fi + else + # Install the binary that we compiled earlier. +- file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` ++ file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + case $install_prog,$host in +- /usr/bin/install*,*cygwin*) ++ */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok +@@ -4439,7 +5809,7 @@ + destfile=$destfile.exe + ;; + *:*.exe) +- destfile=`echo $destfile | sed -e 's,.exe$,,'` ++ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; +@@ -4460,16 +5830,17 @@ + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + +- if test -n "$stripme" && test -n "$striplib"; then ++ if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. +- eval cmds=\"$old_postinstall_cmds\" ++ cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done +@@ -4483,9 +5854,9 @@ + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" +- exec_cmd='$SHELL $0 --finish$current_libdirs' ++ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else +- exit 0 ++ exit $EXIT_SUCCESS + fi + ;; + +@@ -4504,10 +5875,11 @@ + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. +- eval cmds=\"$finish_cmds\" ++ cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" +@@ -4524,43 +5896,43 @@ + fi + + # Exit here if they wanted silent mode. +- test "$show" = : && exit 0 ++ test "$show" = : && exit $EXIT_SUCCESS + +- echo "----------------------------------------------------------------------" +- echo "Libraries have been installed in:" ++ $echo "----------------------------------------------------------------------" ++ $echo "Libraries have been installed in:" + for libdir in $libdirs; do +- echo " $libdir" ++ $echo " $libdir" + done +- echo +- echo "If you ever happen to want to link against installed libraries" +- echo "in a given directory, LIBDIR, you must either use libtool, and" +- echo "specify the full pathname of the library, or use the \`-LLIBDIR'" +- echo "flag during linking and do at least one of the following:" ++ $echo ++ $echo "If you ever happen to want to link against installed libraries" ++ $echo "in a given directory, LIBDIR, you must either use libtool, and" ++ $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" ++ $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then +- echo " - add LIBDIR to the \`$shlibpath_var' environment variable" +- echo " during execution" ++ $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" ++ $echo " during execution" + fi + if test -n "$runpath_var"; then +- echo " - add LIBDIR to the \`$runpath_var' environment variable" +- echo " during linking" ++ $echo " - add LIBDIR to the \`$runpath_var' environment variable" ++ $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + +- echo " - use the \`$flag' linker flag" ++ $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then +- echo " - have your system administrator run these commands:$admincmds" ++ $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then +- echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" ++ $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi +- echo +- echo "See any operating system documentation about shared libraries for" +- echo "more information, such as the ld(1) and ld.so(8) manual pages." +- echo "----------------------------------------------------------------------" +- exit 0 ++ $echo ++ $echo "See any operating system documentation about shared libraries for" ++ $echo "more information, such as the ld(1) and ld.so(8) manual pages." ++ $echo "----------------------------------------------------------------------" ++ exit $EXIT_SUCCESS + ;; + + # libtool execute mode +@@ -4572,7 +5944,7 @@ + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. +@@ -4580,18 +5952,18 @@ + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. +- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : ++ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + # Read the libtool library. +@@ -4618,7 +5990,7 @@ + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + ;; + +@@ -4658,7 +6030,7 @@ + -*) ;; + *) + # Do a test to see if this is really a libtool program. +- if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then ++ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; +@@ -4681,7 +6053,7 @@ + eval "export $shlibpath_var" + fi + +- # Restore saved enviroment variables ++ # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi +@@ -4698,7 +6070,7 @@ + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" +- exit 0 ++ exit $EXIT_SUCCESS + fi + ;; + +@@ -4726,18 +6098,19 @@ + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + + rmdirs= + ++ origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. +- objdir="$objdir" ++ objdir="$origobjdir" + else +- objdir="$dir/$objdir" ++ objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" +@@ -4767,7 +6140,7 @@ + case $name in + *.la) + # Possibly a libtool archive, so verify it. +- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then ++ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. +@@ -4780,10 +6153,11 @@ + if test "$mode" = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. +- eval cmds=\"$postuninstall_cmds\" ++ cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then +@@ -4795,10 +6169,11 @@ + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. +- eval cmds=\"$old_postuninstall_cmds\" ++ cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" ++ eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then +@@ -4813,22 +6188,52 @@ + ;; + + *.lo) +- if test "$build_old_libs" = yes; then +- oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` +- rmfiles="$rmfiles $dir/$oldobj" ++ # Possibly a libtool object, so verify it. ++ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then ++ ++ # Read the .lo file ++ . $dir/$name ++ ++ # Add PIC object to the list of files to remove. ++ if test -n "$pic_object" \ ++ && test "$pic_object" != none; then ++ rmfiles="$rmfiles $dir/$pic_object" ++ fi ++ ++ # Add non-PIC object to the list of files to remove. ++ if test -n "$non_pic_object" \ ++ && test "$non_pic_object" != none; then ++ rmfiles="$rmfiles $dir/$non_pic_object" ++ fi + fi + ;; + + *) +- # Do a test to see if this is a libtool program. +- if test "$mode" = clean && +- (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then +- relink_command= +- . $dir/$file ++ if test "$mode" = clean ; then ++ noexename=$name ++ case $file in ++ *.exe) ++ file=`$echo $file|${SED} 's,.exe$,,'` ++ noexename=`$echo $name|${SED} 's,.exe$,,'` ++ # $file with .exe has already been added to rmfiles, ++ # add $file without .exe ++ rmfiles="$rmfiles $file" ++ ;; ++ esac ++ # Do a test to see if this is a libtool program. ++ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then ++ relink_command= ++ . $dir/$noexename + +- rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" +- if test "$fast_install" = yes && test -n "$relink_command"; then +- rmfiles="$rmfiles $objdir/lt-$name" ++ # note $name still contains .exe if it was in $file originally ++ # as does the version of $file that was added into $rmfiles ++ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" ++ if test "$fast_install" = yes && test -n "$relink_command"; then ++ rmfiles="$rmfiles $objdir/lt-$name" ++ fi ++ if test "X$noexename" != "X$name" ; then ++ rmfiles="$rmfiles $objdir/lt-${noexename}.c" ++ fi + fi + fi + ;; +@@ -4836,6 +6241,7 @@ + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done ++ objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do +@@ -4851,20 +6257,20 @@ + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + fi + fi # test -z "$show_help" + + if test -n "$exec_cmd"; then + eval exec $exec_cmd +- exit 1 ++ exit $EXIT_FAILURE + fi + + # We need to display help for each of the modes. +@@ -4883,6 +6289,7 @@ + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages ++ --tag=TAG use configuration variables from tag TAG + --version print version information + + MODE must be one of the following: +@@ -4896,8 +6303,10 @@ + uninstall remove libraries from an installed directory + + MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +-a more detailed description of MODE." +- exit 0 ++a more detailed description of MODE. ++ ++Report bugs to ." ++ exit $EXIT_SUCCESS + ;; + + clean) +@@ -5008,6 +6417,9 @@ + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects ++ -objectlist FILE Use a list of object files found in FILE to specify objects ++ -precious-files-regex REGEX ++ don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries +@@ -5049,14 +6461,34 @@ + *) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 +- exit 1 ++ exit $EXIT_FAILURE + ;; + esac + +-echo ++$echo + $echo "Try \`$modename --help' for more information about other modes." + +-exit 0 ++exit $EXIT_SUCCESS ++ ++# The TAGs below are defined such that we never get into a situation ++# in which we disable both kinds of libraries. Given conflicting ++# choices, we go for a static library, that is the most portable, ++# since we can't tell whether shared libraries were disabled because ++# the user asked for that or because the platform doesn't support ++# them. This is particularly important on AIX, because we don't ++# support having both static and shared libraries enabled at the same ++# time on that platform, so we default to a shared-only configuration. ++# If a disable-shared tag is given, we'll fallback to a static-only ++# configuration. But we'll never go from static-only to shared-only. ++ ++# ### BEGIN LIBTOOL TAG CONFIG: disable-shared ++build_libtool_libs=no ++build_old_libs=yes ++# ### END LIBTOOL TAG CONFIG: disable-shared ++ ++# ### BEGIN LIBTOOL TAG CONFIG: disable-static ++build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` ++# ### END LIBTOOL TAG CONFIG: disable-static + + # Local Variables: + # mode:shell-script +diff -Naur libodbc++-0.2.3/m4/ac_check_odbc.m4 libodbc++-0.2.3-20050404/m4/ac_check_odbc.m4 +--- libodbc++-0.2.3/m4/ac_check_odbc.m4 2003-04-14 10:38:31.000000000 +0200 ++++ libodbc++-0.2.3-20050404/m4/ac_check_odbc.m4 2003-12-02 12:31:49.000000000 +0100 +@@ -13,7 +13,7 @@ + fi + odbc_libraries_dir="$odbc_dir/lib" + odbc_includes_dir="$odbc_dir/include" +-]) ++], [ odbc_dir=yes ] ) + + AC_ARG_WITH(odbc-includes, + [ --with-odbc-includes=DIR Find unixODBC headers in DIR], +@@ -25,27 +25,31 @@ + [odbc_libraries_dir=$withval] + ) + +-save_CPPFLAGS="$CPPFLAGS" +-save_LIBS="$LIBS" +- +-if test "x$odbc_includes_dir" != "x" -a "x$odbc_includes_dir" != "x/usr/include" +-then +- CPPFLAGS="$CPPFLAGS -I$odbc_includes_dir" +-fi +- +-if test "x$odbc_libraries_dir" != "x" +-then +- LIBS="$LIBS -L$odbc_libraries_dir" +-fi +- +-AC_CHECK_HEADERS([sql.h sqlext.h sqlucode.h], +-[odbc_ok=yes; odbc_headers="$odbc_headers $ac_hdr"], +-[odbc_ok=no; break] +-) +- +-if test "x$odbc_ok" = "xyes" +-then +- AC_CHECK_LIB(odbc,SQLConnect,[odbc_ok=yes],[odbc_ok=no]) ++if test "x$odbc_dir" != "xno"; then ++ save_CPPFLAGS="$CPPFLAGS" ++ save_LIBS="$LIBS" ++ ++ if test "x$odbc_includes_dir" != "x" -a "x$odbc_includes_dir" != "x/usr/include" ++ then ++ CPPFLAGS="$CPPFLAGS -I$odbc_includes_dir" ++ fi ++ ++ if test "x$odbc_libraries_dir" != "x" ++ then ++ LIBS="$LIBS -L$odbc_libraries_dir" ++ fi ++ ++ AC_CHECK_HEADERS([sql.h sqlext.h sqlucode.h], ++ [odbc_ok=yes; odbc_headers="$odbc_headers $ac_hdr"], ++ [odbc_ok=no; break] ++ ) ++ ++ if test "x$odbc_ok" = "xyes" ++ then ++ AC_CHECK_LIB(odbc,SQLConnect,[odbc_ok=yes],[odbc_ok=no]) ++ fi ++else ++ odbc_ok=no + fi + + AC_MSG_CHECKING([whether unixODBC should be used]) +diff -Naur libodbc++-0.2.3/Makefile.in libodbc++-0.2.3-20050404/Makefile.in +--- libodbc++-0.2.3/Makefile.in 2003-06-17 12:20:50.000000000 +0200 ++++ libodbc++-0.2.3-20050404/Makefile.in 2005-04-04 18:21:09.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,92 +32,146 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = . + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + SUBDIRS = \ +@@ -151,15 +205,16 @@ + DATA = $(pkgconf_DATA) + + +-RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ +- uninstall-info-recursive all-recursive install-data-recursive \ +- install-exec-recursive installdirs-recursive install-recursive \ +- uninstall-recursive check-recursive installcheck-recursive +-DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \ +- Makefile.in NEWS THANKS TODO acinclude.m4 aclocal.m4 \ +- config.guess config.h.in config.sub configure configure.ac \ +- depcomp install-sh libodbc++.pc.in libodbc++.spec.in ltconfig \ +- ltmain.sh missing mkinstalldirs ++RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ++ ps-recursive install-info-recursive uninstall-info-recursive \ ++ all-recursive install-data-recursive install-exec-recursive \ ++ installdirs-recursive install-recursive uninstall-recursive \ ++ check-recursive installcheck-recursive ++DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/configure AUTHORS \ ++ COPYING ChangeLog INSTALL Makefile.am NEWS THANKS TODO \ ++ acinclude.m4 aclocal.m4 config.guess config.h.in config.sub \ ++ configure configure.ac depcomp install-sh libodbc++.pc.in \ ++ libodbc++.spec.in ltmain.sh missing mkinstalldirs + DIST_SUBDIRS = $(SUBDIRS) + all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive +@@ -285,10 +340,17 @@ + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done ++ctags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ ++ done + + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -304,9 +366,15 @@ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ ++ if (etags --etags-include --version) >/dev/null 2>&1; then \ ++ include_option=--etags-include; \ ++ else \ ++ include_option=--include; \ ++ fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ +- test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ ++ test -f $$subdir/TAGS && \ ++ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ +@@ -319,13 +387,28 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = . +@@ -337,13 +420,20 @@ + && rm -fr $(distdir); }; } + + GZIP_ENV = --best ++distuninstallcheck_listfiles = find . -type f -print + distcleancheck_listfiles = find . -type f -print + + distdir: $(DISTFILES) + $(am__remove_distdir) + mkdir $(distdir) + $(mkinstalldirs) $(distdir)/. $(distdir)/m4 +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -377,7 +467,7 @@ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ +- top_distdir="${top_distdir}" distdir="$(distdir)" \ ++ top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ +@@ -399,12 +489,13 @@ + $(am__remove_distdir) + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - + chmod -R a-w $(distdir); chmod a+w $(distdir) +- mkdir $(distdir)/=build +- mkdir $(distdir)/=inst ++ mkdir $(distdir)/_build ++ mkdir $(distdir)/_inst + chmod a-w $(distdir) +- dc_install_base=`$(am__cd) $(distdir)/=inst && pwd` \ +- && cd $(distdir)/=build \ +- && ../configure --srcdir=.. --prefix=$$dc_install_base \ ++ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ ++ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ ++ && cd $(distdir)/_build \ ++ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ +@@ -412,23 +503,39 @@ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ +- && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \ +- || { echo "ERROR: files left after uninstall:" ; \ +- find $$dc_install_base -type f -print ; \ +- exit 1; } >&2 ) \ ++ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ ++ distuninstallcheck \ ++ && chmod -R a-w "$$dc_install_base" \ ++ && ({ \ ++ (cd ../.. && $(mkinstalldirs) "$$dc_destdir") \ ++ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ ++ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ ++ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ ++ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ ++ } || { rm -rf "$$dc_destdir"; exit 1; }) \ ++ && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \ + && rm -f $(distdir).tar.gz \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @echo "$(distdir).tar.gz is ready for distribution" | \ + sed 'h;s/./=/g;p;x;p;x' ++distuninstallcheck: ++ @cd $(distuninstallcheck_dir) \ ++ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ ++ || { echo "ERROR: files left after uninstall:" ; \ ++ if test -n "$(DESTDIR)"; then \ ++ echo " (check DESTDIR support)"; \ ++ fi ; \ ++ $(distuninstallcheck_listfiles) ; \ ++ exit 1; } >&2 + distcleancheck: distclean +- if test '$(srcdir)' = . ; then \ ++ @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi +- test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ +- || { echo "ERROR: files left after distclean:" ; \ ++ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ ++ || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 + check-am: all-am +@@ -449,7 +556,7 @@ + installcheck: installcheck-recursive + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -457,7 +564,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -468,6 +575,7 @@ + + distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) ++ -rm -f Makefile + distclean-am: clean-am distclean-generic distclean-hdr distclean-libtool \ + distclean-tags + +@@ -491,22 +599,32 @@ + + maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) +- -rm -rf autom4te.cache ++ -rm -rf $(top_srcdir)/autom4te.cache ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-recursive + + mostlyclean-am: mostlyclean-generic mostlyclean-libtool + ++pdf: pdf-recursive ++ ++pdf-am: ++ ++ps: ps-recursive ++ ++ps-am: ++ + uninstall-am: uninstall-info-am uninstall-pkgconfDATA + + uninstall-info: uninstall-info-recursive + +-.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ +- clean-generic clean-libtool clean-recursive dist dist-all \ +- dist-gzip distcheck distclean distclean-generic distclean-hdr \ +- distclean-libtool distclean-recursive distclean-tags \ +- distcleancheck distdir dvi dvi-am dvi-recursive info info-am \ ++.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ ++ clean-generic clean-libtool clean-recursive ctags \ ++ ctags-recursive dist dist-all dist-gzip distcheck distclean \ ++ distclean-generic distclean-hdr distclean-libtool \ ++ distclean-recursive distclean-tags distcleancheck distdir \ ++ distuninstallcheck dvi dvi-am dvi-recursive info info-am \ + info-recursive install install-am install-data install-data-am \ + install-data-recursive install-exec install-exec-am \ + install-exec-recursive install-info install-info-am \ +@@ -515,7 +633,8 @@ + installdirs installdirs-am installdirs-recursive \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ +- mostlyclean-libtool mostlyclean-recursive tags tags-recursive \ ++ mostlyclean-libtool mostlyclean-recursive pdf pdf-am \ ++ pdf-recursive ps ps-am ps-recursive tags tags-recursive \ + uninstall uninstall-am uninstall-info-am \ + uninstall-info-recursive uninstall-pkgconfDATA \ + uninstall-recursive +diff -Naur libodbc++-0.2.3/missing libodbc++-0.2.3-20050404/missing +--- libodbc++-0.2.3/missing 2003-03-28 16:57:10.000000000 +0100 ++++ libodbc++-0.2.3-20050404/missing 2005-04-04 18:10:27.000000000 +0200 +@@ -1,6 +1,6 @@ + #! /bin/sh + # Common stub for a few missing GNU programs while installing. +-# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. ++# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + # Originally by Fran,cois Pinard , 1996. + + # This program is free software; you can redistribute it and/or modify +@@ -165,7 +165,7 @@ + WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. +- You can get \`$1Help2man' as part of \`Autoconf' from any GNU ++ You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` +@@ -326,7 +326,7 @@ + WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, +- it often tells you about the needed prerequirements for installing ++ it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 +diff -Naur libodbc++-0.2.3/mkinstalldirs libodbc++-0.2.3-20050404/mkinstalldirs +--- libodbc++-0.2.3/mkinstalldirs 2003-03-28 16:57:10.000000000 +0100 ++++ libodbc++-0.2.3-20050404/mkinstalldirs 2005-04-04 18:10:27.000000000 +0200 +@@ -4,8 +4,6 @@ + # Created: 1993-05-16 + # Public domain + +-# $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ +- + errstatus=0 + dirmode="" + +@@ -14,18 +12,29 @@ + + # process command line arguments + while test $# -gt 0 ; do +- case "${1}" in +- -h | --help | --h* ) # -h for help +- echo "${usage}" 1>&2; exit 0 ;; +- -m ) # -m PERM arg +- shift +- test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } +- dirmode="${1}" +- shift ;; +- -- ) shift; break ;; # stop option processing +- -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option +- * ) break ;; # first non-opt arg +- esac ++ case $1 in ++ -h | --help | --h*) # -h for help ++ echo "$usage" 1>&2 ++ exit 0 ++ ;; ++ -m) # -m PERM arg ++ shift ++ test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } ++ dirmode=$1 ++ shift ++ ;; ++ --) # stop option processing ++ shift ++ break ++ ;; ++ -*) # unknown option ++ echo "$usage" 1>&2 ++ exit 1 ++ ;; ++ *) # first non-opt arg ++ break ++ ;; ++ esac + done + + for file +@@ -38,64 +47,65 @@ + done + + case $# in +-0) exit 0 ;; ++ 0) exit 0 ;; + esac + + case $dirmode in +-'') +- if mkdir -p -- . 2>/dev/null; then +- echo "mkdir -p -- $*" +- exec mkdir -p -- "$@" +- fi ;; +-*) +- if mkdir -m "$dirmode" -p -- . 2>/dev/null; then +- echo "mkdir -m $dirmode -p -- $*" +- exec mkdir -m "$dirmode" -p -- "$@" +- fi ;; ++ '') ++ if mkdir -p -- . 2>/dev/null; then ++ echo "mkdir -p -- $*" ++ exec mkdir -p -- "$@" ++ fi ++ ;; ++ *) ++ if mkdir -m "$dirmode" -p -- . 2>/dev/null; then ++ echo "mkdir -m $dirmode -p -- $*" ++ exec mkdir -m "$dirmode" -p -- "$@" ++ fi ++ ;; + esac + + for file + do +- set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` +- shift ++ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` ++ shift + +- pathcomp= +- for d +- do +- pathcomp="$pathcomp$d" +- case "$pathcomp" in +- -* ) pathcomp=./$pathcomp ;; +- esac +- +- if test ! -d "$pathcomp"; then +- echo "mkdir $pathcomp" +- +- mkdir "$pathcomp" || lasterr=$? +- +- if test ! -d "$pathcomp"; then +- errstatus=$lasterr +- else +- if test ! -z "$dirmode"; then +- echo "chmod $dirmode $pathcomp" +- +- lasterr="" +- chmod "$dirmode" "$pathcomp" || lasterr=$? +- +- if test ! -z "$lasterr"; then +- errstatus=$lasterr +- fi +- fi +- fi +- fi ++ pathcomp= ++ for d ++ do ++ pathcomp="$pathcomp$d" ++ case $pathcomp in ++ -*) pathcomp=./$pathcomp ;; ++ esac ++ ++ if test ! -d "$pathcomp"; then ++ echo "mkdir $pathcomp" ++ ++ mkdir "$pathcomp" || lasterr=$? ++ ++ if test ! -d "$pathcomp"; then ++ errstatus=$lasterr ++ else ++ if test ! -z "$dirmode"; then ++ echo "chmod $dirmode $pathcomp" ++ lasterr="" ++ chmod "$dirmode" "$pathcomp" || lasterr=$? ++ ++ if test ! -z "$lasterr"; then ++ errstatus=$lasterr ++ fi ++ fi ++ fi ++ fi + +- pathcomp="$pathcomp/" +- done ++ pathcomp="$pathcomp/" ++ done + done + + exit $errstatus + + # Local Variables: + # mode: shell-script +-# sh-indentation: 3 ++# sh-indentation: 2 + # End: + # mkinstalldirs ends here +diff -Naur libodbc++-0.2.3/NEWS libodbc++-0.2.3-20050404/NEWS +--- libodbc++-0.2.3/NEWS 2003-06-17 12:08:02.000000000 +0200 ++++ libodbc++-0.2.3-20050404/NEWS 2003-06-19 13:24:16.000000000 +0200 +@@ -1,3 +1,7 @@ ++* News in version 0.2.3 ++ ++ * Fixed compilation with Borland C++ Builder ++ + * News in version 0.2.3pre4 + + * Fix time_t support in MSVC++ builds +diff -Naur libodbc++-0.2.3/qtsql++/Makefile.in libodbc++-0.2.3-20050404/qtsql++/Makefile.in +--- libodbc++-0.2.3/qtsql++/Makefile.in 2003-06-17 12:20:51.000000000 +0200 ++++ libodbc++-0.2.3-20050404/qtsql++/Makefile.in 2005-04-04 18:21:24.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,101 +32,154 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = .. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ @QT_DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + + INCLUDES = @INCLUDES@ $(QT_INCLUDES) ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + @BUILD_QTSQLXX_TRUE@bin_PROGRAMS = qtsql++ + @BUILD_QTSQLXX_FALSE@EXTRA_PROGRAMS = qtsql++ ++@THREADS_FALSE@thelib = ../src/libodbc++_qt.la + + @THREADS_TRUE@thelib = ../src/libodbc++_qt-mt.la +-@THREADS_FALSE@thelib = ../src/libodbc++_qt.la +-DEFS = @DEFS@ @QT_DEFS@ + + MOCS = \ + mainwindow.moc.cpp \ +@@ -152,6 +205,7 @@ + + CLEANFILES = $(MOCS) + subdir = qtsql++ ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = +@@ -170,10 +224,8 @@ + @THREADS_TRUE@qtsql___DEPENDENCIES = ../src/libodbc++_qt-mt.la + @THREADS_FALSE@qtsql___DEPENDENCIES = ../src/libodbc++_qt.la + qtsql___LDFLAGS = ++ + DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +-CPPFLAGS = @CPPFLAGS@ +-LDFLAGS = @LDFLAGS@ +-LIBS = @LIBS@ + depcomp = $(SHELL) $(top_srcdir)/depcomp + am__depfiles_maybe = depfiles + @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/connectwindow.Po \ +@@ -190,8 +242,6 @@ + CXXLD = $(CXX) + CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-CXXFLAGS = @CXXFLAGS@ +-CFLAGS = @CFLAGS@ + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) + LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ +@@ -200,7 +250,7 @@ + LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + DIST_SOURCES = $(dist_qtsql___SOURCES) +-DIST_COMMON = Makefile.am Makefile.in ++DIST_COMMON = $(srcdir)/Makefile.in Makefile.am + SOURCES = $(dist_qtsql___SOURCES) $(nodist_qtsql___SOURCES) + + all: all-am +@@ -223,7 +273,7 @@ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ +- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f; \ ++ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \ + else :; fi; \ + done + +@@ -259,27 +309,38 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resultwindow.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resultwindow.moc.Po@am__quote@ + +-distclean-depend: +- -rm -rf ./$(DEPDIR) +- + .cpp.o: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + .cpp.obj: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `cygpath -w $<` ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` + + .cpp.lo: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< +-CXXDEPMODE = @CXXDEPMODE@ ++@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + mostlyclean-libtool: + -rm -f *.lo +@@ -294,6 +355,9 @@ + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -319,20 +383,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = .. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -358,7 +443,6 @@ + + installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) +- + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -370,7 +454,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -379,7 +463,7 @@ + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -389,9 +473,10 @@ + clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + + distclean: distclean-am +- +-distclean-am: clean-am distclean-compile distclean-depend \ +- distclean-generic distclean-libtool distclean-tags ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags + + dvi: dvi-am + +@@ -412,7 +497,8 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-am +- ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-am +@@ -420,19 +506,27 @@ + mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ + uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +-.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \ +- clean-generic clean-libtool distclean distclean-compile \ +- distclean-depend distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am info info-am install \ +- install-am install-binPROGRAMS install-data install-data-am \ +- install-exec install-exec-am install-info install-info-am \ +- install-man install-strip installcheck installcheck-am \ +- installdirs maintainer-clean maintainer-clean-generic \ +- mostlyclean mostlyclean-compile mostlyclean-generic \ +- mostlyclean-libtool tags uninstall uninstall-am \ +- uninstall-binPROGRAMS uninstall-info-am ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ ++ clean-generic clean-libtool ctags distclean distclean-compile \ ++ distclean-generic distclean-libtool distclean-tags distdir dvi \ ++ dvi-am info info-am install install-am install-binPROGRAMS \ ++ install-data install-data-am install-exec install-exec-am \ ++ install-info install-info-am install-man install-strip \ ++ installcheck installcheck-am installdirs maintainer-clean \ ++ maintainer-clean-generic mostlyclean mostlyclean-compile \ ++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ ++ tags uninstall uninstall-am uninstall-binPROGRAMS \ ++ uninstall-info-am + + + %.moc.cpp : %.h +diff -Naur libodbc++-0.2.3/src/datastream.h libodbc++-0.2.3-20050404/src/datastream.h +--- libodbc++-0.2.3/src/datastream.h 2003-04-21 18:28:38.000000000 +0200 ++++ libodbc++-0.2.3-20050404/src/datastream.h 2003-12-16 11:45:14.000000000 +0100 +@@ -63,7 +63,7 @@ + return 0; + } + +- virtual int showmanyc() { ++ virtual std::streamsize showmanyc() { + if(this->gptr() < this->egptr()) { + return this->egptr() - this->gptr(); + } +diff -Naur libodbc++-0.2.3/src/drivermanager.cpp libodbc++-0.2.3-20050404/src/drivermanager.cpp +--- libodbc++-0.2.3/src/drivermanager.cpp 2001-06-12 12:38:31.000000000 +0200 ++++ libodbc++-0.2.3-20050404/src/drivermanager.cpp 2005-02-27 23:37:23.000000000 +0100 +@@ -1,18 +1,18 @@ +-/* ++/* + This file is part of libodbc++. +- ++ + Copyright (C) 1999-2000 Manush Dodunekov +- ++ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. +- ++ + This library 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 + Library General Public License for more details. +- ++ + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +@@ -35,46 +35,60 @@ + int DriverManager::loginTimeout_=-1; + + +-// Note: this will probably not work in all cases, ++// Note: this will probably not work in all cases, + // static constructors are known to cause problems + + #ifdef ODBCXX_ENABLE_THREADS + +-static odbc::Mutex DMAccess; ++#define DMAccess DMAccessMutex() + +-#endif /* ODBCXX_ENABLE_THREADS */ ++odbc::Mutex & DMAccessMutex(bool shutdown=0) ++{ ++ static odbc::Mutex* mtx = new odbc::Mutex(); ++ if ( shutdown ) { ++ delete mtx; ++ mtx = 0; ++ } ++ return *mtx; ++} + ++#endif /* ODBCXX_ENABLE_THREADS */ + + void DriverManager::shutdown() + { +- ODBCXX_LOCKER(DMAccess); ++ { ++ ODBCXX_LOCKER(DMAccess); + +- if(henv_!=SQL_NULL_HENV) { ++ if(henv_!=SQL_NULL_HENV) { + +- SQLRETURN r=ODBC3_C +- (SQLFreeHandle(SQL_HANDLE_ENV, henv_), +- SQLFreeEnv(henv_)); +- +- switch(r) { +- case SQL_SUCCESS: +- break; +- +- case SQL_INVALID_HANDLE: +- // the check above should prevent this +- assert(false); +- break; +- +- case SQL_ERROR: +- // try to obtain an error description +- eh_->_checkEnvError(henv_, r, "Failed to shutdown DriverManager"); +- break; +- } ++ SQLRETURN r=ODBC3_C ++ (SQLFreeHandle(SQL_HANDLE_ENV, henv_), ++ SQLFreeEnv(henv_)); ++ ++ switch(r) { ++ case SQL_SUCCESS: ++ break; ++ ++ case SQL_INVALID_HANDLE: ++ // the check above should prevent this ++ assert(false); ++ break; ++ ++ case SQL_ERROR: ++ // try to obtain an error description ++ eh_->_checkEnvError(henv_, r, "Failed to shutdown DriverManager"); ++ break; ++ } + +- henv_=SQL_NULL_HENV; +- //if henv_ was valid, so is eh_ +- delete eh_; +- eh_=NULL; ++ henv_=SQL_NULL_HENV; ++ //if henv_ was valid, so is eh_ ++ delete eh_; ++ eh_=NULL; ++ } + } ++ ++ // remove the mutex as we can't rely on static destructors ++ DMAccessMutex(1); + } + + +@@ -129,7 +143,7 @@ + { + SQLHDBC hdbc; + SQLRETURN r; +- ++ + //allocate a handle + r= + #if ODBCVER >= 0x0300 +@@ -140,21 +154,21 @@ + ; + + eh_->_checkEnvError(henv_,r,"Failed to allocate connection handle"); +- ++ + Connection* con=new Connection(hdbc); + { + ODBCXX_LOCKER(DMAccess); //since we read loginTimeout_ +- ++ + //apply the login timeout. -1 means do-not-touch (the default) + if(loginTimeout_>-1) { +- ++ + con->_setNumericOption( + #if ODBCVER < 0x0300 + SQL_LOGIN_TIMEOUT + #else + SQL_ATTR_LOGIN_TIMEOUT + #endif +- ++ + ,(SQLUINTEGER)loginTimeout_); + } + } // end of lock scope +@@ -189,10 +203,10 @@ + DataSourceList* DriverManager::getDataSources() + { + DriverManager::_checkInit(); +- ++ + SQLRETURN r; + SQLSMALLINT dsnlen,desclen; +- ++ + DataSourceList* l=new DataSourceList(); + + char dsn[SQL_MAX_DSN_LENGTH+1]; +@@ -208,12 +222,12 @@ + (SQLCHAR*)desc, + 256, + &desclen); +- ++ + eh_->_checkEnvError(henv_,r,"Failed to obtain a list of datasources"); +- ++ + while(r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO) { + l->insert(l->end(),new DataSource(dsn,desc)); +- ++ + r=SQLDataSources(henv_, + SQL_FETCH_NEXT, + (SQLCHAR*)dsn, +@@ -222,7 +236,7 @@ + (SQLCHAR*)desc, + 256, + &desclen); +- ++ + eh_->_checkEnvError(henv_,r,"Failed to obtain a list of datasources"); + } + } // lock scope end +@@ -230,7 +244,7 @@ + } + + #define MAX_DESC_LEN 64 +-#define MAX_ATTR_LEN 1024 ++#define MAX_ATTR_LEN 1024 + + DriverList* DriverManager::getDrivers() + { +@@ -239,7 +253,7 @@ + SQLRETURN r; + DriverList* l=new DriverList(); + +- ++ + char desc[MAX_DESC_LEN]; + char attrs[MAX_ATTR_LEN]; + +@@ -255,13 +269,13 @@ + (SQLCHAR*)attrs, + MAX_ATTR_LEN, + &alen); +- ++ + eh_->_checkEnvError(henv_,r,"Failed to obtain a list of drivers"); +- ++ + while(r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO) { + vector attr; + unsigned int i=0, last=0; +- ++ + //find our attributes + if(attrs[0]!=0) { + do { +@@ -270,10 +284,10 @@ + last=i+1; + } while(attrs[last]!=0); + } +- ++ + Driver* d=new Driver(desc,attr); + l->insert(l->end(),d); +- ++ + r=SQLDrivers(henv_, + SQL_FETCH_NEXT, + (SQLCHAR*)desc, +@@ -282,10 +296,10 @@ + (SQLCHAR*)attrs, + MAX_ATTR_LEN, + &alen); +- ++ + eh_->_checkEnvError(henv_,r,"Failed to obtain a list of drivers"); + } + } // lock scope end +- ++ + return l; + } +diff -Naur libodbc++-0.2.3/src/Makefile.in libodbc++-0.2.3-20050404/src/Makefile.in +--- libodbc++-0.2.3/src/Makefile.in 2003-06-17 12:20:52.000000000 +0200 ++++ libodbc++-0.2.3-20050404/src/Makefile.in 2005-04-04 18:21:23.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,92 +32,149 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = .. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++ ++ ++# confusing conditionals follow ++DEFS = @DEFS@ @QT_DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ @QT_INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + sources = \ +@@ -143,15 +200,14 @@ + + ldflags = -version-info @lib_version@ + +- +-# confusing conditionals follow +-DEFS = @DEFS@ @QT_DEFS@ +- + @QT_FALSE@@THREADS_TRUE@lib_LTLIBRARIES = libodbc++-mt.la +-@QT_FALSE@@THREADS_FALSE@lib_LTLIBRARIES = libodbc++.la ++ + @QT_TRUE@@THREADS_TRUE@lib_LTLIBRARIES = libodbc++_qt-mt.la ++ + @QT_TRUE@@THREADS_FALSE@lib_LTLIBRARIES = libodbc++_qt.la + ++@QT_FALSE@@THREADS_FALSE@lib_LTLIBRARIES = libodbc++.la ++ + libodbc___mt_la_SOURCES = $(sources) + libodbc___mt_la_LDFLAGS = $(ldflags) + libodbc___mt_la_LIBADD = @THREAD_LIBS@ +@@ -167,6 +223,7 @@ + libodbc___qt_mt_la_LDFLAGS = $(ldflags) + libodbc___qt_mt_la_LIBADD = @THREAD_LIBS@ @QT_LIBS@ + subdir = src ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = +@@ -189,10 +246,8 @@ + libodbc___qt_la_DEPENDENCIES = + am_libodbc___qt_la_OBJECTS = $(am__objects_1) + libodbc___qt_la_OBJECTS = $(am_libodbc___qt_la_OBJECTS) ++ + DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +-CPPFLAGS = @CPPFLAGS@ +-LDFLAGS = @LDFLAGS@ +-LIBS = @LIBS@ + depcomp = $(SHELL) $(top_srcdir)/depcomp + am__depfiles_maybe = depfiles + @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/callablestatement.Plo \ +@@ -215,8 +270,6 @@ + CXXLD = $(CXX) + CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-CXXFLAGS = @CXXFLAGS@ +-CFLAGS = @CFLAGS@ + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) + LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ +@@ -226,7 +279,7 @@ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + DIST_SOURCES = $(libodbc___mt_la_SOURCES) $(libodbc___la_SOURCES) \ + $(libodbc___qt_mt_la_SOURCES) $(libodbc___qt_la_SOURCES) +-DIST_COMMON = Makefile.am Makefile.in ++DIST_COMMON = $(srcdir)/Makefile.in Makefile.am + SOURCES = $(libodbc___mt_la_SOURCES) $(libodbc___la_SOURCES) $(libodbc___qt_mt_la_SOURCES) $(libodbc___qt_la_SOURCES) + + all: all-am +@@ -262,7 +315,7 @@ + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test -z "$dir" && dir=.; \ ++ test "$$dir" = "$$p" && dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +@@ -296,27 +349,38 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statement.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threads.Plo@am__quote@ + +-distclean-depend: +- -rm -rf ./$(DEPDIR) +- + .cpp.o: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + .cpp.obj: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `cygpath -w $<` ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` + + .cpp.lo: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< +-CXXDEPMODE = @CXXDEPMODE@ ++@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + mostlyclean-libtool: + -rm -f *.lo +@@ -331,6 +395,9 @@ + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -356,20 +423,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = .. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -395,7 +483,6 @@ + + installdirs: + $(mkinstalldirs) $(DESTDIR)$(libdir) +- + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -407,7 +494,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -415,7 +502,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -426,9 +513,10 @@ + mostlyclean-am + + distclean: distclean-am +- +-distclean-am: clean-am distclean-compile distclean-depend \ +- distclean-generic distclean-libtool distclean-tags ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags + + dvi: dvi-am + +@@ -449,7 +537,8 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-am +- ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-am +@@ -457,19 +546,28 @@ + mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ + uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES + +-.PHONY: GTAGS all all-am check check-am clean clean-generic \ +- clean-libLTLIBRARIES clean-libtool distclean distclean-compile \ +- distclean-depend distclean-generic distclean-libtool \ ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ++ clean-libLTLIBRARIES clean-libtool ctags distclean \ ++ distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ +- mostlyclean-generic mostlyclean-libtool tags uninstall \ +- uninstall-am uninstall-info-am uninstall-libLTLIBRARIES ++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ ++ tags uninstall uninstall-am uninstall-info-am \ ++ uninstall-libLTLIBRARIES + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. +diff -Naur libodbc++-0.2.3/tests/Makefile.in libodbc++-0.2.3-20050404/tests/Makefile.in +--- libodbc++-0.2.3/tests/Makefile.in 2003-06-17 12:20:52.000000000 +0200 ++++ libodbc++-0.2.3-20050404/tests/Makefile.in 2005-04-04 18:21:24.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,93 +32,147 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = .. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ @QT_DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + + INCLUDES = @INCLUDES@ @QT_INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + @BUILD_TESTS_TRUE@noinst_PROGRAMS = \ +@@ -129,13 +183,15 @@ + @BUILD_TESTS_TRUE@mysql \ + @BUILD_TESTS_TRUE@dmtest + +-DEFS = @DEFS@ @QT_DEFS@ + + @QT_FALSE@@THREADS_TRUE@testlibs = @THREAD_LIBS@ ../src/libodbc++-mt.la +-@QT_FALSE@@THREADS_FALSE@testlibs = ../src/libodbc++.la ++ + @QT_TRUE@@THREADS_TRUE@testlibs = @THREAD_LIBS@ ../src/libodbc++_qt-mt.la ++ + @QT_TRUE@@THREADS_FALSE@testlibs = ../src/libodbc++_qt.la + ++@QT_FALSE@@THREADS_FALSE@testlibs = ../src/libodbc++.la ++ + scroll_SOURCES = scroll.cpp + scroll_LDADD = $(testlibs) + +@@ -156,6 +212,7 @@ + + EXTRA_DIST = README + subdir = tests ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = +@@ -208,10 +265,8 @@ + @QT_TRUE@@THREADS_TRUE@streams_DEPENDENCIES = ../src/libodbc++_qt-mt.la + @QT_TRUE@@THREADS_FALSE@streams_DEPENDENCIES = ../src/libodbc++_qt.la + streams_LDFLAGS = ++ + DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +-CPPFLAGS = @CPPFLAGS@ +-LDFLAGS = @LDFLAGS@ +-LIBS = @LIBS@ + depcomp = $(SHELL) $(top_srcdir)/depcomp + am__depfiles_maybe = depfiles + @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/dbmetadata.Po ./$(DEPDIR)/dmtest.Po \ +@@ -225,10 +280,9 @@ + CXXLD = $(CXX) + CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-CXXFLAGS = @CXXFLAGS@ + DIST_SOURCES = $(dbmetadata_SOURCES) $(dmtest_SOURCES) $(mysql_SOURCES) \ + $(oracle_SOURCES) $(scroll_SOURCES) $(streams_SOURCES) +-DIST_COMMON = README Makefile.am Makefile.in ++DIST_COMMON = README $(srcdir)/Makefile.in Makefile.am + SOURCES = $(dbmetadata_SOURCES) $(dmtest_SOURCES) $(mysql_SOURCES) $(oracle_SOURCES) $(scroll_SOURCES) $(streams_SOURCES) + + all: all-am +@@ -279,27 +333,38 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scroll.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/streams.Po@am__quote@ + +-distclean-depend: +- -rm -rf ./$(DEPDIR) +- + .cpp.o: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + .cpp.obj: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(CXXCOMPILE) -c -o $@ `cygpath -w $<` ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` + + .cpp.lo: +-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< +-CXXDEPMODE = @CXXDEPMODE@ ++@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ ++@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; \ ++@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ ++@am__fastdepCXX_TRUE@ fi ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + + mostlyclean-libtool: + -rm -f *.lo +@@ -314,6 +379,9 @@ + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -339,20 +407,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = .. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -377,7 +466,6 @@ + all-am: Makefile $(PROGRAMS) + + installdirs: +- + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -389,7 +477,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -397,7 +485,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -408,9 +496,10 @@ + mostlyclean-am + + distclean: distclean-am +- +-distclean-am: clean-am distclean-compile distclean-depend \ +- distclean-generic distclean-libtool distclean-tags ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags + + dvi: dvi-am + +@@ -431,7 +520,8 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-am +- ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-am +@@ -439,18 +529,26 @@ + mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ + uninstall-am: uninstall-info-am + +-.PHONY: GTAGS all all-am check check-am clean clean-generic \ +- clean-libtool clean-noinstPROGRAMS distclean distclean-compile \ +- distclean-depend distclean-generic distclean-libtool \ ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ++ clean-libtool clean-noinstPROGRAMS ctags distclean \ ++ distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ +- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ +- tags uninstall uninstall-am uninstall-info-am ++ mostlyclean-compile mostlyclean-generic mostlyclean-libtool pdf \ ++ pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. +diff -Naur libodbc++-0.2.3/win32/Makefile.in libodbc++-0.2.3-20050404/win32/Makefile.in +--- libodbc++-0.2.3/win32/Makefile.in 2003-06-17 12:20:52.000000000 +0200 ++++ libodbc++-0.2.3-20050404/win32/Makefile.in 2005-04-04 18:21:29.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,108 +32,164 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = .. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + SUBDIRS = tests + + EXTRA_DIST = Makefile.w32 + subdir = win32 ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = + DIST_SOURCES = + +-RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ +- uninstall-info-recursive all-recursive install-data-recursive \ +- install-exec-recursive installdirs-recursive install-recursive \ +- uninstall-recursive check-recursive installcheck-recursive +-DIST_COMMON = Makefile.am Makefile.in ++RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ++ ps-recursive install-info-recursive uninstall-info-recursive \ ++ all-recursive install-data-recursive install-exec-recursive \ ++ installdirs-recursive install-recursive uninstall-recursive \ ++ check-recursive installcheck-recursive ++DIST_COMMON = $(srcdir)/Makefile.in Makefile.am + DIST_SUBDIRS = $(SUBDIRS) + all: all-recursive + +@@ -208,10 +264,17 @@ + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done ++ctags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ ++ done + + ETAGS = etags + ETAGSFLAGS = + ++CTAGS = ctags ++CTAGSFLAGS = ++ + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +@@ -227,9 +290,15 @@ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ ++ if (etags --etags-include --version) >/dev/null 2>&1; then \ ++ include_option=--etags-include; \ ++ else \ ++ include_option=--include; \ ++ fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ +- test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ ++ test -f $$subdir/TAGS && \ ++ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +@@ -242,20 +311,41 @@ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + ++ctags: CTAGS ++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ + GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + + distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = .. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -305,7 +395,7 @@ + installcheck: installcheck-recursive + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -313,7 +403,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -323,7 +413,7 @@ + clean-am: clean-generic clean-libtool mostlyclean-am + + distclean: distclean-recursive +- ++ -rm -f Makefile + distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +@@ -346,30 +436,40 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-recursive +- ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-recursive + + mostlyclean-am: mostlyclean-generic mostlyclean-libtool + ++pdf: pdf-recursive ++ ++pdf-am: ++ ++ps: ps-recursive ++ ++ps-am: ++ + uninstall-am: uninstall-info-am + + uninstall-info: uninstall-info-recursive + +-.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ +- clean-generic clean-libtool clean-recursive distclean \ +- distclean-generic distclean-libtool distclean-recursive \ +- distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ +- info-recursive install install-am install-data install-data-am \ +- install-data-recursive install-exec install-exec-am \ +- install-exec-recursive install-info install-info-am \ +- install-info-recursive install-man install-recursive \ +- install-strip installcheck installcheck-am installdirs \ +- installdirs-am installdirs-recursive maintainer-clean \ +- maintainer-clean-generic maintainer-clean-recursive mostlyclean \ +- mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ +- tags tags-recursive uninstall uninstall-am uninstall-info-am \ ++.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ ++ clean-generic clean-libtool clean-recursive ctags \ ++ ctags-recursive distclean distclean-generic distclean-libtool \ ++ distclean-recursive distclean-tags distdir dvi dvi-am \ ++ dvi-recursive info info-am info-recursive install install-am \ ++ install-data install-data-am install-data-recursive \ ++ install-exec install-exec-am install-exec-recursive \ ++ install-info install-info-am install-info-recursive install-man \ ++ install-recursive install-strip installcheck installcheck-am \ ++ installdirs installdirs-am installdirs-recursive \ ++ maintainer-clean maintainer-clean-generic \ ++ maintainer-clean-recursive mostlyclean mostlyclean-generic \ ++ mostlyclean-libtool mostlyclean-recursive pdf pdf-am \ ++ pdf-recursive ps ps-am ps-recursive tags tags-recursive \ ++ uninstall uninstall-am uninstall-info-am \ + uninstall-info-recursive uninstall-recursive + + # Tell versions [3.59,3.63) of GNU make to not export all variables. +diff -Naur libodbc++-0.2.3/win32/tests/Makefile.in libodbc++-0.2.3-20050404/win32/tests/Makefile.in +--- libodbc++-0.2.3/win32/tests/Makefile.in 2003-06-17 12:20:53.000000000 +0200 ++++ libodbc++-0.2.3-20050404/win32/tests/Makefile.in 2005-04-04 18:21:30.000000000 +0200 +@@ -1,7 +1,7 @@ +-# Makefile.in generated by automake 1.6.3 from Makefile.am. ++# Makefile.in generated by automake 1.7.9 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + # Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -32,101 +32,156 @@ + # along with this library; see the file COPYING. If not, write to + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. +-SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +-prefix = @prefix@ +-exec_prefix = @exec_prefix@ +- +-bindir = @bindir@ +-sbindir = @sbindir@ +-libexecdir = @libexecdir@ +-datadir = @datadir@ +-sysconfdir = @sysconfdir@ +-sharedstatedir = @sharedstatedir@ +-localstatedir = @localstatedir@ +-libdir = @libdir@ +-infodir = @infodir@ +-mandir = @mandir@ +-includedir = @includedir@ +-oldincludedir = /usr/include + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = ../.. + +-ACLOCAL = @ACLOCAL@ +-AUTOCONF = @AUTOCONF@ +-AUTOMAKE = @AUTOMAKE@ +-AUTOHEADER = @AUTOHEADER@ +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ +-INSTALL_PROGRAM = @INSTALL_PROGRAM@ +-INSTALL_DATA = @INSTALL_DATA@ + install_sh_DATA = $(install_sh) -c -m 644 + install_sh_PROGRAM = $(install_sh) -c + install_sh_SCRIPT = $(install_sh) -c +-INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_HEADER = $(INSTALL_DATA) +-transform = @program_transform_name@ ++transform = $(program_transform_name) + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : +-host_alias = @host_alias@ + host_triplet = @host@ +- +-EXEEXT = @EXEEXT@ +-OBJEXT = @OBJEXT@ +-PATH_SEPARATOR = @PATH_SEPARATOR@ ++ACLOCAL = @ACLOCAL@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ + AMTAR = @AMTAR@ +-AS = @AS@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ + AWK = @AWK@ ++BUILD_ISQLXX_FALSE = @BUILD_ISQLXX_FALSE@ ++BUILD_ISQLXX_TRUE = @BUILD_ISQLXX_TRUE@ ++BUILD_QTSQLXX_FALSE = @BUILD_QTSQLXX_FALSE@ ++BUILD_QTSQLXX_TRUE = @BUILD_QTSQLXX_TRUE@ ++BUILD_TESTS_FALSE = @BUILD_TESTS_FALSE@ ++BUILD_TESTS_TRUE = @BUILD_TESTS_TRUE@ + CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ + DEPDIR = @DEPDIR@ +-DLLTOOL = @DLLTOOL@ + ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ + INCLUDES = @INCLUDES@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++LDFLAGS = @LDFLAGS@ ++LIBOBJS = @LIBOBJS@ + LIBREADLINE = @LIBREADLINE@ ++LIBS = @LIBS@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ +-OBJDUMP = @OBJDUMP@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ + QT_DEFS = @QT_DEFS@ ++QT_FALSE = @QT_FALSE@ + QT_INCLUDES = @QT_INCLUDES@ + QT_LIBS = @QT_LIBS@ + QT_MOC = @QT_MOC@ ++QT_TRUE = @QT_TRUE@ + RANLIB = @RANLIB@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ + STRIP = @STRIP@ ++THREADS_FALSE = @THREADS_FALSE@ ++THREADS_TRUE = @THREADS_TRUE@ + THREAD_LIBS = @THREAD_LIBS@ + VERSION = @VERSION@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ + am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ + bzip2 = @bzip2@ ++datadir = @datadir@ + db2html = @db2html@ + docdir = @docdir@ + doxygen = @doxygen@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ + install_sh = @install_sh@ + lib_version = @lib_version@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++oldincludedir = @oldincludedir@ + perl = @perl@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ + sed = @sed@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ + zip = @zip@ + + EXTRA_DIST = Makefile.w32 + subdir = win32/tests ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = + DIST_SOURCES = +-DIST_COMMON = Makefile.am Makefile.in ++DIST_COMMON = $(srcdir)/Makefile.in Makefile.am + all: all-am + + .SUFFIXES: +@@ -148,13 +203,22 @@ + tags: TAGS + TAGS: + ++ctags: CTAGS ++CTAGS: ++ + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + + top_distdir = ../.. + distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + + distdir: $(DISTFILES) +- @list='$(DISTFILES)'; for file in $$list; do \ ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +@@ -179,7 +243,6 @@ + all-am: Makefile + + installdirs: +- + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -191,7 +254,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -199,7 +262,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -209,7 +272,7 @@ + clean-am: clean-generic clean-libtool mostlyclean-am + + distclean: distclean-am +- ++ -rm -f Makefile + distclean-am: clean-am distclean-generic distclean-libtool + + dvi: dvi-am +@@ -231,13 +294,21 @@ + installcheck-am: + + maintainer-clean: maintainer-clean-am +- ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-am + + mostlyclean-am: mostlyclean-generic mostlyclean-libtool + ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ + uninstall-am: uninstall-info-am + + .PHONY: all all-am check check-am clean clean-generic clean-libtool \ +@@ -247,7 +318,8 @@ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ +- mostlyclean-libtool uninstall uninstall-am uninstall-info-am ++ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ ++ uninstall-info-am + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-dont-install-some-docs.patch b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-dont-install-some-docs.patch new file mode 100644 index 000000000..8bbf50a2d --- /dev/null +++ b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-dont-install-some-docs.patch @@ -0,0 +1,180 @@ +diff -Naur libodbc++-0.2.3-20050404/doc/Makefile.am libodbc++-0.2.3-20050404-dont-install-some-docs/doc/Makefile.am +--- libodbc++-0.2.3-20050404/doc/Makefile.am 2001-06-12 12:38:12.000000000 +0200 ++++ libodbc++-0.2.3-20050404-dont-install-some-docs/doc/Makefile.am 2005-04-04 21:16:50.447164392 +0200 +@@ -17,41 +17,6 @@ + # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. + +-instdoc_dir=@docdir@/@PACKAGE@-@VERSION@/INSTALL +- +-instdoc_name=INSTALL +- + SUBDIRS=progref + +-all-local: $(instdoc_name) +- +-$(instdoc_name): $(instdoc_name).sgml +- test -z "$(db2html)" && mkdir $@ || $(db2html) $< +- +-maintainer-clean-local: +- rm -rf $(instdoc_name) +- +-clean-local: +- rm -rf $(instdoc_name).junk DBTOHTML_OUTPUT_DIR* +- +-dist-hook: all-local +- cp -r $(srcdir)/$(instdoc_name) $(distdir) +- +-install-data-local: +- $(mkinstalldirs) $(DESTDIR)$(instdoc_dir) $(DESTDIR)$(instdoc_dir)/stylesheet-images +- for i in $(srcdir)/$(instdoc_name)/*; do \ +- fn=`basename $$i` \ +- $(INSTALL_DATA) $$i $(DESTDIR)$(instdoc_dir)/$$fn; \ +- done +- for i in $(srcdir)/$(instdoc_name)/stylesheet-images/*; do \ +- fn=`basename $$i` \ +- $(INSTALL_DATA) $$i $(DESTDIR)$(instdoc_dir)/stylesheet-images/$$fn; \ +- done +- +-uninstall-local: +- if test -d $(DESTDIR)$(instdoc_dir); then \ +- rm -rf $(DESTDIR)$(instdoc_dir)/*; \ +- rmdir $(DESTDIR)$(instdoc_dir) || true; \ +- fi +- +-EXTRA_DIST=$(instdoc_name).sgml ++EXTRA_DIST=INSTALL.sgml +diff -Naur libodbc++-0.2.3-20050404/doc/Makefile.in libodbc++-0.2.3-20050404-dont-install-some-docs/doc/Makefile.in +--- libodbc++-0.2.3-20050404/doc/Makefile.in 2005-04-04 18:21:26.000000000 +0200 ++++ libodbc++-0.2.3-20050404-dont-install-some-docs/doc/Makefile.in 2005-04-04 21:16:50.447164392 +0200 +@@ -174,13 +174,9 @@ + target_alias = @target_alias@ + zip = @zip@ + +-instdoc_dir = @docdir@/@PACKAGE@-@VERSION@/INSTALL +- +-instdoc_name = INSTALL +- + SUBDIRS = progref + +-EXTRA_DIST = $(instdoc_name).sgml ++EXTRA_DIST = INSTALL.sgml + subdir = doc + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +@@ -382,12 +378,9 @@ + || exit 1; \ + fi; \ + done +- $(MAKE) $(AM_MAKEFLAGS) \ +- top_distdir="$(top_distdir)" distdir="$(distdir)" \ +- dist-hook + check-am: all-am + check: check-recursive +-all-am: Makefile all-local ++all-am: Makefile + installdirs: installdirs-recursive + installdirs-am: + +@@ -417,7 +410,7 @@ + @echo "it deletes files that may require special tools to rebuild." + clean: clean-recursive + +-clean-am: clean-generic clean-libtool clean-local mostlyclean-am ++clean-am: clean-generic clean-libtool mostlyclean-am + + distclean: distclean-recursive + -rm -f Makefile +@@ -432,7 +425,7 @@ + + info-am: + +-install-data-am: install-data-local ++install-data-am: + + install-exec-am: + +@@ -444,8 +437,7 @@ + + maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +-maintainer-clean-am: distclean-am maintainer-clean-generic \ +- maintainer-clean-local ++maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-recursive + +@@ -459,59 +451,27 @@ + + ps-am: + +-uninstall-am: uninstall-info-am uninstall-local ++uninstall-am: uninstall-info-am + + uninstall-info: uninstall-info-recursive + +-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am all-local check \ +- check-am clean clean-generic clean-libtool clean-local \ +- clean-recursive ctags ctags-recursive distclean \ +- distclean-generic distclean-libtool distclean-recursive \ +- distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ +- info-recursive install install-am install-data install-data-am \ +- install-data-local install-data-recursive install-exec \ +- install-exec-am install-exec-recursive install-info \ +- install-info-am install-info-recursive install-man \ ++.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ ++ clean-generic clean-libtool clean-recursive ctags \ ++ ctags-recursive distclean distclean-generic distclean-libtool \ ++ distclean-recursive distclean-tags distdir dvi dvi-am \ ++ dvi-recursive info info-am info-recursive install install-am \ ++ install-data install-data-am install-data-recursive \ ++ install-exec install-exec-am install-exec-recursive \ ++ install-info install-info-am install-info-recursive install-man \ + install-recursive install-strip installcheck installcheck-am \ + installdirs installdirs-am installdirs-recursive \ + maintainer-clean maintainer-clean-generic \ +- maintainer-clean-local maintainer-clean-recursive mostlyclean \ +- mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ +- pdf pdf-am pdf-recursive ps ps-am ps-recursive tags \ +- tags-recursive uninstall uninstall-am uninstall-info-am \ +- uninstall-info-recursive uninstall-local uninstall-recursive +- +- +-all-local: $(instdoc_name) +- +-$(instdoc_name): $(instdoc_name).sgml +- test -z "$(db2html)" && mkdir $@ || $(db2html) $< +- +-maintainer-clean-local: +- rm -rf $(instdoc_name) +- +-clean-local: +- rm -rf $(instdoc_name).junk DBTOHTML_OUTPUT_DIR* +- +-dist-hook: all-local +- cp -r $(srcdir)/$(instdoc_name) $(distdir) +- +-install-data-local: +- $(mkinstalldirs) $(DESTDIR)$(instdoc_dir) $(DESTDIR)$(instdoc_dir)/stylesheet-images +- for i in $(srcdir)/$(instdoc_name)/*; do \ +- fn=`basename $$i` \ +- $(INSTALL_DATA) $$i $(DESTDIR)$(instdoc_dir)/$$fn; \ +- done +- for i in $(srcdir)/$(instdoc_name)/stylesheet-images/*; do \ +- fn=`basename $$i` \ +- $(INSTALL_DATA) $$i $(DESTDIR)$(instdoc_dir)/stylesheet-images/$$fn; \ +- done ++ maintainer-clean-recursive mostlyclean mostlyclean-generic \ ++ mostlyclean-libtool mostlyclean-recursive pdf pdf-am \ ++ pdf-recursive ps ps-am ps-recursive tags tags-recursive \ ++ uninstall uninstall-am uninstall-info-am \ ++ uninstall-info-recursive uninstall-recursive + +-uninstall-local: +- if test -d $(DESTDIR)$(instdoc_dir); then \ +- rm -rf $(DESTDIR)$(instdoc_dir)/*; \ +- rmdir $(DESTDIR)$(instdoc_dir) || true; \ +- fi + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-no-namespace-closing-colon.patch b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-no-namespace-closing-colon.patch new file mode 100644 index 000000000..2d927a863 --- /dev/null +++ b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-no-namespace-closing-colon.patch @@ -0,0 +1,130 @@ +diff -Naur libodbc++-0.2.3/include/odbc++/callablestatement.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/callablestatement.h +--- libodbc++-0.2.3/include/odbc++/callablestatement.h 2003-03-20 16:52:27.000000000 +0100 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/callablestatement.h 2005-01-18 14:47:32.761605624 +0100 +@@ -160,7 +160,7 @@ + }; + + +-}; // namespace odbc ++} // namespace odbc + + + #endif // __ODBCXX_CALLABLESTATEMENT_H +diff -Naur libodbc++-0.2.3/include/odbc++/connection.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/connection.h +--- libodbc++-0.2.3/include/odbc++/connection.h 2001-06-12 12:38:16.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/connection.h 2005-01-18 14:47:41.210321224 +0100 +@@ -204,7 +204,7 @@ + + + +-}; // namespace odbc ++} // namespace odbc + + + #endif // __ODBCXX_CONNECTION_H +diff -Naur libodbc++-0.2.3/include/odbc++/databasemetadata.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/databasemetadata.h +--- libodbc++-0.2.3/include/odbc++/databasemetadata.h 2001-06-12 12:38:17.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/databasemetadata.h 2005-01-18 14:47:44.922756848 +0100 +@@ -1333,7 +1333,7 @@ + }; + + +-}; // namespace odbc ++} // namespace odbc + + + #endif // __ODBCXX_DATABASEMETADATA_H +diff -Naur libodbc++-0.2.3/include/odbc++/drivermanager.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/drivermanager.h +--- libodbc++-0.2.3/include/odbc++/drivermanager.h 2001-06-12 12:38:17.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/drivermanager.h 2005-01-18 14:47:48.704181984 +0100 +@@ -147,7 +147,7 @@ + + + +-}; ++} + + + #endif // __ODBCXX_DRIVERMANAGER_H +diff -Naur libodbc++-0.2.3/include/odbc++/errorhandler.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/errorhandler.h +--- libodbc++-0.2.3/include/odbc++/errorhandler.h 2001-06-12 12:38:18.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/errorhandler.h 2005-01-18 14:47:53.838401464 +0100 +@@ -127,6 +127,6 @@ + }; + + +-}; // namespace odbc ++} // namespace odbc + + #endif +diff -Naur libodbc++-0.2.3/include/odbc++/preparedstatement.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/preparedstatement.h +--- libodbc++-0.2.3/include/odbc++/preparedstatement.h 2003-05-09 10:45:48.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/preparedstatement.h 2005-01-18 14:47:57.663819912 +0100 +@@ -211,6 +211,6 @@ + }; + + +-}; // namespace odbc ++} // namespace odbc + + #endif // __ODBCXX_PREPAREDSTATEMENT_H +diff -Naur libodbc++-0.2.3/include/odbc++/resultset.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/resultset.h +--- libodbc++-0.2.3/include/odbc++/resultset.h 2001-06-12 12:38:19.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/resultset.h 2005-01-18 14:48:01.966165856 +0100 +@@ -619,7 +619,7 @@ + + + +-}; // namespace odbc ++} // namespace odbc + + + #endif // __ODBCXX_RESULTSET_H +diff -Naur libodbc++-0.2.3/include/odbc++/resultsetmetadata.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/resultsetmetadata.h +--- libodbc++-0.2.3/include/odbc++/resultsetmetadata.h 2001-06-12 12:38:20.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/resultsetmetadata.h 2005-01-18 14:48:05.372647992 +0100 +@@ -176,7 +176,7 @@ + + + +-}; // namespace odbc ++} // namespace odbc + + + #endif // __ODBCXX_RESULTSETMETADATA_H +diff -Naur libodbc++-0.2.3/include/odbc++/statement.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/statement.h +--- libodbc++-0.2.3/include/odbc++/statement.h 2003-03-20 16:52:32.000000000 +0100 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/statement.h 2005-01-18 14:48:11.589702856 +0100 +@@ -260,7 +260,7 @@ + + + +-}; // namespace odbc ++} // namespace odbc + + + #endif // __ODBCXX_STATEMENT_H +diff -Naur libodbc++-0.2.3/include/odbc++/threads.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/threads.h +--- libodbc++-0.2.3/include/odbc++/threads.h 2001-06-12 12:38:20.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/threads.h 2005-01-18 14:48:16.409970064 +0100 +@@ -65,7 +65,7 @@ + } + }; + +-}; //namespace odbc ++} //namespace odbc + + // macro used all over the place + #define ODBCXX_LOCKER(mut) odbc::Locker _locker(mut) +diff -Naur libodbc++-0.2.3/include/odbc++/types.h libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/types.h +--- libodbc++-0.2.3/include/odbc++/types.h 2003-06-17 12:08:02.000000000 +0200 ++++ libodbc++-0.2.3-no-namespace-closing-colon/include/odbc++/types.h 2005-01-18 14:48:22.560035112 +0100 +@@ -791,7 +791,7 @@ + } + }; + +-}; // namespace odbc ++} // namespace odbc + + + #endif // __ODBCXX_TYPES_H diff --git a/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-no-thread-dmaccess-mutex-fix.patch b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-no-thread-dmaccess-mutex-fix.patch new file mode 100644 index 000000000..f5b03f203 --- /dev/null +++ b/campcaster/etc/portage/dev-db/libodbc++/files/libodbc++-no-thread-dmaccess-mutex-fix.patch @@ -0,0 +1,14 @@ +diff -Naur libodbc++-0.2.3-20050404/src/drivermanager.cpp libodbc++-0.2.3-20050404-no-thread-dmaccess-mutex-fix/src/drivermanager.cpp +--- libodbc++-0.2.3-20050404/src/drivermanager.cpp 2005-02-27 23:37:23.000000000 +0100 ++++ libodbc++-0.2.3-20050404-no-thread-dmaccess-mutex-fix/src/drivermanager.cpp 2005-04-04 18:35:25.725465880 +0200 +@@ -87,8 +87,10 @@ + } + } + ++#ifdef ODBCXX_ENABLE_THREADS + // remove the mutex as we can't rely on static destructors + DMAccessMutex(1); ++#endif + } + + diff --git a/campcaster/etc/portage/dev-db/libodbc++/libodbc++-0.2.3-r2.ebuild b/campcaster/etc/portage/dev-db/libodbc++/libodbc++-0.2.3-r2.ebuild new file mode 100644 index 000000000..1762850b1 --- /dev/null +++ b/campcaster/etc/portage/dev-db/libodbc++/libodbc++-0.2.3-r2.ebuild @@ -0,0 +1,82 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit eutils flag-o-matic + +DESCRIPTION="Libodbc++ is a c++ class library that provides a subset of the well-known JDBC 2.0(tm) and runs on top of ODBC." +SRC_URI="mirror://sourceforge/libodbcxx/${P}.tar.gz" +HOMEPAGE="http://libodbcxx.sourceforge.net/" +LICENSE="LGPL-2" + +DEPEND="dev-db/unixODBC + sys-libs/libtermcap-compat" +KEYWORDS="~x86 ~ppc ~hppa ~alpha ~amd64" +IUSE="qt" +SLOT=0 + +SB="${S}-build" +SB_MT="${S}-build-mt" +SB_QT="${S}-build_qt" +SB_QT_MT="${S}-build_qt-mt" + +src_unpack() { + unpack ${A} + cd ${S} + + epatch ${FILESDIR}/libodbc++-0.2.3-to-cvs-20050404.patch + epatch ${FILESDIR}/libodbc++-no-namespace-closing-colon.patch + epatch ${FILESDIR}/libodbc++-no-thread-dmaccess-mutex-fix.patch + epatch ${FILESDIR}/libodbc++-dont-install-some-docs.patch + + # toch the programmers reference stamp, so that it is not re-generated + touch doc/progref/progref-stamp +} + +src_compile() { + local commonconf + commonconf="--with-odbc=/usr --without-tests" + commonconf="${commonconf} --enable-static --enable-shared" + # " --enable-threads" + if ! has ccache FEATURES; then + einfo "ccache would really help you compiling this package..." + fi + + export ECONF_SOURCE="${S}" + append-flags -DODBCXX_DISABLE_READLINE_HACK + + buildlist="${SB} ${SB_MT}" + use qt && buildlist="${buildlist} $SB_QT $SB_QT_MT" + + for sd in ${buildlist}; do + mkdir -p "${sd}" + cd "${sd}" + commonconf2='' + LIBS='' + [ "${sd}" == "${SB_MT}" -o "${sd}" == "${SB_QT_MT}" ] && commonconf2="${commonconf2} --enable-threads" + [ "${sd}" == "${SB_QT}" -o "${sd}" == "${SB_QT_MT}" ] && commonconf2="${commonconf2} --with-qt" + [ "${sd}" == "${SB}" ] && commonconf2="${commonconf2} --with-isqlxx" + [ "${sd}" == "${SB_QT}" ] && commonconf2="${commonconf2} --with-qtsqlxx" + export LIBS + # using without-qt breaks the build + #--without-qt \ + libtoolize --copy --force + econf \ + ${commonconf} \ + ${commonconf2} \ + || die "econf failed" + emake || die "emake failed" + done +} + +src_install () { + cd ${S} + dodoc AUTHORS BUGS ChangeLog COPYING INSTALL NEWS README THANKS TODO + + buildlist="${SB} ${SB_MT}" + use qt && buildlist="${buildlist} $SB_QT $SB_QT_MT" + for sd in ${buildlist}; do + cd ${sd} + make DESTDIR=${D} install || die "make install failed" + done +} diff --git a/campcaster/etc/portage/dev-libs/xmlrpc++/Manifest b/campcaster/etc/portage/dev-libs/xmlrpc++/Manifest new file mode 100644 index 000000000..e7d894a2e --- /dev/null +++ b/campcaster/etc/portage/dev-libs/xmlrpc++/Manifest @@ -0,0 +1,6 @@ +MD5 c98236a5a9e80d523bd9ae18b85d92c7 xmlrpc++-0.7.ebuild 1046 +MD5 9c03b31bd18ec67ca2d1a38ea5e0da59 files/digest-xmlrpc++-0.7 62 +MD5 30ffa4ae3a5736ec63cb3d72867211a2 files/xmlrpc++-automake.patch 7756 +MD5 1bfb17903af3f417349ffbb38db5abc0 files/incorrect_XmlRpcValue_struct_tm_conversion.patch 1207 +MD5 b5bdda7867960ddfb6530224a2e1dc88 files/uninitialised_XmlRpcSource_ssl_ssl.patch 423 +MD5 ec8a71135df6f24e75e41b0f8b27556b files/xmlrpc++-0.7-to-cvs-20040713.patch 79370 diff --git a/campcaster/etc/portage/dev-libs/xmlrpc++/files/digest-xmlrpc++-0.7 b/campcaster/etc/portage/dev-libs/xmlrpc++/files/digest-xmlrpc++-0.7 new file mode 100644 index 000000000..64d311c1d --- /dev/null +++ b/campcaster/etc/portage/dev-libs/xmlrpc++/files/digest-xmlrpc++-0.7 @@ -0,0 +1 @@ +MD5 d88f0f9c36d938316d672d16f6c37d7e xmlrpc++0.7.tar.gz 64037 diff --git a/campcaster/etc/portage/dev-libs/xmlrpc++/files/incorrect_XmlRpcValue_struct_tm_conversion.patch b/campcaster/etc/portage/dev-libs/xmlrpc++/files/incorrect_XmlRpcValue_struct_tm_conversion.patch new file mode 100644 index 000000000..f0fc4cbf1 --- /dev/null +++ b/campcaster/etc/portage/dev-libs/xmlrpc++/files/incorrect_XmlRpcValue_struct_tm_conversion.patch @@ -0,0 +1,31 @@ +diff -Nur xmlrpc++/src/XmlRpcValue.cpp x/src/XmlRpcValue.cpp +--- xmlrpc++/src/XmlRpcValue.cpp 2003-06-06 20:13:28.000000000 +0200 ++++ x/src/XmlRpcValue.cpp 2004-12-13 21:02:39.505001617 +0100 +@@ -390,6 +390,7 @@ + return false; + + t.tm_year -= 1900; ++ t.tm_mon -= 1; + t.tm_isdst = -1; + _type = TypeDateTime; + _value.asTime = new struct tm(t); +@@ -402,7 +403,7 @@ + struct tm* t = _value.asTime; + char buf[20]; + snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", +- 1900+t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); ++ 1900+t->tm_year,1+t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); + buf[sizeof(buf)-1] = 0; + + std::string xml = VALUE_TAG; +@@ -553,8 +554,8 @@ + { + struct tm* t = _value.asTime; + char buf[20]; +- snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d", +- t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); ++ snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", ++ 1900+t->tm_year,1+t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); + buf[sizeof(buf)-1] = 0; + os << buf; + break; diff --git a/campcaster/etc/portage/dev-libs/xmlrpc++/files/uninitialised_XmlRpcSource_ssl_ssl.patch b/campcaster/etc/portage/dev-libs/xmlrpc++/files/uninitialised_XmlRpcSource_ssl_ssl.patch new file mode 100644 index 000000000..4c2faa6f6 --- /dev/null +++ b/campcaster/etc/portage/dev-libs/xmlrpc++/files/uninitialised_XmlRpcSource_ssl_ssl.patch @@ -0,0 +1,11 @@ +diff -Nur xmlrpc++/src/XmlRpcSource.cpp x/src/XmlRpcSource.cpp +--- xmlrpc++/src/XmlRpcSource.cpp 2004-04-13 22:21:59.000000000 +0700 ++++ x/src/XmlRpcSource.cpp 2004-07-14 12:26:28.227768848 +0700 +@@ -9,6 +9,7 @@ + XmlRpcSource::XmlRpcSource(int fd /*= -1*/, bool deleteOnClose /*= false*/) + : _fd(fd), _deleteOnClose(deleteOnClose), _keepOpen(false) + { ++ _ssl_ssl = NULL; + } + + XmlRpcSource::~XmlRpcSource() diff --git a/campcaster/etc/portage/dev-libs/xmlrpc++/files/xmlrpc++-0.7-to-cvs-20040713.patch b/campcaster/etc/portage/dev-libs/xmlrpc++/files/xmlrpc++-0.7-to-cvs-20040713.patch new file mode 100644 index 000000000..fb1a3db8a --- /dev/null +++ b/campcaster/etc/portage/dev-libs/xmlrpc++/files/xmlrpc++-0.7-to-cvs-20040713.patch @@ -0,0 +1,2539 @@ +diff -Naur xmlrpc++0.7/debian/changelog xmlrpc++/debian/changelog +--- xmlrpc++0.7/debian/changelog 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/changelog 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,5 @@ ++xmlrpc++ (0.8) unstable; urgency=low ++ ++ * Initial release. ++ ++ -- jeff Tue, 13 Apr 2004 11:36:50 -0400 +diff -Naur xmlrpc++0.7/debian/control xmlrpc++/debian/control +--- xmlrpc++0.7/debian/control 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/control 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,30 @@ ++Source: xmlrpc++ ++Section: devel ++Priority: optional ++Maintainer: jeff ++Standards-Version: 3.5.8 ++Build-Depends: debmake make gcc libssl-dev ++ ++Package: libxmlrpc++1-dev ++Architecture: any ++Depends: libxmlrpc++1, libc6-dev, libssl-dev ++Provides: libxmlrpc++-dev ++Conflicts: libxmlrpc++-dev ++Description: C++ library for XML-RPC development files ++ XmlRpc++ is a C++ implementation of the XML-RPC protocol. It is based upon ++ Shilad Sen's excellent py-xmlrpc. The XmlRpc protocol was designed to make ++ remote procedure calls easy: it encodes data in a simple XML format and ++ uses HTTP for communication. XmlRpc++ is designed to make it easy to ++ incorporate XML-RPC client and server support into C++ applications. ++ This package is needed to develop applications with this library. ++ ++Package: libxmlrpc++1 ++Architecture: any ++Depends: ${shlibs:Depends} ++Description: C++ library for XML-RPC ++ XmlRpc++ is a C++ implementation of the XML-RPC protocol. It is based upon ++ Shilad Sen's excellent py-xmlrpc. The XmlRpc protocol was designed to make ++ remote procedure calls easy: it encodes data in a simple XML format and ++ uses HTTP for communication. XmlRpc++ is designed to make it easy to ++ incorporate XML-RPC client and server support into C++ applications. ++ +diff -Naur xmlrpc++0.7/debian/copyright xmlrpc++/debian/copyright +--- xmlrpc++0.7/debian/copyright 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/copyright 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,5 @@ ++This packaging was written by jeff (jeff@freemedsoftware.com) ++ on Tue, 13 Apr 2004 11:36:50 -0400. ++ ++Copyright: GPL (see /usr/share/common-licenses/GPL) ++ +diff -Naur xmlrpc++0.7/debian/.cvsignore xmlrpc++/debian/.cvsignore +--- xmlrpc++0.7/debian/.cvsignore 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/.cvsignore 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,2 @@ ++libxmlrpc++1 ++tmp +diff -Naur xmlrpc++0.7/debian/dirs xmlrpc++/debian/dirs +--- xmlrpc++0.7/debian/dirs 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/dirs 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,3 @@ ++usr/lib ++usr/include ++usr/share/man/man3 +diff -Naur xmlrpc++0.7/debian/files xmlrpc++/debian/files +--- xmlrpc++0.7/debian/files 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/files 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,2 @@ ++libxmlrpc++1_0.8_i386.deb devel optional ++libxmlrpc++1-dev_0.8_i386.deb devel optional +diff -Naur xmlrpc++0.7/debian/libxmlrpc++1.files xmlrpc++/debian/libxmlrpc++1.files +--- xmlrpc++0.7/debian/libxmlrpc++1.files 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/libxmlrpc++1.files 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1 @@ ++usr/lib/*.so* +diff -Naur xmlrpc++0.7/debian/libxmlrpc++1.substvars xmlrpc++/debian/libxmlrpc++1.substvars +--- xmlrpc++0.7/debian/libxmlrpc++1.substvars 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/libxmlrpc++1.substvars 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1 @@ ++shlibs:Depends=libc6 (>= 2.3.2.ds1-4), libgcc1 (>= 1:3.3.3-1), libstdc++5 (>= 1:3.3.3-1) +diff -Naur xmlrpc++0.7/debian/libxmlrpc++-dev.files xmlrpc++/debian/libxmlrpc++-dev.files +--- xmlrpc++0.7/debian/libxmlrpc++-dev.files 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/libxmlrpc++-dev.files 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,2 @@ ++usr/lib/*.a ++usr/include/*.h +diff -Naur xmlrpc++0.7/debian/rules xmlrpc++/debian/rules +--- xmlrpc++0.7/debian/rules 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/debian/rules 2004-04-19 15:51:26.000000000 +0200 +@@ -0,0 +1,86 @@ ++#!/usr/bin/make -f ++# Made with the aid of debmake, by Christoph Lameter, ++# based on the sample debian/rules file for GNU hello by Ian Jackson. ++ ++package=libxmlrpc++ ++ ++version=$(shell expr `pwd` : '.*-\([0-9.]*\)') ++version_major=$(shell expr `pwd` : '.*-\([0-9]*\).[0-9.]*') ++ ++build: ++ $(checkdir) ++ ++ #--- All this would be nice, but I really don't want to debug it: ++ #-mkdir shared static ++ # ++ # First build the shared library ++ # ++ #cd shared ; \ ++ # ln -s ../src . ; \ ++ # $(MAKE) -f ../Makefile VPATH=".." srcdir=".." \ ++ # CFLAGS="-O2 -fPIC -pipe" ; \ ++ # gcc -shared -Wl,-soname,$(package).so.$(version_major) -o $(package).so.$(version) `ls *.o` ++ # ++ # Build the static library (it does not need Position Independent Code, ++ # which reserves one register; thus, without -fPIC we get more efficient ++ # code). ++ # ++ #cd static ; \ ++ # ln -s ../src . ; \ ++ # $(MAKE) -f ../Makefile VPATH=".." srcdir=".." \ ++ # CFLAGS="-O2 -pipe" LDFLAGS="-s" libXmlRpc.a; \ ++ # mv libXmlRpc.a libxmlrpc++.a ++ ++ # So we go with this instead: ++ make CFLAGS="-O2" all ++ touch build ++ ++clean: ++ $(checkdir) ++# rm -rf static shared ++ rm -f build ++ -$(MAKE) clean ++ rm -f `find . -name "*~"` ++ rm -rf debian/tmp `find debian/* -type d ! -name CVS` debian/files* core ++ rm -f debian/*substvars ++ ++binary-indep: checkroot build ++ $(checkdir) ++# There are no architecture-independent files to be uploaded ++# generated by this package. If there were any they would be ++# made here. ++ ++binary-arch: checkroot build ++ $(checkdir) ++ rm -rf debian/tmp `find debian/* -type d ! -name CVS` ++ install -d debian/tmp ++ cd debian/tmp && install -d `cat ../dirs` ++ install -m644 $(package).a debian/tmp/usr/lib/ ++ install -m644 src/*.h debian/tmp/usr/include/ ++ ++ install -m644 $(package).so.$(version) debian/tmp/usr/lib ++ ++ # Should do this in the makefile, but we'll do it here - Jeff ++ #$(MAKE) install DESTDIR=`pwd`/debian/tmp ++ #mkdir -p debian/tmp/usr/{include,lib} ++ #install -m755 *.so* *.a debian/tmp/usr/lib ++ #install -m644 src/*.h *.a debian/tmp/usr/include ++ ++ debstd -m README.html ++ dpkg-gencontrol -isp -plibxmlrpc++1 ++ dpkg-gencontrol -isp -plibxmlrpc++1-dev ++ chown -R root:root debian/tmp ++ chmod -R go=rX debian/tmp ++ dpkg --build debian/tmp .. ++ ++define checkdir ++ test -f debian/rules ++endef ++ ++binary: binary-indep binary-arch ++ ++checkroot: ++ $(checkdir) ++ test root = "`whoami`" ++ ++.PHONY: binary binary-arch binary-indep clean checkroot +diff -Naur xmlrpc++0.7/Makefile xmlrpc++/Makefile +--- xmlrpc++0.7/Makefile 2003-03-06 18:25:38.000000000 +0100 ++++ xmlrpc++/Makefile 2004-04-19 15:53:00.000000000 +0200 +@@ -1,13 +1,23 @@ + # makefile written for gnu make + CXX = g++ + SRC = ./src ++SHARED = -shared + CPPFLAGS = -I$(SRC) + DEBUG = -g + OPTIMIZE = -O2 + GCCWARN = -Wall -Wstrict-prototypes + CXXFLAGS = $(DEBUG) $(GCCWARN) $(OPTIMIZE) $(INCLUDES) ++VERSION = 0.8 ++ ++DESTDIR = ++prefix = /usr ++MKDIR = mkdir -p ++CP = cp ++LN = ln -s + + LIB = ./libXmlRpc.a ++LIBALT = ./libxmlrpc++.a ++SO = ./libxmlrpc++.so.$(VERSION) + + # Add your system-dependent network libs here. These are + # only used to build the tests (your application will need them too). +@@ -22,10 +32,14 @@ + $(SRC)/XmlRpcServerMethod.o $(SRC)/XmlRpcSocket.o $(SRC)/XmlRpcSource.o \ + $(SRC)/XmlRpcUtil.o $(SRC)/XmlRpcValue.o + +-all: $(LIB) tests ++all: $(LIB) $(SO) tests + + $(LIB): $(OBJ) + $(AR) $(ARFLAGS) $(LIB) $(OBJ) ++ cp $(LIB) $(LIBALT) ++ ++$(SO): $(OBJ) ++ $(CXX) -o $(SO) $(SHARED) $(OBJ) + + + tests: $(LIB) +@@ -34,9 +48,24 @@ + doc doxygen: + cd src && doxygen Doxyfile + ++distclean: clean ++ + clean: + rm -f $(SRC)/*.o + rm -f $(SRC)/*~ +- rm -f $(LIB) ++ rm -f $(LIB) $(LIBALT) $(SO) ++ rm -f build + cd test && $(MAKE) clean + ++install: ++ $(MKDIR) $(DESTDIR)$(prefix)/lib ++ $(CP) $(SO) $(LIB) $(DESTDIR)$(prefix)/lib ++ $(MKDIR) $(DESTDIR)$(prefix)/include ++ $(CP) src/*.h $(DESTDIR)$(prefix)/include ++ ( cd $(DESTDIR)$(prefix)/lib; rm -f libxmlrpc++.so; $(LN) $(SO) libxmlrpc++.so ) ++ # Does not install tests right now ++ ++# Debian package make target, in case you want to manually build a package ++# from the distribution. ++deb: ++ dpkg-buildpackage -rfakeroot +diff -Naur xmlrpc++0.7/src/XmlRpcClient.cpp xmlrpc++/src/XmlRpcClient.cpp +--- xmlrpc++0.7/src/XmlRpcClient.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcClient.cpp 2004-04-14 20:36:25.000000000 +0200 +@@ -4,11 +4,14 @@ + #include "XmlRpcSocket.h" + #include "XmlRpc.h" + ++#include "base64.h" // For HTTP authentication encoding ++ + #include + #include +- ++#include + + using namespace XmlRpc; ++using namespace std; + + // Static data + const char XmlRpcClient::REQUEST_BEGIN[] = +@@ -31,13 +34,83 @@ + + _host = host; + _port = port; ++ if (uri && *uri) ++ _uri = uri; ++ else ++ _uri = "/RPC2"; ++ _connectionState = NO_CONNECTION; ++ _executing = false; ++ _eof = false; ++ _ssl = false; _ssl_ssl = (SSL *) NULL; ++ ++ // Default to keeping the connection open until an explicit close is done ++ setKeepOpen(); ++} ++XmlRpcClient::XmlRpcClient(const char* host, int port, const char* uri, bool ssl) ++{ ++ XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d.", host, port); ++ ++ _host = host; ++ _port = port; ++ if (uri && *uri) ++ _uri = uri; ++ else ++ _uri = "/RPC2"; ++ _connectionState = NO_CONNECTION; ++ _executing = false; ++ _eof = false; ++ _ssl = ssl; ++ if (!_ssl) { _ssl_ssl = (SSL *) NULL; } ++ ++ // Default to keeping the connection open until an explicit close is done ++ setKeepOpen(); ++} ++ ++ ++XmlRpcClient::XmlRpcClient(const char* host, int port, ++ const char* login, const char* password, const char* uri/*=0*/) ++{ ++ XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d, login %s.", host, port, login); ++ ++ _host = host; ++ _port = port; + if (uri) + _uri = uri; + else + _uri = "/RPC2"; ++ ++ _login = login; ++ _password = password; ++ ++ _connectionState = NO_CONNECTION; ++ _executing = false; ++ _eof = false; ++ ++ // Default to keeping the connection open until an explicit close is done ++ setKeepOpen(); ++} ++ ++XmlRpcClient::XmlRpcClient(const char* host, int port, ++ const char* login, const char* password, ++ const char* uri/*=0*/, bool ssl) ++{ ++ XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d, login %s.", host, port, login); ++ ++ _host = host; ++ _port = port; ++ if (uri) ++ _uri = uri; ++ else ++ _uri = "/RPC2"; ++ ++ _login = login; ++ _password = password; ++ + _connectionState = NO_CONNECTION; + _executing = false; + _eof = false; ++ _ssl = ssl; ++ if (!_ssl) { _ssl_ssl = (SSL *) NULL; } + + // Default to keeping the connection open until an explicit close is done + setKeepOpen(); +@@ -46,8 +119,11 @@ + + XmlRpcClient::~XmlRpcClient() + { ++ XmlRpcUtil::log(1, "XmlRpcClient dtor client: host %s, port %d.", _host.c_str(), _port); ++ if (_connectionState != NO_CONNECTION) close(); + } + ++ + // Close the owned fd + void + XmlRpcClient::close() +@@ -56,7 +132,21 @@ + _connectionState = NO_CONNECTION; + _disp.exit(); + _disp.removeSource(this); ++ if (_ssl) { ++ // Pre-socket shutdown ++ XmlRpcUtil::log(4, "XmlRpcClient::close: before SSL_shutdown"); ++ SSL_shutdown(_ssl_ssl); ++ XmlRpcUtil::log(4, "XmlRpcClient::close: after SSL_shutdown"); ++ } + XmlRpcSource::close(); ++ if (_ssl) { ++ // Post-socket shutdown ++ XmlRpcUtil::log(4, "XmlRpcClient::close: before SSL_free(_ssl_ssl)"); ++ SSL_free(_ssl_ssl); ++ XmlRpcUtil::log(4, "XmlRpcClient::close: before SSL_CTX_free(_ssl_ctx)"); ++ SSL_CTX_free(_ssl_ctx); ++ XmlRpcUtil::log(4, "XmlRpcClient::close: SSL shutdown successful!"); ++ } + } + + +@@ -113,6 +203,10 @@ + { + if (eventType == XmlRpcDispatch::Exception) + { ++ //if (XmlRpcSocket::nonFatalError()) ++ // return (_connectionState == WRITE_REQUEST) ++ // ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; ++ + if (_connectionState == WRITE_REQUEST && _bytesWritten == 0) + XmlRpcUtil::error("Error in XmlRpcClient::handleEvent: could not connect to server (%s).", + XmlRpcSocket::getErrorMsg().c_str()); +@@ -191,6 +285,17 @@ + return false; + } + ++ // Perform SSL if needed ++ if (_ssl) { ++ SSLeay_add_ssl_algorithms(); ++ _ssl_meth = SSLv23_client_method(); ++ SSL_load_error_strings(); ++ _ssl_ctx = SSL_CTX_new (_ssl_meth); ++ _ssl_ssl = SSL_new (_ssl_ctx); ++ SSL_set_fd (_ssl_ssl, fd); ++ int err = SSL_connect (_ssl_ssl); ++ } ++ + return true; + } + +@@ -247,6 +352,35 @@ + sprintf(buff,":%d\r\n", _port); + + header += buff; ++ ++ if (_login.length() != 0) ++ { ++ // convert to base64 ++ std::vector base64data; ++ int iostatus = 0; ++ base64 encoder; ++ std::back_insert_iterator > ins = ++ std::back_inserter(base64data); ++ ++ std::string authBuf = _login + ":" + _password; ++ ++ encoder.put(authBuf.begin(), authBuf.end(), ins, iostatus, ++ base64<>::crlf()); ++ ++ header += "Authorization: Basic "; ++ std::string authEnc(base64data.begin(), base64data.end()); ++ // handle pesky linefeed characters ++ string::size_type lf; ++ while ( (lf = authEnc.find("\r")) != string::npos ) { ++ authEnc.erase(lf, 1); ++ } ++ while ( (lf = authEnc.find("\n")) != string::npos ) { ++ authEnc.erase(lf, 1); ++ } ++ header += authEnc; ++ header += "\r\n"; ++ } ++ + header += "Content-Type: text/xml\r\nContent-length: "; + + sprintf(buff,"%d\r\n\r\n", body.size()); +@@ -261,7 +395,7 @@ + XmlRpcUtil::log(5, "XmlRpcClient::writeRequest (attempt %d):\n%s\n", _sendAttempts+1, _request.c_str()); + + // Try to write the request +- if ( ! XmlRpcSocket::nbWrite(this->getfd(), _request, &_bytesWritten)) { ++ if ( ! XmlRpcSocket::nbWrite(this->getfd(), _request, &_bytesWritten, _ssl_ssl)) { + XmlRpcUtil::error("Error in XmlRpcClient::writeRequest: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); + return false; + } +@@ -283,7 +417,7 @@ + XmlRpcClient::readHeader() + { + // Read available data +- if ( ! XmlRpcSocket::nbRead(this->getfd(), _header, &_eof) || ++ if ( ! XmlRpcSocket::nbRead(this->getfd(), _header, &_eof, _ssl_ssl) || + (_eof && _header.length() == 0)) { + + // If we haven't read any data yet and this is a keep-alive connection, the server may +@@ -355,7 +489,7 @@ + { + // If we dont have the entire response yet, read available data + if (int(_response.length()) < _contentLength) { +- if ( ! XmlRpcSocket::nbRead(this->getfd(), _response, &_eof)) { ++ if ( ! XmlRpcSocket::nbRead(this->getfd(), _response, &_eof, _ssl_ssl)) { + XmlRpcUtil::error("Error in XmlRpcClient::readResponse: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); + return false; + } +diff -Naur xmlrpc++0.7/src/XmlRpcClient.h xmlrpc++/src/XmlRpcClient.h +--- xmlrpc++0.7/src/XmlRpcClient.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcClient.h 2004-04-13 17:21:59.000000000 +0200 +@@ -37,10 +37,21 @@ + static const char FAULT_TAG[]; + + //! Construct a client to connect to the server at the specified host:port address +- //! @param host The name of the remote machine hosting the server ++ //! @param host The name of the remote machine hosting the server, eg "myserver.mycompany.com" + //! @param port The port on the remote machine where the server is listening + //! @param uri An optional string to be sent as the URI in the HTTP GET header ++ //! Note that the host is not a URL, do not prepend "http://" or other protocol specifiers. + XmlRpcClient(const char* host, int port, const char* uri=0); ++ XmlRpcClient(const char* host, int port, const char* uri=0, bool ssl=false); ++ ++ //! Construct a client to connect to the server at the specified host:port address including HTTP authentication ++ //! @param host The name of the remote machine hosting the server ++ //! @param port The port on the remote machine where the server is listening ++ //! @param login The username passed to the server ++ //! @param pass The password passed to the server ++ //! @param uri An optional string to be sent as the URI in the HTTP GET header ++ XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri=0); ++ XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri=0, bool ssl=false); + + //! Destructor + virtual ~XmlRpcClient(); +@@ -60,6 +71,14 @@ + //! Returns true if the result of the last execute() was a fault response. + bool isFault() const { return _isFault; } + ++ //! Return the host name of the server ++ const char* const host() const { return _host.c_str(); } ++ ++ //! Return the port ++ int port() const { return _port; } ++ ++ //! Return the URI ++ const char* const uri() const { return _uri.c_str(); } + + // XmlRpcSource interface implementation + //! Close the connection +@@ -91,6 +110,10 @@ + std::string _uri; + int _port; + ++ // Login information for HTTP authentication ++ std::string _login; ++ std::string _password; ++ + // The xml-encoded request, http header of response, and response xml + std::string _request; + std::string _header; +@@ -108,9 +131,9 @@ + + // True if the server closed the connection + bool _eof; +- +- // True if a fault response was returned by the server +- bool _isFault; ++ ++ // True if a fault response was returned by the server ++ bool _isFault; + + // Number of bytes expected in the response body (parsed from response header) + int _contentLength; +diff -Naur xmlrpc++0.7/src/XmlRpcDispatch.cpp xmlrpc++/src/XmlRpcDispatch.cpp +--- xmlrpc++0.7/src/XmlRpcDispatch.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcDispatch.cpp 2003-04-29 03:06:22.000000000 +0200 +@@ -3,6 +3,7 @@ + #include "XmlRpcSource.h" + #include "XmlRpcUtil.h" + ++#include + #include + #include + +@@ -74,73 +75,21 @@ + XmlRpcDispatch::work(double timeout) + { + // Compute end time +- _endTime = (timeout < 0.0) ? -1.0 : (getTime() + timeout); ++ double timeNow = getTime(); ++ _endTime = (timeout < 0.0) ? -1.0 : (timeNow + timeout); + _doClear = false; + _inWork = true; + + // Only work while there is something to monitor + while (_sources.size() > 0) { + +- // Construct the sets of descriptors we are interested in +- fd_set inFd, outFd, excFd; +- FD_ZERO(&inFd); +- FD_ZERO(&outFd); +- FD_ZERO(&excFd); +- +- int maxFd = -1; // Not used on windows +- SourceList::iterator it; +- for (it=_sources.begin(); it!=_sources.end(); ++it) { +- int fd = it->getSource()->getfd(); +- if (it->getMask() & ReadableEvent) FD_SET(fd, &inFd); +- if (it->getMask() & WritableEvent) FD_SET(fd, &outFd); +- if (it->getMask() & Exception) FD_SET(fd, &excFd); +- if (it->getMask() && fd > maxFd) maxFd = fd; +- } +- +- // Check for events +- int nEvents; +- if (timeout < 0.0) +- nEvents = select(maxFd+1, &inFd, &outFd, &excFd, NULL); +- else ++ // Wait for and dispatch events ++ if ( ! waitForAndProcessEvents(timeout)) + { +- struct timeval tv; +- tv.tv_sec = (int)floor(timeout); +- tv.tv_usec = ((int)floor(1000000.0 * (timeout-floor(timeout)))) % 1000000; +- nEvents = select(maxFd+1, &inFd, &outFd, &excFd, &tv); +- } +- +- if (nEvents < 0) +- { +- XmlRpcUtil::error("Error in XmlRpcDispatch::work: error in select (%d).", nEvents); + _inWork = false; + return; + } + +- // Process events +- for (it=_sources.begin(); it != _sources.end(); ) +- { +- SourceList::iterator thisIt = it++; +- XmlRpcSource* src = thisIt->getSource(); +- int fd = src->getfd(); +- unsigned newMask = (unsigned) -1; +- if (fd <= maxFd) { +- // If you select on multiple event types this could be ambiguous +- if (FD_ISSET(fd, &inFd)) +- newMask &= src->handleEvent(ReadableEvent); +- if (FD_ISSET(fd, &outFd)) +- newMask &= src->handleEvent(WritableEvent); +- if (FD_ISSET(fd, &excFd)) +- newMask &= src->handleEvent(Exception); +- +- if ( ! newMask) { +- _sources.erase(thisIt); // Stop monitoring this one +- if ( ! src->getKeepOpen()) +- src->close(); +- } else if (newMask != (unsigned) -1) { +- thisIt->getMask() = newMask; +- } +- } +- } + + // Check whether to clear all sources + if (_doClear) +@@ -148,22 +97,35 @@ + SourceList closeList = _sources; + _sources.clear(); + for (SourceList::iterator it=closeList.begin(); it!=closeList.end(); ++it) { +- XmlRpcSource *src = it->getSource(); ++ XmlRpcSource *src = it->getSource(); + src->close(); + } + + _doClear = false; + } + +- // Check whether end time has passed +- if (0 <= _endTime && getTime() > _endTime) ++ // Check whether end time has passed or exit has been called ++ if (_endTime == 0.0) // Exit + break; ++ else if (_endTime > 0.0) // Check for timeout ++ { ++ double t = getTime(); ++ if (t > _endTime) ++ break; ++ ++ // Decrement timeout by elapsed time ++ timeout -= (t - timeNow); ++ if (timeout < 0.0) ++ timeout = 0.0; // Shouldn't happen but its fp math... ++ timeNow = t; ++ } + } + + _inWork = false; + } + + ++ + // Exit from work routine. Presumably this will be called from + // one of the source event handlers. + void +@@ -172,6 +134,7 @@ + _endTime = 0.0; // Return from work asap + } + ++ + // Clear all sources from the monitored sources list + void + XmlRpcDispatch::clear() +@@ -188,6 +151,7 @@ + } + + ++// Time utility + double + XmlRpcDispatch::getTime() + { +@@ -207,3 +171,98 @@ + } + + ++// Wait for I/O on any source, timeout, or interrupt signal. ++bool ++XmlRpcDispatch::waitForAndProcessEvents(double timeout) ++{ ++#if defined(_WINDOWS) && 0 ++ ++ int nHandles = 0; ++ SourceList::iterator it; ++ for (it=_sources.begin(); it!=_sources.end(); ++it) { ++ int fd = it->getSource()->getfd(); ++ int mask = 0; ++ if (it->getMask() & ReadableEvent) mask = (FD_READ | FD_CLOSE | FD_ACCEPT); ++ if (it->getMask() & WritableEvent) mask |= (FD_WRITE | FD_CLOSE); ++ ++#else // Posix ++ ++ // Construct the sets of descriptors we are interested in ++ fd_set inFd, outFd, excFd; ++ FD_ZERO(&inFd); ++ FD_ZERO(&outFd); ++ FD_ZERO(&excFd); ++ ++ int maxFd = -1; ++ SourceList::iterator it; ++ for (it=_sources.begin(); it!=_sources.end(); ++it) { ++ int fd = it->getSource()->getfd(); ++ if (it->getMask() & ReadableEvent) FD_SET(fd, &inFd); ++ if (it->getMask() & WritableEvent) FD_SET(fd, &outFd); ++ if (it->getMask() & Exception) FD_SET(fd, &excFd); ++ if (it->getMask() && fd > maxFd) maxFd = fd; ++ } ++ ++ // Check for events ++ int nEvents; ++ if (_endTime < 0.0) ++ nEvents = select(maxFd+1, &inFd, &outFd, &excFd, NULL); ++ else ++ { ++ struct timeval tv; ++ tv.tv_sec = (int)floor(timeout); ++ tv.tv_usec = ((int)floor(1000000.0 * (timeout-floor(timeout)))) % 1000000; ++ nEvents = select(maxFd+1, &inFd, &outFd, &excFd, &tv); ++ } ++ ++ if (nEvents < 0 && errno != EINTR) ++ { ++ XmlRpcUtil::error("Error in XmlRpcDispatch::work: error in select (%d).", nEvents); ++ return false; ++ } ++ ++ // Process events ++ for (it=_sources.begin(); it != _sources.end(); ) ++ { ++ SourceList::iterator thisIt = it++; ++ XmlRpcSource* src = thisIt->getSource(); ++ int fd = src->getfd(); ++ ++ if (fd <= maxFd) { ++ // handleEvent is called once per event type signalled ++ unsigned newMask = 0; ++ int nset = 0; ++ if (FD_ISSET(fd, &inFd)) ++ { ++ newMask |= src->handleEvent(ReadableEvent); ++ ++nset; ++ } ++ if (FD_ISSET(fd, &outFd)) ++ { ++ newMask |= src->handleEvent(WritableEvent); ++ ++nset; ++ } ++ if (FD_ISSET(fd, &excFd)) ++ { ++ newMask |= src->handleEvent(Exception); ++ ++nset; ++ } ++ ++ // Some event occurred ++ if (nset) ++ { ++ if (newMask) ++ thisIt->getMask() = newMask; ++ else // Stop monitoring this one ++ { ++ _sources.erase(thisIt); ++ if ( ! src->getKeepOpen()) ++ src->close(); ++ } ++ } ++ } ++ } ++#endif ++ ++ return true; ++} +diff -Naur xmlrpc++0.7/src/XmlRpcDispatch.h xmlrpc++/src/XmlRpcDispatch.h +--- xmlrpc++0.7/src/XmlRpcDispatch.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcDispatch.h 2003-04-29 03:06:22.000000000 +0200 +@@ -40,6 +40,7 @@ + + //! Stop monitoring this source. + //! @param source The source to stop monitoring ++ //! The source socket is not closed. + void removeSource(XmlRpcSource* source); + + //! Modify the types of events to watch for on this source +@@ -58,6 +59,10 @@ + + protected: + ++ //! Wait for I/O on any source, timeout, or interrupt signal. ++ bool waitForAndProcessEvents(double timeout); ++ ++ + // helper + double getTime(); + +diff -Naur xmlrpc++0.7/src/XmlRpc.h xmlrpc++/src/XmlRpc.h +--- xmlrpc++0.7/src/XmlRpc.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpc.h 2003-04-29 03:06:21.000000000 +0200 +@@ -15,6 +15,9 @@ + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, write to the Free Software + // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 ++// ++// The XmlRpc++ home page is http://xmlrpcpp.sourceforge.net/ ++// My home page is http://www.vermontel.net/~cmorley/ + // + + #if defined(_MSC_VER) +diff -Naur xmlrpc++0.7/src/XmlRpcMutex.cpp xmlrpc++/src/XmlRpcMutex.cpp +--- xmlrpc++0.7/src/XmlRpcMutex.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/src/XmlRpcMutex.cpp 2003-04-29 03:06:22.000000000 +0200 +@@ -0,0 +1,60 @@ ++#if defined(XMLRPC_THREADS) ++ ++#include "XmlRpcMutex.h" ++ ++#if defined(_WINDOWS) ++# define WIN32_LEAN_AND_MEAN ++# include ++#else ++# include ++#endif ++ ++using namespace XmlRpc; ++ ++ ++//! Destructor. ++XmlRpcMutex::~XmlRpcMutex() ++{ ++ if (_pMutex) ++ { ++#if defined(_WINDOWS) ++ ::CloseHandle((HANDLE)_pMutex); ++#else ++ ::pthread_mutex_destroy((pthread_mutex_t*)_pMutex); ++ delete _pMutex; ++#endif ++ _pMutex = 0; ++ } ++} ++ ++//! Wait for the mutex to be available and then acquire the lock. ++void XmlRpcMutex::acquire() ++{ ++#if defined(_WINDOWS) ++ if ( ! _pMutex) ++ _pMutex = ::CreateMutex(0, TRUE, 0); ++ else ++ ::WaitForSingleObject(_pMutex, INFINITE); ++#else ++ if ( ! _pMutex) ++ { ++ _pMutex = new pthread_mutex_t; ++ ::pthread_mutex_init((pthread_mutex_t*)_pMutex, 0); ++ } ++ ::pthread_mutex_lock((pthread_mutex_t*)_pMutex); ++#endif ++} ++ ++//! Release the mutex. ++void XmlRpcMutex::release() ++{ ++ if (_pMutex) ++#if defined(_WINDOWS) ++ ::ReleaseMutex(_pMutex); ++#else ++ ::pthread_mutex_unlock((pthread_mutex_t*)_pMutex); ++#endif ++} ++ ++#endif // XMLRPC_THREADS ++ +diff -Naur xmlrpc++0.7/src/XmlRpcMutex.h xmlrpc++/src/XmlRpcMutex.h +--- xmlrpc++0.7/src/XmlRpcMutex.h 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/src/XmlRpcMutex.h 2003-04-23 22:57:52.000000000 +0200 +@@ -0,0 +1,46 @@ ++#ifndef _XMLRPCMUTEX_H_ ++#define _XMLRPCMUTEX_H_ ++// ++// XmlRpc++ Copyright (c) 2002-2003 by Chris Morley ++// ++#if defined(_MSC_VER) ++# pragma warning(disable:4786) // identifier was truncated in debug info ++#endif ++ ++namespace XmlRpc { ++ ++ //! A simple platform-independent mutex API implemented for posix and windows. ++ class XmlRpcMutex { ++ public: ++ //! Construct a Mutex object. ++ XmlRpcMutex() : _pMutex(0) {} ++ ++ //! Destroy a Mutex object. ++ ~XmlRpcMutex(); ++ ++ //! Wait for the mutex to be available and then acquire the lock. ++ void acquire(); ++ ++ //! Release the mutex. ++ void release(); ++ ++ //! Utility class to acquire a mutex at construction and release it when destroyed. ++ struct AutoLock { ++ //! Acquire the mutex at construction ++ AutoLock(XmlRpcMutex& m) : _m(m) { _m.acquire(); } ++ //! Release at destruction ++ ~AutoLock() { _m.release(); } ++ //! The mutex being held ++ XmlRpcMutex& _m; ++ }; ++ ++ private: ++ ++ //! Native Mutex object ++ void* _pMutex; ++ ++ }; // class XmlRpcMutex ++ ++} // namespace XmlRpc ++ ++#endif // _XMLRPCMUTEX_H_ +diff -Naur xmlrpc++0.7/src/XmlRpcServerConnection.cpp xmlrpc++/src/XmlRpcServerConnection.cpp +--- xmlrpc++0.7/src/XmlRpcServerConnection.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcServerConnection.cpp 2004-04-13 17:21:59.000000000 +0200 +@@ -2,32 +2,23 @@ + #include "XmlRpcServerConnection.h" + + #include "XmlRpcSocket.h" +-#include "XmlRpc.h" + #ifndef MAKEDEPEND + # include + # include + #endif + +-using namespace XmlRpc; +- +-// Static data +-const char XmlRpcServerConnection::METHODNAME_TAG[] = ""; +-const char XmlRpcServerConnection::PARAMS_TAG[] = ""; +-const char XmlRpcServerConnection::PARAMS_ETAG[] = ""; +-const char XmlRpcServerConnection::PARAM_TAG[] = ""; +-const char XmlRpcServerConnection::PARAM_ETAG[] = ""; +- +-const std::string XmlRpcServerConnection::SYSTEM_MULTICALL = "system.multicall"; +-const std::string XmlRpcServerConnection::METHODNAME = "methodName"; +-const std::string XmlRpcServerConnection::PARAMS = "params"; ++#include "XmlRpcDispatch.h" ++#include "XmlRpcServer.h" ++#include "XmlRpcUtil.h" + +-const std::string XmlRpcServerConnection::FAULTCODE = "faultCode"; +-const std::string XmlRpcServerConnection::FAULTSTRING = "faultString"; ++using namespace XmlRpc; + + + + // The server delegates handling client requests to a serverConnection object. +-XmlRpcServerConnection::XmlRpcServerConnection(int fd, XmlRpcServer* server, bool deleteOnClose /*= false*/) : ++XmlRpcServerConnection::XmlRpcServerConnection(int fd, ++ XmlRpcServer* server, ++ bool deleteOnClose /*= false*/) : + XmlRpcSource(fd, deleteOnClose) + { + XmlRpcUtil::log(2,"XmlRpcServerConnection: new socket %d.", fd); +@@ -69,7 +60,7 @@ + { + // Read available data + bool eof; +- if ( ! XmlRpcSocket::nbRead(this->getfd(), _header, &eof)) { ++ if ( ! XmlRpcSocket::nbRead(this->getfd(), _header, &eof, _ssl_ssl)) { + // Its only an error if we already have read some data + if (_header.length() > 0) + XmlRpcUtil::error("XmlRpcServerConnection::readHeader: error while reading header (%s).",XmlRpcSocket::getErrorMsg().c_str()); +@@ -141,13 +132,15 @@ + return true; // Continue monitoring this source + } + ++ ++ + bool + XmlRpcServerConnection::readRequest() + { + // If we dont have the entire request yet, read available data + if (int(_request.length()) < _contentLength) { + bool eof; +- if ( ! XmlRpcSocket::nbRead(this->getfd(), _request, &eof)) { ++ if ( ! XmlRpcSocket::nbRead(this->getfd(), _request, &eof, _ssl_ssl)) { + XmlRpcUtil::error("XmlRpcServerConnection::readRequest: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); + return false; + } +@@ -172,6 +165,7 @@ + } + + ++ + bool + XmlRpcServerConnection::writeResponse() + { +@@ -185,7 +179,7 @@ + } + + // Try to write the response +- if ( ! XmlRpcSocket::nbWrite(this->getfd(), _response, &_bytesWritten)) { ++ if ( ! XmlRpcSocket::nbWrite(this->getfd(), _response, &_bytesWritten, _ssl_ssl)) { + XmlRpcUtil::error("XmlRpcServerConnection::writeResponse: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); + return false; + } +@@ -202,170 +196,10 @@ + return _keepAlive; // Continue monitoring this source if true + } + +-// Run the method, generate _response string +-void +-XmlRpcServerConnection::executeRequest() +-{ +- XmlRpcValue params, resultValue; +- std::string methodName = parseRequest(params); +- XmlRpcUtil::log(2, "XmlRpcServerConnection::executeRequest: server calling method '%s'", +- methodName.c_str()); +- +- try { +- +- if ( ! executeMethod(methodName, params, resultValue) && +- ! executeMulticall(methodName, params, resultValue)) +- generateFaultResponse(methodName + ": unknown method name"); +- else +- generateResponse(resultValue.toXml()); +- +- } catch (const XmlRpcException& fault) { +- XmlRpcUtil::log(2, "XmlRpcServerConnection::executeRequest: fault %s.", +- fault.getMessage().c_str()); +- generateFaultResponse(fault.getMessage(), fault.getCode()); +- } +-} +- +-// Parse the method name and the argument values from the request. +-std::string +-XmlRpcServerConnection::parseRequest(XmlRpcValue& params) +-{ +- int offset = 0; // Number of chars parsed from the request +- +- std::string methodName = XmlRpcUtil::parseTag(METHODNAME_TAG, _request, &offset); +- +- if (methodName.size() > 0 && XmlRpcUtil::findTag(PARAMS_TAG, _request, &offset)) +- { +- int nArgs = 0; +- while (XmlRpcUtil::nextTagIs(PARAM_TAG, _request, &offset)) { +- params[nArgs++] = XmlRpcValue(_request, &offset); +- (void) XmlRpcUtil::nextTagIs(PARAM_ETAG, _request, &offset); +- } +- +- (void) XmlRpcUtil::nextTagIs(PARAMS_ETAG, _request, &offset); +- } +- +- return methodName; +-} +- +-// Execute a named method with the specified params. +-bool +-XmlRpcServerConnection::executeMethod(const std::string& methodName, +- XmlRpcValue& params, XmlRpcValue& result) +-{ +- XmlRpcServerMethod* method = _server->findMethod(methodName); +- +- if ( ! method) return false; +- +- method->execute(params, result); +- +- // Ensure a valid result value +- if ( ! result.valid()) +- result = std::string(); +- +- return true; +-} +- +-// Execute multiple calls and return the results in an array. +-bool +-XmlRpcServerConnection::executeMulticall(const std::string& methodName, +- XmlRpcValue& params, XmlRpcValue& result) +-{ +- if (methodName != SYSTEM_MULTICALL) return false; +- +- // There ought to be 1 parameter, an array of structs +- if (params.size() != 1 || params[0].getType() != XmlRpcValue::TypeArray) +- throw XmlRpcException(SYSTEM_MULTICALL + ": Invalid argument (expected an array)"); +- +- int nc = params[0].size(); +- result.setSize(nc); +- +- for (int i=0; i\r\n" +- "\r\n\t"; +- const char RESPONSE_2[] = +- "\r\n\r\n"; +- +- std::string body = RESPONSE_1 + resultXml + RESPONSE_2; +- std::string header = generateHeader(body); +- +- _response = header + body; +- XmlRpcUtil::log(5, "XmlRpcServerConnection::generateResponse:\n%s\n", _response.c_str()); +-} +- +-// Prepend http headers +-std::string +-XmlRpcServerConnection::generateHeader(std::string const& body) +-{ +- std::string header = +- "HTTP/1.1 200 OK\r\n" +- "Server: "; +- header += XMLRPC_VERSION; +- header += "\r\n" +- "Content-Type: text/xml\r\n" +- "Content-length: "; +- +- char buffLen[40]; +- sprintf(buffLen,"%d\r\n\r\n", body.size()); +- +- return header + buffLen; +-} +- +- +-void +-XmlRpcServerConnection::generateFaultResponse(std::string const& errorMsg, int errorCode) +-{ +- const char RESPONSE_1[] = +- "\r\n" +- "\r\n\t"; +- const char RESPONSE_2[] = +- "\r\n\r\n"; +- +- XmlRpcValue faultStruct; +- faultStruct[FAULTCODE] = errorCode; +- faultStruct[FAULTSTRING] = errorMsg; +- std::string body = RESPONSE_1 + faultStruct.toXml() + RESPONSE_2; +- std::string header = generateHeader(body); +- +- _response = header + body; ++ _response = _server->executeRequest(_request); + } + +diff -Naur xmlrpc++0.7/src/XmlRpcServerConnection.h xmlrpc++/src/XmlRpcServerConnection.h +--- xmlrpc++0.7/src/XmlRpcServerConnection.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcServerConnection.h 2003-04-29 03:06:24.000000000 +0200 +@@ -17,26 +17,13 @@ + namespace XmlRpc { + + +- // The server waits for client connections and provides methods ++ // The server waits for client connections and provides support for executing methods + class XmlRpcServer; + class XmlRpcServerMethod; + + //! A class to handle XML RPC requests from a particular client + class XmlRpcServerConnection : public XmlRpcSource { + public: +- // Static data +- static const char METHODNAME_TAG[]; +- static const char PARAMS_TAG[]; +- static const char PARAMS_ETAG[]; +- static const char PARAM_TAG[]; +- static const char PARAM_ETAG[]; +- +- static const std::string SYSTEM_MULTICALL; +- static const std::string METHODNAME; +- static const std::string PARAMS; +- +- static const std::string FAULTCODE; +- static const std::string FAULTSTRING; + + //! Constructor + XmlRpcServerConnection(int fd, XmlRpcServer* server, bool deleteOnClose = false); +@@ -50,51 +37,44 @@ + + protected: + ++ //! Reads the http header + bool readHeader(); +- bool readRequest(); +- bool writeResponse(); +- +- // Parses the request, runs the method, generates the response xml. +- virtual void executeRequest(); + +- // Parse the methodName and parameters from the request. +- std::string parseRequest(XmlRpcValue& params); ++ //! Reads the request (based on the content-length header value) ++ bool readRequest(); + +- // Execute a named method with the specified params. +- bool executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); ++ //! Executes the request and writes the resulting response ++ bool writeResponse(); + +- // Execute multiple calls and return the results in an array. +- bool executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); + +- // Construct a response from the result XML. +- void generateResponse(std::string const& resultXml); +- void generateFaultResponse(std::string const& msg, int errorCode = -1); +- std::string generateHeader(std::string const& body); ++ //! Helper method to execute the client request ++ virtual void executeRequest(); + + +- // The XmlRpc server that accepted this connection ++ //! The XmlRpc server that accepted this connection + XmlRpcServer* _server; + +- // Possible IO states for the connection ++ //! Possible IO states for the connection + enum ServerConnectionState { READ_HEADER, READ_REQUEST, WRITE_RESPONSE }; ++ //! Current IO state for the connection + ServerConnectionState _connectionState; + +- // Request headers ++ //! Request headers + std::string _header; + +- // Number of bytes expected in the request body (parsed from header) ++ //! Number of bytes expected in the request body (parsed from header) + int _contentLength; + +- // Request body ++ //! Request body + std::string _request; + +- // Response ++ //! Response + std::string _response; + +- // Number of bytes of the response written so far ++ //! Number of bytes of the response written so far + int _bytesWritten; + +- // Whether to keep the current client connection open for further requests ++ //! Whether to keep the current client connection open for further requests + bool _keepAlive; + }; + } // namespace XmlRpc +diff -Naur xmlrpc++0.7/src/XmlRpcServer.cpp xmlrpc++/src/XmlRpcServer.cpp +--- xmlrpc++0.7/src/XmlRpcServer.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcServer.cpp 2003-05-08 03:21:35.000000000 +0200 +@@ -1,15 +1,32 @@ + ++ + #include "XmlRpcServer.h" + #include "XmlRpcServerConnection.h" + #include "XmlRpcServerMethod.h" + #include "XmlRpcSocket.h" + #include "XmlRpcUtil.h" + #include "XmlRpcException.h" ++#include "XmlRpc.h" + + + using namespace XmlRpc; + + ++// Static data ++const char XmlRpcServer::METHODNAME_TAG[] = ""; ++const char XmlRpcServer::PARAMS_TAG[] = ""; ++const char XmlRpcServer::PARAMS_ETAG[] = ""; ++const char XmlRpcServer::PARAM_TAG[] = ""; ++const char XmlRpcServer::PARAM_ETAG[] = ""; ++ ++const std::string XmlRpcServer::METHODNAME = "methodName"; ++const std::string XmlRpcServer::PARAMS = "params"; ++ ++const std::string XmlRpcServer::FAULTCODE = "faultCode"; ++const std::string XmlRpcServer::FAULTSTRING = "faultString"; ++ ++ ++ + XmlRpcServer::XmlRpcServer() + { + _introspectionEnabled = false; +@@ -119,6 +136,15 @@ + } + + ++// Get port number that this server is listening on ++int ++XmlRpcServer::getPort(void) const ++{ ++ return XmlRpcSocket::getPort(getfd()); ++} ++ ++ ++ + // Process client requests for the specified time + void + XmlRpcServer::work(double msTime) +@@ -159,7 +185,8 @@ + else // Notify the dispatcher to listen for input on this source when we are in work() + { + XmlRpcUtil::log(2, "XmlRpcServer::acceptConnection: creating a connection"); +- _disp.addSource(this->createConnection(s), XmlRpcDispatch::ReadableEvent); ++ XmlRpcServerConnection* c = this->createConnection(s); ++ if (c) this->dispatchConnection(c); + } + } + +@@ -173,6 +200,15 @@ + } + + ++// Hand off a new connection to a dispatcher ++void ++XmlRpcServer::dispatchConnection(XmlRpcServerConnection* sc) ++{ ++ _disp.addSource(sc, XmlRpcDispatch::ReadableEvent); ++} ++ ++ ++// Remove a connection. Called by the connection when it closes down. + void + XmlRpcServer::removeConnection(XmlRpcServerConnection* sc) + { +@@ -276,9 +312,183 @@ + for (MethodMap::iterator it=_methods.begin(); it != _methods.end(); ++it) + result[i++] = it->first; + +- // Multicall support is built into XmlRpcServerConnection ++ // Multicall support is built into XmlRpcServer::executeRequest + result[i] = MULTICALL; + } + + + ++// Parse the request, run the method, generate a response string. ++std::string ++XmlRpcServer::executeRequest(std::string const& request) ++{ ++ XmlRpcValue params, resultValue; ++ std::string methodName = parseRequest(request, params); ++ XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: server calling method '%s'", ++ methodName.c_str()); ++ ++ std::string response; ++ try { ++ ++ if ( ! executeMethod(methodName, params, resultValue) && ++ ! executeMulticall(methodName, params, resultValue)) ++ response = generateFaultResponse(methodName + ": unknown method name"); ++ else ++ response = generateResponse(resultValue.toXml()); ++ ++ } catch (const XmlRpcException& fault) { ++ XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: fault %s.", ++ fault.getMessage().c_str()); ++ response = generateFaultResponse(fault.getMessage(), fault.getCode()); ++ } ++ ++ return response; ++} ++ ++// Parse the method name and the argument values from the request. ++std::string ++XmlRpcServer::parseRequest(std::string const& request, XmlRpcValue& params) ++{ ++ int offset = 0; // Number of chars parsed from the request ++ ++ std::string methodName = XmlRpcUtil::parseTag(METHODNAME_TAG, request, &offset); ++ ++ if (methodName.size() > 0 && XmlRpcUtil::findTag(PARAMS_TAG, request, &offset)) ++ { ++ int nArgs = 0; ++ while (XmlRpcUtil::nextTagIs(PARAM_TAG, request, &offset)) { ++ params[nArgs++] = XmlRpcValue(request, &offset); ++ (void) XmlRpcUtil::nextTagIs(PARAM_ETAG, request, &offset); ++ } ++ ++ (void) XmlRpcUtil::nextTagIs(PARAMS_ETAG, request, &offset); ++ } ++ ++ return methodName; ++} ++ ++// Execute a named method with the specified params. ++bool ++XmlRpcServer::executeMethod(const std::string& methodName, ++ XmlRpcValue& params, ++ XmlRpcValue& result) ++{ ++ XmlRpcServerMethod* method = findMethod(methodName); ++ ++ if ( ! method) return false; ++ ++ method->execute(params, result); ++ ++ // Ensure a valid result value ++ if ( ! result.valid()) ++ result = std::string(); ++ ++ return true; ++} ++ ++// Execute multiple calls and return the results in an array. ++bool ++XmlRpcServer::executeMulticall(const std::string& methodName, ++ XmlRpcValue& params, ++ XmlRpcValue& result) ++{ ++ if (methodName != MULTICALL) return false; ++ ++ // There ought to be 1 parameter, an array of structs ++ if (params.size() != 1 || params[0].getType() != XmlRpcValue::TypeArray) ++ throw XmlRpcException(MULTICALL + ": Invalid argument (expected an array)"); ++ ++ int nc = params[0].size(); ++ result.setSize(nc); ++ ++ for (int i=0; i\r\n" ++ "\r\n\t"; ++ const char RESPONSE_2[] = ++ "\r\n\r\n"; ++ ++ std::string body = RESPONSE_1 + resultXml + RESPONSE_2; ++ std::string header = generateHeader(body); ++ std::string response = header + body; ++ ++ XmlRpcUtil::log(5, "XmlRpcServer::generateResponse:\n%s\n", response.c_str()); ++ return response; ++} ++ ++ ++// Prepend http headers ++std::string ++XmlRpcServer::generateHeader(std::string const& body) ++{ ++ std::string header = ++ "HTTP/1.1 200 OK\r\n" ++ "Server: "; ++ header += XMLRPC_VERSION; ++ header += "\r\n" ++ "Content-Type: text/xml\r\n" ++ "Content-length: "; ++ ++ char buffLen[40]; ++ sprintf(buffLen,"%d\r\n\r\n", body.size()); ++ ++ return header + buffLen; ++} ++ ++ ++std::string ++XmlRpcServer::generateFaultResponse(std::string const& errorMsg, int errorCode) ++{ ++ const char RESPONSE_1[] = ++ "\r\n" ++ "\r\n\t"; ++ const char RESPONSE_2[] = ++ "\r\n\r\n"; ++ ++ XmlRpcValue faultStruct; ++ faultStruct[FAULTCODE] = errorCode; ++ faultStruct[FAULTSTRING] = errorMsg; ++ std::string body = RESPONSE_1 + faultStruct.toXml() + RESPONSE_2; ++ std::string header = generateHeader(body); ++ ++ return header + body; ++} ++ +diff -Naur xmlrpc++0.7/src/XmlRpcServer.h xmlrpc++/src/XmlRpcServer.h +--- xmlrpc++0.7/src/XmlRpcServer.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcServer.h 2003-05-08 03:21:35.000000000 +0200 +@@ -54,8 +54,12 @@ + + //! Create a socket, bind to the specified port, and + //! set it in listen mode to make it available for clients. ++ //! @param port The port to bind and listen on (zero to choose an arbitrary port) + bool bindAndListen(int port, int backlog = 5); + ++ //! Get the port number this server is listening on. ++ int getPort(void) const; ++ + //! Process client requests for the specified time + void work(double msTime); + +@@ -68,6 +72,12 @@ + //! Introspection support + void listMethods(XmlRpcValue& result); + ++ ++ //! Parses the request xml, runs the method, generates the response (header+xml). ++ //! Returns a fault response if an error occurs during method execution. ++ virtual std::string executeRequest(std::string const& request); ++ ++ + // XmlRpcSource interface implementation + + //! Handle client connection requests +@@ -78,24 +88,70 @@ + + protected: + ++ // Static data ++ static const char METHODNAME_TAG[]; ++ static const char PARAMS_TAG[]; ++ static const char PARAMS_ETAG[]; ++ static const char PARAM_TAG[]; ++ static const char PARAM_ETAG[]; ++ ++ static const std::string SYSTEM_MULTICALL; ++ static const std::string METHODNAME; ++ static const std::string PARAMS; ++ ++ static const std::string FAULTCODE; ++ static const std::string FAULTSTRING; ++ ++ + //! Accept a client connection request + virtual void acceptConnection(); + + //! Create a new connection object for processing requests from a specific client. ++ //! If the client is not authorized to connect, close the socket and return 0. + virtual XmlRpcServerConnection* createConnection(int socket); + +- // Whether the introspection API is supported by this server ++ //! Hand off a new connection object to a dispatcher. ++ virtual void dispatchConnection(XmlRpcServerConnection* sc); ++ ++ ++ //! Parse the methodName and parameters from the request. ++ //! @returns the methodName ++ std::string parseRequest(std::string const& request, XmlRpcValue& params); ++ ++ //! Execute a named method with the specified params. ++ bool executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); ++ ++ //! Execute multiple calls and return the results in an array. ++ //! System.multicall implementation ++ bool executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); ++ ++ //! Construct a response from the result XML. ++ std::string generateResponse(std::string const& resultXml); ++ ++ //! Construct a fault response. ++ std::string generateFaultResponse(std::string const& msg, int errorCode = -1); ++ ++ //! Return the appropriate headers for the response. ++ std::string generateHeader(std::string const& body); ++ ++ ++ ++ //! Whether the introspection API is supported by this server + bool _introspectionEnabled; + +- // Event dispatcher ++ //! Event dispatcher + XmlRpcDispatch _disp; + +- // Collection of methods. This could be a set keyed on method name if we wanted... ++ //! Collection of methods. This could be a set keyed on method name if we wanted... + typedef std::map< std::string, XmlRpcServerMethod* > MethodMap; ++ ++ //! Registered RPC methods. + MethodMap _methods; + +- // system methods ++ //! List all registered RPC methods (only available if introspection is enabled) + XmlRpcServerMethod* _listMethods; ++ ++ //! Return help string for a specified method (only available if introspection is enabled) + XmlRpcServerMethod* _methodHelp; + + }; +diff -Naur xmlrpc++0.7/src/XmlRpcSocket.cpp xmlrpc++/src/XmlRpcSocket.cpp +--- xmlrpc++0.7/src/XmlRpcSocket.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcSocket.cpp 2004-04-13 17:21:59.000000000 +0200 +@@ -5,13 +5,16 @@ + #ifndef MAKEDEPEND + + #if defined(_WINDOWS) +-# include ++# include + # include + //# pragma lib(WS2_32.lib) + + # define EINPROGRESS WSAEINPROGRESS + # define EWOULDBLOCK WSAEWOULDBLOCK + # define ETIMEDOUT WSAETIMEDOUT ++ ++typedef int socklen_t; ++ + #else + extern "C" { + # include +@@ -53,15 +56,14 @@ + #endif // _WINDOWS + + +-// These errors are not considered fatal for an IO operation; the operation will be re-tried. +-static inline bool +-nonFatalError() +-{ +- int err = XmlRpcSocket::getError(); +- return (err == EINPROGRESS || err == EAGAIN || err == EWOULDBLOCK || err == EINTR); +-} +- +- ++// These errors are not considered fatal for an IO operation; the operation will be re-tried. ++bool ++XmlRpcSocket::nonFatalError() ++{ ++ int err = XmlRpcSocket::getError(); ++ return (err == EINPROGRESS || err == EAGAIN || err == EWOULDBLOCK || err == EINTR); ++} ++ + + int + XmlRpcSocket::socket() +@@ -131,12 +133,7 @@ + XmlRpcSocket::accept(int fd) + { + struct sockaddr_in addr; +-#if defined(_WINDOWS) +- int +-#else +- socklen_t +-#endif +- addrlen = sizeof(addr); ++ socklen_t addrlen = sizeof(addr); + + return (int) ::accept(fd, (struct sockaddr*)&addr, &addrlen); + } +@@ -168,7 +165,7 @@ + + // Read available text from the specified socket. Returns false on error. + bool +-XmlRpcSocket::nbRead(int fd, std::string& s, bool *eof) ++XmlRpcSocket::nbRead(int fd, std::string& s, bool *eof, SSL* ssl) + { + const int READ_SIZE = 4096; // Number of bytes to attempt to read at a time + char readBuf[READ_SIZE]; +@@ -180,10 +177,15 @@ + #if defined(_WINDOWS) + int n = recv(fd, readBuf, READ_SIZE-1, 0); + #else +- int n = read(fd, readBuf, READ_SIZE-1); ++ int n; ++ if (ssl != (SSL *) NULL) { ++ n = SSL_read(ssl, readBuf, READ_SIZE-1); ++ } else { ++ n = read(fd, readBuf, READ_SIZE-1); ++ } + #endif + XmlRpcUtil::log(5, "XmlRpcSocket::nbRead: read/recv returned %d.", n); +- ++ + if (n > 0) { + readBuf[n] = 0; + s.append(readBuf, n); +@@ -201,7 +203,7 @@ + + // Write text to the specified socket. Returns false on error. + bool +-XmlRpcSocket::nbWrite(int fd, std::string& s, int *bytesSoFar) ++XmlRpcSocket::nbWrite(int fd, std::string& s, int *bytesSoFar, SSL* ssl) + { + int nToWrite = int(s.length()) - *bytesSoFar; + char *sp = const_cast(s.c_str()) + *bytesSoFar; +@@ -211,7 +213,12 @@ + #if defined(_WINDOWS) + int n = send(fd, sp, nToWrite, 0); + #else +- int n = write(fd, sp, nToWrite); ++ int n; ++ if (ssl != (SSL *) NULL) { ++ n = SSL_write(ssl, sp, nToWrite); ++ } else { ++ n = write(fd, sp, nToWrite); ++ } + #endif + XmlRpcUtil::log(5, "XmlRpcSocket::nbWrite: send/write returned %d.", n); + +@@ -228,6 +235,24 @@ + return true; + } + ++// Get the port of a bound socket ++int ++XmlRpcSocket::getPort(int socket) ++{ ++ struct sockaddr_in saddr; ++ socklen_t saddr_len = sizeof(saddr); ++ int port; ++ ++ int result = ::getsockname(socket, (sockaddr*) &saddr, &saddr_len); ++ ++ if (result != 0) { ++ port = -1; ++ } else { ++ port = ntohs(saddr.sin_port); ++ } ++ return port; ++} ++ + + // Returns last errno + int +diff -Naur xmlrpc++0.7/src/XmlRpcSocket.h xmlrpc++/src/XmlRpcSocket.h +--- xmlrpc++0.7/src/XmlRpcSocket.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcSocket.h 2004-04-13 17:21:59.000000000 +0200 +@@ -11,11 +11,14 @@ + # include + #endif + ++#include ++ + namespace XmlRpc { + + //! A platform-independent socket API. + class XmlRpcSocket { + public: ++ // TODO - typedef the socket type, casting to int won't work for 64 bit windows + + //! Creates a stream (TCP) socket. Returns -1 on failure. + static int socket(); +@@ -28,10 +31,10 @@ + static bool setNonBlocking(int socket); + + //! Read text from the specified socket. Returns false on error. +- static bool nbRead(int socket, std::string& s, bool *eof); ++ static bool nbRead(int socket, std::string& s, bool *eof, SSL *ssl); + + //! Write text to the specified socket. Returns false on error. +- static bool nbWrite(int socket, std::string& s, int *bytesSoFar); ++ static bool nbWrite(int socket, std::string& s, int *bytesSoFar, SSL* ssl); + + + // The next four methods are appropriate for servers. +@@ -49,10 +52,14 @@ + //! Accept a client connection request + static int accept(int socket); + +- + //! Connect a socket to a server (from a client) + static bool connect(int socket, std::string& host, int port); + ++ //! Get the port of a bound socket ++ static int getPort(int socket); ++ ++ //! Returns true if the last error was not a fatal one (eg, EWOULDBLOCK) ++ static bool nonFatalError(); + + //! Returns last errno + static int getError(); +diff -Naur xmlrpc++0.7/src/XmlRpcSource.cpp xmlrpc++/src/XmlRpcSource.cpp +--- xmlrpc++0.7/src/XmlRpcSource.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcSource.cpp 2004-04-13 17:21:59.000000000 +0200 +@@ -30,6 +30,11 @@ + _deleteOnClose = false; + delete this; + } ++ if (_ssl_ssl != (SSL *) NULL) { ++ SSL_shutdown (_ssl_ssl); ++ SSL_free (_ssl_ssl); ++ SSL_CTX_free (_ssl_ctx); ++ } + } + + } // namespace XmlRpc +diff -Naur xmlrpc++0.7/src/XmlRpcSource.h xmlrpc++/src/XmlRpcSource.h +--- xmlrpc++0.7/src/XmlRpcSource.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcSource.h 2004-04-13 17:21:59.000000000 +0200 +@@ -8,6 +8,13 @@ + # pragma warning(disable:4786) // identifier was truncated in debug info + #endif + ++// Deal with SSL dependencies ++#include ++#include ++#include ++#include ++#include ++ + namespace XmlRpc { + + //! An RPC source represents a file descriptor to monitor +@@ -37,6 +44,11 @@ + //! Return true to continue monitoring this source + virtual unsigned handleEvent(unsigned eventType) = 0; + ++ // Keep track of SSL status and other such things ++ bool _ssl; ++ SSL_CTX* _ssl_ctx; ++ SSL* _ssl_ssl; ++ SSL_METHOD* _ssl_meth; + private: + + // Socket. This should really be a SOCKET (an alias for unsigned int*) on windows... +diff -Naur xmlrpc++0.7/src/XmlRpcThread.cpp xmlrpc++/src/XmlRpcThread.cpp +--- xmlrpc++0.7/src/XmlRpcThread.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/src/XmlRpcThread.cpp 2003-04-29 03:06:24.000000000 +0200 +@@ -0,0 +1,74 @@ ++#if defined(XMLRPC_THREADS) ++ ++#include "XmlRpcThread.h" ++ ++#if defined(_WINDOWS) ++# define WIN32_LEAN_AND_MEAN ++# include ++# include ++#else ++# include ++#endif ++ ++ ++using namespace XmlRpc; ++ ++ ++//! Destructor. Does not perform a join() (ie, the thread may continue to run). ++XmlRpcThread::~XmlRpcThread() ++{ ++ if (_pThread) ++ { ++#if defined(_WINDOWS) ++ ::CloseHandle((HANDLE)_pThread); ++#else ++ ::pthread_detach((pthread_t)_pThread); ++#endif ++ _pThread = 0; ++ } ++} ++ ++//! Execute the run method of the runnable object in a separate thread. ++//! Returns immediately in the calling thread. ++void ++XmlRpcThread::start() ++{ ++ if ( ! _pThread) ++ { ++#if defined(_WINDOWS) ++ unsigned threadID; ++ _pThread = (HANDLE)_beginthreadex(NULL, 0, &runInThread, this, 0, &threadID); ++#else ++ ::pthread_create((pthread_t*) &_pThread, NULL, &runInThread, this); ++#endif ++ } ++} ++ ++//! Waits until the thread exits. ++void ++XmlRpcThread::join() ++{ ++ if (_pThread) ++ { ++#if defined(_WINDOWS) ++ ::WaitForSingleObject(_pThread, INFINITE); ++ ::CloseHandle(_pThread); ++#else ++ ::pthread_join((pthread_t)_pThread, 0); ++#endif ++ _pThread = 0; ++ } ++} ++ ++//! Start the runnable going in a thread ++unsigned int ++XmlRpcThread::runInThread(void* pThread) ++{ ++ XmlRpcThread* t = (XmlRpcThread*)pThread; ++ t->getRunnable()->run(); ++ return 0; ++} ++ ++#endif // XMLRPC_THREADS ++ ++ +diff -Naur xmlrpc++0.7/src/XmlRpcThreadedServer.cpp xmlrpc++/src/XmlRpcThreadedServer.cpp +--- xmlrpc++0.7/src/XmlRpcThreadedServer.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/src/XmlRpcThreadedServer.cpp 2003-04-29 03:06:25.000000000 +0200 +@@ -0,0 +1,27 @@ ++#if defined(XMLRPC_THREADS) ++ ++#include "XmlRpcThreadedServer.h" ++//#include "XmlRpcServerConnection.h" ++ ++ ++using namespace XmlRpc; ++ ++// executeRequestThreaded: ++// remove the serverConnection from the dispatcher (but don't close the socket) ++// push the request onto the request queue ++// (acquire the mutex, push_back request, release mutex, incr semaphore) ++// ++ ++// worker::run ++// while ! stopped ++// pop a request off the request queue (block on semaphore/decr, acquire mutex, get request, rel) ++// executeRequest (parse, run, generate response) ++// notify the serverConnection that the response is available ++// (the serverConnection needs to add itself back to the dispatcher safely - mutex) ++ ++// How do I interrupt the dispatcher if it is waiting in a select call? ++// i) Replace select with WaitForMultipleObjects, using WSAEventSelect to associate ++// each socket with an event object, and adding an additional "signal" event. ++// ++ ++#endif // XMLRPC_THREADS +diff -Naur xmlrpc++0.7/src/XmlRpcThreadedServer.h xmlrpc++/src/XmlRpcThreadedServer.h +--- xmlrpc++0.7/src/XmlRpcThreadedServer.h 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/src/XmlRpcThreadedServer.h 2003-04-29 03:06:25.000000000 +0200 +@@ -0,0 +1,67 @@ ++ ++#ifndef _XMLRPCTHREADEDSERVER_H_ ++#define _XMLRPCTHREADEDSERVER_H_ ++// ++// XmlRpc++ Copyright (c) 2002-2003 by Chris Morley ++// ++#if defined(_MSC_VER) ++# pragma warning(disable:4786) // identifier was truncated in debug info ++#endif ++ ++#ifndef MAKEDEPEND ++# include ++# include ++#endif ++ ++ ++#include "XmlRpcMutex.h" ++#include "XmlRpcServer.h" ++#include "XmlRpcThread.h" ++ ++ ++namespace XmlRpc { ++ ++ //! A class to handle multiple simultaneous XML RPC requests ++ class XmlRpcThreadedServer : public XmlRpcServer { ++ public: ++ ++ //! Create a server object with a specified number of worker threads. ++ XmlRpcThreadedServer(int nWorkers = 6) : _workers(nWorkers) {} ++ ++ ++ //! Execute a request ++ ++ protected: ++ ++ //! Each client request is assigned to one worker to handle. ++ //! Workers are executed on separate threads, and one worker may be ++ //! responsible for dispatching events to multiple client connections. ++ class Worker : XmlRpcRunnable { ++ public: ++ //! Constructor. Executes the run method in a separate thread. ++ Worker() { _thread.setRunnable(this); _thread.start(); } ++ ++ //! Implement the Runnable interface ++ void run(); ++ ++ protected: ++ ++ //! The thread this worker is running in. ++ XmlRpcThread _thread; ++ ++ }; ++ ++ ++ //! The worker pool ++ std::vector _workers; ++ ++ ++ //! Serialize dispatcher access ++ XmlRpcMutex _mutex; ++ ++ ++ }; // class XmlRpcThreadedServer ++ ++} ++ ++#endif // _XMLRPCTHREADEDSERVER_H_ +diff -Naur xmlrpc++0.7/src/XmlRpcThread.h xmlrpc++/src/XmlRpcThread.h +--- xmlrpc++0.7/src/XmlRpcThread.h 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/src/XmlRpcThread.h 2003-04-29 03:06:24.000000000 +0200 +@@ -0,0 +1,60 @@ ++#ifndef _XMLRPCTHREAD_H_ ++#define _XMLRPCTHREAD_H_ ++// ++// XmlRpc++ Copyright (c) 2002-2003 by Chris Morley ++// ++#if defined(_MSC_VER) ++# pragma warning(disable:4786) // identifier was truncated in debug info ++#endif ++ ++namespace XmlRpc { ++ ++ //! An abstract class providing an interface for objects that can run in a separate thread. ++ class XmlRpcRunnable { ++ public: ++ //! Code to be executed. ++ virtual void run() = 0; ++ }; // class XmlRpcRunnable ++ ++ ++ //! A simple platform-independent thread API implemented for posix and windows. ++ class XmlRpcThread { ++ public: ++ //! Construct a thread object. Not usable until setRunnable() has been called. ++ XmlRpcThread() : _runner(0), _pThread(0) {} ++ ++ //! Construct a thread object. ++ XmlRpcThread(XmlRpcRunnable* runnable) : _runner(runnable), _pThread(0) {} ++ ++ //! Destructor. Does not perform a join() (ie, the thread may continue to run). ++ ~XmlRpcThread(); ++ ++ //! Execute the run method of the runnable object in a separate thread. ++ //! Returns immediately in the calling thread. ++ void start(); ++ ++ //! Waits until the thread exits. ++ void join(); ++ ++ //! Access the runnable ++ XmlRpcRunnable* getRunnable() const { return _runner; } ++ ++ //! Set the runnable ++ void setRunnable(XmlRpcRunnable* r) { _runner = r; } ++ ++ private: ++ ++ //! Start the runnable going in a thread ++ static unsigned int __stdcall runInThread(void* pThread); ++ ++ //! Code to be executed ++ XmlRpcRunnable* _runner; ++ ++ //! Native thread object ++ void* _pThread; ++ ++ }; // class XmlRpcThread ++ ++} // namespace XmlRpc ++ ++#endif // _XMLRPCTHREAD_H_ +diff -Naur xmlrpc++0.7/src/XmlRpcUtil.cpp xmlrpc++/src/XmlRpcUtil.cpp +--- xmlrpc++0.7/src/XmlRpcUtil.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcUtil.cpp 2003-04-29 03:03:19.000000000 +0200 +@@ -21,7 +21,7 @@ + #endif + + // Version id +-const char XmlRpc::XMLRPC_VERSION[] = "XMLRPC++ 0.7"; ++const char XmlRpc::XMLRPC_VERSION[] = "XMLRPC++ 0.8"; + + // Default log verbosity: 0 for no messages through 5 (writes everything) + int XmlRpcLogHandler::_verbosity = 0; +@@ -147,28 +147,37 @@ + } + + // Returns the next tag and updates offset to the char after the tag, or empty string +-// if the next non-whitespace character is not '<' ++// if the next non-whitespace character is not '<'. Ignores parameters and values within ++// the tag entity. + std::string + XmlRpcUtil::getNextTag(std::string const& xml, int* offset) + { + if (*offset >= int(xml.length())) return std::string(); + +- size_t pos = *offset; +- const char* cp = xml.c_str() + pos; +- while (*cp && isspace(*cp)) { ++ const char* cp = xml.c_str() + size_t(*offset); ++ const char* startcp = cp; ++ while (*cp && isspace(*cp)) + ++cp; +- ++pos; +- } ++ + + if (*cp != '<') return std::string(); + +- std::string s; +- do { +- s += *cp; +- ++pos; +- } while (*cp++ != '>' && *cp != 0); ++ // Tag includes the non-blank characters after < ++ const char* start = cp++; ++ while (*cp != '>' && *cp != 0 && ! isspace(*cp)) ++ ++cp; ++ ++ std::string s(start, cp-start+1); ++ ++ if (*cp != '>') // Skip parameters and values ++ { ++ while (*cp != '>' && *cp != 0) ++ ++cp; ++ ++ s[s.length()-1] = *cp; ++ } + +- *offset = int(pos); ++ *offset += int(cp - startcp + 1); + return s; + } + +diff -Naur xmlrpc++0.7/src/XmlRpcValue.cpp xmlrpc++/src/XmlRpcValue.cpp +--- xmlrpc++0.7/src/XmlRpcValue.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcValue.cpp 2003-06-06 20:13:28.000000000 +0200 +@@ -389,6 +389,7 @@ + if (sscanf(stime.c_str(),"%4d%2d%2dT%2d:%2d:%2d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec) != 6) + return false; + ++ t.tm_year -= 1900; + t.tm_isdst = -1; + _type = TypeDateTime; + _value.asTime = new struct tm(t); +@@ -400,8 +401,8 @@ + { + struct tm* t = _value.asTime; + char buf[20]; +- snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d", +- t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); ++ snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", ++ 1900+t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); + buf[sizeof(buf)-1] = 0; + + std::string xml = VALUE_TAG; +diff -Naur xmlrpc++0.7/src/XmlRpcValue.h xmlrpc++/src/XmlRpcValue.h +--- xmlrpc++0.7/src/XmlRpcValue.h 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/src/XmlRpcValue.h 2003-03-25 22:19:30.000000000 +0100 +@@ -4,6 +4,7 @@ + // + // XmlRpc++ Copyright (c) 2002-2003 by Chris Morley + // ++ + #if defined(_MSC_VER) + # pragma warning(disable:4786) // identifier was truncated in debug info + #endif +@@ -17,12 +18,15 @@ + + namespace XmlRpc { + +- //! RPC method arguments and results are represented by Values ++ //! A class to represent RPC arguments and results. ++ //! Each XmlRpcValue object contains a typed value, ++ //! where the type is determined by the initial value ++ //! assigned to the object. + // should probably refcount them... + class XmlRpcValue { + public: + +- ++ //! XmlRpcValue types + enum Type { + TypeInvalid, + TypeBoolean, +@@ -41,22 +45,36 @@ + typedef std::map ValueStruct; + + +- //! Constructors ++ // Constructors ++ //! Construct an empty XmlRpcValue + XmlRpcValue() : _type(TypeInvalid) { _value.asBinary = 0; } ++ ++ //! Construct an XmlRpcValue with a bool value + XmlRpcValue(bool value) : _type(TypeBoolean) { _value.asBool = value; } ++ ++ //! Construct an XmlRpcValue with an int value + XmlRpcValue(int value) : _type(TypeInt) { _value.asInt = value; } ++ ++ //! Construct an XmlRpcValue with a double value + XmlRpcValue(double value) : _type(TypeDouble) { _value.asDouble = value; } + ++ //! Construct an XmlRpcValue with a string value + XmlRpcValue(std::string const& value) : _type(TypeString) + { _value.asString = new std::string(value); } + ++ //! Construct an XmlRpcValue with a string value. ++ //! @param value A null-terminated (C) string. + XmlRpcValue(const char* value) : _type(TypeString) + { _value.asString = new std::string(value); } + ++ //! Construct an XmlRpcValue with a date/time value. ++ //! @param value A pointer to a struct tm (see localtime) + XmlRpcValue(struct tm* value) : _type(TypeDateTime) + { _value.asTime = new struct tm(*value); } + +- ++ //! Construct an XmlRpcValue with a binary data value ++ //! @param value A pointer to data ++ //! @param nBytes The length of the data pointed to, in bytes + XmlRpcValue(void* value, int nBytes) : _type(TypeBase64) + { + _value.asBinary = new BinaryData((char*)value, ((char*)value)+nBytes); +@@ -66,7 +84,7 @@ + XmlRpcValue(std::string const& xml, int* offset) : _type(TypeInvalid) + { if ( ! fromXml(xml,offset)) _type = TypeInvalid; } + +- //! Copy ++ //! Copy constructor + XmlRpcValue(XmlRpcValue const& rhs) : _type(TypeInvalid) { *this = rhs; } + + //! Destructor (make virtual if you want to subclass) +@@ -76,27 +94,79 @@ + void clear() { invalidate(); } + + // Operators ++ //! Assignment from one XmlRpcValue to this one. ++ //! @param rhs The value in rhs is copied to this value. + XmlRpcValue& operator=(XmlRpcValue const& rhs); ++ ++ //! Assign an int to this XmlRpcValue. + XmlRpcValue& operator=(int const& rhs) { return operator=(XmlRpcValue(rhs)); } ++ ++ //! Assign a double to this XmlRpcValue. + XmlRpcValue& operator=(double const& rhs) { return operator=(XmlRpcValue(rhs)); } ++ ++ //! Assign a string to this XmlRpcValue. + XmlRpcValue& operator=(const char* rhs) { return operator=(XmlRpcValue(std::string(rhs))); } + ++ //! Tests two XmlRpcValues for equality + bool operator==(XmlRpcValue const& other) const; ++ ++ //! Tests two XmlRpcValues for inequality + bool operator!=(XmlRpcValue const& other) const; + ++ //! Treat an XmlRpcValue as a bool. ++ //! Throws XmlRpcException if the value is initialized to ++ //! a type that is not TypeBoolean. + operator bool&() { assertTypeOrInvalid(TypeBoolean); return _value.asBool; } ++ ++ //! Treat an XmlRpcValue as an int. ++ //! Throws XmlRpcException if the value is initialized to ++ //! a type that is not TypeInt. + operator int&() { assertTypeOrInvalid(TypeInt); return _value.asInt; } ++ ++ //! Treat an XmlRpcValue as a double. ++ //! Throws XmlRpcException if the value is initialized to ++ //! a type that is not TypeDouble. + operator double&() { assertTypeOrInvalid(TypeDouble); return _value.asDouble; } ++ ++ //! Treat an XmlRpcValue as a string. ++ //! Throws XmlRpcException if the value is initialized to ++ //! a type that is not TypeString. + operator std::string&() { assertTypeOrInvalid(TypeString); return *_value.asString; } ++ ++ //! Access the BinaryData value. ++ //! Throws XmlRpcException if the value is initialized to ++ //! a type that is not TypeBase64. + operator BinaryData&() { assertTypeOrInvalid(TypeBase64); return *_value.asBinary; } ++ ++ //! Access the DateTime value. ++ //! Throws XmlRpcException if the value is initialized to ++ //! a type that is not TypeDateTime. + operator struct tm&() { assertTypeOrInvalid(TypeDateTime); return *_value.asTime; } + ++ ++ //! Const array value accessor. ++ //! Access the ith value of the array. ++ //! Throws XmlRpcException if the value is not an array or if the index i is ++ //! not a valid index for the array. + XmlRpcValue const& operator[](int i) const { assertArray(i+1); return _value.asArray->at(i); } ++ ++ //! Array value accessor. ++ //! Access the ith value of the array, growing the array if necessary. ++ //! Throws XmlRpcException if the value is not an array. + XmlRpcValue& operator[](int i) { assertArray(i+1); return _value.asArray->at(i); } + ++ //! Struct entry accessor. ++ //! Returns the value associated with the given entry, creating one if necessary. + XmlRpcValue& operator[](std::string const& k) { assertStruct(); return (*_value.asStruct)[k]; } ++ ++ //! Struct entry accessor. ++ //! Returns the value associated with the given entry, creating one if necessary. + XmlRpcValue& operator[](const char* k) { assertStruct(); std::string s(k); return (*_value.asStruct)[s]; } + ++ //! Access the struct value map. ++ //! Can be used to iterate over the entries in the map to find all defined entries. ++ operator ValueStruct const&() { assertStruct(); return *_value.asStruct; } ++ + // Accessors + //! Return true if the value has been set to something. + bool valid() const { return _type != TypeInvalid; } +diff -Naur xmlrpc++0.7/test/HelloClient.cpp xmlrpc++/test/HelloClient.cpp +--- xmlrpc++0.7/test/HelloClient.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/test/HelloClient.cpp 2004-04-13 17:22:00.000000000 +0200 +@@ -15,7 +15,7 @@ + //XmlRpc::setVerbosity(5); + + // Use introspection API to look up the supported methods +- XmlRpcClient c(argv[1], port); ++ XmlRpcClient c(argv[1], port, "/RPC2", false); + XmlRpcValue noArgs, result; + if (c.execute("system.listMethods", noArgs, result)) + std::cout << "\nMethods:\n " << result << "\n\n"; +diff -Naur xmlrpc++0.7/test/Makefile xmlrpc++/test/Makefile +--- xmlrpc++0.7/test/Makefile 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/test/Makefile 2004-04-13 17:22:00.000000000 +0200 +@@ -7,7 +7,7 @@ + GCCWARN = -Wall -Wstrict-prototypes + CXXFLAGS = $(DEBUG) $(GCCWARN) $(OPTIMIZE) $(INCLUDES) + +-LIB = ../libXmlRpc.a ++LIB = ../libXmlRpc.a -lssl + + # Add your system-dependent network libs here + # Solaris: -lsocket -lnsl +@@ -15,7 +15,7 @@ + + LDLIBS = $(SYSTEMLIBS) $(LIB) + +-TESTS = HelloClient HelloServer TestBase64Client TestBase64Server TestValues TestXml Validator ++TESTS = HelloClient HelloServer TestBase64Client TestBase64Server TestValues TestXml Validator TestEGroupwareSSLClient + + all: $(TESTS) + +diff -Naur xmlrpc++0.7/test/TestBase64Client.cpp xmlrpc++/test/TestBase64Client.cpp +--- xmlrpc++0.7/test/TestBase64Client.cpp 2003-03-06 18:25:37.000000000 +0100 ++++ xmlrpc++/test/TestBase64Client.cpp 2004-04-13 17:22:00.000000000 +0200 +@@ -21,7 +21,7 @@ + int port = atoi(argv[2]); + + //XmlRpc::setVerbosity(5); +- XmlRpcClient c(argv[1], port); ++ XmlRpcClient c(argv[1], port, "/RPC2", false); + + XmlRpcValue noArgs, result; + if (c.execute("TestBase64", noArgs, result)) +diff -Naur xmlrpc++0.7/test/TestEGroupwareSSLClient.cpp xmlrpc++/test/TestEGroupwareSSLClient.cpp +--- xmlrpc++0.7/test/TestEGroupwareSSLClient.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ xmlrpc++/test/TestEGroupwareSSLClient.cpp 2004-04-13 17:22:00.000000000 +0200 +@@ -0,0 +1,65 @@ ++#include "XmlRpc.h" ++#include ++ ++using namespace XmlRpc; ++using namespace std; ++ ++int main ( int argc, char *argv[]) { ++ XmlRpc::setVerbosity(3); ++ ++ if (argc != 5) { ++ cout << "eGroupware SSL Client Test\n\n"; ++ cout << "usage: " << argv[0] << " host url user password\n"; ++ cout << "example: " << argv[0] << " www.egroupware.org \"/egroupware/xmlrpc.php\" demo guest\n"; ++ exit (0); ++ } ++ XmlRpcClient client (argv[1], 443, argv[2], true); ++ ++ XmlRpcValue result; ++ XmlRpcValue params; ++ params["username"] = argv[3]; ++ params["password"] = argv[4]; ++ if (!client.execute ("system.login", params, result)) { ++ cout << "Failed.\n"; ++ return 0; ++ } else { ++ cout << result << "\n"; ++ } ++ string sessionid = string(result["sessionid"]); ++ string kp3 = string(result["kp3"]); ++/* ++ XmlRpcClient authClient (argv[1], 443, sessionid.c_str(), kp3.c_str(), argv[2], true); ++ XmlRpcValue calParam; ++ XmlRpcValue calResult; ++ ++ calParam["syear"] = "2001"; ++ calParam["smonth"] = "03"; ++ calParam["sday"] = "01"; ++ calParam["eyear"] = "2005"; ++ calParam["emonth"] = "04"; ++ calParam["eday"] = "25"; ++ ++ if (!authClient.execute("calendar.bocalendar.search", calParam, calResult)) { ++ cout << "No calendar events\n"; ++ } else { ++ cout << calResult << "\n"; ++ } ++*/ ++ ++ XmlRpcValue logoutParam; ++ XmlRpcValue logoutResult; ++ XmlRpcClient client_logout (argv[1], 443, argv[2], true); ++ ++ logoutParam["sessionid"] = sessionid; ++ logoutParam["kp3"] = kp3; ++ ++ if (!client_logout.execute("system.logout", logoutParam, logoutResult)) { ++ cout << "failed to logout\n"; ++ } else { ++ // params['GOODBYE'] == 'XOXO' ++ cout << logoutResult << "\n"; ++ } ++ ++ return 1; ++} ++ +diff -Naur xmlrpc++0.7/test/Validator.cpp xmlrpc++/test/Validator.cpp +--- xmlrpc++0.7/test/Validator.cpp 2003-03-06 18:25:38.000000000 +0100 ++++ xmlrpc++/test/Validator.cpp 2003-12-16 01:10:32.000000000 +0100 +@@ -137,7 +137,7 @@ + { + std::cerr << "ModerateSizeArrayCheck\n"; + std::string s = params[0][0]; +- s += params[0][params[0].size()-1]; ++ s += (std::string)params[0][params[0].size()-1]; + result = s; + } + } moderateSizeArrayCheck(&s); +diff -Naur xmlrpc++0.7/XmlRpc.vcproj xmlrpc++/XmlRpc.vcproj +--- xmlrpc++0.7/XmlRpc.vcproj 2003-03-06 18:25:38.000000000 +0100 ++++ xmlrpc++/XmlRpc.vcproj 2003-04-23 22:57:37.000000000 +0200 +@@ -127,6 +127,8 @@ + + ++ + +@@ -137,6 +139,10 @@ + + ++ ++ + +@@ -151,6 +157,10 @@ + + ++ ++ + +@@ -161,6 +171,10 @@ + + ++ ++ + diff --git a/campcaster/etc/portage/dev-libs/xmlrpc++/files/xmlrpc++-automake.patch b/campcaster/etc/portage/dev-libs/xmlrpc++/files/xmlrpc++-automake.patch new file mode 100644 index 000000000..14de32d39 --- /dev/null +++ b/campcaster/etc/portage/dev-libs/xmlrpc++/files/xmlrpc++-automake.patch @@ -0,0 +1,252 @@ +diff -Naur xmlrpc++/Makefile xmlrpc++-automake/Makefile +--- xmlrpc++/Makefile 2004-04-19 20:53:00.000000000 +0700 ++++ xmlrpc++-automake/Makefile 1970-01-01 07:00:00.000000000 +0700 +@@ -1,71 +0,0 @@ +-# makefile written for gnu make +-CXX = g++ +-SRC = ./src +-SHARED = -shared +-CPPFLAGS = -I$(SRC) +-DEBUG = -g +-OPTIMIZE = -O2 +-GCCWARN = -Wall -Wstrict-prototypes +-CXXFLAGS = $(DEBUG) $(GCCWARN) $(OPTIMIZE) $(INCLUDES) +-VERSION = 0.8 +- +-DESTDIR = +-prefix = /usr +-MKDIR = mkdir -p +-CP = cp +-LN = ln -s +- +-LIB = ./libXmlRpc.a +-LIBALT = ./libxmlrpc++.a +-SO = ./libxmlrpc++.so.$(VERSION) +- +-# Add your system-dependent network libs here. These are +-# only used to build the tests (your application will need them too). +-# Linux: none +-# Solaris: -lsocket -lnsl +-#SYSTEMLIBS = -lsocket -lnsl +-SYSTEMLIBS = +-LDLIBS = $(LIB) $(SYSTEMLIBS) +- +-OBJ = $(SRC)/XmlRpcClient.o $(SRC)/XmlRpcDispatch.o \ +- $(SRC)/XmlRpcServer.o $(SRC)/XmlRpcServerConnection.o \ +- $(SRC)/XmlRpcServerMethod.o $(SRC)/XmlRpcSocket.o $(SRC)/XmlRpcSource.o \ +- $(SRC)/XmlRpcUtil.o $(SRC)/XmlRpcValue.o +- +-all: $(LIB) $(SO) tests +- +-$(LIB): $(OBJ) +- $(AR) $(ARFLAGS) $(LIB) $(OBJ) +- cp $(LIB) $(LIBALT) +- +-$(SO): $(OBJ) +- $(CXX) -o $(SO) $(SHARED) $(OBJ) +- +- +-tests: $(LIB) +- cd test && $(MAKE) CXX=$(CXX) CXXFLAGS="$(CXXFLAGS)" SYSTEMLIBS="$(SYSTEMLIBS)" +- +-doc doxygen: +- cd src && doxygen Doxyfile +- +-distclean: clean +- +-clean: +- rm -f $(SRC)/*.o +- rm -f $(SRC)/*~ +- rm -f $(LIB) $(LIBALT) $(SO) +- rm -f build +- cd test && $(MAKE) clean +- +-install: +- $(MKDIR) $(DESTDIR)$(prefix)/lib +- $(CP) $(SO) $(LIB) $(DESTDIR)$(prefix)/lib +- $(MKDIR) $(DESTDIR)$(prefix)/include +- $(CP) src/*.h $(DESTDIR)$(prefix)/include +- ( cd $(DESTDIR)$(prefix)/lib; rm -f libxmlrpc++.so; $(LN) $(SO) libxmlrpc++.so ) +- # Does not install tests right now +- +-# Debian package make target, in case you want to manually build a package +-# from the distribution. +-deb: +- dpkg-buildpackage -rfakeroot +diff -Naur xmlrpc++/Makefile.am xmlrpc++-automake/Makefile.am +--- xmlrpc++/Makefile.am 1970-01-01 07:00:00.000000000 +0700 ++++ xmlrpc++-automake/Makefile.am 2004-07-26 11:54:16.610066768 +0700 +@@ -0,0 +1,17 @@ ++SUBDIRS = src ++ ++EXTRA_DIST = README.html ++ ++DOC_DIR=@datadir@/doc/xmlrpc++ ++ ++doc: ++ cd src && doxygen Doxyfile ++ ++install-data-local: doc ++ $(mkinstalldirs) $(DOC_DIR); \ ++ for i in doc/html/*; do \ ++ if test -r "$$i"; then \ ++ fn=`basename $$i` \ ++ $(INSTALL_DATA) $$i $(DOC_DIR)/$$fn; \ ++ fi; \ ++ done +diff -Naur xmlrpc++/autogen.sh xmlrpc++-automake/autogen.sh +--- xmlrpc++/autogen.sh 1970-01-01 07:00:00.000000000 +0700 ++++ xmlrpc++-automake/autogen.sh 2004-07-26 11:54:11.578831632 +0700 +@@ -0,0 +1,69 @@ ++#!/bin/sh ++# Run this to set up the build system: configure, makefiles, etc. ++# (based on the version in enlightenment's cvs) ++ ++package="xmlrpc++" ++ ++srcdir=`dirname $0` ++test -z "$srcdir" && srcdir=. ++ ++cd "$srcdir" ++DIE=0 ++ ++(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 ++} ++ ++(automake --version) < /dev/null > /dev/null 2>&1 || { ++ echo ++ echo "You must have automake installed to compile $package." ++ echo "Download the appropriate package for your system," ++ echo "or get the source from one of the GNU ftp sites" ++ echo "listed in http://www.gnu.org/order/ftp.html" ++ DIE=1 ++} ++ ++(libtool --help) < /dev/null > /dev/null 2>&1 || { ++ echo ++ echo "You must have libtool installed to compile $package." ++ echo "Download the appropriate package for your system," ++ echo "or get the source from one of the GNU ftp sites" ++ echo "listed in http://www.gnu.org/order/ftp.html" ++ 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...." ++ ++echo " aclocal $ACLOCAL_FLAGS" ++aclocal $ACLOCAL_FLAGS ++echo " autoheader" ++autoheader ++echo " libtoolize --automake" ++libtoolize --automake ++echo " automake --add-missing --foreign $AUTOMAKE_FLAGS" ++automake --add-missing --foreign $AUTOMAKE_FLAGS ++echo " autoconf" ++autoconf ++ ++$srcdir/configure "$@" && echo +diff -Naur xmlrpc++/configure.in xmlrpc++-automake/configure.in +--- xmlrpc++/configure.in 1970-01-01 07:00:00.000000000 +0700 ++++ xmlrpc++-automake/configure.in 2004-07-26 11:54:11.578831632 +0700 +@@ -0,0 +1,40 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/XmlRpc.h) ++ ++XMLRPC_MAJOR_VERSION=0 ++XMLRPC_MINOR_VERSION=8 ++XMLRPC_MICRO_VERSION=0 ++ ++#shared library versioning ++XMLRPC_INTERFACE_AGE=0 # increment if interfaces have been added, ++ # zero if interfaces have changed or been removed ++XMLRPC_BINARY_AGE=0 # increment if binary-compatability is broken ++ ++XMLRPC_VERSION=$XMLRPC_MAJOR_VERSION.$XMLRPC_MINOR_VERSION.$XMLRPC_MICRO_VERSION ++ ++LT_RELEASE=$XMLRPC_MAJOR_VERSION.$XMLRPC_MINOR_VERSION ++LT_CURRENT=`expr $XMLRPC_MICRO_VERSION - $XMLRPC_INTERFACE_AGE` ++LT_REVISION=$XMLRPC_INTERFACE_AGE ++LT_AGE=`expr $XMLRPC_BINARY_AGE - $XMLRPC_INTERFACE_AGE` ++ ++AC_SUBST(LT_RELEASE) ++AC_SUBST(LT_CURRENT) ++AC_SUBST(LT_REVISION) ++AC_SUBST(LT_AGE) ++AC_SUBST(XMLRPC_VERSION) ++ ++AM_INIT_AUTOMAKE(libxmlrpc++,$XMLRPC_VERSION) ++ ++AM_CONFIG_HEADER(configure.h) ++ ++AC_PROG_CXX ++AC_PROG_INSTALL ++AC_PROG_LIBTOOL ++ ++dnl AC_STDC_HEADERS ++AC_CHECK_LIB( socket, socket) ++AC_CHECK_LIB( nsl, gethostbyname) ++AC_CHECK_LIB( ssl, SSL_connect) ++ ++AC_OUTPUT(Makefile src/Makefile) ++ +diff -Naur xmlrpc++/src/Makefile.am xmlrpc++-automake/src/Makefile.am +--- xmlrpc++/src/Makefile.am 1970-01-01 07:00:00.000000000 +0700 ++++ xmlrpc++-automake/src/Makefile.am 2004-07-26 11:54:11.578831632 +0700 +@@ -0,0 +1,35 @@ ++lib_LTLIBRARIES = libxmlrpc++.la ++ ++libxmlrpc___la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) ++ ++library_includedir=$(includedir) ++library_include_HEADERS = XmlRpc.h \ ++ XmlRpcServer.h \ ++ XmlRpcSocket.h \ ++ XmlRpcValue.h \ ++ XmlRpcClient.h \ ++ XmlRpcServerConnection.h \ ++ XmlRpcSource.h \ ++ XmlRpcDispatch.h \ ++ XmlRpcServerMethod.h \ ++ XmlRpcUtil.h \ ++ XmlRpcThreadedServer.h \ ++ XmlRpcException.h \ ++ XmlRpcMutex.h \ ++ XmlRpcThread.h ++ ++libxmlrpc___la_SOURCES = $(library_include_HEADERS) \ ++ base64.h \ ++ XmlRpcClient.cpp \ ++ XmlRpcServerConnection.cpp \ ++ XmlRpcSource.cpp \ ++ XmlRpcDispatch.cpp \ ++ XmlRpcServerMethod.cpp \ ++ XmlRpcUtil.cpp \ ++ XmlRpcServer.cpp \ ++ XmlRpcSocket.cpp \ ++ XmlRpcValue.cpp \ ++ XmlRpcThreadedServer.cpp \ ++ XmlRpcMutex.cpp\ ++ XmlRpcThread.cpp ++ diff --git a/campcaster/etc/portage/dev-libs/xmlrpc++/xmlrpc++-0.7.ebuild b/campcaster/etc/portage/dev-libs/xmlrpc++/xmlrpc++-0.7.ebuild new file mode 100644 index 000000000..20feeebda --- /dev/null +++ b/campcaster/etc/portage/dev-libs/xmlrpc++/xmlrpc++-0.7.ebuild @@ -0,0 +1,47 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit eutils flag-o-matic + +DESCRIPTION="XmlRpc++ is a C++ implementation of the XML-RPC protocol." +SRC_URI="mirror://sourceforge/xmlrpcpp/${PN}${PV}.tar.gz" +HOMEPAGE="http://xmlrpcpp.sourceforge.net/" +LICENSE="LGPL" + +DEPEND="" +KEYWORDS="~x86 ~ppc ~hppa ~alpha ~amd64" +IUSE="" +SLOT=0 + +src_unpack() { + unpack ${A} + cd ${PN}${PV} + + epatch ${FILESDIR}/xmlrpc++-0.7-to-cvs-20040713.patch + epatch ${FILESDIR}/xmlrpc++-automake.patch + epatch ${FILESDIR}/uninitialised_XmlRpcSource_ssl_ssl.patch + epatch ${FILESDIR}/incorrect_XmlRpcValue_struct_tm_conversion.patch + + sh autogen.sh +} + +src_compile() { + cd ${WORKDIR}/${PN}${PV} + + econf || die "econf failed" + emake || die "emake failed" +} + +src_install () { + cd ${WORKDIR}/${PN}${PV} + + dodoc COPYING README.html + emake prefix=${D} \ + includedir=${D}/usr/include \ + libdir=${D}/usr/lib \ + DOC_DIR=${D}/usr/share/doc/${PF} \ + install \ + || die "make install failed" +} + diff --git a/campcaster/etc/portage/dev-php/PEAR-Calendar/Manifest b/campcaster/etc/portage/dev-php/PEAR-Calendar/Manifest new file mode 100644 index 000000000..42094ebbf --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-Calendar/Manifest @@ -0,0 +1,2 @@ +MD5 4240a059d8243567ea2b783f05c29c14 PEAR-Calendar-0.5.2.ebuild 317 +MD5 f85abc41078747dcbe66b80ddbfea88c files/digest-PEAR-Calendar-0.5.2 62 diff --git a/campcaster/etc/portage/dev-php/PEAR-Calendar/PEAR-Calendar-0.5.2.ebuild b/campcaster/etc/portage/dev-php/PEAR-Calendar/PEAR-Calendar-0.5.2.ebuild new file mode 100644 index 000000000..2ea7689a0 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-Calendar/PEAR-Calendar-0.5.2.ebuild @@ -0,0 +1,13 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit php-pear-r1 + +DESCRIPTION="A package for building Calendar data structures (irrespective of +output)" + +LICENSE="PHP" +SLOT="0" +KEYWORDS="alpha amd64 hppa ia64 ppc ppc64 s390 sparc x86" +IUSE="" diff --git a/campcaster/etc/portage/dev-php/PEAR-Calendar/files/digest-PEAR-Calendar-0.5.2 b/campcaster/etc/portage/dev-php/PEAR-Calendar/files/digest-PEAR-Calendar-0.5.2 new file mode 100644 index 000000000..fd7c38866 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-Calendar/files/digest-PEAR-Calendar-0.5.2 @@ -0,0 +1 @@ +MD5 26e2dedc175fd5056856b1fee6c0415a Calendar-0.5.2.tgz 60164 diff --git a/campcaster/etc/portage/dev-php/PEAR-File/Manifest b/campcaster/etc/portage/dev-php/PEAR-File/Manifest new file mode 100644 index 000000000..f413956ce --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-File/Manifest @@ -0,0 +1,2 @@ +MD5 e0f58b576c8dc7b50a16cc8ab4ed5295 PEAR-File-1.2.0.ebuild 244 +MD5 dfbc729e39566a4af97ca144c293a308 files/digest-PEAR-File-1.2.0 58 diff --git a/campcaster/etc/portage/dev-php/PEAR-File/PEAR-File-1.2.0.ebuild b/campcaster/etc/portage/dev-php/PEAR-File/PEAR-File-1.2.0.ebuild new file mode 100644 index 000000000..fc092acfd --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-File/PEAR-File-1.2.0.ebuild @@ -0,0 +1,12 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit php-pear-r1 + +DESCRIPTION="Common file and directory routines" + +LICENSE="PHP" +SLOT="0" +KEYWORDS="~sparc ~x86" +IUSE="" diff --git a/campcaster/etc/portage/dev-php/PEAR-File/files/digest-PEAR-File-1.2.0 b/campcaster/etc/portage/dev-php/PEAR-File/files/digest-PEAR-File-1.2.0 new file mode 100644 index 000000000..060cad9e2 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-File/files/digest-PEAR-File-1.2.0 @@ -0,0 +1 @@ +MD5 40ccd2236328fbb2475ba74ea575787d File-1.2.0.tgz 15450 diff --git a/campcaster/etc/portage/dev-php/PEAR-File_Find/Manifest b/campcaster/etc/portage/dev-php/PEAR-File_Find/Manifest new file mode 100644 index 000000000..659eb6c62 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-File_Find/Manifest @@ -0,0 +1,2 @@ +MD5 790c4721e6436b79a12dada33b5391fa PEAR-File_Find-0.3.1.ebuild 289 +MD5 7ff24f071f24225d832b6b7a8ef4bf36 files/digest-PEAR-File_Find-0.3.1 62 diff --git a/campcaster/etc/portage/dev-php/PEAR-File_Find/PEAR-File_Find-0.3.1.ebuild b/campcaster/etc/portage/dev-php/PEAR-File_Find/PEAR-File_Find-0.3.1.ebuild new file mode 100644 index 000000000..262512aaf --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-File_Find/PEAR-File_Find-0.3.1.ebuild @@ -0,0 +1,11 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit php-pear-r1 + +DESCRIPTION="A class that facillitates the search of filesystems." +LICENSE="PHP" +SLOT="0" +KEYWORDS="x86 ~ppc ~sparc alpha ~hppa amd64 ppc64" +IUSE="" diff --git a/campcaster/etc/portage/dev-php/PEAR-File_Find/files/digest-PEAR-File_Find-0.3.1 b/campcaster/etc/portage/dev-php/PEAR-File_Find/files/digest-PEAR-File_Find-0.3.1 new file mode 100644 index 000000000..8a8fa1329 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-File_Find/files/digest-PEAR-File_Find-0.3.1 @@ -0,0 +1 @@ +MD5 a81c83a7ce53f4fb9bec8a0019fde0e8 File_Find-0.3.1.tgz 4759 diff --git a/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/Manifest b/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/Manifest new file mode 100644 index 000000000..33a7b7e6e --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/Manifest @@ -0,0 +1,2 @@ +MD5 64e1cc953c0f89144e5865d9e95e0405 PEAR-HTML_QuickForm-3.2.4.ebuild 523 +MD5 4273f257f8706d090b9dbf9856189504 files/digest-PEAR-HTML_QuickForm-3.2.4 68 diff --git a/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/PEAR-HTML_QuickForm-3.2.4.ebuild b/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/PEAR-HTML_QuickForm-3.2.4.ebuild new file mode 100644 index 000000000..f835798ab --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/PEAR-HTML_QuickForm-3.2.4.ebuild @@ -0,0 +1,16 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit php-pear-r1 + +DESCRIPTION="The PEAR::HTML_QuickForm package provides methods for creating, validating, processing HTML forms." +LICENSE="PHP" +SLOT="0" +KEYWORDS="~x86 ~sparc ~ppc ~ia64 ~amd64" +DEPEND=">=dev-php/PEAR-HTML_Common-1.2.1 + dev-php/PEAR-HTML_Template_Flexy + dev-php/PEAR-HTML_Template_IT" +# the last two would be option on doc? but I think we should put the docs there +# anyway +IUSE="" diff --git a/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/files/digest-PEAR-HTML_QuickForm-3.2.4 b/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/files/digest-PEAR-HTML_QuickForm-3.2.4 new file mode 100644 index 000000000..aa2fbd552 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-HTML_QuickForm/files/digest-PEAR-HTML_QuickForm-3.2.4 @@ -0,0 +1 @@ +MD5 63e41c52445c3c975a4d81a801fcd1c6 HTML_QuickForm-3.2.4.tgz 92946 diff --git a/campcaster/etc/portage/dev-php/PEAR-XML_Parser/Manifest b/campcaster/etc/portage/dev-php/PEAR-XML_Parser/Manifest new file mode 100644 index 000000000..b03d3deb5 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-XML_Parser/Manifest @@ -0,0 +1,2 @@ +MD5 20e860b9eaed5ae49ab9e7fc3fc2edf3 PEAR-XML_Parser-1.2.6.ebuild 317 +MD5 1000e0267dc48ce81fa7d8085e801b78 files/digest-PEAR-XML_Parser-1.2.6 64 diff --git a/campcaster/etc/portage/dev-php/PEAR-XML_Parser/PEAR-XML_Parser-1.2.6.ebuild b/campcaster/etc/portage/dev-php/PEAR-XML_Parser/PEAR-XML_Parser-1.2.6.ebuild new file mode 100644 index 000000000..8e9a9e852 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-XML_Parser/PEAR-XML_Parser-1.2.6.ebuild @@ -0,0 +1,14 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit php-pear-r1 + +DESCRIPTION="XML parsing class based on PHP's SAX parser" + +LICENSE="PHP" +SLOT="0" +KEYWORDS="alpha amd64 hppa ia64 ppc ppc64 s390 sparc x86" +IUSE="" + +RDEPEND="dev-php/PEAR-PEAR" diff --git a/campcaster/etc/portage/dev-php/PEAR-XML_Parser/files/digest-PEAR-XML_Parser-1.2.6 b/campcaster/etc/portage/dev-php/PEAR-XML_Parser/files/digest-PEAR-XML_Parser-1.2.6 new file mode 100644 index 000000000..88c766ae8 --- /dev/null +++ b/campcaster/etc/portage/dev-php/PEAR-XML_Parser/files/digest-PEAR-XML_Parser-1.2.6 @@ -0,0 +1 @@ +MD5 96ebc0fc2f349249f1455389797e72a4 XML_Parser-1.2.6.tgz 12944 diff --git a/campcaster/etc/portage/dev-util/cppunit/Manifest b/campcaster/etc/portage/dev-util/cppunit/Manifest new file mode 100644 index 000000000..89cf2ea54 --- /dev/null +++ b/campcaster/etc/portage/dev-util/cppunit/Manifest @@ -0,0 +1,4 @@ +MD5 1d1904de3d5f6dd756279f300a4ae35d cppunit-1.10.2-r1.ebuild 1081 +MD5 b437cd880b8b07ee37ff84cb9f912bed .cppunit-1.10.2-r1.ebuild.swp 12288 +MD5 2f66c625e1f7de63458cfb987e9b0d9d files/digest-cppunit-1.10.2-r1 66 +MD5 bc589fdb15867ba23639c300f62e70f5 files/cppunit-1.10.2-nostandalone.patch 3175 diff --git a/campcaster/etc/portage/dev-util/cppunit/cppunit-1.10.2-r1.ebuild b/campcaster/etc/portage/dev-util/cppunit/cppunit-1.10.2-r1.ebuild new file mode 100644 index 000000000..1ea4d8041 --- /dev/null +++ b/campcaster/etc/portage/dev-util/cppunit/cppunit-1.10.2-r1.ebuild @@ -0,0 +1,41 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit eutils + +IUSE="doc" + +DESCRIPTION="CppUnit is the C++ port of the famous JUnit framework for unit testing." +HOMEPAGE="http://cppunit.sourceforge.net/" +SRC_URI="mirror://sourceforge/${PN}/${P}.tar.gz" + +LICENSE="LGPL-2.1" +SLOT="0" +KEYWORDS="amd64 ppc sparc x86" + +RESTRICT="maketest" + +DEPEND="doc? ( app-doc/doxygen ) + media-gfx/graphviz" + +src_unpack() { + unpack ${A} + cd ${S} + epatch ${FILESDIR}/cppunit-1.10.2-nostandalone.patch +} + +src_compile() { + econf `use_enable doc doxygen` || die "configure failed" + emake || die + #make check || die +} + +src_install() { + make DESTDIR=${D} install || die + dodoc AUTHORS BUGS COPYING NEWS README THANKS TODO + # the package automatically puts its docs into /usr/share/cppunit + # move them to the standard location and clean up + mv ${D}/usr/share/cppunit/html ${D}/usr/share/doc/${PF} + rm -rf ${D}/usr/share/cppunit +} diff --git a/campcaster/etc/portage/dev-util/cppunit/files/cppunit-1.10.2-nostandalone.patch b/campcaster/etc/portage/dev-util/cppunit/files/cppunit-1.10.2-nostandalone.patch new file mode 100644 index 000000000..0286c71e1 --- /dev/null +++ b/campcaster/etc/portage/dev-util/cppunit/files/cppunit-1.10.2-nostandalone.patch @@ -0,0 +1,100 @@ +diff -Naur cppunit-1.10.2/include/cppunit/XmlOutputter.h cppunit-1.10.2-nostandalone/include/cppunit/XmlOutputter.h +--- cppunit-1.10.2/include/cppunit/XmlOutputter.h 2002-09-17 01:31:29.000000000 +0700 ++++ cppunit-1.10.2-nostandalone/include/cppunit/XmlOutputter.h 2004-07-24 15:44:00.816814688 +0700 +@@ -94,6 +94,16 @@ + virtual void addSuccessfulTests( FailedTests &failedTests, + XmlElement *rootNode ); + ++ /*! \brief set the output document as standalone or not. ++ * ++ * For the output document, specify wether it's a standalone XML ++ * document, or not. ++ * ++ * \param standalone if true, the output will be specified as standalone. ++ * if false, it will be not. ++ */ ++ virtual void setStandalone(bool standalone); ++ + /*! \brief Adds the statics element to the root node. + * + * Creates a new element containing statistics data and adds it to the root element. +diff -Naur cppunit-1.10.2/include/cppunit/tools/XmlDocument.h cppunit-1.10.2-nostandalone/include/cppunit/tools/XmlDocument.h +--- cppunit-1.10.2/include/cppunit/tools/XmlDocument.h 2002-08-29 14:36:50.000000000 +0700 ++++ cppunit-1.10.2-nostandalone/include/cppunit/tools/XmlDocument.h 2004-07-24 15:39:03.516011280 +0700 +@@ -42,6 +42,9 @@ + std::string styleSheet() const; + void setStyleSheet( const std::string &styleSheet = "" ); + ++ bool standalone(void) const; ++ void setStandalone(bool standalone); ++ + void setRootElement( XmlElement *rootElement ); + XmlElement &rootElement() const; + +@@ -58,6 +61,7 @@ + std::string m_encoding; + std::string m_styleSheet; + XmlElement *m_rootElement; ++ bool m_standalone; + }; + + +diff -Naur cppunit-1.10.2/src/cppunit/XmlDocument.cpp cppunit-1.10.2-nostandalone/src/cppunit/XmlDocument.cpp +--- cppunit-1.10.2/src/cppunit/XmlDocument.cpp 2002-08-28 04:51:18.000000000 +0700 ++++ cppunit-1.10.2-nostandalone/src/cppunit/XmlDocument.cpp 2004-07-24 15:40:03.344915904 +0700 +@@ -11,6 +11,7 @@ + , m_styleSheet( styleSheet ) + { + setEncoding( encoding ); ++ m_standalone = true; + } + + +@@ -67,11 +68,29 @@ + } + + ++bool ++XmlDocument::standalone() const ++{ ++ return m_standalone; ++} ++ ++ ++void ++XmlDocument::setStandalone(bool standalone) ++{ ++ m_standalone = standalone; ++} ++ ++ + std::string + XmlDocument::toString() const + { + std::string asString = "\n"; ++ "encoding='" + m_encoding + "'"; ++ if (m_standalone) { ++ asString += " standalone='yes'"; ++ } ++ asString += " ?>\n"; + + if ( !m_styleSheet.empty() ) + asString += "\n"; +diff -Naur cppunit-1.10.2/src/cppunit/XmlOutputter.cpp cppunit-1.10.2-nostandalone/src/cppunit/XmlOutputter.cpp +--- cppunit-1.10.2/src/cppunit/XmlOutputter.cpp 2003-03-15 15:55:29.000000000 +0700 ++++ cppunit-1.10.2-nostandalone/src/cppunit/XmlOutputter.cpp 2004-07-24 15:42:59.090198560 +0700 +@@ -43,6 +43,13 @@ + } + + ++void ++XmlOutputter::setStandalone(bool standalone) ++{ ++ m_xml->setStandalone(standalone); ++} ++ ++ + void + XmlOutputter::write() + { diff --git a/campcaster/etc/portage/dev-util/cppunit/files/digest-cppunit-1.10.2-r1 b/campcaster/etc/portage/dev-util/cppunit/files/digest-cppunit-1.10.2-r1 new file mode 100644 index 000000000..7b326a7c9 --- /dev/null +++ b/campcaster/etc/portage/dev-util/cppunit/files/digest-cppunit-1.10.2-r1 @@ -0,0 +1 @@ +MD5 0bc06cd219410f7d4f6bbfc9bdd7c824 cppunit-1.10.2.tar.gz 723340 diff --git a/campcaster/etc/portage/dev-util/lcov/Manifest b/campcaster/etc/portage/dev-util/lcov/Manifest new file mode 100644 index 000000000..d14593c51 --- /dev/null +++ b/campcaster/etc/portage/dev-util/lcov/Manifest @@ -0,0 +1,4 @@ +MD5 0e7c2f291da9f11b39a4cf459b2a22f8 lcov-1.3.ebuild 786 +MD5 b29720b4a135962c0738f5b8181c8db1 files/lcov-1.3-geninfo-regexp.patch 330 +MD5 fef7da910c51fb5fc571bb8370ae6ac0 files/lcov-1.3-install-to-prefix.patch 464 +MD5 074a9de30fca555be8ce86957c10b960 files/digest-lcov-1.3 59 diff --git a/campcaster/etc/portage/dev-util/lcov/files/digest-lcov-1.3 b/campcaster/etc/portage/dev-util/lcov/files/digest-lcov-1.3 new file mode 100644 index 000000000..749b255d0 --- /dev/null +++ b/campcaster/etc/portage/dev-util/lcov/files/digest-lcov-1.3 @@ -0,0 +1 @@ +MD5 ee9e3811b6b3a4c604115a8d1b8f13a7 lcov-1.3.tar.gz 88539 diff --git a/campcaster/etc/portage/dev-util/lcov/files/lcov-1.3-geninfo-regexp.patch b/campcaster/etc/portage/dev-util/lcov/files/lcov-1.3-geninfo-regexp.patch new file mode 100644 index 000000000..1fe36da91 --- /dev/null +++ b/campcaster/etc/portage/dev-util/lcov/files/lcov-1.3-geninfo-regexp.patch @@ -0,0 +1,12 @@ +diff -Naur lcov-1.3/bin/geninfo lcov-1.3-regexp-fix/bin/geninfo +--- lcov-1.3/bin/geninfo 2004-04-29 00:57:11.000000000 +0700 ++++ lcov-1.3-regexp-fix/bin/geninfo 2004-08-02 12:51:48.996719688 +0700 +@@ -707,7 +707,7 @@ + + foreach (@list) + { +- if (/\/$filename$/) ++ if (m,/\Q$filename\E$,) + { + @result = (@result, $_); + } diff --git a/campcaster/etc/portage/dev-util/lcov/files/lcov-1.3-install-to-prefix.patch b/campcaster/etc/portage/dev-util/lcov/files/lcov-1.3-install-to-prefix.patch new file mode 100644 index 000000000..8dd12c87b --- /dev/null +++ b/campcaster/etc/portage/dev-util/lcov/files/lcov-1.3-install-to-prefix.patch @@ -0,0 +1,13 @@ +--- lcov-1.3/Makefile 2004-04-28 19:57:09.000000000 +0200 ++++ lcov-1.3-livesupport/Makefile 2005-07-22 12:12:18.000000000 +0200 +@@ -15,8 +15,8 @@ + RELEASE := 1 + DATE := $(shell date +%Y-%m-%d) + +-BIN_DIR := $(PREFIX)/usr/bin +-MAN_DIR := $(PREFIX)/usr/share/man ++BIN_DIR := $(PREFIX)/bin ++MAN_DIR := $(PREFIX)/share/man + TMP_DIR := /tmp/lcov-tmp.$(shell echo $$$$) + FILES := $(wildcard bin/*) $(wildcard man/*) README CHANGES Makefile \ + $(wildcard rpm/*) diff --git a/campcaster/etc/portage/dev-util/lcov/lcov-1.3.ebuild b/campcaster/etc/portage/dev-util/lcov/lcov-1.3.ebuild new file mode 100644 index 000000000..4de95f753 --- /dev/null +++ b/campcaster/etc/portage/dev-util/lcov/lcov-1.3.ebuild @@ -0,0 +1,37 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit eutils + +DESCRIPTION="LCOV is an extension to GCOV, providing HTML output and support for +large projects" +HOMEPAGE="http://ltp.sourceforge.net/coverage/lcov.php" +SRC_URI="mirror://sourceforge/ltp/${P}.tar.gz" + +LICENSE="LGPL-2.1" +SLOT="0" +KEYWORDS="amd64 ppc sparc x86" + +RESTRICT="maketest" + +DEPEND="dev-lang/perl" + +src_unpack() { + unpack ${A} + cd ${S} + epatch ${FILESDIR}/lcov-1.3-geninfo-regexp.patch + epatch ${FILESDIR}/lcov-1.3-install-to-prefix.patch +} + +src_compile() { + emake || die + #make check || die +} + +src_install() { + # by setting PREFIX we can tell the Makefile where to install + export PREFIX=${D}/usr + emake install || die + dodoc CHANGES README +} diff --git a/campcaster/etc/portage/media-libs/gst-plugins/Manifest b/campcaster/etc/portage/media-libs/gst-plugins/Manifest new file mode 100644 index 000000000..241f364ae --- /dev/null +++ b/campcaster/etc/portage/media-libs/gst-plugins/Manifest @@ -0,0 +1,7 @@ +MD5 230cec8bdd27a33315b67c3eb5cd59f7 gst-plugins-0.8.10-r1.ebuild 2151 +MD5 14463cc56953050a6161f55a1abb9228 files/adder-query.patch 1754 +MD5 d05851db15053a9e5b1c114dfecabbf4 files/adder-duration-fix.patch 1102 +MD5 36f4a0bacb3d1f85c78525f4a1e46fe5 files/switch-fix.patch 1434 +MD5 9f833bb88c0c1d6b9c2b0bdf20f47e4e files/adder-caps-property.patch 9086 +MD5 e5a6b80e2dfc0bf36559f4663fb90e25 files/digest-gst-plugins-0.8.10-r1 72 +MD5 0fd59e0dd0c56f118ccc1a5309cb69b8 files/typefind-smil.patch 2783 diff --git a/campcaster/etc/portage/media-libs/gst-plugins/files/adder-caps-property.patch b/campcaster/etc/portage/media-libs/gst-plugins/files/adder-caps-property.patch new file mode 100644 index 000000000..81d8eca83 --- /dev/null +++ b/campcaster/etc/portage/media-libs/gst-plugins/files/adder-caps-property.patch @@ -0,0 +1,290 @@ +--- gst-plugins-0.8.10/gst/adder/gstadder.h 2005-05-17 10:41:43.000000000 +0200 ++++ gst-plugins-0.8.10-livesupport/gst/adder/gstadder.h 2005-08-26 10:58:46.000000000 +0200 +@@ -65,6 +65,8 @@ + + GstPad *srcpad; + ++ GstCaps *caps; ++ + /* keep track of the sinkpads */ + guint numsinkpads; + GSList *input_channels; +--- gst-plugins-0.8.10/gst/adder/gstadder.c 2005-06-14 18:38:01.000000000 +0200 ++++ gst-plugins-0.8.10-livesupport/gst/adder/gstadder.c 2005-08-26 12:07:30.000000000 +0200 +@@ -64,7 +64,8 @@ + { + ARG_0, + ARG_NUM_PADS, +- ARG_EOS ++ ARG_EOS, ++ ARG_CAPS + /* FILL ME */ + }; + +@@ -86,6 +87,7 @@ + + static void gst_adder_class_init (GstAdderClass * klass); + static void gst_adder_init (GstAdder * adder); ++static void gst_adder_dispose (GObject * object); + + static void gst_adder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +@@ -101,6 +103,8 @@ + /* we do need a loop function */ + static void gst_adder_loop (GstElement * element); + ++static void gst_adder_set_caps(GstAdder * adder, ++ const GstCaps * caps); + static GstCaps *gst_adder_get_caps (GstPad * pad); + + static GstElementClass *parent_class = NULL; +@@ -131,13 +135,11 @@ + static GstPadLinkReturn + gst_adder_link (GstPad * pad, const GstCaps * caps) + { +- GstAdder *adder; +- const char *media_type; +- const GList *pads; +- GstStructure *structure; +- GstPadLinkReturn ret; +- GstElement *element; +- const GSList *links; ++ GstAdder * adder; ++ const GList * pads; ++ GstPadLinkReturn ret; ++ GstElement * element; ++ GSList * links; + + g_return_val_if_fail (caps != NULL, GST_PAD_LINK_REFUSED); + g_return_val_if_fail (pad != NULL, GST_PAD_LINK_REFUSED); +@@ -145,41 +147,42 @@ + element = GST_PAD_PARENT (pad); + adder = GST_ADDER (element); + +- pads = gst_element_get_pad_list (element); +- while (pads) { +- GstPad *otherpad = GST_PAD (pads->data); +- +- if (otherpad != pad) { +- ret = gst_pad_try_set_caps (otherpad, caps); +- if (ret == GST_PAD_LINK_REFUSED || +- (otherpad == adder->srcpad && GST_PAD_LINK_FAILED (ret))) { +- return ret; ++ if (adder->caps != NULL) { ++ pads = gst_element_get_pad_list (element); ++ while (pads) { ++ GstPad *otherpad = GST_PAD (pads->data); ++ ++ if (otherpad != pad) { ++ ret = gst_pad_try_set_caps (otherpad, adder->caps); ++ if (ret == GST_PAD_LINK_REFUSED || ++ (otherpad == adder->srcpad && GST_PAD_LINK_FAILED (ret))) { ++ return ret; ++ } + } ++ pads = g_list_next (pads); ++ } ++ } else { ++ pads = gst_element_get_pad_list (element); ++ while (pads) { ++ GstPad *otherpad = GST_PAD (pads->data); ++ ++ if (otherpad != pad) { ++ ret = gst_pad_try_set_caps (otherpad, caps); ++ if (ret == GST_PAD_LINK_REFUSED || ++ (otherpad == adder->srcpad && GST_PAD_LINK_FAILED (ret))) { ++ return ret; ++ } ++ } ++ pads = g_list_next (pads); + } +- pads = g_list_next (pads); +- } + +- structure = gst_caps_get_structure (caps, 0); +- media_type = gst_structure_get_name (structure); +- if (strcmp (media_type, "audio/x-raw-int") == 0) { +- GST_DEBUG ("parse_caps sets adder to format int"); +- adder->format = GST_ADDER_FORMAT_INT; +- gst_structure_get_int (structure, "width", &adder->width); +- gst_structure_get_int (structure, "depth", &adder->depth); +- gst_structure_get_int (structure, "endianness", &adder->endianness); +- gst_structure_get_boolean (structure, "signed", &adder->is_signed); +- gst_structure_get_int (structure, "channels", &adder->channels); +- gst_structure_get_int (structure, "rate", &adder->rate); +- } else if (strcmp (media_type, "audio/x-raw-float") == 0) { +- GST_DEBUG ("parse_caps sets adder to format float"); +- adder->format = GST_ADDER_FORMAT_FLOAT; +- gst_structure_get_int (structure, "width", &adder->width); +- gst_structure_get_int (structure, "channels", &adder->channels); +- gst_structure_get_int (structure, "rate", &adder->rate); ++ /* set our caps, if all try_set_caps succeeded */ ++ gst_adder_set_caps(adder, caps); ++ + } + + for (links = adder->input_channels; +- links != NULL; links = g_slist_next (links)) { ++ links != NULL; links = g_slist_next (links)) { + GstAdderInputChannel *input = (GstAdderInputChannel *) links->data; + + if (input->sinkpad == pad) { +@@ -200,6 +203,8 @@ + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + ++ gobject_class->dispose = gst_adder_dispose; ++ + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_adder_src_template)); + gst_element_class_add_pad_template (gstelement_class, +@@ -217,6 +222,11 @@ + "generate an EOS when all input channels did", FALSE, + G_PARAM_READWRITE)); + ++ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CAPS, ++ g_param_spec_pointer ("caps", "pad capabilities", ++ "fix all adder capabilities to supplied value", ++ G_PARAM_READWRITE)); ++ + gobject_class->get_property = gst_adder_get_property; + gobject_class->set_property = gst_adder_set_property; + +@@ -226,6 +236,44 @@ + } + + static void ++gst_adder_set_caps(GstAdder * adder, ++ const GstCaps * caps) ++{ ++ GstStructure * structure; ++ const char * media_type; ++ ++ if (adder == NULL || !GST_IS_ADDER(adder) ++ || caps == NULL || !GST_IS_CAPS(caps)) { ++ ++ return; ++ } ++ if (adder->caps != NULL) { ++ gst_caps_free(adder->caps); ++ } ++ ++ adder->caps = gst_caps_copy(caps); ++ ++ structure = gst_caps_get_structure (adder->caps, 0); ++ media_type = gst_structure_get_name (structure); ++ if (strcmp (media_type, "audio/x-raw-int") == 0) { ++ GST_DEBUG ("parse_caps sets adder to format int"); ++ adder->format = GST_ADDER_FORMAT_INT; ++ gst_structure_get_int (structure, "width", &adder->width); ++ gst_structure_get_int (structure, "depth", &adder->depth); ++ gst_structure_get_int (structure, "endianness", &adder->endianness); ++ gst_structure_get_boolean (structure, "signed", &adder->is_signed); ++ gst_structure_get_int (structure, "channels", &adder->channels); ++ gst_structure_get_int (structure, "rate", &adder->rate); ++ } else if (strcmp (media_type, "audio/x-raw-float") == 0) { ++ GST_DEBUG ("parse_caps sets adder to format float"); ++ adder->format = GST_ADDER_FORMAT_FLOAT; ++ gst_structure_get_int (structure, "width", &adder->width); ++ gst_structure_get_int (structure, "channels", &adder->channels); ++ gst_structure_get_int (structure, "rate", &adder->rate); ++ } ++} ++ ++static void + gst_adder_init (GstAdder * adder) + { + adder->srcpad = +@@ -238,6 +286,8 @@ + + adder->format = GST_ADDER_FORMAT_UNSET; + ++ adder->caps = NULL; ++ + /* keep track of the sinkpads requested */ + + adder->numsinkpads = 0; +@@ -246,6 +296,18 @@ + adder->eos = FALSE; + } + ++static void ++gst_adder_dispose(GObject * object) ++{ ++ GstAdder * adder = GST_ADDER(object); ++ ++ g_return_if_fail(GST_IS_ADDER(adder)); ++ if (adder->caps) { ++ gst_caps_free(adder->caps); ++ } ++ G_OBJECT_CLASS(parent_class)->dispose(object); ++} ++ + static GstPad * + gst_adder_request_new_pad (GstElement * element, GstPadTemplate * templ, + const gchar * unused) +@@ -339,6 +401,9 @@ + case ARG_EOS: + g_value_set_boolean (value, adder->eos); + break; ++ case ARG_CAPS: ++ g_value_set_pointer (value, adder->caps); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -360,6 +425,9 @@ + case ARG_EOS: + adder->eos = g_value_get_boolean (value); + break; ++ case ARG_CAPS: ++ gst_adder_set_caps(adder, g_value_get_pointer(value)); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -613,23 +681,28 @@ + gst_adder_get_caps (GstPad * pad) + { + GstAdder *adder = GST_ADDER (gst_pad_get_parent (pad)); +- GstCaps *caps = gst_caps_new_any (); +- GstCaps *tmp, *res; +- GstPad *otherpad; +- const GList *pads; +- +- for (pads = gst_element_get_pad_list (GST_ELEMENT (adder)); +- pads != NULL; pads = pads->next) { +- otherpad = GST_PAD (pads->data); +- +- tmp = gst_pad_get_allowed_caps (otherpad); +- res = gst_caps_intersect (caps, tmp); +- gst_caps_free (tmp); +- gst_caps_free (caps); +- caps = res; +- } + +- return caps; ++ if (adder->caps != NULL) { ++ return gst_caps_copy(adder->caps); ++ } else { ++ GstCaps *caps = gst_caps_new_any (); ++ GstCaps *tmp, *res; ++ GstPad *otherpad; ++ const GList *pads; ++ ++ for (pads = gst_element_get_pad_list (GST_ELEMENT (adder)); ++ pads != NULL; pads = pads->next) { ++ otherpad = GST_PAD (pads->data); ++ ++ tmp = gst_pad_get_allowed_caps (otherpad); ++ res = gst_caps_intersect (caps, tmp); ++ gst_caps_free (tmp); ++ gst_caps_free (caps); ++ caps = res; ++ } ++ ++ return caps; ++ } + } + + static gboolean diff --git a/campcaster/etc/portage/media-libs/gst-plugins/files/adder-duration-fix.patch b/campcaster/etc/portage/media-libs/gst-plugins/files/adder-duration-fix.patch new file mode 100644 index 000000000..5ec07ede9 --- /dev/null +++ b/campcaster/etc/portage/media-libs/gst-plugins/files/adder-duration-fix.patch @@ -0,0 +1,29 @@ +--- gst-plugins-0.8.9/gst/adder/gstadder.c 2005-06-29 14:45:17.000000000 +0200 ++++ gst-plugins-0.8.9-livesupport/gst/adder/gstadder.c 2005-06-29 14:42:05.000000000 +0200 +@@ -558,14 +558,19 @@ + } + + if (valid_inputs > 0 || adder->eos == FALSE) { ++ gint64 delta; ++ gint64 duration; ++ ++ delta = (adder->format == GST_ADDER_FORMAT_FLOAT) ++ ? GST_BUFFER_SIZE (buf_out) / adder->width / adder->channels ++ : GST_BUFFER_SIZE (buf_out) * 8 / adder->width / adder->channels; ++ duration = delta * GST_SECOND / adder->rate; ++ + GST_BUFFER_TIMESTAMP (buf_out) = adder->timestamp; +- if (adder->format == GST_ADDER_FORMAT_FLOAT) +- adder->offset += +- GST_BUFFER_SIZE (buf_out) / adder->width / adder->channels; +- else +- adder->offset += +- GST_BUFFER_SIZE (buf_out) * 8 / adder->width / adder->channels; +- adder->timestamp = adder->offset * GST_SECOND / adder->rate; ++ GST_BUFFER_DURATION (buf_out) = duration; ++ ++ adder->offset += delta; ++ adder->timestamp += duration; + + /* send it out */ + GST_LOG ("pushing buf_out"); diff --git a/campcaster/etc/portage/media-libs/gst-plugins/files/adder-query.patch b/campcaster/etc/portage/media-libs/gst-plugins/files/adder-query.patch new file mode 100644 index 000000000..12add8ffc --- /dev/null +++ b/campcaster/etc/portage/media-libs/gst-plugins/files/adder-query.patch @@ -0,0 +1,54 @@ +--- gst-plugins-0.8.10/gst/adder/gstadder.c 2005-09-07 16:24:18.000000000 +0200 ++++ gst-plugins-0.8.10-livesupport/gst/adder/gstadder.c 2005-09-07 16:22:40.000000000 +0200 +@@ -107,6 +107,11 @@ + const GstCaps * caps); + static GstCaps *gst_adder_get_caps (GstPad * pad); + ++static gboolean gst_adder_query(GstPad * pad, ++ GstQueryType type, ++ GstFormat * format, ++ gint64 * value); ++ + static GstElementClass *parent_class = NULL; + + /* static guint gst_adder_signals[LAST_SIGNAL] = { 0 }; */ +@@ -283,6 +288,7 @@ + gst_element_set_loop_function (GST_ELEMENT (adder), gst_adder_loop); + gst_pad_set_getcaps_function (adder->srcpad, gst_adder_get_caps); + gst_pad_set_link_function (adder->srcpad, gst_adder_link); ++ gst_pad_set_query_function (adder->srcpad, gst_adder_query); + + adder->format = GST_ADDER_FORMAT_UNSET; + +@@ -654,6 +660,31 @@ + } + + ++static gboolean gst_adder_query(GstPad * pad, ++ GstQueryType type, ++ GstFormat * format, ++ gint64 * value) ++{ ++ GstAdder * adder; ++ ++ adder = GST_ADDER(gst_pad_get_parent(pad)); ++ if (!GST_IS_ADDER(adder)) { ++ return FALSE; ++ } ++ ++ if (pad != adder->srcpad) { ++ return gst_pad_query_default(pad, type, format, value); ++ } ++ ++ if (type != GST_QUERY_POSITION || *format != GST_FORMAT_TIME) { ++ return gst_pad_query_default(pad, type, format, value); ++ } ++ ++ *value = adder->timestamp; ++ return TRUE; ++} ++ ++ + static GstElementStateReturn + gst_adder_change_state (GstElement * element) + { diff --git a/campcaster/etc/portage/media-libs/gst-plugins/files/digest-gst-plugins-0.8.10-r1 b/campcaster/etc/portage/media-libs/gst-plugins/files/digest-gst-plugins-0.8.10-r1 new file mode 100644 index 000000000..511a32be2 --- /dev/null +++ b/campcaster/etc/portage/media-libs/gst-plugins/files/digest-gst-plugins-0.8.10-r1 @@ -0,0 +1 @@ +MD5 99f36ba2b91015a23d3c20a8f424b232 gst-plugins-0.8.10.tar.bz2 2397528 diff --git a/campcaster/etc/portage/media-libs/gst-plugins/files/switch-fix.patch b/campcaster/etc/portage/media-libs/gst-plugins/files/switch-fix.patch new file mode 100644 index 000000000..0b083cb61 --- /dev/null +++ b/campcaster/etc/portage/media-libs/gst-plugins/files/switch-fix.patch @@ -0,0 +1,32 @@ +--- gst-plugins-0.8.9/gst/switch/gstswitch.c 2005-04-14 18:26:47.000000000 +0200 ++++ gst-plugins-0.8.9-livesupport/gst/switch/gstswitch.c 2005-06-18 11:26:19.000000000 +0200 +@@ -241,15 +241,23 @@ + GstEvent *event = GST_EVENT (data); + + GST_LOG_OBJECT (gstswitch, +- "handling event from active pad %p", switchpad->sinkpad); ++ "handling event of type %d from active pad %p", ++ GST_EVENT_TYPE(GST_EVENT(data)), ++ switchpad->sinkpad); + /* Handling event */ + gst_pad_event_default (switchpad->sinkpad, event); + } else { +- /* Pushing active sinkpad data to srcpad */ +- GST_LOG_OBJECT (gstswitch, +- "pushing data from active pad %p to %p", +- switchpad->sinkpad, gstswitch->srcpad); +- gst_pad_push (gstswitch->srcpad, data); ++ if (GST_PAD_IS_ACTIVE(GST_PAD_PEER(gstswitch->srcpad))) { ++ /* Pushing active sinkpad data to srcpad */ ++ GST_LOG_OBJECT (gstswitch, ++ "pushing data from active pad %p to %p", ++ switchpad->sinkpad, gstswitch->srcpad); ++ gst_pad_push (gstswitch->srcpad, data); ++ } else { ++ /* the peer has become inactive, put us into EOS state */ ++ GST_LOG_OBJECT(gstswitch, "peer pad inactivated, going to eos"); ++ gst_element_set_eos(GST_ELEMENT(gstswitch)); ++ } + } + + /* Mark this data as forwarded so that it won't get unrefed on next poll */ diff --git a/campcaster/etc/portage/media-libs/gst-plugins/files/typefind-smil.patch b/campcaster/etc/portage/media-libs/gst-plugins/files/typefind-smil.patch new file mode 100644 index 000000000..5d3167014 --- /dev/null +++ b/campcaster/etc/portage/media-libs/gst-plugins/files/typefind-smil.patch @@ -0,0 +1,86 @@ +--- gst-plugins-0.8.9/gst/typefind/gsttypefindfunctions.c 2005-05-17 10:41:47.000000000 +0200 ++++ gst-plugins-0.8.9-livesupport/gst/typefind/gsttypefindfunctions.c 2005-06-22 18:46:33.000000000 +0200 +@@ -132,6 +132,66 @@ + } + } + ++/*** application/smil *********************************************************/ ++ ++static GstStaticCaps smil_caps = GST_STATIC_CAPS ("application/smil"); ++ ++#define SMIL_CAPS (gst_static_caps_get(&smil_caps)) ++static void ++smil_type_find (GstTypeFind * tf, gpointer unused) ++{ ++ guint8 *data = gst_type_find_peek (tf, 0, BUFFER_SIZE); ++ guint pos = 0; ++ guint offset = 0; ++ ++ if (data) { ++ /* look for the XMLDec, ++ * see XML spec 2.8, Prolog and Document Type Declaration ++ * http://www.w3.org/TR/2004/REC-xml-20040204/#sec-prolog-dtd ++ */ ++ /* we know that BUFFER_SIZE > strlen(" element */ ++ while (data) { ++ while (*data != '<') { ++ INC_BUFFER; ++ } ++ ++ INC_BUFFER; ++ if (!g_ascii_isalpha(*data)) { ++ /* if not alphabetic, it's a PI or an element / attribute declaration ++ * like =media-libs/gstreamer-0.8.10 + >=gnome-base/gconf-2" + +DEPEND="${RDEPEND} + >=sys-devel/gettext-0.11.5 + >=dev-util/pkgconfig-0.9" + +PDEPEND="oss? ( >=media-plugins/gst-plugins-oss-${PV} ) + alsa? ( >=media-plugins/gst-plugins-alsa-${PV} ) + esd? ( >=media-plugins/gst-plugins-esd-${PV} )" + +# we need x for the x overlay to get linked +GST_PLUGINS_BUILD="x xshm" + +# overrides the eclass +src_unpack() { + + unpack ${A} + cd ${S} + epatch ${FILESDIR}/adder-caps-property.patch + epatch ${FILESDIR}/adder-duration-fix.patch + epatch ${FILESDIR}/adder-query.patch + epatch ${FILESDIR}/switch-fix.patch + epatch ${FILESDIR}/typefind-smil.patch +} + +src_compile() { + + elibtoolize + + # gst doesnt handle optimisations well + strip-flags + replace-flags "-O3" "-O2" + filter-flags "-fprefetch-loop-arrays" # see bug 22249 + if use alpha || use amd64 || use ia64 || use hppa; then + append-flags -fPIC + fi + + gst-plugins_src_configure + + emake || die + +} + +# override eclass +src_install() { + + gnome2_src_install + +} + +DOCS="AUTHORS INSTALL README RELEASE TODO" + +pkg_postinst () { + + gnome2_pkg_postinst + gst-plugins_pkg_postinst + + echo "" + einfo "The Gstreamer plugins setup has changed quite a bit on Gentoo," + einfo "applications now should provide the basic plugins needed." + echo "" + einfo "The new seperate plugins are all named 'gst-plugins-'." + einfo "To get a listing of currently available plugins execute 'emerge -s gst-plugins-'." + einfo "In most cases it shouldn't be needed though to emerge extra plugins." + +} + +pkg_postrm() { + + gnome2_pkg_postrm + gst-plugins_pkg_postrm + +} diff --git a/campcaster/etc/portage/media-libs/taglib/Manifest b/campcaster/etc/portage/media-libs/taglib/Manifest new file mode 100644 index 000000000..569b0fef9 --- /dev/null +++ b/campcaster/etc/portage/media-libs/taglib/Manifest @@ -0,0 +1,4 @@ +MD5 7a549789db883fd2a1fece00159db85b taglib-1.3.1-r3.ebuild 916 +MD5 103dd47ff1744397288b44834902e16c files/taglib-1.3.1-memleak-fix2.patch 2514 +MD5 5be2e7958dd0c6985fd109659eb90b6b files/taglib-1.3.1-length-in-microseconds.patch 5962 +MD5 cc8a58ea8028f3539fcee148baeffcc1 files/digest-taglib-1.3.1-r3 64 diff --git a/campcaster/etc/portage/media-libs/taglib/files/digest-taglib-1.3.1-r3 b/campcaster/etc/portage/media-libs/taglib/files/digest-taglib-1.3.1-r3 new file mode 100644 index 000000000..cd73d6280 --- /dev/null +++ b/campcaster/etc/portage/media-libs/taglib/files/digest-taglib-1.3.1-r3 @@ -0,0 +1 @@ +MD5 f5c7c71513ba51b240864d7475a199c0 taglib-1.3.1.tar.gz 734938 diff --git a/campcaster/etc/portage/media-libs/taglib/files/taglib-1.3.1-length-in-microseconds.patch b/campcaster/etc/portage/media-libs/taglib/files/taglib-1.3.1-length-in-microseconds.patch new file mode 100644 index 000000000..bd8047634 --- /dev/null +++ b/campcaster/etc/portage/media-libs/taglib/files/taglib-1.3.1-length-in-microseconds.patch @@ -0,0 +1,172 @@ +--- taglib-1.3.1/taglib/audioproperties.h 2003-11-04 03:48:25.000000000 +0100 ++++ taglib-1.3.1-microseconds/taglib/audioproperties.h 2005-06-15 19:27:31.805943362 +0200 +@@ -59,11 +59,16 @@ + virtual ~AudioProperties(); + + /*! +- * Returns the lenght of the file in seconds. ++ * Returns the length of the file in seconds (rounded down). + */ + virtual int length() const = 0; + + /*! ++ * Returns the fractional part of the length of the file, in microseconds. ++ */ ++ virtual int length_microseconds() const = 0; ++ ++ /*! + * Returns the most appropriate bit rate for the file in kb/s. For constant + * bitrate formats this is simply the bitrate of the file. For variable + * bitrate formats this is either the average or nominal bitrate. +--- taglib-1.3.1/taglib/flac/flacproperties.h 2004-06-24 21:27:02.000000000 +0200 ++++ taglib-1.3.1-microseconds/taglib/flac/flacproperties.h 2005-06-15 19:41:27.176791223 +0200 +@@ -62,6 +62,7 @@ + // Reimplementations. + + virtual int length() const; ++ virtual int length_microseconds() const; + virtual int bitrate() const; + virtual int sampleRate() const; + virtual int channels() const; +--- taglib-1.3.1/taglib/flac/flacproperties.cpp 2004-08-02 16:18:58.000000000 +0200 ++++ taglib-1.3.1-microseconds/taglib/flac/flacproperties.cpp 2005-06-15 21:42:48.714138847 +0200 +@@ -76,6 +76,11 @@ + return d->length; + } + ++int FLAC::Properties::length_microseconds() const ++{ ++ return 0; ++} ++ + int FLAC::Properties::bitrate() const + { + return d->bitrate; +--- taglib-1.3.1/taglib/mpc/mpcproperties.h 2004-07-21 00:30:00.000000000 +0200 ++++ taglib-1.3.1-microseconds/taglib/mpc/mpcproperties.h 2005-06-15 19:46:10.845016974 +0200 +@@ -56,6 +56,7 @@ + // Reimplementations. + + virtual int length() const; ++ virtual int length_microseconds() const; + virtual int bitrate() const; + virtual int sampleRate() const; + virtual int channels() const; +--- taglib-1.3.1/taglib/mpc/mpcproperties.cpp 2004-09-09 02:28:18.000000000 +0200 ++++ taglib-1.3.1-microseconds/taglib/mpc/mpcproperties.cpp 2005-06-15 21:43:14.322020672 +0200 +@@ -71,6 +71,11 @@ + return d->length; + } + ++int MPC::Properties::length_microseconds() const ++{ ++ return 0; ++} ++ + int MPC::Properties::bitrate() const + { + return d->bitrate; +--- taglib-1.3.1/taglib/mpeg/mpegproperties.h 2003-11-05 05:29:05.000000000 +0100 ++++ taglib-1.3.1-microseconds/taglib/mpeg/mpegproperties.h 2005-06-15 19:33:00.669147926 +0200 +@@ -56,6 +56,7 @@ + // Reimplementations. + + virtual int length() const; ++ virtual int length_microseconds() const; + virtual int bitrate() const; + virtual int sampleRate() const; + virtual int channels() const; +--- taglib-1.3.1/taglib/mpeg/mpegproperties.cpp 2004-08-02 16:18:58.000000000 +0200 ++++ taglib-1.3.1-microseconds/taglib/mpeg/mpegproperties.cpp 2005-06-15 20:57:14.538631543 +0200 +@@ -41,7 +41,7 @@ + + File *file; + ReadStyle style; +- int length; ++ long long length; + int bitrate; + int sampleRate; + int channels; +@@ -71,7 +71,12 @@ + + int MPEG::Properties::length() const + { +- return d->length; ++ return int(d->length / 1000000); ++} ++ ++int MPEG::Properties::length_microseconds() const ++{ ++ return int(d->length % 1000000); + } + + int MPEG::Properties::bitrate() const +@@ -191,8 +196,9 @@ + + double timePerFrame = blockSize[firstHeader.layer()]; + timePerFrame = firstHeader.sampleRate() > 0 ? timePerFrame / firstHeader.sampleRate() : 0; +- d->length = int(timePerFrame * xingHeader.totalFrames()); +- d->bitrate = d->length > 0 ? xingHeader.totalSize() * 8 / d->length / 1000 : 0; ++ d->length = (long long)( ++ timePerFrame * xingHeader.totalFrames() * 1000000 + 0.5); ++ d->bitrate = d->length > 0 ? xingHeader.totalSize() * 8000 / d->length : 0; + } + + // Since there was no valid Xing header found, we hope that we're in a constant +@@ -204,8 +210,10 @@ + else if(firstHeader.frameLength() > 0 && firstHeader.bitrate() > 0) { + int frames = (last - first) / firstHeader.frameLength() + 1; + +- d->length = int(float(firstHeader.frameLength() * frames) / +- float(firstHeader.bitrate() * 125) + 0.5); ++ d->length = (long long)( ++ (double(firstHeader.frameLength()) * frames * 1000000) / ++ (double(firstHeader.bitrate()) * 125) + 0.5); ++ + d->bitrate = firstHeader.bitrate(); + } + +--- taglib-1.3.1/taglib/ogg/vorbis/vorbisproperties.h 2004-05-13 02:29:48.000000000 +0200 ++++ taglib-1.3.1-microseconds/taglib/ogg/vorbis/vorbisproperties.h 2005-06-15 19:48:18.365492520 +0200 +@@ -65,6 +65,7 @@ + // Reimplementations. + + virtual int length() const; ++ virtual int length_microseconds() const; + virtual int bitrate() const; + virtual int sampleRate() const; + virtual int channels() const; +--- taglib-1.3.1/taglib/ogg/vorbis/vorbisproperties.cpp 2003-12-02 06:00:23.000000000 +0100 ++++ taglib-1.3.1-microseconds/taglib/ogg/vorbis/vorbisproperties.cpp 2005-06-15 20:36:41.687062239 +0200 +@@ -46,7 +46,7 @@ + + File *file; + ReadStyle style; +- int length; ++ long long length; + int bitrate; + int sampleRate; + int channels; +@@ -81,7 +81,12 @@ + + int Vorbis::Properties::length() const + { +- return d->length; ++ return int(d->length / 1000000); ++} ++ ++int Vorbis::Properties::length_microseconds() const ++{ ++ return int(d->length % 1000000); + } + + int Vorbis::Properties::bitrate() const +@@ -169,7 +174,7 @@ + long long end = last->absoluteGranularPosition(); + + if(start >= 0 && end >= 0 && d->sampleRate > 0) +- d->length = (end - start) / (long long) d->sampleRate; ++ d->length = ((end - start) * 1000000) / (long long) d->sampleRate; + else + debug("Vorbis::Properties::read() -- Either the PCM values for the start or " + "end of this file was incorrect or the sample rate is zero."); diff --git a/campcaster/etc/portage/media-libs/taglib/files/taglib-1.3.1-memleak-fix2.patch b/campcaster/etc/portage/media-libs/taglib/files/taglib-1.3.1-memleak-fix2.patch new file mode 100644 index 000000000..8e969d2da --- /dev/null +++ b/campcaster/etc/portage/media-libs/taglib/files/taglib-1.3.1-memleak-fix2.patch @@ -0,0 +1,112 @@ +--- taglib/mpc/mpcproperties.cpp 2004/09/09 00:28:57 345141 ++++ taglib/mpc/mpcproperties.cpp 2005/04/02 20:53:11 402712 +@@ -106,7 +106,7 @@ + + void MPC::Properties::read() + { +- if(d->data.mid(0, 3) != "MP+") ++ if(!d->data.startsWith("MP+")) + return; + + d->version = d->data[3] & 15; +@@ -116,7 +116,7 @@ + if(d->version >= 7) { + frames = d->data.mid(4, 4).toUInt(false); + +- std::bitset<32> flags = d->data.mid(8, 4).toUInt(true); ++ std::bitset<32> flags = d->data.mid(8, 4).toUInt(false); + d->sampleRate = sftable[flags[17] * 2 + flags[16]]; + d->channels = 2; + } + + +--- taglib/mpc/mpcfile.cpp 2004/09/02 18:50:26 343576 ++++ taglib/mpc/mpcfile.cpp 2005/04/03 16:41:17 402896 +@@ -53,7 +53,10 @@ + + ~FilePrivate() + { ++ if (tag != ID3v1Tag && tag != APETag) delete tag; + delete ID3v1Tag; ++ delete APETag; ++ delete ID3v2Header; + delete properties; + } + +@@ -227,7 +230,7 @@ + if(d->APETag) + d->tag = d->APETag; + else +- d->tag = d->APETag = new APE::Tag(); ++ d->tag = d->APETag = new APE::Tag; + } + + if(tags & ID3v2) { +@@ -242,7 +245,7 @@ + if(d->ID3v1Tag) + d->tag = d->ID3v1Tag; + else +- d->tag = d->APETag = new APE::Tag(); ++ d->tag = d->APETag = new APE::Tag; + } + } + +@@ -284,7 +287,7 @@ + if(d->hasAPE) + d->tag = d->APETag; + else +- d->tag = d->APETag = new APE::Tag(); ++ d->tag = d->APETag = new APE::Tag; + } + } + + +--- taglib/ape/apeitem.h 2004/11/06 14:24:40 360969 ++++ taglib/ape/apeitem.h 2005/04/03 16:35:55 402891 +@@ -70,6 +70,11 @@ + Item(const Item &item); + + /*! ++ * Destroys the item. ++ */ ++ virtual ~Item(); ++ ++ /*! + * Copies the contents of \a item into this item. + */ + Item &operator=(const Item &item); + + +--- taglib/ape/apeitem.cpp 2004/11/06 14:43:24 360973 ++++ taglib/ape/apeitem.cpp 2005/04/03 16:35:55 402891 +@@ -62,6 +62,11 @@ + d = new ItemPrivate(*item.d); + } + ++APE::Item::~Item() ++{ ++ delete d; ++} ++ + Item &APE::Item::operator=(const Item &item) + { + delete d; +@@ -111,7 +116,7 @@ + + String APE::Item::toString() const + { +- return d->text.front(); ++ return isEmpty() ? String::null : d->text.front(); + } + + bool APE::Item::isEmpty() const +@@ -121,7 +126,7 @@ + case 1: + if(d->text.isEmpty()) + return true; +- if(d->text.size() == 1 && d->text.front() == "") ++ if(d->text.size() == 1 && d->text.front().isEmpty()) + return true; + return false; + case 2: + diff --git a/campcaster/etc/portage/media-libs/taglib/taglib-1.3.1-r3.ebuild b/campcaster/etc/portage/media-libs/taglib/taglib-1.3.1-r3.ebuild new file mode 100644 index 000000000..7986acacc --- /dev/null +++ b/campcaster/etc/portage/media-libs/taglib/taglib-1.3.1-r3.ebuild @@ -0,0 +1,39 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit eutils flag-o-matic + +DESCRIPTION="A library for reading and editing audio meta data" +HOMEPAGE="http://developer.kde.org/~wheeler/taglib.html" +SRC_URI="http://developer.kde.org/~wheeler/files/src/${P}.tar.gz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~mips" +IUSE="debug" + +DEPEND=">=sys-devel/autoconf-2.58" +RDEPEND="" + +src_unpack() { + unpack ${A} + cd ${S} + epatch ${FILESDIR}/${P}-memleak-fix2.patch + epatch ${FILESDIR}/${P}-length-in-microseconds.patch + + rm -rf autom4te.cache + export WANT_AUTOCONF=2.5 + export WANT_AUTOMAKE=1.7 + aclocal && autoconf && automake || die "autotools failed" +} + +src_compile() { + replace-flags -O3 -O2 + econf `use_enable debug` || die + emake || die +} + +src_install() { + make install DESTDIR=${D} destdir=${D} || die +} diff --git a/campcaster/etc/portage/media-plugins/gst-plugins-mad/Manifest b/campcaster/etc/portage/media-plugins/gst-plugins-mad/Manifest new file mode 100644 index 000000000..b5d6a3bb7 --- /dev/null +++ b/campcaster/etc/portage/media-plugins/gst-plugins-mad/Manifest @@ -0,0 +1,3 @@ +MD5 5675251f4f6bd25fbf54f809816140ac gst-plugins-mad-0.8.10-r1.ebuild 421 +MD5 e5a6b80e2dfc0bf36559f4663fb90e25 files/digest-gst-plugins-mad-0.8.10-r1 72 +MD5 9b4b87c7c0e1bf243ebc6def2f62c971 files/id3demuxbin-pad-free-fix.patch 551 diff --git a/campcaster/etc/portage/media-plugins/gst-plugins-mad/files/digest-gst-plugins-mad-0.8.10-r1 b/campcaster/etc/portage/media-plugins/gst-plugins-mad/files/digest-gst-plugins-mad-0.8.10-r1 new file mode 100644 index 000000000..511a32be2 --- /dev/null +++ b/campcaster/etc/portage/media-plugins/gst-plugins-mad/files/digest-gst-plugins-mad-0.8.10-r1 @@ -0,0 +1 @@ +MD5 99f36ba2b91015a23d3c20a8f424b232 gst-plugins-0.8.10.tar.bz2 2397528 diff --git a/campcaster/etc/portage/media-plugins/gst-plugins-mad/files/id3demuxbin-pad-free-fix.patch b/campcaster/etc/portage/media-plugins/gst-plugins-mad/files/id3demuxbin-pad-free-fix.patch new file mode 100644 index 000000000..ffa6c7089 --- /dev/null +++ b/campcaster/etc/portage/media-plugins/gst-plugins-mad/files/id3demuxbin-pad-free-fix.patch @@ -0,0 +1,15 @@ +--- gst-plugins-0.8.9/ext/mad/gstid3demuxbin.c 2005-04-10 22:24:17.000000000 +0200 ++++ gst-plugins-0.8.9-livesupport/ext/mad/gstid3demuxbin.c 2005-06-22 10:45:31.000000000 +0200 +@@ -188,7 +188,11 @@ + gst_id3demux_bin_remove_pad (GstId3DemuxBin * id3) + { + if (id3->srcpad) { +- gst_element_remove_pad (GST_ELEMENT (id3), id3->srcpad); ++ GstPad * pad = gst_element_get_pad(GST_ELEMENT(id3), "src"); ++ ++ if (pad && pad == id3->srcpad) { ++ gst_element_remove_pad (GST_ELEMENT (id3), id3->srcpad); ++ } + id3->srcpad = NULL; + } + } diff --git a/campcaster/etc/portage/media-plugins/gst-plugins-mad/gst-plugins-mad-0.8.10-r1.ebuild b/campcaster/etc/portage/media-plugins/gst-plugins-mad/gst-plugins-mad-0.8.10-r1.ebuild new file mode 100644 index 000000000..e169dbbb1 --- /dev/null +++ b/campcaster/etc/portage/media-plugins/gst-plugins-mad/gst-plugins-mad-0.8.10-r1.ebuild @@ -0,0 +1,22 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit gst-plugins eutils + +KEYWORDS="alpha amd64 ~arm hppa ia64 -mips ppc ppc64 sparc x86" +IUSE="" + +RDEPEND=">=media-libs/libmad-0.15.1b + >=media-libs/libid3tag-0.15" + +DEPEND="${RDEPEND} + dev-util/pkgconfig" + +src_unpack() { + + unpack ${A} + cd ${S} + epatch ${FILESDIR}/id3demuxbin-pad-free-fix.patch +} + diff --git a/campcaster/etc/portage/media-radio/livesupport/Manifest b/campcaster/etc/portage/media-radio/livesupport/Manifest new file mode 100644 index 000000000..7a7a95525 --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/Manifest @@ -0,0 +1,8 @@ +MD5 327ed3bdd51bf26a7fc4f8a097ec163f livesupport-1.0.ebuild 2745 +MD5 88922583359d4f48bb62fe32edcf49bf files/storageServer-docroot.patch 496 +MD5 748c25d0b1d9b77b549de03d2d054796 files/prefix-as-make-variable.patch 9729 +MD5 c2d1ff785cf48e5379f9a3c408c44eb7 files/setup-install-dirs.patch 1430 +MD5 f1b36bd5e8064413975e891f7e698909 files/taglib-curl-icu.patch 46021 +MD5 a538c0d8cca6f56f49e849d02e7eeaf5 files/pg_hba.patch 1271 +MD5 11fe70fcc870ab186dcc8ce354c43076 files/digest-livesupport-1.0 70 +MD5 aa45773c2de23cc856a1bc11153637ec files/postinstall-config-file.patch 7791 diff --git a/campcaster/etc/portage/media-radio/livesupport/files/digest-livesupport-1.0 b/campcaster/etc/portage/media-radio/livesupport/files/digest-livesupport-1.0 new file mode 100644 index 000000000..1fe67e311 --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/files/digest-livesupport-1.0 @@ -0,0 +1 @@ +MD5 73d76a5c9cd0c0b9e2f527e8a169183b livesupport-1.0.tar.bz2 10666438 diff --git a/campcaster/etc/portage/media-radio/livesupport/files/pg_hba.patch b/campcaster/etc/portage/media-radio/livesupport/files/pg_hba.patch new file mode 100644 index 000000000..4db2125a9 --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/files/pg_hba.patch @@ -0,0 +1,24 @@ +--- livesupport-1.0/etc/pg_hba.conf 2005-08-13 12:33:33.000000000 +0200 ++++ livesupport-1.0-gentoo/etc/pg_hba.conf 2005-09-22 13:48:24.000000000 +0200 +@@ -85,18 +85,16 @@ + # Database administrative login by UNIX sockets + local all postgres ident sameuser + # +-# All other connections by UNIX sockets +-local all all ident sameuser +-# + # All IPv4 connections from localhost + # The following line was inserted by the livesupport-station package installer + # the original pg_hba.conf file is saved under pg_hba.conf.before-livesupport + host all all 127.0.0.1 255.255.255.255 password + #host all all 127.0.0.1 255.255.255.255 ident sameuser + # ++# All other connections by UNIX sockets ++local all all password ++# + # All IPv6 localhost connections +-host all all ::1 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ident sameuser +-host all all ::ffff:127.0.0.1/128 ident sameuser + # + # reject all other connection attempts + host all all 0.0.0.0 0.0.0.0 reject diff --git a/campcaster/etc/portage/media-radio/livesupport/files/postinstall-config-file.patch b/campcaster/etc/portage/media-radio/livesupport/files/postinstall-config-file.patch new file mode 100644 index 000000000..8948e3a96 --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/files/postinstall-config-file.patch @@ -0,0 +1,193 @@ +--- livesupport-1.0/bin/postInstallStation.sh 2005-08-14 14:15:30.000000000 +0200 ++++ livesupport-1.0-gentoo/bin/postInstallStation.sh 2005-09-22 13:16:23.000000000 +0200 +@@ -155,9 +155,13 @@ + echo " apache document root: $www_root"; + echo "" + ++ + #------------------------------------------------------------------------------- + # The details of installation + #------------------------------------------------------------------------------- ++ls_hostname=localhost ++ls_www_port=80 ++ + ls_dbserver=$dbserver + ls_dbuser=$dbuser + ls_dbpassword=$dbpassword +@@ -168,9 +172,15 @@ + install_bin=$installdir/bin + install_etc=$installdir/etc + install_lib=$installdir/lib ++install_tmp=$installdir/tmp + install_usr=$installdir/usr + install_var_ls=$installdir/var/LiveSupport + ++php_url_prefix=livesupport ++alib_xml_rpc_prefix=xmlrpc/xrLocStor.php ++audio_out=default ++scheduler_port=3344 ++ + + #------------------------------------------------------------------------------- + # Function to check for the existence of an executable on the PATH +@@ -226,19 +236,68 @@ + + + #------------------------------------------------------------------------------- ++# Create the replacement string for the config files ++#------------------------------------------------------------------------------- ++install_lib_s=`echo ${install_lib} | sed -e "s/\//\\\\\\\\\//g"` ++install_tmp_s=`echo ${install_tmp} | sed -e "s/\//\\\\\\\\\//g"` ++php_url_prefix_s=`echo ${php_url_prefix} | sed -e "s/\//\\\\\\\\\//g"` ++alib_xml_rpc_prefix_s=`echo ${alib_xml_rpc_prefix} | sed -e "s/\//\\\\\\\\\//g"` ++audio_out_s=`echo ${audio_out} | sed -e "s/\//\\\\\\\\\//g"` ++ ++ ++replace_sed_string="s/ls_lib_dir/${install_lib_s}/; \ ++ s/ls_dbuser/${ls_dbuser}/; \ ++ s/ls_dbpassword/${ls_dbpassword}/; \ ++ s/ls_dbserver/${ls_dbserver}/; \ ++ s/ls_database/${ls_database}/; \ ++ s/ls_php_urlPrefix/${php_url_prefix_s}/; \ ++ s/ls_php_host/${ls_hostname}/; \ ++ s/ls_php_port/${ls_www_port}/; \ ++ s/ls_alib_xmlRpcPrefix/${alib_xml_rpc_prefix_s}/; \ ++ s/ls_tmp_dir/${install_tmp_s}/; \ ++ s/ls_audio_output_device/${audio_out_s}/; \ ++ s/ls_scheduler_host/${ls_hostname}/; \ ++ s/ls_scheduler_port/${scheduler_port}/;" ++ ++ ++#------------------------------------------------------------------------------- ++# Creating configuration files ++#------------------------------------------------------------------------------- ++echo "Creating configuration files..."; ++ ++cat $install_etc/scheduler.xml.template | sed -e "${replace_sed_string}" \ ++ > $install_etc/scheduler.xml ++ ++cat $install_var_ls/archiveServer/var/conf.php.template \ ++ | sed -e "${replace_sed_string}" \ ++ > $install_var_ls/archiveServer/var/conf.php ++ ++cat $install_var_ls/storageServer/var/conf.php.template \ ++ | sed -e "${replace_sed_string}" \ ++ > $install_var_ls/storageServer/var/conf.php ++ ++ ++#------------------------------------------------------------------------------- + # Install the new pg_hba.conf file + #------------------------------------------------------------------------------- + echo "Modifying postgresql access permissions..."; + +-pg_config_dir=/etc/postgresql + pg_config_file=pg_hba.conf + pg_config_file_saved=pg_hba.conf.before-livesupport + ++pg_config_dir=/etc/postgresql + if [ -f $pg_config_dir/$pg_config_file ] ; then + mv -f $pg_config_dir/$pg_config_file $pg_config_dir/$pg_config_file_saved ; ++ cp $install_etc/$pg_config_file $pg_config_dir/$pg_config_file ++ chown root:$postgres_user $pg_config_dir/$pg_config_file ++fi ++ ++pg_config_dir=/var/lib/postgresql/data/ ++if [ -f $pg_config_dir/$pg_config_file ] ; then ++ mv -f $pg_config_dir/$pg_config_file $pg_config_dir/$pg_config_file_saved ; ++ cp $install_etc/$pg_config_file $pg_config_dir/$pg_config_file ++ chown root:$postgres_user $pg_config_dir/$pg_config_file + fi +-cp $install_etc/$pg_config_file $pg_config_dir/$pg_config_file +-chown root:$postgres_user $pg_config_dir/$pg_config_file + + /etc/init.d/postgresql restart + +@@ -290,6 +349,10 @@ + odbc_template=$install_etc/odbc_template + odbc_template_tmp=/tmp/odbc_template.$$ + ++# customied odbc template file ++cat $install_etc/odbc_template | sed -e "${replace_sed_string}" \ ++ > $odbc_template_tmp ++ + # check for an existing PostgreSQL ODBC driver, and only install if necessary + odbcinst_res=`odbcinst -q -d | grep "\[PostgreSQL\]"` + if [ "x$odbcinst_res" == "x" ]; then +@@ -298,13 +361,17 @@ + fi + + echo "Registering LiveSupport ODBC data source..."; +-odbcinst -i -s -l -f $odbc_template || exit 1; ++odbcinst -i -s -l -f $odbc_template_tmp || exit 1; ++ ++rm -f $odbc_template_tmp + + + #------------------------------------------------------------------------------- + # Install PEAR packages (locally in the LiveSupport) + #------------------------------------------------------------------------------- +-$install_usr/lib/pear/bin/install.sh -d $installdir || exit 1; ++if [ -f $install_usr/lib/pear/bin/install.sh ]; then ++ $install_usr/lib/pear/bin/install.sh -d $installdir || exit 1; ++fi + + + #------------------------------------------------------------------------------- +@@ -338,6 +405,7 @@ + chmod g+sw $install_var_ls/htmlUI/var/templates_c + chmod g+sw $install_var_ls/htmlUI/var/html/img + ++ + #------------------------------------------------------------------------------- + # Configuring Apache + #------------------------------------------------------------------------------- +@@ -421,7 +489,9 @@ + export LD_LIBRARY_PATH=$install_lib + export GST_REGISTRY=$install_etc/gst-registry.xml + export GST_PLUGIN_PATH=$gstreamer_dir +-$install_bin/gst-register > /dev/null 2>&1 ++if [ -f $install_bin/gst-register ]; then ++ $install_bin/gst-register > /dev/null 2>&1 ++fi + + + #------------------------------------------------------------------------------- +--- livesupport-1.0/products/scheduler/etc/Makefile.in 2005-09-21 15:33:18.000000000 +0200 ++++ livesupport-1.0-gentoo/products/scheduler/etc/Makefile.in 2005-09-22 12:47:38.000000000 +0200 +@@ -375,10 +375,8 @@ + ${CP} ${SCHEDULER_EXE} ${USR_BIN_DIR} + ${CP} ${ETC_DIR}/odbcinst_debian_template \ + ${ETC_DIR}/odbcinst_template ${USR_ETC_DIR} +- ${CAT} ${ETC_DIR}/odbc_template | ${SED} -e ${REPLACE_SED_STRING} \ +- > ${USR_ETC_DIR}/odbc_template +- ${CAT} ${ETC_DIR}/scheduler.xml.template | ${SED} -e ${REPLACE_SED_STRING} \ +- > ${USR_ETC_DIR}/scheduler.xml ++ ${CP} ${ETC_DIR}/odbc_template ${USR_ETC_DIR} ++ ${CP} ${ETC_DIR}/scheduler.xml.template ${USR_ETC_DIR} + + create_database: + ifeq (@CREATE_LS_DATABASE@,yes) +--- livesupport-1.0/modules/archiveServer/etc/Makefile.in 2005-09-21 15:33:18.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/archiveServer/etc/Makefile.in 2005-09-22 13:14:20.000000000 +0200 +@@ -165,8 +165,7 @@ + ${CP} ${VAR_DIR}/*.{php,template} ${DEST_DIR} + ${CP} ${VAR_DIR}/install/*.php ${DEST_DIR}/install + ${CP} ${VAR_DIR}/xmlrpc/*.php ${DEST_DIR}/xmlrpc +- ${CAT} ${VAR_DIR}/conf.php.template | ${SED} -e ${REPLACE_SED_STRING} \ +- > ${DEST_DIR}/conf.php ++ ${CP} ${VAR_DIR}/conf.php.template ${DEST_DIR} + + + #------------------------------------------------------------------------------- +--- livesupport-1.0/modules/storageServer/etc/Makefile.in 2005-09-21 15:33:18.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/storageServer/etc/Makefile.in 2005-09-22 13:14:20.000000000 +0200 +@@ -183,8 +183,7 @@ + ${DEST_DIR}/install + ${CP} ${VAR_DIR}/xmlrpc/*.php \ + ${DEST_DIR}/xmlrpc +- ${CAT} ${VAR_DIR}/conf.php.template | ${SED} -e ${REPLACE_SED_STRING} \ +- > ${DEST_DIR}/conf.php ++ ${CP} ${VAR_DIR}/conf.php.template ${DEST_DIR} + + chgrp ${APACHE_GROUP} ${DEST_DIR}/access + chgrp ${APACHE_GROUP} ${DEST_DIR}/stor diff --git a/campcaster/etc/portage/media-radio/livesupport/files/prefix-as-make-variable.patch b/campcaster/etc/portage/media-radio/livesupport/files/prefix-as-make-variable.patch new file mode 100644 index 000000000..869c49e6c --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/files/prefix-as-make-variable.patch @@ -0,0 +1,238 @@ +diff -Naur livesupport-1.0/modules/alib/etc/Makefile.in livesupport-1.0-gentoo/modules/alib/etc/Makefile.in +--- livesupport-1.0/modules/alib/etc/Makefile.in 2005-08-01 21:25:59.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/alib/etc/Makefile.in 2005-09-21 11:55:23.000000000 +0200 +@@ -59,7 +59,9 @@ + TMP_DIR = ${BASE_DIR}/tmp + VAR_DIR = ${BASE_DIR}/var + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_VAR_DIR = ${USR_DIR}/var + +diff -Naur livesupport-1.0/modules/archiveServer/etc/Makefile.in livesupport-1.0-gentoo/modules/archiveServer/etc/Makefile.in +--- livesupport-1.0/modules/archiveServer/etc/Makefile.in 2005-08-01 21:25:59.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/archiveServer/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -62,7 +62,9 @@ + TMP_DIR = ${BASE_DIR}/tmp + VAR_DIR = ${BASE_DIR}/var + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + USR_VAR_DIR = ${USR_DIR}/var +diff -Naur livesupport-1.0/modules/authentication/etc/Makefile.in livesupport-1.0-gentoo/modules/authentication/etc/Makefile.in +--- livesupport-1.0/modules/authentication/etc/Makefile.in 2005-08-01 21:25:59.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/authentication/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -50,7 +50,9 @@ + SRC_DIR = ${BASE_DIR}/src + TMP_DIR = ${BASE_DIR}/tmp + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 +diff -Naur livesupport-1.0/modules/core/etc/Makefile.in livesupport-1.0-gentoo/modules/core/etc/Makefile.in +--- livesupport-1.0/modules/core/etc/Makefile.in 2005-09-21 11:57:28.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/core/etc/Makefile.in 2005-09-21 11:55:38.000000000 +0200 +@@ -53,7 +53,9 @@ + TMP_DIR = ${BASE_DIR}/tmp + VAR_DIR = ${BASE_DIR}/var + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_BIN_DIR = ${USR_DIR}/bin + USR_LIB_DIR = ${USR_DIR}/lib +diff -Naur livesupport-1.0/modules/db/etc/Makefile.in livesupport-1.0-gentoo/modules/db/etc/Makefile.in +--- livesupport-1.0/modules/db/etc/Makefile.in 2005-08-01 21:25:59.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/db/etc/Makefile.in 2005-09-21 11:55:10.000000000 +0200 +@@ -51,7 +51,9 @@ + SRC_DIR = ${BASE_DIR}/src + TMP_DIR = ${BASE_DIR}/tmp + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 +diff -Naur livesupport-1.0/modules/eventScheduler/etc/Makefile.in livesupport-1.0-gentoo/modules/eventScheduler/etc/Makefile.in +--- livesupport-1.0/modules/eventScheduler/etc/Makefile.in 2005-08-08 13:57:53.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/eventScheduler/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -50,7 +50,9 @@ + SRC_DIR = ${BASE_DIR}/src + TMP_DIR = ${BASE_DIR}/tmp + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 +diff -Naur livesupport-1.0/modules/getid3/etc/Makefile.in livesupport-1.0-gentoo/modules/getid3/etc/Makefile.in +--- livesupport-1.0/modules/getid3/etc/Makefile.in 2005-08-01 21:25:59.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/getid3/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -60,7 +60,9 @@ + TMP_DIR = ${BASE_DIR}/tmp + VAR_DIR = ${BASE_DIR}/var + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_VAR_DIR = ${USR_DIR}/var + +diff -Naur livesupport-1.0/modules/gstreamerElements/etc/Makefile.in livesupport-1.0-gentoo/modules/gstreamerElements/etc/Makefile.in +--- livesupport-1.0/modules/gstreamerElements/etc/Makefile.in 2005-09-21 11:57:28.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/gstreamerElements/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -56,7 +56,9 @@ + REAL_BASE_DIR=$(shell cd ${BASE_DIR}; pwd) + + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_BIN_DIR = ${USR_DIR}/bin + USR_LIB_DIR = ${USR_DIR}/lib +diff -Naur livesupport-1.0/modules/htmlUI/etc/Makefile.in livesupport-1.0-gentoo/modules/htmlUI/etc/Makefile.in +--- livesupport-1.0/modules/htmlUI/etc/Makefile.in 2005-08-10 00:03:11.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/htmlUI/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -61,7 +61,9 @@ + TMP_DIR = ${BASE_DIR}/tmp + VAR_DIR = ${BASE_DIR}/var + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_VAR_DIR = ${USR_DIR}/var + +diff -Naur livesupport-1.0/modules/playlistExecutor/etc/Makefile.in livesupport-1.0-gentoo/modules/playlistExecutor/etc/Makefile.in +--- livesupport-1.0/modules/playlistExecutor/etc/Makefile.in 2005-09-21 11:57:28.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/playlistExecutor/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -53,7 +53,9 @@ + REAL_BASE_DIR=$(shell cd ${BASE_DIR}; pwd) + + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 +diff -Naur livesupport-1.0/modules/schedulerClient/etc/Makefile.in livesupport-1.0-gentoo/modules/schedulerClient/etc/Makefile.in +--- livesupport-1.0/modules/schedulerClient/etc/Makefile.in 2005-09-21 11:57:29.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/schedulerClient/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -50,7 +50,9 @@ + SRC_DIR = ${BASE_DIR}/src + TMP_DIR = ${BASE_DIR}/tmp + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 +diff -Naur livesupport-1.0/modules/storage/etc/Makefile.in livesupport-1.0-gentoo/modules/storage/etc/Makefile.in +--- livesupport-1.0/modules/storage/etc/Makefile.in 2005-09-21 11:57:29.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/storage/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -50,7 +50,9 @@ + SRC_DIR = ${BASE_DIR}/src + TMP_DIR = ${BASE_DIR}/tmp + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 +diff -Naur livesupport-1.0/modules/storageAdmin/etc/Makefile.in livesupport-1.0-gentoo/modules/storageAdmin/etc/Makefile.in +--- livesupport-1.0/modules/storageAdmin/etc/Makefile.in 2005-08-11 02:41:22.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/storageAdmin/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -64,7 +64,9 @@ + VAR_DIR = ${BASE_DIR}/var + BIN_DIR = ${BASE_DIR}/bin + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_VAR_DIR = ${USR_DIR}/var + +diff -Naur livesupport-1.0/modules/storageServer/etc/Makefile.in livesupport-1.0-gentoo/modules/storageServer/etc/Makefile.in +--- livesupport-1.0/modules/storageServer/etc/Makefile.in 2005-08-16 14:45:00.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/storageServer/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -64,7 +64,9 @@ + TMP_DIR = ${BASE_DIR}/tmp + VAR_DIR = ${BASE_DIR}/var + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_LIB_DIR = ${USR_DIR}/lib + USR_VAR_DIR = ${USR_DIR}/var +diff -Naur livesupport-1.0/modules/widgets/etc/Makefile.in livesupport-1.0-gentoo/modules/widgets/etc/Makefile.in +--- livesupport-1.0/modules/widgets/etc/Makefile.in 2005-08-08 13:57:53.000000000 +0200 ++++ livesupport-1.0-gentoo/modules/widgets/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -53,7 +53,9 @@ + TMP_DIR = ${BASE_DIR}/tmp + VAR_DIR = ${BASE_DIR}/var + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_INCLUDE_DIR = ${USR_DIR}/include + USR_BIN_DIR = ${USR_DIR}/bin + USR_LIB_DIR = ${USR_DIR}/lib +diff -Naur livesupport-1.0/products/gLiveSupport/etc/Makefile.in livesupport-1.0-gentoo/products/gLiveSupport/etc/Makefile.in +--- livesupport-1.0/products/gLiveSupport/etc/Makefile.in 2005-09-21 11:57:29.000000000 +0200 ++++ livesupport-1.0-gentoo/products/gLiveSupport/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -58,7 +58,9 @@ + REAL_BASE_DIR=$(shell cd ${BASE_DIR}; pwd) + + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_BIN_DIR = ${USR_DIR}/bin + USR_ETC_DIR = ${USR_DIR}/etc + USR_INCLUDE_DIR = ${USR_DIR}/include +diff -Naur livesupport-1.0/products/scheduler/etc/Makefile.in livesupport-1.0-gentoo/products/scheduler/etc/Makefile.in +--- livesupport-1.0/products/scheduler/etc/Makefile.in 2005-09-21 11:57:29.000000000 +0200 ++++ livesupport-1.0-gentoo/products/scheduler/etc/Makefile.in 2005-09-21 11:56:57.000000000 +0200 +@@ -56,7 +56,9 @@ + REAL_BASE_DIR=$(shell cd ${BASE_DIR}; pwd) + + +-USR_DIR = @prefix@ ++prefix = @prefix@ ++ ++USR_DIR = ${prefix} + USR_BIN_DIR = ${USR_DIR}/bin + USR_ETC_DIR = ${USR_DIR}/etc + USR_INCLUDE_DIR = ${USR_DIR}/include diff --git a/campcaster/etc/portage/media-radio/livesupport/files/setup-install-dirs.patch b/campcaster/etc/portage/media-radio/livesupport/files/setup-install-dirs.patch new file mode 100644 index 000000000..ce2afead2 --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/files/setup-install-dirs.patch @@ -0,0 +1,40 @@ +--- livesupport-1.0/etc/Makefile.in 2005-08-25 13:09:41.000000000 +0200 ++++ livesupport-1.0-gentoo/etc/Makefile.in 2005-09-21 13:26:08.000000000 +0200 +@@ -54,7 +54,10 @@ + + USR_DIR = ${prefix} + USR_BIN_DIR = ${USR_DIR}/bin ++USR_DOC_DIR = ${USR_DIR}/doc + USR_ETC_DIR = ${USR_DIR}/etc ++USR_LIB_DIR = ${USR_DIR}/lib ++USR_VAR_DIR = ${USR_DIR}/var + + HOSTNAME = @HOSTNAME@ + APACHE_GROUP = @APACHE_GROUP@ +@@ -426,9 +430,10 @@ + #------------------------------------------------------------------------------- + # Installation related targets + #------------------------------------------------------------------------------- +-.PHONY: install create_database install_modules install_products ++.PHONY: install create_database setup_install_dirs ++.PHONY: install_modules install_products + +-install: setup compile create_database install_modules install_products ++install: setup compile setup_install_dirs create_database install_modules install_products + ${MKDIR} ${USR_ETC_DIR}/apache + ${CP} ${ETC_DIR}/apache/*.conf ${USR_ETC_DIR}/apache + ${MKDIR} ${USR_BIN_DIR} +@@ -444,6 +449,13 @@ + --dbpassword=${DB_PASSWORD} + endif + ++setup_install_dirs: ++ ${MKDIR} ${USR_BIN_DIR} ++ ${MKDIR} ${USR_DOC_DIR} ++ ${MKDIR} ${USR_ETC_DIR} ++ ${MKDIR} ${USR_LIB_DIR} ++ ${MKDIR} ${USR_VAR_DIR} ++ + install_modules: + ${MAKE} -C ${ALIB_DIR} install + ${MAKE} -C ${ARCHIVE_SERVER_DIR} install diff --git a/campcaster/etc/portage/media-radio/livesupport/files/storageServer-docroot.patch b/campcaster/etc/portage/media-radio/livesupport/files/storageServer-docroot.patch new file mode 100644 index 000000000..29acba8cb --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/files/storageServer-docroot.patch @@ -0,0 +1,10 @@ +--- livesupport-1.0/etc/Makefile.in 2005-08-25 13:09:41.000000000 +0200 ++++ livesupport-1.0-gentoo/etc/Makefile.in 2005-09-21 13:08:47.000000000 +0200 +@@ -314,6 +314,7 @@ + ./configure --prefix=${prefix} \ + --with-apache-group=${APACHE_GROUP} \ + --with-hostname=${HOSTNAME} \ ++ --with-www-docroot=${WWW_DOCROOT} \ + --with-www-port=${WWW_PORT} \ + --with-scheduler-port=${SCHEDULER_PORT} \ + --with-database-server=${DB_SERVER} \ diff --git a/campcaster/etc/portage/media-radio/livesupport/files/taglib-curl-icu.patch b/campcaster/etc/portage/media-radio/livesupport/files/taglib-curl-icu.patch new file mode 100644 index 000000000..6dab04de3 --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/files/taglib-curl-icu.patch @@ -0,0 +1,1265 @@ +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/core/etc/acinclude.m4 livesupport-x/modules/core/etc/acinclude.m4 +--- livesupport/modules/core/etc/acinclude.m4 2005-09-20 12:46:39.000000000 +0200 ++++ livesupport-x/modules/core/etc/acinclude.m4 2005-09-19 16:33:28.000000000 +0200 +@@ -91,6 +91,122 @@ + + + dnl----------------------------------------------------------------------------- ++dnl Macro to check for taglib of sufficient version by looking at taglib-config ++dnl ++dnl usage: ++dnl AC_CHECK_TAGLIB(version, action-if, action-not) ++dnl ++dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_TAGLIB], [ ++ succeeded=no ++ ++ if test -z "$TAGLIB_CONFIG"; then ++ AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) ++ fi ++ ++ if test "$TAGLIB_CONFIG" = "no" ; then ++ echo "*** The taglib-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" ++ else ++ TAGLIB_VERSION=`$TAGLIB_CONFIG --version` ++ AC_MSG_CHECKING(for taglib >= $1) ++ VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(TAGLIB_CFLAGS) ++ TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` ++ AC_MSG_RESULT($TAGLIB_CFLAGS) ++ ++ AC_MSG_CHECKING(TAGLIB_LIBS) ++ TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` ++ AC_MSG_RESULT($TAGLIB_LIBS) ++ else ++ TAGLIB_CFLAGS="" ++ TAGLIB_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find taglib >= $1",) ++ fi ++ ++ AC_SUBST(TAGLIB_CFLAGS) ++ AC_SUBST(TAGLIB_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for ICU of sufficient version by looking at icu-config ++dnl ++dnl usage: ++dnl AC_CHECK_ICU(version, action-if, action-not) ++dnl ++dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_ICU], [ ++ succeeded=no ++ ++ if test -z "$ICU_CONFIG"; then ++ AC_PATH_PROG(ICU_CONFIG, icu-config, no) ++ fi ++ ++ if test "$ICU_CONFIG" = "no" ; then ++ echo "*** The icu-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://ibm.com/software/globalization/icu/" ++ else ++ ICU_VERSION=`$ICU_CONFIG --version` ++ AC_MSG_CHECKING(for ICU >= $1) ++ VERSION_CHECK=`expr $ICU_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(ICU_CFLAGS) ++ ICU_CFLAGS=`$ICU_CONFIG --cflags` ++ AC_MSG_RESULT($ICU_CFLAGS) ++ ++ AC_MSG_CHECKING(ICU_CXXFLAGS) ++ ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` ++ AC_MSG_RESULT($ICU_CXXFLAGS) ++ ++ AC_MSG_CHECKING(ICU_LIBS) ++ ICU_LIBS=`$ICU_CONFIG --ldflags` ++ AC_MSG_RESULT($ICU_LIBS) ++ else ++ ICU_CFLAGS="" ++ ICU_CXXFLAGS="" ++ ICU_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find ICU >= $1",) ++ fi ++ ++ AC_SUBST(ICU_CFLAGS) ++ AC_SUBST(ICU_CXXFLAGS) ++ AC_SUBST(ICU_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- + dnl Macro to check for C++ namespaces + dnl for more information on this macro, see + dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/core/etc/configure.ac livesupport-x/modules/core/etc/configure.ac +--- livesupport/modules/core/etc/configure.ac 2005-09-20 12:46:39.000000000 +0200 ++++ livesupport-x/modules/core/etc/configure.ac 2005-09-19 16:38:06.000000000 +0200 +@@ -76,6 +76,19 @@ + AC_SUBST(LIBXMLPP_CFLAGS) + AC_SUBST(LIBXMLPP_LIBS) + ++AC_CHECK_TAGLIB(1.3.1) ++AC_SUBST(TAGLIB_CFLAGS) ++AC_SUBST(TAGLIB_LIBS) ++ ++AC_CHECK_ICU(3.0) ++AC_SUBST(ICU_CFLAGS) ++AC_SUBST(ICU_CXXFLAGS) ++AC_SUBST(ICU_LIBS) ++ ++AC_PATH_PROG(GENRB, genrb) ++AC_SUBST(GENRB) ++ ++ + dnl----------------------------------------------------------------------------- + dnl enable compilaton for code coverage data + dnl----------------------------------------------------------------------------- +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/core/etc/Makefile.in livesupport-x/modules/core/etc/Makefile.in +--- livesupport/modules/core/etc/Makefile.in 2005-09-20 12:46:39.000000000 +0200 ++++ livesupport-x/modules/core/etc/Makefile.in 2005-09-19 16:38:37.000000000 +0200 +@@ -59,7 +59,7 @@ + USR_LIB_DIR = ${USR_DIR}/lib + BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 + +-GENRB = ${USR_BIN_DIR}/genrb ++GENRB = @GENRB@ + GENRBOPTS = --destdir ${TMP_DIR} \ + --encoding utf-8 \ + --package-name ${PACKAGE_NAME} \ +@@ -73,12 +73,12 @@ + LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ + LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +-# TODO: move ICU flag determination to configure script +-ICU_CFLAGS= +-ICU_LIBS=`${USR_DIR}/bin/icu-config --ldflags --ldflags-toolutil --ldflags-icuio` ++ICU_CFLAGS=@ICU_CFLAGS@ ++ICU_CXXFLAGS=@ICU_CXXFLAGS@ ++ICU_LIBS=@ICU_LIBS@ + +-TAGLIB_CFLAGS =`${USR_DIR}/bin/taglib-config --cflags` +-TAGLIB_LIBS =`${USR_DIR}/bin/taglib-config --libs` ++TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ ++TAGLIB_LIBS=@TAGLIB_LIBS@ + + TEST_RESULTS = ${DOC_DIR}/testResults.xml + # the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +@@ -99,7 +99,6 @@ + CPPFLAGS = @CPPFLAGS@ + CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -pedantic -Wall -Wno-long-long \ +- ${ICU_CFLAGS} \ + ${TAGLIB_CFLAGS} \ + ${LIBXMLPP_CFLAGS} \ + -I${USR_INCLUDE_DIR} \ +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/gstreamerElements/etc/configure.ac livesupport-x/modules/gstreamerElements/etc/configure.ac +--- livesupport/modules/gstreamerElements/etc/configure.ac 2005-09-20 12:46:18.000000000 +0200 ++++ livesupport-x/modules/gstreamerElements/etc/configure.ac 2005-09-19 17:11:47.000000000 +0200 +@@ -63,6 +63,9 @@ + AC_SUBST(GSTREAMER_CFLAGS) + AC_SUBST(GSTREAMER_LIBS) + ++AC_PATH_PROG(GST_REGISTER, gst-register-0.8) ++AC_SUBST(GST_REGISTER) ++ + + dnl----------------------------------------------------------------------------- + dnl enable compilaton for code coverage data +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/gstreamerElements/etc/Makefile.in livesupport-x/modules/gstreamerElements/etc/Makefile.in +--- livesupport/modules/gstreamerElements/etc/Makefile.in 2005-09-20 12:46:18.000000000 +0200 ++++ livesupport-x/modules/gstreamerElements/etc/Makefile.in 2005-09-19 17:06:03.000000000 +0200 +@@ -74,7 +74,7 @@ + + GSTREAMER_CFLAGS=@GSTREAMER_CFLAGS@ + GSTREAMER_LIBS=@GSTREAMER_LIBS@ +-GST_REGISTER=${USR_BIN_DIR}/gst-register ++GST_REGISTER=@GST_REGISTER@ + + TEST_RESULTS = ${DOC_DIR}/testResults.xml + # the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/playlistExecutor/etc/acinclude.m4 livesupport-x/modules/playlistExecutor/etc/acinclude.m4 +--- livesupport/modules/playlistExecutor/etc/acinclude.m4 2005-09-20 12:45:15.000000000 +0200 ++++ livesupport-x/modules/playlistExecutor/etc/acinclude.m4 2005-09-19 17:25:54.000000000 +0200 +@@ -91,6 +91,122 @@ + + + dnl----------------------------------------------------------------------------- ++dnl Macro to check for taglib of sufficient version by looking at taglib-config ++dnl ++dnl usage: ++dnl AC_CHECK_TAGLIB(version, action-if, action-not) ++dnl ++dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_TAGLIB], [ ++ succeeded=no ++ ++ if test -z "$TAGLIB_CONFIG"; then ++ AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) ++ fi ++ ++ if test "$TAGLIB_CONFIG" = "no" ; then ++ echo "*** The taglib-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" ++ else ++ TAGLIB_VERSION=`$TAGLIB_CONFIG --version` ++ AC_MSG_CHECKING(for taglib >= $1) ++ VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(TAGLIB_CFLAGS) ++ TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` ++ AC_MSG_RESULT($TAGLIB_CFLAGS) ++ ++ AC_MSG_CHECKING(TAGLIB_LIBS) ++ TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` ++ AC_MSG_RESULT($TAGLIB_LIBS) ++ else ++ TAGLIB_CFLAGS="" ++ TAGLIB_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find taglib >= $1",) ++ fi ++ ++ AC_SUBST(TAGLIB_CFLAGS) ++ AC_SUBST(TAGLIB_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for ICU of sufficient version by looking at icu-config ++dnl ++dnl usage: ++dnl AC_CHECK_ICU(version, action-if, action-not) ++dnl ++dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_ICU], [ ++ succeeded=no ++ ++ if test -z "$ICU_CONFIG"; then ++ AC_PATH_PROG(ICU_CONFIG, icu-config, no) ++ fi ++ ++ if test "$ICU_CONFIG" = "no" ; then ++ echo "*** The icu-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://ibm.com/software/globalization/icu/" ++ else ++ ICU_VERSION=`$ICU_CONFIG --version` ++ AC_MSG_CHECKING(for ICU >= $1) ++ VERSION_CHECK=`expr $ICU_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(ICU_CFLAGS) ++ ICU_CFLAGS=`$ICU_CONFIG --cflags` ++ AC_MSG_RESULT($ICU_CFLAGS) ++ ++ AC_MSG_CHECKING(ICU_CXXFLAGS) ++ ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` ++ AC_MSG_RESULT($ICU_CXXFLAGS) ++ ++ AC_MSG_CHECKING(ICU_LIBS) ++ ICU_LIBS=`$ICU_CONFIG --ldflags` ++ AC_MSG_RESULT($ICU_LIBS) ++ else ++ ICU_CFLAGS="" ++ ICU_CXXFLAGS="" ++ ICU_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find ICU >= $1",) ++ fi ++ ++ AC_SUBST(ICU_CFLAGS) ++ AC_SUBST(ICU_CXXFLAGS) ++ AC_SUBST(ICU_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- + dnl Macro to check for C++ namespaces + dnl for more information on this macro, see + dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/playlistExecutor/etc/configure.ac livesupport-x/modules/playlistExecutor/etc/configure.ac +--- livesupport/modules/playlistExecutor/etc/configure.ac 2005-09-20 12:45:15.000000000 +0200 ++++ livesupport-x/modules/playlistExecutor/etc/configure.ac 2005-09-19 17:25:35.000000000 +0200 +@@ -74,6 +74,18 @@ + AC_SUBST(GSTREAMER_CFLAGS) + AC_SUBST(GSTREAMER_LIBS) + ++AC_CHECK_TAGLIB(1.3.1) ++AC_SUBST(TAGLIB_CFLAGS) ++AC_SUBST(TAGLIB_LIBS) ++ ++AC_CHECK_ICU(3.0) ++AC_SUBST(ICU_CFLAGS) ++AC_SUBST(ICU_CXXFLAGS) ++AC_SUBST(ICU_LIBS) ++ ++AC_PATH_PROG(GENRB, genrb) ++AC_SUBST(GENRB) ++ + + dnl----------------------------------------------------------------------------- + dnl enable compilaton for code coverage data +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/playlistExecutor/etc/Makefile.in livesupport-x/modules/playlistExecutor/etc/Makefile.in +--- livesupport/modules/playlistExecutor/etc/Makefile.in 2005-09-20 12:45:15.000000000 +0200 ++++ livesupport-x/modules/playlistExecutor/etc/Makefile.in 2005-09-19 17:26:28.000000000 +0200 +@@ -82,13 +82,15 @@ + LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ + LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +-# TODO: move ICU flag determination to configure script +-ICU_LIBS=`${USR_DIR}/bin/icu-config --ldflags --ldflags-toolutil --ldflags-icuio` ++ICU_CFLAGS=@ICU_CFLAGS@ ++ICU_CXXFLAGS=@ICU_CXXFLAGS@ ++ICU_LIBS=@ICU_LIBS@ + + GSTREAMER_CFLAGS=@GSTREAMER_CFLAGS@ + GSTREAMER_LIBS=@GSTREAMER_LIBS@ + +-TAGLIB_LIBS =`${USR_DIR}/bin/taglib-config --libs` ++TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ ++TAGLIB_LIBS=@TAGLIB_LIBS@ + + TEST_RESULTS = ${DOC_DIR}/testResults.xml + # the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/schedulerClient/etc/acinclude.m4 livesupport-x/modules/schedulerClient/etc/acinclude.m4 +--- livesupport/modules/schedulerClient/etc/acinclude.m4 2005-09-20 12:46:55.000000000 +0200 ++++ livesupport-x/modules/schedulerClient/etc/acinclude.m4 2005-09-19 17:29:40.000000000 +0200 +@@ -91,6 +91,122 @@ + + + dnl----------------------------------------------------------------------------- ++dnl Macro to check for taglib of sufficient version by looking at taglib-config ++dnl ++dnl usage: ++dnl AC_CHECK_TAGLIB(version, action-if, action-not) ++dnl ++dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_TAGLIB], [ ++ succeeded=no ++ ++ if test -z "$TAGLIB_CONFIG"; then ++ AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) ++ fi ++ ++ if test "$TAGLIB_CONFIG" = "no" ; then ++ echo "*** The taglib-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" ++ else ++ TAGLIB_VERSION=`$TAGLIB_CONFIG --version` ++ AC_MSG_CHECKING(for taglib >= $1) ++ VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(TAGLIB_CFLAGS) ++ TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` ++ AC_MSG_RESULT($TAGLIB_CFLAGS) ++ ++ AC_MSG_CHECKING(TAGLIB_LIBS) ++ TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` ++ AC_MSG_RESULT($TAGLIB_LIBS) ++ else ++ TAGLIB_CFLAGS="" ++ TAGLIB_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find taglib >= $1",) ++ fi ++ ++ AC_SUBST(TAGLIB_CFLAGS) ++ AC_SUBST(TAGLIB_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for ICU of sufficient version by looking at icu-config ++dnl ++dnl usage: ++dnl AC_CHECK_ICU(version, action-if, action-not) ++dnl ++dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_ICU], [ ++ succeeded=no ++ ++ if test -z "$ICU_CONFIG"; then ++ AC_PATH_PROG(ICU_CONFIG, icu-config, no) ++ fi ++ ++ if test "$ICU_CONFIG" = "no" ; then ++ echo "*** The icu-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://ibm.com/software/globalization/icu/" ++ else ++ ICU_VERSION=`$ICU_CONFIG --version` ++ AC_MSG_CHECKING(for ICU >= $1) ++ VERSION_CHECK=`expr $ICU_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(ICU_CFLAGS) ++ ICU_CFLAGS=`$ICU_CONFIG --cflags` ++ AC_MSG_RESULT($ICU_CFLAGS) ++ ++ AC_MSG_CHECKING(ICU_CXXFLAGS) ++ ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` ++ AC_MSG_RESULT($ICU_CXXFLAGS) ++ ++ AC_MSG_CHECKING(ICU_LIBS) ++ ICU_LIBS=`$ICU_CONFIG --ldflags` ++ AC_MSG_RESULT($ICU_LIBS) ++ else ++ ICU_CFLAGS="" ++ ICU_CXXFLAGS="" ++ ICU_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find ICU >= $1",) ++ fi ++ ++ AC_SUBST(ICU_CFLAGS) ++ AC_SUBST(ICU_CXXFLAGS) ++ AC_SUBST(ICU_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- + dnl Macro to check for C++ namespaces + dnl for more information on this macro, see + dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/schedulerClient/etc/configure.ac livesupport-x/modules/schedulerClient/etc/configure.ac +--- livesupport/modules/schedulerClient/etc/configure.ac 2005-09-20 12:46:55.000000000 +0200 ++++ livesupport-x/modules/schedulerClient/etc/configure.ac 2005-09-19 17:29:24.000000000 +0200 +@@ -70,6 +70,18 @@ + AC_SUBST(LIBXMLPP_CFLAGS) + AC_SUBST(LIBXMLPP_LIBS) + ++AC_CHECK_TAGLIB(1.3.1) ++AC_SUBST(TAGLIB_CFLAGS) ++AC_SUBST(TAGLIB_LIBS) ++ ++AC_CHECK_ICU(3.0) ++AC_SUBST(ICU_CFLAGS) ++AC_SUBST(ICU_CXXFLAGS) ++AC_SUBST(ICU_LIBS) ++ ++AC_PATH_PROG(GENRB, genrb) ++AC_SUBST(GENRB) ++ + + dnl----------------------------------------------------------------------------- + dnl enable compilaton for code coverage data +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/schedulerClient/etc/Makefile.in livesupport-x/modules/schedulerClient/etc/Makefile.in +--- livesupport/modules/schedulerClient/etc/Makefile.in 2005-09-20 12:46:55.000000000 +0200 ++++ livesupport-x/modules/schedulerClient/etc/Makefile.in 2005-09-19 17:29:57.000000000 +0200 +@@ -83,10 +83,12 @@ + LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ + LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +-# TODO: move ICU flag determination to configure script +-ICU_LIBS=`${USR_DIR}/bin/icu-config --ldflags --ldflags-toolutil --ldflags-icuio` ++ICU_CFLAGS=@ICU_CFLAGS@ ++ICU_CXXFLAGS=@ICU_CXXFLAGS@ ++ICU_LIBS=@ICU_LIBS@ + +-TAGLIB_LIBS =`${USR_DIR}/bin/taglib-config --libs` ++TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ ++TAGLIB_LIBS=@TAGLIB_LIBS@ + + TEST_RESULTS = ${DOC_DIR}/testResults.xml + # the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/storage/etc/acinclude.m4 livesupport-x/modules/storage/etc/acinclude.m4 +--- livesupport/modules/storage/etc/acinclude.m4 2005-09-20 12:45:42.000000000 +0200 ++++ livesupport-x/modules/storage/etc/acinclude.m4 2005-09-20 12:13:02.000000000 +0200 +@@ -90,3 +90,175 @@ + + + ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for taglib of sufficient version by looking at taglib-config ++dnl ++dnl usage: ++dnl AC_CHECK_TAGLIB(version, action-if, action-not) ++dnl ++dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_TAGLIB], [ ++ succeeded=no ++ ++ if test -z "$TAGLIB_CONFIG"; then ++ AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) ++ fi ++ ++ if test "$TAGLIB_CONFIG" = "no" ; then ++ echo "*** The taglib-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" ++ else ++ TAGLIB_VERSION=`$TAGLIB_CONFIG --version` ++ AC_MSG_CHECKING(for taglib >= $1) ++ VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(TAGLIB_CFLAGS) ++ TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` ++ AC_MSG_RESULT($TAGLIB_CFLAGS) ++ ++ AC_MSG_CHECKING(TAGLIB_LIBS) ++ TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` ++ AC_MSG_RESULT($TAGLIB_LIBS) ++ else ++ TAGLIB_CFLAGS="" ++ TAGLIB_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find taglib >= $1",) ++ fi ++ ++ AC_SUBST(TAGLIB_CFLAGS) ++ AC_SUBST(TAGLIB_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for ICU of sufficient version by looking at icu-config ++dnl ++dnl usage: ++dnl AC_CHECK_ICU(version, action-if, action-not) ++dnl ++dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_ICU], [ ++ succeeded=no ++ ++ if test -z "$ICU_CONFIG"; then ++ AC_PATH_PROG(ICU_CONFIG, icu-config, no) ++ fi ++ ++ if test "$ICU_CONFIG" = "no" ; then ++ echo "*** The icu-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://ibm.com/software/globalization/icu/" ++ else ++ ICU_VERSION=`$ICU_CONFIG --version` ++ AC_MSG_CHECKING(for ICU >= $1) ++ VERSION_CHECK=`expr $ICU_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(ICU_CFLAGS) ++ ICU_CFLAGS=`$ICU_CONFIG --cflags` ++ AC_MSG_RESULT($ICU_CFLAGS) ++ ++ AC_MSG_CHECKING(ICU_CXXFLAGS) ++ ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` ++ AC_MSG_RESULT($ICU_CXXFLAGS) ++ ++ AC_MSG_CHECKING(ICU_LIBS) ++ ICU_LIBS=`$ICU_CONFIG --ldflags` ++ AC_MSG_RESULT($ICU_LIBS) ++ else ++ ICU_CFLAGS="" ++ ICU_CXXFLAGS="" ++ ICU_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find ICU >= $1",) ++ fi ++ ++ AC_SUBST(ICU_CFLAGS) ++ AC_SUBST(ICU_CXXFLAGS) ++ AC_SUBST(ICU_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for curl of sufficient version by looking at curl-config ++dnl ++dnl usage: ++dnl AC_CHECK_CURL(version, action-if, action-not) ++dnl ++dnl defines CURL_LIBS, CURL_CFLAGS, see curl-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_CURL], [ ++ succeeded=no ++ ++ if test -z "$CURL_CONFIG"; then ++ AC_PATH_PROG(CURL_CONFIG, curl-config, no) ++ fi ++ ++ if test "$CURL_CONFIG" = "no" ; then ++ echo "*** The curl-config script could not be found. Make sure it is" ++ echo "*** in your path, and that curl is properly installed." ++ echo "*** Or see http://curl.haxx.se/" ++ else ++ dnl curl-config --version returns "libcurl ", thus cut the number ++ CURL_VERSION=`$CURL_CONFIG --version | cut -d" " -f2` ++ AC_MSG_CHECKING(for curl >= $1) ++ VERSION_CHECK=`expr $CURL_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(CURL_CFLAGS) ++ CURL_CFLAGS=`$CURL_CONFIG --cflags` ++ AC_MSG_RESULT($CURL_CFLAGS) ++ ++ AC_MSG_CHECKING(CURL_LIBS) ++ CURL_LIBS=`$CURL_CONFIG --libs` ++ AC_MSG_RESULT($CURL_LIBS) ++ else ++ CURL_CFLAGS="" ++ CURL_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find curl >= $1",) ++ fi ++ ++ AC_SUBST(CURL_CFLAGS) ++ AC_SUBST(CURL_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (curl) not met.]), [$3]) ++ fi ++]) ++ ++ ++ +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/storage/etc/configure.ac livesupport-x/modules/storage/etc/configure.ac +--- livesupport/modules/storage/etc/configure.ac 2005-09-20 12:45:42.000000000 +0200 ++++ livesupport-x/modules/storage/etc/configure.ac 2005-09-20 12:12:42.000000000 +0200 +@@ -62,6 +62,22 @@ + AC_SUBST(LIBXMLPP_CFLAGS) + AC_SUBST(LIBXMLPP_LIBS) + ++AC_CHECK_CURL(7.13.0) ++AC_SUBST(CURL_CFLAGS) ++AC_SUBST(CURL_LIBS) ++ ++AC_CHECK_TAGLIB(1.3.1) ++AC_SUBST(TAGLIB_CFLAGS) ++AC_SUBST(TAGLIB_LIBS) ++ ++AC_CHECK_ICU(3.0) ++AC_SUBST(ICU_CFLAGS) ++AC_SUBST(ICU_CXXFLAGS) ++AC_SUBST(ICU_LIBS) ++ ++AC_PATH_PROG(GENRB, genrb) ++AC_SUBST(GENRB) ++ + + dnl----------------------------------------------------------------------------- + dnl enable compilaton for code coverage data +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/modules/storage/etc/Makefile.in livesupport-x/modules/storage/etc/Makefile.in +--- livesupport/modules/storage/etc/Makefile.in 2005-09-20 12:45:42.000000000 +0200 ++++ livesupport-x/modules/storage/etc/Makefile.in 2005-09-20 12:13:25.000000000 +0200 +@@ -74,12 +74,15 @@ + LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ + LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +-# TODO: move ICU flag determination to configure script +-ICU_LIBS=`${USR_DIR}/bin/icu-config --ldflags --ldflags-toolutil --ldflags-icuio` ++CURL_CFLAGS=@CURL_CFLAGS@ ++CURL_LIBS=@CURL_LIBS@ + +-CURL_LIBS=`${USR_DIR}/bin/curl-config --libs` ++ICU_CFLAGS=@ICU_CFLAGS@ ++ICU_CXXFLAGS=@ICU_CXXFLAGS@ ++ICU_LIBS=@ICU_LIBS@ + +-TAGLIB_LIBS =`${USR_DIR}/bin/taglib-config --libs` ++TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ ++TAGLIB_LIBS=@TAGLIB_LIBS@ + + TEST_RESULTS = ${DOC_DIR}/testResults.xml + # the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/products/gLiveSupport/etc/acinclude.m4 livesupport-x/products/gLiveSupport/etc/acinclude.m4 +--- livesupport/products/gLiveSupport/etc/acinclude.m4 2005-09-20 12:43:07.000000000 +0200 ++++ livesupport-x/products/gLiveSupport/etc/acinclude.m4 2005-09-20 11:56:35.000000000 +0200 +@@ -91,6 +91,178 @@ + + + dnl----------------------------------------------------------------------------- ++dnl Macro to check for taglib of sufficient version by looking at taglib-config ++dnl ++dnl usage: ++dnl AC_CHECK_TAGLIB(version, action-if, action-not) ++dnl ++dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_TAGLIB], [ ++ succeeded=no ++ ++ if test -z "$TAGLIB_CONFIG"; then ++ AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) ++ fi ++ ++ if test "$TAGLIB_CONFIG" = "no" ; then ++ echo "*** The taglib-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" ++ else ++ TAGLIB_VERSION=`$TAGLIB_CONFIG --version` ++ AC_MSG_CHECKING(for taglib >= $1) ++ VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(TAGLIB_CFLAGS) ++ TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` ++ AC_MSG_RESULT($TAGLIB_CFLAGS) ++ ++ AC_MSG_CHECKING(TAGLIB_LIBS) ++ TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` ++ AC_MSG_RESULT($TAGLIB_LIBS) ++ else ++ TAGLIB_CFLAGS="" ++ TAGLIB_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find taglib >= $1",) ++ fi ++ ++ AC_SUBST(TAGLIB_CFLAGS) ++ AC_SUBST(TAGLIB_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for ICU of sufficient version by looking at icu-config ++dnl ++dnl usage: ++dnl AC_CHECK_ICU(version, action-if, action-not) ++dnl ++dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_ICU], [ ++ succeeded=no ++ ++ if test -z "$ICU_CONFIG"; then ++ AC_PATH_PROG(ICU_CONFIG, icu-config, no) ++ fi ++ ++ if test "$ICU_CONFIG" = "no" ; then ++ echo "*** The icu-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://ibm.com/software/globalization/icu/" ++ else ++ ICU_VERSION=`$ICU_CONFIG --version` ++ AC_MSG_CHECKING(for ICU >= $1) ++ VERSION_CHECK=`expr $ICU_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(ICU_CFLAGS) ++ ICU_CFLAGS=`$ICU_CONFIG --cflags` ++ AC_MSG_RESULT($ICU_CFLAGS) ++ ++ AC_MSG_CHECKING(ICU_CXXFLAGS) ++ ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` ++ AC_MSG_RESULT($ICU_CXXFLAGS) ++ ++ AC_MSG_CHECKING(ICU_LIBS) ++ ICU_LIBS=`$ICU_CONFIG --ldflags` ++ AC_MSG_RESULT($ICU_LIBS) ++ else ++ ICU_CFLAGS="" ++ ICU_CXXFLAGS="" ++ ICU_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find ICU >= $1",) ++ fi ++ ++ AC_SUBST(ICU_CFLAGS) ++ AC_SUBST(ICU_CXXFLAGS) ++ AC_SUBST(ICU_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for curl of sufficient version by looking at curl-config ++dnl ++dnl usage: ++dnl AC_CHECK_CURL(version, action-if, action-not) ++dnl ++dnl defines CURL_LIBS, CURL_CFLAGS, see curl-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_CURL], [ ++ succeeded=no ++ ++ if test -z "$CURL_CONFIG"; then ++ AC_PATH_PROG(CURL_CONFIG, curl-config, no) ++ fi ++ ++ if test "$CURL_CONFIG" = "no" ; then ++ echo "*** The curl-config script could not be found. Make sure it is" ++ echo "*** in your path, and that curl is properly installed." ++ echo "*** Or see http://curl.haxx.se/" ++ else ++ dnl curl-config --version returns "libcurl ", thus cut the number ++ CURL_VERSION=`$CURL_CONFIG --version | cut -d" " -f2` ++ AC_MSG_CHECKING(for curl >= $1) ++ VERSION_CHECK=`expr $CURL_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(CURL_CFLAGS) ++ CURL_CFLAGS=`$CURL_CONFIG --cflags` ++ AC_MSG_RESULT($CURL_CFLAGS) ++ ++ AC_MSG_CHECKING(CURL_LIBS) ++ CURL_LIBS=`$CURL_CONFIG --libs` ++ AC_MSG_RESULT($CURL_LIBS) ++ else ++ CURL_CFLAGS="" ++ CURL_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find curl >= $1",) ++ fi ++ ++ AC_SUBST(CURL_CFLAGS) ++ AC_SUBST(CURL_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (curl) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- + dnl Macro to check for C++ namespaces + dnl for more information on this macro, see + dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/products/gLiveSupport/etc/configure.ac livesupport-x/products/gLiveSupport/etc/configure.ac +--- livesupport/products/gLiveSupport/etc/configure.ac 2005-09-20 12:43:07.000000000 +0200 ++++ livesupport-x/products/gLiveSupport/etc/configure.ac 2005-09-20 11:56:15.000000000 +0200 +@@ -78,6 +78,22 @@ + AC_SUBST(GSTREAMER_CFLAGS) + AC_SUBST(GSTREAMER_LIBS) + ++AC_CHECK_CURL(7.13.0) ++AC_SUBST(CURL_CFLAGS) ++AC_SUBST(CURL_LIBS) ++ ++AC_CHECK_TAGLIB(1.3.1) ++AC_SUBST(TAGLIB_CFLAGS) ++AC_SUBST(TAGLIB_LIBS) ++ ++AC_CHECK_ICU(3.0) ++AC_SUBST(ICU_CFLAGS) ++AC_SUBST(ICU_CXXFLAGS) ++AC_SUBST(ICU_LIBS) ++ ++AC_PATH_PROG(GENRB, genrb) ++AC_SUBST(GENRB) ++ + + dnl----------------------------------------------------------------------------- + dnl enable compilaton for code coverage data +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/products/gLiveSupport/etc/Makefile.in livesupport-x/products/gLiveSupport/etc/Makefile.in +--- livesupport/products/gLiveSupport/etc/Makefile.in 2005-09-20 12:43:07.000000000 +0200 ++++ livesupport-x/products/gLiveSupport/etc/Makefile.in 2005-09-20 11:56:49.000000000 +0200 +@@ -103,7 +103,7 @@ + s/ls_scheduler_xmlRpcPrefix/${SCHEDULER_XML_RPC_PREFIX}/;" + + +-GENRB = ${USR_BIN_DIR}/genrb ++GENRB = @GENRB@ + GENRBOPTS = --destdir ${TMP_DIR} \ + --encoding utf-8 \ + --package-name ${PACKAGE_NAME} \ +@@ -168,7 +168,8 @@ + LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ + LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +-CURL_LIBS=`${USR_DIR}/bin/curl-config --libs` ++CURL_CFLAGS=@CURL_CFLAGS@ ++CURL_LIBS=@CURL_LIBS@ + + GTKMM_CFLAGS=@GTKMM_CFLAGS@ + GTKMM_LIBS=@GTKMM_LIBS@ +@@ -176,11 +177,12 @@ + GSTREAMER_CFLAGS=@GSTREAMER_CFLAGS@ + GSTREAMER_LIBS=@GSTREAMER_LIBS@ + +-ICU_CFLAGS= +-ICU_LIBS=`${USR_DIR}/bin/icu-config --ldflags-toolutil --ldflags-icuio` ++ICU_CFLAGS=@ICU_CFLAGS@ ++ICU_CXXFLAGS=@ICU_CXXFLAGS@ ++ICU_LIBS=@ICU_LIBS@ + +-TAGLIB_CFLAGS=`${USR_DIR}/bin/taglib-config --cflags` +-TAGLIB_LIBS=`${USR_DIR}/bin/taglib-config --libs` ++TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ ++TAGLIB_LIBS=@TAGLIB_LIBS@ + + TEST_RESULTS = ${DOC_DIR}/testResults.xml + # the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +@@ -203,7 +205,6 @@ + CPPFLAGS = @CPPFLAGS@ + CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -pedantic -Wall -Wno-long-long \ +- ${ICU_CFLAGS} \ + ${TAGLIB_CFLAGS} \ + ${LIBXMLPP_CFLAGS} \ + ${GTKMM_CFLAGS} \ + +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/products/scheduler/etc/acinclude.m4 livesupport-x/products/scheduler/etc/acinclude.m4 +--- livesupport/products/scheduler/etc/acinclude.m4 2005-09-20 12:43:27.000000000 +0200 ++++ livesupport-x/products/scheduler/etc/acinclude.m4 2005-09-19 17:45:40.000000000 +0200 +@@ -91,6 +91,178 @@ + + + dnl----------------------------------------------------------------------------- ++dnl Macro to check for taglib of sufficient version by looking at taglib-config ++dnl ++dnl usage: ++dnl AC_CHECK_TAGLIB(version, action-if, action-not) ++dnl ++dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_TAGLIB], [ ++ succeeded=no ++ ++ if test -z "$TAGLIB_CONFIG"; then ++ AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) ++ fi ++ ++ if test "$TAGLIB_CONFIG" = "no" ; then ++ echo "*** The taglib-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" ++ else ++ TAGLIB_VERSION=`$TAGLIB_CONFIG --version` ++ AC_MSG_CHECKING(for taglib >= $1) ++ VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(TAGLIB_CFLAGS) ++ TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` ++ AC_MSG_RESULT($TAGLIB_CFLAGS) ++ ++ AC_MSG_CHECKING(TAGLIB_LIBS) ++ TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` ++ AC_MSG_RESULT($TAGLIB_LIBS) ++ else ++ TAGLIB_CFLAGS="" ++ TAGLIB_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find taglib >= $1",) ++ fi ++ ++ AC_SUBST(TAGLIB_CFLAGS) ++ AC_SUBST(TAGLIB_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for ICU of sufficient version by looking at icu-config ++dnl ++dnl usage: ++dnl AC_CHECK_ICU(version, action-if, action-not) ++dnl ++dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_ICU], [ ++ succeeded=no ++ ++ if test -z "$ICU_CONFIG"; then ++ AC_PATH_PROG(ICU_CONFIG, icu-config, no) ++ fi ++ ++ if test "$ICU_CONFIG" = "no" ; then ++ echo "*** The icu-config script could not be found. Make sure it is" ++ echo "*** in your path, and that taglib is properly installed." ++ echo "*** Or see http://ibm.com/software/globalization/icu/" ++ else ++ ICU_VERSION=`$ICU_CONFIG --version` ++ AC_MSG_CHECKING(for ICU >= $1) ++ VERSION_CHECK=`expr $ICU_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(ICU_CFLAGS) ++ ICU_CFLAGS=`$ICU_CONFIG --cflags` ++ AC_MSG_RESULT($ICU_CFLAGS) ++ ++ AC_MSG_CHECKING(ICU_CXXFLAGS) ++ ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` ++ AC_MSG_RESULT($ICU_CXXFLAGS) ++ ++ AC_MSG_CHECKING(ICU_LIBS) ++ ICU_LIBS=`$ICU_CONFIG --ldflags` ++ AC_MSG_RESULT($ICU_LIBS) ++ else ++ ICU_CFLAGS="" ++ ICU_CXXFLAGS="" ++ ICU_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find ICU >= $1",) ++ fi ++ ++ AC_SUBST(ICU_CFLAGS) ++ AC_SUBST(ICU_CXXFLAGS) ++ AC_SUBST(ICU_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- ++dnl Macro to check for curl of sufficient version by looking at curl-config ++dnl ++dnl usage: ++dnl AC_CHECK_CURL(version, action-if, action-not) ++dnl ++dnl defines CURL_LIBS, CURL_CFLAGS, see curl-config man page ++dnl----------------------------------------------------------------------------- ++AC_DEFUN([AC_CHECK_CURL], [ ++ succeeded=no ++ ++ if test -z "$CURL_CONFIG"; then ++ AC_PATH_PROG(CURL_CONFIG, curl-config, no) ++ fi ++ ++ if test "$CURL_CONFIG" = "no" ; then ++ echo "*** The curl-config script could not be found. Make sure it is" ++ echo "*** in your path, and that curl is properly installed." ++ echo "*** Or see http://curl.haxx.se/" ++ else ++ dnl curl-config --version returns "libcurl ", thus cut the number ++ CURL_VERSION=`$CURL_CONFIG --version | cut -d" " -f2` ++ AC_MSG_CHECKING(for curl >= $1) ++ VERSION_CHECK=`expr $CURL_VERSION \>\= $1` ++ if test "$VERSION_CHECK" = "1" ; then ++ AC_MSG_RESULT(yes) ++ succeeded=yes ++ ++ AC_MSG_CHECKING(CURL_CFLAGS) ++ CURL_CFLAGS=`$CURL_CONFIG --cflags` ++ AC_MSG_RESULT($CURL_CFLAGS) ++ ++ AC_MSG_CHECKING(CURL_LIBS) ++ CURL_LIBS=`$CURL_CONFIG --libs` ++ AC_MSG_RESULT($CURL_LIBS) ++ else ++ CURL_CFLAGS="" ++ CURL_LIBS="" ++ ## If we have a custom action on failure, don't print errors, but ++ ## do set a variable so people can do so. ++ ifelse([$3], ,echo "can't find curl >= $1",) ++ fi ++ ++ AC_SUBST(CURL_CFLAGS) ++ AC_SUBST(CURL_LIBS) ++ fi ++ ++ if test $succeeded = yes; then ++ ifelse([$2], , :, [$2]) ++ else ++ ifelse([$3], , AC_MSG_ERROR([Library requirements (curl) not met.]), [$3]) ++ fi ++]) ++ ++ ++ ++dnl----------------------------------------------------------------------------- + dnl Macro to check for C++ namespaces + dnl for more information on this macro, see + dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/products/scheduler/etc/configure.ac livesupport-x/products/scheduler/etc/configure.ac +--- livesupport/products/scheduler/etc/configure.ac 2005-09-20 12:43:27.000000000 +0200 ++++ livesupport-x/products/scheduler/etc/configure.ac 2005-09-19 17:37:57.000000000 +0200 +@@ -77,6 +77,22 @@ + AC_SUBST(GSTREAMER_CFLAGS) + AC_SUBST(GSTREAMER_LIBS) + ++AC_CHECK_CURL(7.13.0) ++AC_SUBST(CURL_CFLAGS) ++AC_SUBST(CURL_LIBS) ++ ++AC_CHECK_TAGLIB(1.3.1) ++AC_SUBST(TAGLIB_CFLAGS) ++AC_SUBST(TAGLIB_LIBS) ++ ++AC_CHECK_ICU(3.0) ++AC_SUBST(ICU_CFLAGS) ++AC_SUBST(ICU_CXXFLAGS) ++AC_SUBST(ICU_LIBS) ++ ++AC_PATH_PROG(GENRB, genrb) ++AC_SUBST(GENRB) ++ + + dnl----------------------------------------------------------------------------- + dnl enable compilaton for code coverage data +diff -Naur --exclude=.svn --exclude=tmp --exclude=lib --exclude=Makefile --exclude=var --exclude=doc --exclude=src livesupport/products/scheduler/etc/Makefile.in livesupport-x/products/scheduler/etc/Makefile.in +--- livesupport/products/scheduler/etc/Makefile.in 2005-09-20 12:43:27.000000000 +0200 ++++ livesupport-x/products/scheduler/etc/Makefile.in 2005-09-19 17:37:01.000000000 +0200 +@@ -113,13 +113,15 @@ + GSTREAMER_LIBS=@GSTREAMER_LIBS@ + + +-CURL_LIBS=`${USR_DIR}/bin/curl-config --libs` ++CURL_CFLAGS=@CURL_CFLAGS@ ++CURL_LIBS=@CURL_LIBS@ + +-# TODO: move ICU flag determination to configure script +-ICU_LIBS=`${USR_DIR}/bin/icu-config --ldflags --ldflags-toolutil --ldflags-icuio` ++ICU_CFLAGS=@ICU_CFLAGS@ ++ICU_CXXFLAGS=@ICU_CXXFLAGS@ ++ICU_LIBS=@ICU_LIBS@ + +-TAGLIB_CFLAGS =`${USR_DIR}/bin/taglib-config --cflags` +-TAGLIB_LIBS =`${USR_DIR}/bin/taglib-config --libs` ++TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ ++TAGLIB_LIBS=@TAGLIB_LIBS@ + + MODULES_DIR = ${BASE_DIR}/../../modules + diff --git a/campcaster/etc/portage/media-radio/livesupport/livesupport-1.0.ebuild b/campcaster/etc/portage/media-radio/livesupport/livesupport-1.0.ebuild new file mode 100644 index 000000000..215ecb14d --- /dev/null +++ b/campcaster/etc/portage/media-radio/livesupport/livesupport-1.0.ebuild @@ -0,0 +1,105 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +inherit eutils flag-o-matic + +IUSE="" + +DESCRIPTION="LiveSupport is a radio broadcast support tool." +HOMEPAGE="http://livesupport.campware.org/" +SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~ppc ~sparc ~x86" + +RESTRICT="maketest" + +DEPEND=">=dev-db/unixODBC-2.2 + media-libs/fontconfig + >=media-libs/libpng-1.2 + media-libs/jpeg + dev-libs/openssl + dev-libs/libxml2 + dev-libs/popt + media-libs/alsa-lib + media-libs/libid3tag + media-libs/libmad + media-libs/libogg + media-libs/libvorbis + >=dev-libs/boost-0.31 + sys-apps/sed + net-www/apache + dev-lang/php + >=dev-php/PEAR-PEAR-1.3.5 + >=dev-php/PEAR-Archive_Tar-1.3.1 + >=dev-php/PEAR-Calendar-0.5.2 + >=dev-php/PEAR-Console_Getopt-1.2 + >=dev-php/PEAR-DB-1.7.6 + >=dev-php/PEAR-File-1.2.0 + >=dev-php/PEAR-File_Find-0.3.1 + >=dev-php/PEAR-HTML_Common-1.2.1-r1 + >=dev-php/PEAR-HTML_QuickForm-3.2.4 + >=dev-php/PEAR-XML_Beautifier-1.1 + >=dev-php/PEAR-XML_Parser-1.2.6 + >=dev-php/PEAR-XML_RPC-1.4.0 + >=dev-php/PEAR-XML_Serializer-0.15 + >=dev-php/PEAR-XML_Util-1.1.1 + >=dev-db/postgresql-7.4 + >=x11-libs/gtk+-2.6.1 + >=dev-cpp/gtkmm-2.5.5 + >=net-misc/curl-7.13.2 + >=dev-cpp/libxmlpp-2.8.1 + =dev-db/libodbc++-0.2.3-r2 + =dev-libs/xmlrpc++-0.7 + =media-libs/gst-plugins-0.8.10-r1 + =media-libs/taglib-1.3.1-r3 + =media-plugins/gst-plugins-mad-0.8.10-r1 + =media-plugins/gst-plugins-ogg-0.8.10 + =media-libs/gstreamer-0.8.10" + +src_unpack() { + unpack ${A} + cd ${S} + + # these patches are committed to the source as of 2005-09-23 + epatch ${FILESDIR}/taglib-curl-icu.patch + epatch ${FILESDIR}/prefix-as-make-variable.patch + epatch ${FILESDIR}/storageServer-docroot.patch + epatch ${FILESDIR}/setup-install-dirs.patch + epatch ${FILESDIR}/pg_hba.patch + # this patch not committed + epatch ${FILESDIR}/postinstall-config-file.patch + + # toch the tools make stamp, so that tools don't get built + touch tmp/tools_setup.stamp +} + +src_compile() { + # append -g, otherwise we get 'defined in discared section' linkage errors + append-flags -g + + econf --with-create-database=no \ + --with-create-odbc-data-source=no \ + --with-init-database=no \ + --with-configure-apache=no \ + --with-apache-group=apache \ + --with-www-docroot=${D}/var/www/localhost/htdocs \ + || die "configure failed" + emake -j1 || die "make failed" +} + +src_install() { + # to make sure the link from the docroot works + mkdir -p ${D}/var/www/localhost/htdocs + emake -j1 prefix=${D}/usr install || die "install failed" + dodoc doc INSTALL README +} + +pkg_postinst() { + /usr/bin/postInstallStation.sh --directory /usr \ + --www-root /var/www/localhost/htdocs \ + --apache-group apache +} + diff --git a/campcaster/etc/testResultToHtml.xsl b/campcaster/etc/testResultToHtml.xsl new file mode 100644 index 000000000..15738b720 --- /dev/null +++ b/campcaster/etc/testResultToHtml.xsl @@ -0,0 +1,57 @@ + + + + + + + Campcaster unit test results + + +

    Preface

    +This document is part of the +Campcaster +project, Copyright © 2004 Media +Development Loan Fund, under the GNU +GPL. +
    +This is an automatically generated document. +

    Scope

    +This document contains the generated unit test results for the +Campcaster project. +

    Summary

    + + + + + + + + + + + + + +
    Total number of tests:
    Tests passed:
    Tests failed:
    +

    Tests

    + + + + + + + + + + + + + +
    test nametest status
    failedpassed
    + + +
    + +
    + diff --git a/campcaster/etc/testResults.xml b/campcaster/etc/testResults.xml new file mode 100644 index 000000000..4fe4df376 --- /dev/null +++ b/campcaster/etc/testResults.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + +]> + +&authenticationResults; +&coreResults; +&dbResults; +&eventSchedulerResults; +&gstreamerElementsResults; +&playlistExecutorResults; +&schedulerClientResults; +&storageClientResults; +&schedulerResults; + diff --git a/campcaster/etc/xmlrpc-doxygen.config b/campcaster/etc/xmlrpc-doxygen.config new file mode 100644 index 000000000..77dfc385c --- /dev/null +++ b/campcaster/etc/xmlrpc-doxygen.config @@ -0,0 +1,1147 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "LiveSupport::Scheduler XML-RPC Interface" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/xml-rpc_doc + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +#SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +#SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src/products/scheduler/src \ + src/modules/archiveServer/var/xmlrpc/XR_Archive.php \ + src/modules/storageServer/var/xmlrpc/XR_LocStor.php + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = *Method.cxx *Method.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = src/products/scheduler/src/BaseTestMethod.h + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = \ +./doc/doxygen/xmlrpc++.tag=../../../usr/share/doc/xmlrpc++ + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/alib/.htaccess b/campcaster/src/modules/alib/.htaccess new file mode 100644 index 000000000..ba3404cb8 --- /dev/null +++ b/campcaster/src/modules/alib/.htaccess @@ -0,0 +1,12 @@ +DirectoryIndex index.php +Options +FollowSymLinks -Indexes + + + + AddType application/x-httpd-php .php + + php_flag magic_quotes_gpc On + php_flag register_globals Off + + + diff --git a/campcaster/src/modules/alib/bin/autogen.sh b/campcaster/src/modules/alib/bin/autogen.sh new file mode 100755 index 000000000..7137351ad --- /dev/null +++ b/campcaster/src/modules/alib/bin/autogen.sh @@ -0,0 +1,94 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="Alib" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +#ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +#echo " aclocal $ACLOCAL_FLAGS" +#cp -f ${configure_ac} ${tmpdir} +#cp -f ${etcdir}/acinclude.m4 ${tmpdir} +#aclocal $ACLOCAL_FLAGS + +#echo " autoheader ${configure_ac}" +#autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/alib/configure b/campcaster/src/modules/alib/configure new file mode 100755 index 000000000..47e6d5cd0 --- /dev/null +++ b/campcaster/src/modules/alib/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen "$@") +fi + +(cd $tmpdir && $configure "$@") + diff --git a/campcaster/src/modules/alib/etc/Makefile.in b/campcaster/src/modules/alib/etc/Makefile.in new file mode 100644 index 000000000..6042cc22b --- /dev/null +++ b/campcaster/src/modules/alib/etc/Makefile.in @@ -0,0 +1,152 @@ +#------------------------------------------------------------------------------- +# Alib - authentication and authorizaction component +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f + + +#------------------------------------------------------------------------------- +# Misc +#------------------------------------------------------------------------------- + +MODULE_NAME = alib +TAR_C = tar -cj --exclude .svn --exclude '*~' -C ${BASE_DIR} -f +DIST_EXT = .tgz +DATE = `date +%y%m%d` + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +#BASE_DIR = @builddir@ +BASE_DIR = . +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp +VAR_DIR = ${BASE_DIR}/var + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_VAR_DIR = ${USR_DIR}/var + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +PHP_DIR = ${VAR_DIR} +TEST_RUNNER = ${PHP_DIR}/tests/index.php + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +#CPPFLAGS = @CPPFLAGS@ +#CXXFLAGS = @CXXFLAGS@ @DEFS@ -I${USR_INCLUDE_DIR} -I${INCLUDE_DIR} -I${TMP_DIR}\ +# -pedantic -Wall +#LDFLAGS = @LDFLAGS@ -L${USR_LIB_DIR} -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +#HELLO_LIB_OBJS = ${TMP_DIR}/Hello.o +#TEST_RUNNER_OBJS = ${TMP_DIR}/HelloTest.o ${TMP_DIR}/TestRunner.o + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean dist install +.PHONY: db_init db_clean + +all: + +dir_setup: ${DOXYGEN_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: db_clean +# ${RM} ... + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + +depclean: clean + +dist: all + ${TAR_C} ${MODULE_NAME}${DATE}${DIST_EXT} * + +distclean: clean docclean +# ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* + +#check: all ${TEST_RUNNER} +# ${TEST_RUNNER} +check: all + +install: all + ${MKDIR} ${USR_VAR_DIR}/Campcaster/alib/var +# ${MKDIR} ${USR_VAR_DIR}/Campcaster/alib/var/xmlrpc + ${CP} ${VAR_DIR}/*.php ${USR_VAR_DIR}/Campcaster/alib/var +# ${CP} ${VAR_DIR}/xmlrpc/*.php ${USR_VAR_DIR}/Campcaster/alib/var/xmlrpc + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +# IMPORTANT: db_init and db_clean are commented out only for Campcaster, +# where alib is initialized through storageServer module + +db_init: +# cd var/install; php -q install.php + +db_clean: +# cd var/install; php -q uninstall.php + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${TEST_RUNNER}: + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +#${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx +# ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/src/modules/alib/etc/configure.ac b/campcaster/src/modules/alib/etc/configure.ac new file mode 100644 index 000000000..176b55a26 --- /dev/null +++ b/campcaster/src/modules/alib/etc/configure.ac @@ -0,0 +1,45 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(Alib, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../var/alib.php) + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/alib/etc/doxygen.config b/campcaster/src/modules/alib/etc/doxygen.config new file mode 100644 index 000000000..8991ee1f6 --- /dev/null +++ b/campcaster/src/modules/alib/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# doxygen.config +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = LiveSupport - alib module + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +#EXTRACT_ALL = NO +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = var var/xmlrpc + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = *.php + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/alib/tmp/.keepme b/campcaster/src/modules/alib/tmp/.keepme new file mode 100644 index 000000000..e69de29bb diff --git a/campcaster/src/modules/alib/var/.htaccess b/campcaster/src/modules/alib/var/.htaccess new file mode 100644 index 000000000..ba3404cb8 --- /dev/null +++ b/campcaster/src/modules/alib/var/.htaccess @@ -0,0 +1,12 @@ +DirectoryIndex index.php +Options +FollowSymLinks -Indexes + + + + AddType application/x-httpd-php .php + + php_flag magic_quotes_gpc On + php_flag register_globals Off + + + diff --git a/campcaster/src/modules/alib/var/alib.php b/campcaster/src/modules/alib/var/alib.php new file mode 100644 index 000000000..f1b97d2db --- /dev/null +++ b/campcaster/src/modules/alib/var/alib.php @@ -0,0 +1,696 @@ +permTable = $config['tblNamePrefix'].'perms'; + $this->sessTable = $config['tblNamePrefix'].'sess'; + } // constructor + + + /* ======================================================= public methods */ + + /* ----------------------------------------------- session/authentication */ + + /** + * Authenticate and create session + * + * @param string $login + * @param string $pass + * @return mixed + * boolean/sessionId/err + */ + function login($login, $pass) + { + if (FALSE === $this->authenticate($login, $pass)) { + $this->setTimeStamp($login, TRUE); + return FALSE; + } + $sessid = $this->_createSessid(); + if (PEAR::isError($sessid)) { + return $sessid; + } + $userid = $this->getSubjId($login); + $sql = "INSERT INTO {$this->sessTable} (sessid, userid, login, ts) + VALUES('$sessid', '$userid', '$login', now())"; + $r = $this->dbc->query($sql); + if (PEAR::isError($r)) { + return $r; + } + $this->login = $login; + $this->userid = $userid; + $this->sessid = $sessid; + $this->setTimeStamp($login, FALSE); + return $sessid; + } // fn login + + + /** + * Logout and destroy session + * + * @param string $sessid + * @return true/err + */ + function logout($sessid) + { + $ct = $this->checkAuthToken($sessid); + if($ct === FALSE) { + return PEAR::raiseError('Alib::logout: not logged ($ct)', + ALIBERR_NOTLOGGED, PEAR_ERROR_RETURN); + } elseif (PEAR::isError($ct)) { + return $ct; + } else { + $sql = "DELETE FROM {$this->sessTable} + WHERE sessid='$sessid'"; + $r = $this->dbc->query($sql); + if (PEAR::isError($r)) { + return $r; + } + $this->login = NULL; + $this->userid = NULL; + $this->sessid = NULL; + return TRUE; + } + } // fn logout + + + /** + * Return true if the token is valid + * + * @param string $sessid + * @return boolean/err + */ + function checkAuthToken($sessid) + { + $sql = "SELECT count(*) as cnt FROM {$this->sessTable} + WHERE sessid='$sessid'"; + $c = $this->dbc->getOne($sql); + return ($c == 1 ? TRUE : (PEAR::isError($c) ? $c : FALSE )); + } //fn checkAuthToken + + + /** + * Set valid token in alib object + * + * @param string $sessid + * @return boolean/err + */ + function setAuthToken($sessid) + { + $r = checkAuthToken($sessid); + if(PEAR::isError($r)) return $r; + if(!$r) + return PEAR::raiseError("ALib::setAuthToken: invalid token ($sessid)"); + $this->sessid = $sessid; + return TRUE; + } // fn setAuthToken + + + /* -------------------------------------------------------- authorization */ + /** + * Insert permission record + * + * @param int $sid + * local user/group id + * @param string $action + * @param int $oid + * local object id + * @param string $type + * 'A'|'D' (allow/deny) + * @return int + * local permission id + */ + function addPerm($sid, $action, $oid, $type='A') + { + $permid = $this->dbc->nextId("{$this->permTable}_id_seq"); + $sql = "INSERT INTO {$this->permTable} (permid, subj, action, obj, type) + VALUES ($permid, $sid, '$action', $oid, '$type')"; + $r = $this->dbc->query($sql); + if (PEAR::isError($r)) { + return($r); + } + return $permid; + } // fn addPerm + + + /** + * Remove permission record + * + * @param int $permid + * (optional) local permission id + * @param int $subj + * (optional) local user/group id + * @param int $obj + * (optional) local object id + * @return boolean/error + */ + function removePerm($permid=NULL, $subj=NULL, $obj=NULL) + { + $ca = array(); + if ($permid) { + $ca[] = "permid=$permid"; + } + if ($subj) { + $ca[] = "subj=$subj"; + } + if ($obj) { + $ca[] = "obj=$obj"; + } + $cond = join(" AND ", $ca); + if (!$cond) { + return TRUE; + } + $sql = "DELETE FROM {$this->permTable} WHERE $cond"; + return $this->dbc->query($sql); + } // fn removePerm + + + /** + * Return object related with permission record + * + * @param int $permid + * local permission id + * @return int + * local object id + */ + function _getPermOid($permid) + { + $sql = "SELECT obj FROM {$this->permTable} WHERE permid=$permid"; + $res = $this->dbc->getOne($sql); + return $res; + } // fn _getPermOid + + + /** + * Check if specified subject have permission to specified action + * on specified object + * + * Look for sequence of correnponding permissions and order it by + * relevence, then test the most relevant for result. + * High relevence have direct permission (directly for specified subject + * and object. Relevance order is done by level distance in the object + * tree, level distance in subjects (user/group system). + * Similar way is used for permissions related to object classes. + * But class-related permissions have lower priority then + * object-tree-related. + * Support for object classes can be disabled by USE_ALIB_CLASSES const. + * + * @param int $sid + * subject id (user or group id) + * @param string $action + * from set defined in config + * @param int $oid + * object id, optional (default: root node) + * @return mixed + * boolean/err + */ + function checkPerm($sid, $action, $oid=NULL) + { + if (!is_numeric($sid)) { + return FALSE; + } + if (is_null($oid) or $oid=='') { + $oid = $this->getRootNode(); + } + if (PEAR::isError($oid)) { + return $oid; + } + if (!is_numeric($oid)) { + return FALSE; + } + // query construction + // shortcuts: + // p: permTable, + // s: subjTable, m smembTable, + // t: treeTable ts: structTable, + // c: classTable, cm: cmembTable + // main query elements: + $q_flds = "m.level , p.subj, s.login, action, p.type, p.obj"; + $q_from = "{$this->permTable} p "; + // joins for solving users/groups: + $q_join = "LEFT JOIN {$this->subjTable} s ON s.id=p.subj "; + $q_join .= "LEFT JOIN {$this->smembTable} m ON m.gid=p.subj "; + $q_cond = "p.action in('_all', '$action') AND + (s.id=$sid OR m.uid=$sid) "; + // coalesce -1 for higher priority of nongroup rows: + // action DESC order for lower priority of '_all': + $q_ordb = "ORDER BY coalesce(m.level,-1), action DESC, p.type DESC"; + $q_flds0 = $q_flds; + $q_from0 = $q_from; + $q_join0 = $q_join; + $q_cond0 = $q_cond; + $q_ordb0 = $q_ordb; + // joins for solving object tree: + $q_flds .= ", t.name, ts.level as tlevel"; + $q_join .= "LEFT JOIN {$this->treeTable} t ON t.id=p.obj "; + $q_join .= "LEFT JOIN {$this->structTable} ts ON ts.parid=p.obj "; + $q_cond .= " AND (t.id=$oid OR ts.objid=$oid)"; + // action DESC order is hack for lower priority of '_all': + $q_ordb = "ORDER BY coalesce(ts.level,0), m.level, action DESC, p.type DESC"; + // query by tree: + $query1 = "SELECT $q_flds FROM $q_from $q_join WHERE $q_cond $q_ordb"; + $r1 = $this->dbc->getAll($query1); + if (PEAR::isError($r1)) { + return($r1); + } + // if there is row with type='A' on the top => permit + $AllowedByTree = + (is_array($r1) && count($r1)>0 && $r1[0]['type']=='A'); + $DeniedByTree = + (is_array($r1) && count($r1)>0 && $r1[0]['type']=='D'); + + if (!USE_ALIB_CLASSES) { + return $AllowedbyTree; + } + + // joins for solving object classes: + $q_flds = $q_flds0.", c.cname "; + $q_join = $q_join0."LEFT JOIN {$this->classTable} c ON c.id=p.obj "; + $q_join .= "LEFT JOIN {$this->cmembTable} cm ON cm.cid=p.obj "; + $q_cond = $q_cond0." AND (c.id=$oid OR cm.objid=$oid)"; + $q_ordb = $q_ordb0; + // query by class: + $query2 = "SELECT $q_flds FROM $q_from $q_join WHERE $q_cond $q_ordb"; + $r2 = $this->dbc->getAll($query2); + if (PEAR::isError($r2)) { + return($r2); + } + $AllowedByClass = + (is_array($r2) && count($r2)>0 && $r2[0]['type']=='A'); + // not used now: + // $DeniedByClass = + // (is_array($r2) && count($r2)>0 && $r2[0]['type']=='D'); + $res = ($AllowedByTree || (!$DeniedByTree && $AllowedByClass)); +# echo"
    \nsid=$sid, action=$action, oid=$oid\n"; var_dump($r1); echo"\n---\n$query1\n---\n\n"; var_dump($r2); echo"\n---\n$query2\n---\n\n"; exit;
    +        return $res;
    +    } // fn checkPerm
    +
    +
    +    /* ---------------------------------------------------------- object tree */
    +
    +    /**
    +     * Remove all permissions on object and then remove object itself
    +     *
    +     * @param int $id
    +     * @return mixed
    +     * 		void/error
    +     */
    +    function removeObj($id)
    +    {
    +        $r = $this->removePerm(NULL, NULL, $id);
    +        if (PEAR::isError($r)) {
    +            return $r;
    +        }
    +        return parent::removeObj($id);
    +    } // fn removeObj
    +
    +    /* --------------------------------------------------------- users/groups */
    +
    +    /**
    +     * Remove all permissions of subject and then remove subject itself
    +     *
    +     * @param string $login
    +     * @return mixed
    +     * 		void/error
    +     */
    +    function removeSubj($login)
    +    {
    +        $uid = $this->getSubjId($login);
    +        if (PEAR::isError($uid)) {
    +            return $uid;
    +        }
    +        if (is_null($uid)){
    +            return $this->dbc->raiseError("Alib::removeSubj: Subj not found ($login)",
    +                ALIBERR_NOTEXISTS,  PEAR_ERROR_RETURN);
    +        }
    +        $r = $this->removePerm(NULL, $uid);
    +        if (PEAR::isError($r)) {
    +            return $r;
    +        }
    +        return parent::removeSubj($login, $uid);
    +    } // fn removeSubj
    +
    +
    +    /* ------------------------------------------------------------- sessions */
    +    /**
    +     * Get login from session id (token)
    +     *
    +     * @param string $sessid
    +     * @return string/error
    +     */
    +    function getSessLogin($sessid)
    +    {
    +        $sql = "SELECT login FROM {$this->sessTable} WHERE sessid='$sessid'";
    +        $r = $this->dbc->getOne($sql);
    +        if (PEAR::isError($r)) {
    +            return $r;
    +        }
    +        if (is_null($r)){
    +            return PEAR::raiseError("Alib::getSessLogin:".
    +                " invalid session id ($sessid)",
    +                ALIBERR_NOTEXISTS,  PEAR_ERROR_RETURN);
    +        }
    +        return $r;
    +    } // fn getSessLogin
    +
    +
    +    /**
    +     * Get user id from session id.
    +     *
    +     * @param string $sessid
    +     * @return int/error
    +     */
    +    function getSessUserId($sessid)
    +    {
    +        $sql = "SELECT userid FROM {$this->sessTable} WHERE sessid='$sessid'";
    +        $r = $this->dbc->getOne($sql);
    +        if (PEAR::isError($r)) {
    +            return $r;
    +        }
    +        if (is_null($r)){
    +            return PEAR::raiseError("Alib::getSessUserId:".
    +                " invalid session id ($sessid)",
    +                ALIBERR_NOTEXISTS,  PEAR_ERROR_RETURN);
    +        }
    +        return $r;
    +    } // fn getSessUserId
    +
    +
    +    /* --------------------------------------------------------- info methods */
    +    /**
    +     * Get all permissions on object.
    +     *
    +     * @param int $id
    +     * @return array/null/err
    +     */
    +    function getObjPerms($id)
    +    {
    +        $sql = "SELECT s.login, p.* FROM {$this->permTable} p, {$this->subjTable} s
    +            WHERE s.id=p.subj AND p.obj=$id";
    +        return $this->dbc->getAll($sql);
    +    } // fn getObjPerms
    +
    +
    +    /**
    +     * Get all permissions of subject.
    +     *
    +     * @param int $sid
    +     * @return array
    +     */
    +    function getSubjPerms($sid)
    +    {
    +        $sql = "
    +            SELECT t.name, t.type as otype , p.*
    +            FROM {$this->permTable} p, {$this->treeTable} t
    +            WHERE t.id=p.obj AND p.subj=$sid";
    +        $a1 = $this->dbc->getAll($sql);
    +        if (PEAR::isError($a1)) {
    +            return $a1;
    +        }
    +        $sql2 = "
    +            SELECT c.cname as name, 'C'as otype, p.*
    +            FROM {$this->permTable} p, {$this->classTable} c
    +            WHERE c.id=p.obj AND p.subj=$sid";
    +        $a2 = $this->dbc->getAll($sql2);
    +        if (PEAR::isError($a2)) {
    +            return $a2;
    +        }
    +        return array_merge($a1, $a2);
    +    } // fn getSubjPerms
    +
    +
    +    /* ------------------------ info methods related to application structure */
    +    /* (this part should be added/rewritten to allow defining/modifying/using
    +     * application structure)
    +     * (only very simple structure definition - in $config - supported now)
    +     */
    +
    +    /**
    +     * Get all actions
    +     *
    +     * @return array
    +     */
    +    function getAllActions()
    +    {
    +        return $this->config['allActions'];
    +    } // fn getAllActions
    +
    +
    +    /**
    +     * Get all allowed actions on specified object type.
    +     *
    +     * @param string $type
    +     * @return array
    +     */
    +    function getAllowedActions($type)
    +    {
    +        return $this->config['allowedActions'][$type];
    +    } // fn getAllowedActions
    +
    +
    +    /* ====================================================== private methods */
    +
    +    /**
    +     * Create new session id.  Return the new session ID.
    +     *
    +     * @return string
    +     */
    +    function _createSessid()
    +    {
    +        for ($c=1; $c>0;){
    +            $sessid = md5(uniqid(rand()));
    +            $sql = "SELECT count(*) FROM {$this->sessTable}
    +                WHERE sessid='$sessid'";
    +            $c = $this->dbc->getOne($sql);
    +            if (PEAR::isError($c)) {
    +                return $c;
    +            }
    +        }
    +        return $sessid;
    +    } // fn _createSessid
    +
    +
    +    /* =============================================== test and debug methods */
    +
    +    /**
    +     * Dump all permissions for debug
    +     *
    +     * @param string $indstr
    +     * 		indentation string
    +     * @param string $ind
    +     * 		actual indentation
    +     * @return string
    +     */
    +    function dumpPerms($indstr='    ', $ind='')
    +    {
    +        $arr = $this->dbc->getAll("
    +            SELECT s.login, p.action, p.type
    +            FROM {$this->permTable} p, {$this->subjTable} s
    +            WHERE s.id=p.subj
    +            ORDER BY p.permid
    +        ");
    +        if (PEAR::isError($arr)) {
    +            return $arr;
    +        }
    +        $r = $ind.join(', ', array_map(create_function('$v',
    +                'return "{$v[\'login\']}/{$v[\'action\']}/{$v[\'type\']}";'
    +            ),
    +            $arr
    +        ))."\n";
    +        return $r;
    +    } // fn dumpPerms
    +
    +
    +    /**
    +     * Delete everything form the permission table and session table.
    +     *
    +     * @return void
    +     */
    +    function deleteData()
    +    {
    +        $this->dbc->query("DELETE FROM {$this->permTable}");
    +        $this->dbc->query("DELETE FROM {$this->sessTable}");
    +        parent::deleteData();
    +    } // fn deleteData
    +
    +
    +    /**
    +     * Insert test permissions
    +     *
    +     * @return array
    +     */
    +    function testData()
    +    {
    +        parent::testData();
    +        $t =& $this->tdata['tree'];
    +        $c =& $this->tdata['classes'];
    +        $s =& $this->tdata['subjects'];
    +        $this->dbc->setErrorHandling(PEAR_ERROR_PRINT);
    +        $perms = array(
    +            array($s['root'], '_all', $t['root'], 'A'),
    +            array($s['test1'], '_all', $t['pa'], 'A'),
    +            array($s['test1'], 'read', $t['s2b'], 'D'),
    +            array($s['test2'], 'addChilds', $t['pa'], 'D'),
    +            array($s['test2'], 'read', $t['i2'], 'A'),
    +            array($s['test2'], 'edit', $t['s1a'], 'A'),
    +            array($s['test1'], 'addChilds', $t['s2a'], 'D'),
    +            array($s['test1'], 'addChilds', $t['s2c'], 'D'),
    +            array($s['gr2'], 'addChilds', $t['i2'], 'A'),
    +            array($s['test3'], '_all', $t['t1'], 'D'),
    +        );
    +        if (USE_ALIB_CLASSES){
    +            $perms[] = array($s['test3'], 'read', $c['cl_sa'], 'D');
    +            $perms[] = array($s['test4'], 'editPerms', $c['cl2'], 'A');
    +        }
    +        foreach ($perms as $p){
    +            $o[] = $r = $this->addPerm($p[0], $p[1], $p[2], $p[3]);
    +            if (PEAR::isError($r)) {
    +                return $r;
    +            }
    +        }
    +        $this->tdata['perms'] = $o;
    +    } // fn testData
    +
    +
    +    /**
    +     * Make basic test
    +     *
    +     * @return boolean/error
    +     */
    +    function test()
    +    {
    +        if (PEAR::isError($p = parent::test())) {
    +            return $p;
    +        }
    +        $this->deleteData();
    +        $r = $this->testData();
    +        if (PEAR::isError($r)) {
    +            return $r;
    +        }
    +        $this->test_correct = "root/_all/A, test1/_all/A, test1/read/D,".
    +            " test2/addChilds/D, test2/read/A, test2/edit/A,".
    +            " test1/addChilds/D, test1/addChilds/D, gr2/addChilds/A,".
    +            " test3/_all/D";
    +        if (USE_ALIB_CLASSES){
    +            $this->test_correct .= ", test3/read/D, test4/editPerms/A";
    +        }
    +        $this->test_correct .= "\nno, yes\n";
    +        $r = $this->dumpPerms();
    +        if (PEAR::isError($r)) {
    +            return $r;
    +        }
    +        $this->test_dump = $r.
    +            ($this->checkPerm(
    +                $this->tdata['subjects']['test1'], 'read',
    +                $this->tdata['tree']['t1']
    +            )? 'yes':'no').", ".
    +            ($this->checkPerm(
    +                $this->tdata['subjects']['test1'], 'addChilds',
    +                $this->tdata['tree']['i2']
    +            )? 'yes':'no')."\n"
    +        ;
    +        $this->removePerm($this->tdata['perms'][1]);
    +        $this->removePerm($this->tdata['perms'][3]);
    +        $this->test_correct .= "root/_all/A, test1/read/D,".
    +            " test2/read/A, test2/edit/A,".
    +            " test1/addChilds/D, test1/addChilds/D, gr2/addChilds/A,".
    +            " test3/_all/D";
    +        if (USE_ALIB_CLASSES){
    +            $this->test_correct .= ", test3/read/D, test4/editPerms/A";
    +        }
    +        $this->test_correct .= "\n";
    +        $this->test_dump .= $this->dumpPerms();
    +        $this->deleteData();
    +        if ($this->test_dump==$this->test_correct) {
    +            $this->test_log.="alib: OK\n"; return TRUE;
    +        } else {
    +            return PEAR::raiseError('Alib::test', 1, PEAR_ERROR_DIE, '%s'.
    +            "
    \ncorrect:\n{$this->test_correct}\n".
    +            "dump:\n{$this->test_dump}\n
    \n"); + } + } // fn test + + + /** + * Create tables + initialize + * + * @return void + */ + function install() + { + parent::install(); + $this->dbc->query("CREATE TABLE {$this->permTable} ( + permid int not null PRIMARY KEY, + subj int REFERENCES {$this->subjTable} ON DELETE CASCADE, + action varchar(20), + obj int, + type char(1) + )"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->permTable}_permid_idx + ON {$this->permTable} (permid)"); + $this->dbc->query("CREATE INDEX {$this->permTable}_subj_obj_idx + ON {$this->permTable} (subj, obj)"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->permTable}_all_idx + ON {$this->permTable} (subj, action, obj)"); + $this->dbc->createSequence("{$this->permTable}_id_seq"); + + $this->dbc->query("CREATE TABLE {$this->sessTable} ( + sessid char(32) not null PRIMARY KEY, + userid int REFERENCES {$this->subjTable} ON DELETE CASCADE, + login varchar(255), + ts timestamp + )"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->sessTable}_sessid_idx + ON {$this->sessTable} (sessid)"); + $this->dbc->query("CREATE INDEX {$this->sessTable}_userid_idx + ON {$this->sessTable} (userid)"); + $this->dbc->query("CREATE INDEX {$this->sessTable}_login_idx + ON {$this->sessTable} (login)"); + } // fn install + + + /** + * Drop tables etc. + * + * @return void + */ + function uninstall() + { + $this->dbc->query("DROP TABLE {$this->permTable}"); + $this->dbc->dropSequence("{$this->permTable}_id_seq"); + $this->dbc->query("DROP TABLE {$this->sessTable}"); + parent::uninstall(); + } // fn uninstall + +} // class Alib +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/class.php b/campcaster/src/modules/alib/var/class.php new file mode 100644 index 000000000..ec9f1d9fe --- /dev/null +++ b/campcaster/src/modules/alib/var/class.php @@ -0,0 +1,341 @@ +classTable = $config['tblNamePrefix'].'classes'; + $this->cmembTable = $config['tblNamePrefix'].'cmemb'; + } + + + /* ======================================================= public methods */ + + /** + * Add new class of objects + * + * @param cname string + * @return id/error + */ + function addClass($cname) + { + $id = $this->dbc->nextId("{$this->treeTable}_id_seq"); + if (PEAR::isError($id)) { + return $id; + } + $r = $this->dbc->query(" + INSERT INTO {$this->classTable} (id, cname) + VALUES ($id, '$cname') + "); + if (PEAR::isError($r)) { + return $r; + } + return $id; + } + + + /** + * Remove class by name + * + * @param cname string + * @return boolean/err + */ + function removeClass($cname) + { + $cid = $this->getClassId($cname); + if (PEAR::isError($cid)) { + return($cid); + } + return $this->removeClassById($cid); + } + + + /** + * Remove class by id + * + * @param cid int + * @return boolean/err + */ + function removeClassById($cid) + { + $r = $this->dbc->query("DELETE FROM {$this->cmembTable} + WHERE cid=$cid"); + if (PEAR::isError($r)) { + return $r; + } + $r = $this->dbc->query("DELETE FROM {$this->classTable} + WHERE id=$cid"); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } + + + /** + * Add object to class + * + * @param cid int + * @param oid int + * @return boolean/err + */ + function addObj2Class($cid, $oid) + { + $r = $this->dbc->query("INSERT INTO {$this->cmembTable} (cid, objid) + VALUES ($cid, $oid)"); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } + + + /** + * Remove object from class + * + * @param oid int + * @param cid int, optional, default: remove obj from all classes + * @return boolean/err + */ + function removeObjFromClass($oid, $cid=NULL) + { + $r = $this->dbc->query("DELETE FROM {$this->cmembTable} + WHERE objid=$oid".(is_null($cid)? '':" AND cid=$cid")); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } + + + /* ---------------------------------------------------------- object tree */ + + /** + * Remove object from all classes and remove object itself + * + * @param id int + * @return boolean/err + */ + function removeObj($id) + { + $r = $this->removeObjFromClass($id); + if (PEAR::isError($r)) { + return $r; + } + return parent::removeObj($id); + } + + + /* --------------------------------------------------------- info methods */ + + /** + * Get class id from name + * + * @param cname string + * @return int/err + */ + function getClassId($cname) + { + $cname = pg_escape_string($cname); + return $this->dbc->getOne($query = "SELECT id FROM {$this->classTable} + WHERE cname='$cname'"); + } + + + /** + * Get class name from id + * + * @param id int + * @return string/err + */ + function getClassName($id) + { + return $this->dbc->getOne( + $query = "SELECT cname FROM {$this->classTable} WHERE id=$id"); + } + + + /** + * Return true is object is class + * + * @param id int + * @return boolean/err + */ + function isClass($id) + { + $r = $this->dbc->getOne("SELECT count(*) FROM {$this->classTable} + WHERE id=$id"); + if (PEAR::isError($r)) { + return $r; + } + return ($r > 0); + } + + + /** + * Return all classes + * + * @return array/err + */ + function getClasses() + { + return $this->dbc->getAll("SELECT * FROM {$this->classTable}"); + } + + + /** + * Return all objects in class + * + * @param id int + * @return array/err + */ + function listClass($id) + { + return $this->dbc->getAll(" + SELECT t.* FROM {$this->cmembTable} cm, {$this->treeTable} t + WHERE cm.cid=$id AND cm.objid=t.id"); + } + + + /* =============================================== test and debug methods */ + + /** + * Dump all classes fot debug + * + * @param indstr string // indentation string + * @param ind string // aktual indentation + * @return string + */ + function dumpClasses($indstr=' ', $ind='') + { + $r = $ind.join(', ', array_map( + create_function('$v', 'return "{$v[\'cname\']} ({$v[\'cnt\']})";'), + $this->dbc->getAll(" + SELECT cname, count(cm.objid)as cnt FROM {$this->classTable} c + LEFT JOIN {$this->cmembTable} cm ON c.id=cm.cid + GROUP BY cname, c.id ORDER BY c.id + ") + ))."\n"; + return $r; + } + + + /** + * Delete all classes and membeship records + * + */ + function deleteData() + { + $this->dbc->query("DELETE FROM {$this->cmembTable}"); + $this->dbc->query("DELETE FROM {$this->classTable}"); + parent::reset(); + } + + + /** + * Insert test data + * + */ + function testData() + { + parent::testData(); + $o['cl_sa'] = $this->addClass('Sections a'); + $o['cl2'] = $this->addClass('Class 2'); + $this->addObj2Class($o['cl_sa'], $this->tdata['tree']['s1a']); + $this->addObj2Class($o['cl_sa'], $this->tdata['tree']['s2a']); + $this->addObj2Class($o['cl2'], $this->tdata['tree']['t1']); + $this->addObj2Class($o['cl2'], $this->tdata['tree']['pb']); + $this->tdata['classes'] = $o; + } + + + /** + * Make basic test + * + */ + function test() + { + if (PEAR::isError($p = parent::test())) { + return $p; + } + $this->deleteData(); + $this->testData(); + $this->test_correct = "Sections a (2), Class 2 (2)\n"; + $this->test_dump = $this->dumpClasses(); + $this->removeClass('Sections a'); + $this->removeObjFromClass($this->tdata['tree']['pb'], + $this->tdata['classes']['cl2']); + $this->test_correct .= "Class 2 (1)\n"; + $this->test_dump .= $this->dumpClasses(); + $this->deleteData(); + if ($this->test_dump==$this->test_correct) { + $this->test_log.="class: OK\n"; return TRUE; + } else { + return PEAR::raiseError( + 'ObjClasses::test:', 1, PEAR_ERROR_DIE, '%s'. + "
    \ncorrect:\n{$this->test_correct}\n".
    +            "dump:\n{$this->test_dump}\n
    \n"); + } + } + + + /** + * Create tables + initialize + * + */ + function install() + { + parent::install(); + $this->dbc->query("CREATE TABLE {$this->classTable} ( + id int not null PRIMARY KEY, + cname varchar(20) + )"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->classTable}_id_idx + ON {$this->classTable} (id)"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->classTable}_cname_idx + ON {$this->classTable} (cname)"); + + $this->dbc->query("CREATE TABLE {$this->cmembTable} ( + objid int not null, + cid int not null + )"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->cmembTable}_idx + ON {$this->cmembTable} (objid, cid)"); + } + + + /** + * Drop tables etc. + * + */ + function uninstall() + { + $this->dbc->query("DROP TABLE {$this->classTable}"); + $this->dbc->query("DROP TABLE {$this->cmembTable}"); + parent::uninstall(); + } +} // class ObjClasses +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibExCls.php b/campcaster/src/modules/alib/var/example/alibExCls.php new file mode 100644 index 000000000..8b1fed8f6 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExCls.php @@ -0,0 +1,129 @@ + $alib->getClasses(), + 'loggedAs' => $login, + ); +}else{ + $d = array( + 'rows' => $alib->listClass($id), + 'id' => $id, + 'loggedAs' => $login, + 'cname' => $alib->getClassName($id), + 'cls' => $alib->getClasses(), + 'objs' => $alib->getSubTree(null, true) + ); +} +$d['msg'] = $_SESSION['alertMsg']; unset($_SESSION['alertMsg']); + +require_once "alib_f.php"; +// template follows: +?> + +Alib - class editor + + + + + + +

    Class editor

    + + +

    All classes:

    + +0) foreach($d['cls'] as $k=>$c) {?> + + + +?> + + + + + +
    + delete + permissions +
    none
    + +
    +Add class with name + + + +
    + + + +

    Objects in class :

    + + + + + +0) foreach($d['rows'] as $k=>$row) {?> + + + + + + + + + +
    + All classes +
    + removeFromClass + permissions +
    none
    + +
    +Add object + +to class + + + +
    + + + + + + + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibExLogin.php b/campcaster/src/modules/alib/var/example/alibExLogin.php new file mode 100644 index 000000000..d067810e8 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExLogin.php @@ -0,0 +1,115 @@ + $alib->getSubjects(), + 'actions' => $alib->getAllActions(), + 'objects' => $alib->getAllObjects(), + 'msg' => $_SESSION['alertMsg'] +); +unset($_SESSION['alertMsg']); + +// forms prefill: +if(is_array($_SESSION['lastPost'])) $d = array_merge($d, array( + 'lastSubj' => $_SESSION['lastPost']['subj'], + 'lastAction'=> $_SESSION['lastPost']['permAction'], + 'lastObj' => $_SESSION['lastPost']['obj'] +)); +unset($_SESSION['lastPost']); + +#header("Content-type: text/plain"); print_r($d); exit; +require_once "alib_f.php"; +// template follows: +?> + +Alib - example login + + + + + +
    + Test accounts/pass: + +
    + +

    ALib - tests/example

    + +
    + + + + +
    Login:
    Password:
    + +
    +
    +
    + +
    +Permission test:
    +Subject: +action: +object: + + +
    +
    + +
    +Permission matrix for subject: + +
    + +
    + + + + + + + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibExPList.php b/campcaster/src/modules/alib/var/example/alibExPList.php new file mode 100644 index 000000000..f68aa8c80 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExPList.php @@ -0,0 +1,79 @@ + $alib->getSubjPerms($id), + 'id' => $id, + 'loggedAs' => $login, + 'actions' => $alib->getAllActions(), + 'name' => $alib->getSubjName($id) + ); + $d['msg'] = $_SESSION['alertMsg']; unset($_SESSION['alertMsg']); + +require_once "alib_f.php"; +// template follows: +?> + +Alib - permission list + + + + + + +

    Subject permission list

    + +

    Permissions for subject :

    + + + + + +0) foreach($d['rows'] as $k=>$row) {?> + + + + + + + + +
    + All subjects +
    + () + deny' : $row['type']))?> + delete +
    none
    + + + + + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibExPMatrix.php b/campcaster/src/modules/alib/var/example/alibExPMatrix.php new file mode 100644 index 000000000..5d4cf63d3 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExPMatrix.php @@ -0,0 +1,53 @@ +getAllObjects(); +foreach($alib->getClasses() as $cl) + $all[] = array('name'=>$cl['cname']." (class)", 'id'=>$cl['id']); + +foreach($all as $it){ + $aa=array(); + foreach($alib->getAllActions() as $a){ + $aa[$a] = $r = $alib->checkPerm($sid, $a, $it['id']); + if(PEAR::isError($r)){ + echo $r->getMessage()." ".$r->getUserInfo()."\n"; exit; } + } + $m[]=array($it['name'], $aa); +} +#echo"
    \n"; var_dump($m);
    +$u=$alib->getSubjName($sid);
    +
    +?>
    +
    +ALib - permission matrix
    +
    +
    +

    Permission matrix

    +

    User:

    + + +getAllActions() as $a){?> + + + +$v){ list($obj, $aa)=$v;?> + + + + + + + +
    object
    + +Back +
    +Tree dump: +
    dumpTree()?>
    + diff --git a/campcaster/src/modules/alib/var/example/alibExPerms.php b/campcaster/src/modules/alib/var/example/alibExPerms.php new file mode 100644 index 000000000..7d8c66835 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExPerms.php @@ -0,0 +1,122 @@ +getRootNode(); +} + +// prefill data structure for template +if(!$alib->isClass($id)){ + $d = array( + 'path' => $alib->getPath($id, 'id,name'), + 'perms' => $alib->getObjPerms($id), + 'actions' => $alib->getAllowedActions($alib->getObjType($id)), + 'subjects' => $alib->getSubjects(), + 'id' => $id, + 'loggedAs' => $login + ); +}else{ + $d = array( + 'path' => '', + 'name' => $alib->getClassName($id), + 'perms' => $alib->getObjPerms($id), + 'actions' => $alib->getAllowedActions('_class'), + 'subjects' => $alib->getSubjects(), + 'id' => $id, + 'loggedAs' => $login + ); +} +$d['msg'] = $_SESSION['alertMsg']; unset($_SESSION['alertMsg']); + +require_once "alib_f.php"; +// template follows: +?> + +Alib - permission editor + + + + + + +

    Permission editor

    + +

    Path: + $it) {?> +href="?id=">/ + +Class + +

    + + +0) foreach($d['perms'] as $k=>$row) {?> + + + + + + + + + +
    deny' : $row['type']))?> + delete +
    none
    + +
    +Add permission + +for action + +to subject + + + + + +
    + + + + + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibExSubj.php b/campcaster/src/modules/alib/var/example/alibExSubj.php new file mode 100644 index 000000000..25f167bde --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExSubj.php @@ -0,0 +1,145 @@ + $alib->getSubjectsWCnt(), + 'loggedAs' => $login + ); +}else{ + $d = array( + 'rows' => $alib->listGroup($id), + 'id' => $id, + 'loggedAs' => $login, + 'gname' => $alib->getSubjName($id), + 'subj' => $alib->getSubjects() + ); +} +$d['msg'] = $_SESSION['alertMsg']; unset($_SESSION['alertMsg']); + +require_once "alib_f.php"; +// template follows: +?> + +Alib - subjects editor + + + + + + +

    User/Group editor

    + + +

    Subjects:

    + +0) foreach($d['subj'] as $k=>$c) {?> + + + (G:) (U) + + + + + +
    + + + + + + delete + permissions + permsMatrix + permsList +
    none
    + +
    +Add subject with name: +[and password: ] + + +
    + + + +

    Subjects in group :

    + + + + + +0) foreach($d['rows'] as $k=>$row) {?> + + + (G) (U) + + + + + +
    + All subjects +
    + + + + + + + removeFromGroup + + permissions +
    none
    + +
    +Add subject + +to group + + + + +
    + + + + + + + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibExTestAuth.php b/campcaster/src/modules/alib/var/example/alibExTestAuth.php new file mode 100644 index 000000000..0eef588b4 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExTestAuth.php @@ -0,0 +1,13 @@ +getSessLogin($_REQUEST['alibsid']); +if(!isset($login)||$login==''){ + $_SESSION['alertMsg'] = "Login required"; + header("Location: alibExLogin.php"); + exit; +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibExTree.php b/campcaster/src/modules/alib/var/example/alibExTree.php new file mode 100644 index 000000000..393d04c98 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibExTree.php @@ -0,0 +1,116 @@ +getRootNode(); + +// prefill data structure for template +$d = array( + 'parid' => $alib->getParent($id), + 'oname' => $alib->getObjName($id), + 'path' => $alib->getPath($id, 'id, name'), + 'rows' => $alib->getDir($id, 'id, name, type'), + 'addtypes' => $alib->getAllowedChildTypes($alib->getObjType($id)), + 'dump' => $alib->dumpTree($id), + 'id' => $id, + 'loggedAs' => $login +); +$d['msg'] = preg_replace(array("|\n|","|'|"), array("\\n","\\'"), $_SESSION['alertMsg']); unset($_SESSION['alertMsg']); + +#echo"
    \n"; var_dump($d['path']);exit;
    +require_once "alib_f.php";
    +// template follows:
    +?>
    +
    +Alib - tree editor
    +
    +
    +
    +
    +
    +
    +

    Tree editor

    +

    Path: +$it) {?> +href="alibExTree.php?id=">/ +

    + + + + + + + +0) foreach($d['rows'] as $k=>$row) {?> + + + + + + + + +
    Current node: + + permissions +
    +Parent: .. +/ + +
    () + delete + permissions +
    none
    + +
    +Add object of type + +with name + + + + + + +
    + +
    Subtree dump:
    +; print_r($d); echo"
    ";?> + + + + + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alibHttp.php b/campcaster/src/modules/alib/var/example/alibHttp.php new file mode 100644 index 000000000..8a21db463 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alibHttp.php @@ -0,0 +1,151 @@ +\nGET:\n"; print_r($_GET); echo"POST:\n"; print_r($_POST); exit; + +function getPGval($vn, $dfl='') +{ + return (isset($_POST[$vn])?$_POST[$vn]:(isset($_GET[$vn])?$_GET[$vn]:$dfl)); +} + +$userid = $alib->getSessUserId($_REQUEST['alibsid']); +$login = $alib->getSessLogin($_REQUEST['alibsid']); + +$redirUrl="alibExTree.php".(($reid=getPGval('reid', '')) ? "?id=$reid":""); +$act = getPGval('act', 'nop'); +switch($act) +{ + case"login"; + if($sessid = $alib->login($_POST['login'], $_POST['pass'])){ + setcookie('alibsid', $sessid); + $redirUrl="alibExTree.php"; + }else{ + $redirUrl="alibExLogin.php"; $_SESSION['alertMsg']='Login failed.'; + } + break; + case"logout"; + $r = $alib->logout($_REQUEST['alibsid']); + if(PEAR::isError($r)){ + $_SESSION['alertMsg'] = $r->getMessage().", ".$r->getUserInfo(); + } + setcookie('alibsid', ''); + $redirUrl="alibExLogin.php"; + break; + case"addNode"; + if($alib->checkPerm($userid, 'addChilds', $_POST['id']) + && $_POST['type']!='' + && $_POST['name']!='' + ){ + $position = ($_POST['position']=='I' ? null : $_POST['position']); + $oid = $alib->addObj( + $_POST['name'], $_POST['type'], $_POST['id'], $position + ); + if(PEAR::isError($oid)){ + $_SESSION['alertMsg'] = + $oid->getMessage().", ".$oid->getUserInfo(); + }else $r = $alib->addPerm($userid, '_all', $oid); + if(PEAR::isError($r)){ + $_SESSION['alertMsg'] = $r->getMessage().", ".$r->getUserInfo(); + } + }else $_SESSION['alertMsg']='Access denied.'; + break; + case"deleteNode"; + if($alib->checkPerm($userid, 'delete', $_REQUEST['id'])) + $alib->removeObj($_GET['id']); + else $_SESSION['alertMsg']='Access denied.'; + break; + case"addPerm"; + $a = $alib->isClass($_POST['id']) ? 'classes':'editPerms'; + $id = $alib->isClass($_POST['id']) ? '':$_POST['id']; + if($alib->checkPerm($userid, $a, $id)){ + $alib->addPerm( + $_POST['subj'], $_POST['permAction'], + $_POST['id'], $_POST['allowDeny'] + ); + }else $_SESSION['alertMsg']='Access denied.'; + $redirUrl = "alibExPerms.php". + (($reid=getPGval('reid', '')) ? "?id=$reid":""); + break; + case"removePerm"; + $a = $alib->isClass($_REQUEST['oid']) ? 'classes':'editPerms'; + $oid = $alib->isClass($_REQUEST['oid']) ? NULL:$_REQUEST['oid']; + if($alib->checkPerm($userid, $a, $oid)) + $alib->removePerm($_GET['permid']); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl = + ($_REQUEST['reurl']==plist ? "alibExPList.php":"alibExPerms.php"). + (($reid=getPGval('reid', '')) ? "?id=$reid":""); + break; + case"checkPerm"; + $res = $alib->checkPerm( + $_POST['subj'], $_POST['permAction'], $_POST['obj'] + ); + $_SESSION['alertMsg'] = ($res ? "permitted: ":"DENIED: "). + " {$_POST['permAction']} for ".$alib->getSubjName($_POST['subj']). + " on ".$alib->getObjName($_POST['obj']); + $_SESSION['lastPost']=$_POST; + $redirUrl="alibExLogin.php"; + break; + case"addClass"; + if($alib->checkPerm($userid, 'classes')) + $alib->addClass($_POST['name']); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl="alibExCls.php"; + break; + case"removeClass"; + if($alib->checkPerm($userid, 'classes')) + $alib->removeClassById($_GET['id']); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl="alibExCls.php"; + break; + case"addSubj"; + if($alib->checkPerm($userid, 'subjects')) + $alib->addSubj($_POST['login'], $_POST['pass']); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl="alibExSubj.php"; + break; + case"removeSubj"; + if($alib->checkPerm($userid, 'subjects')) + $alib->removeSubj($_GET['login']); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl="alibExSubj.php"; + break; + case"addSubj2Gr"; + if($alib->checkPerm($userid, 'subjects')) + $alib->addSubj2Gr($_POST['login'], $_POST['gname']); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl = "alibExSubj.php". + (($id=getPGval('reid', '')) ? "?id=$reid":""); + break; + case"removeSubjFromGr"; + if($alib->checkPerm($userid, 'subjects')) + $alib->removeSubjFromGr($_GET['login'], $_GET['gname']); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl = "alibExSubj.php". + (($id=getPGval('reid', '')) ? "?id=$reid":""); + break; + case"addObj2Class"; + if($alib->checkPerm($userid, 'classes')) + $alib->addObj2Class($_POST['id'], $_POST['oid']); + else $_SESSION['alertMsg']='Access denied. X1'; + $redirUrl="alibExCls.php".(($id=getPGval('id', '')) ? "?id=$id":""); + break; + case"removeObjFromClass"; + $id=getPGval('id', ''); + if($alib->checkPerm($userid, 'classes')) + $alib->removeObjFromClass($_GET['oid'], $id); + else $_SESSION['alertMsg']='Access denied.'; + $redirUrl="alibExCls.php".($id ? "?id=$id":""); + break; + default: + $_SESSION['alertMsg']="Unknown method: $act"; +} + +require_once"alib_f.php"; + +header("Location: $redirUrl"); +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alib_f.php b/campcaster/src/modules/alib/var/example/alib_f.php new file mode 100644 index 000000000..da6aba933 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alib_f.php @@ -0,0 +1,4 @@ +disconnect(); +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/alib_h.php b/campcaster/src/modules/alib/var/example/alib_h.php new file mode 100644 index 000000000..edee803e2 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/alib_h.php @@ -0,0 +1,31 @@ +\n"); +#PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING); +PEAR::setErrorHandling(PEAR_ERROR_DIE); +PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'errCallback'); + +function errCallback($err) +{ + if(assert_options(ASSERT_ACTIVE)==1) return; + echo "
    \n";
    +	echo "request: "; print_r($_REQUEST);
    +    echo "\ngm:\n".$err->getMessage()."\nui:\n".$err->getUserInfo()."\n";
    +    echo "
    BackTrace:\n"; + print_r($err->backtrace); + echo "
    \n"; + exit; +} + +$dbc = DB::connect($config['dsn'], TRUE); +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$alib =& new Alib($dbc, $config); +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/conf.php b/campcaster/src/modules/alib/var/example/conf.php new file mode 100644 index 000000000..b3c3e2fc5 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/conf.php @@ -0,0 +1,44 @@ + array( // data source definition + 'username' => 'test', + 'password' => 'test', + 'hostspec' => 'localhost', + 'phptype' => 'pgsql', + 'database' => 'Campcaster-test' + ), + 'tblNamePrefix' => 'al_', +# 'tblNamePrefix' => 'gb_', + 'RootNode' =>'RootNode', + 'objtypes' => array( + 'RootNode' => array('Publication'), + 'Publication' => array('Issue'), + 'Issue' => array('Title', 'Section'), + 'Section' => array('Title', 'Image', 'Par') + ), + 'allowedActions'=> array( + 'RootNode' => array( + 'addChilds', 'editPerms', 'read', 'edit', 'delete', + 'classes', 'subjects'), + 'Publication' => array( + 'addChilds', 'editPerms', 'read', 'edit', 'delete'), + 'Issue' => array( + 'addChilds', 'editPerms', 'read', 'edit', 'delete'), + 'Section' => array( + 'addChilds', 'editPerms', 'read', 'edit', 'delete'), + 'Title' => array('editPerms', 'read', 'edit', 'delete'), + 'Image' => array('editPerms', 'read', 'edit', 'delete'), + 'Par' => array('editPerms', 'read', 'edit', 'delete'), + '_class' => array( + 'addChilds', 'editPerms', 'read', 'edit', 'delete') + ), + 'allActions'=> array( + 'editPerms', 'addChilds', 'read', 'edit', 'delete', + 'classes', 'subjects') +); +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/example/default.css b/campcaster/src/modules/alib/var/example/default.css new file mode 100644 index 000000000..03f8e09d1 --- /dev/null +++ b/campcaster/src/modules/alib/var/example/default.css @@ -0,0 +1,15 @@ + diff --git a/campcaster/src/modules/alib/var/example/index.php b/campcaster/src/modules/alib/var/example/index.php new file mode 100644 index 000000000..402b92e6a --- /dev/null +++ b/campcaster/src/modules/alib/var/example/index.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/index.php b/campcaster/src/modules/alib/var/index.php new file mode 100644 index 000000000..89a7d9fc7 --- /dev/null +++ b/campcaster/src/modules/alib/var/index.php @@ -0,0 +1,8 @@ + +ALib module + + +

    Alib

    +Example
    + + diff --git a/campcaster/src/modules/alib/var/install/install.php b/campcaster/src/modules/alib/var/install/install.php new file mode 100644 index 000000000..941c73efc --- /dev/null +++ b/campcaster/src/modules/alib/var/install/install.php @@ -0,0 +1,63 @@ +getMessage()."\ndi:\n".$err->getDebugInfo()."\nui:\n".$err->getUserInfo()."\n
    \n"; + exit; +} + + +$dbc = DB::connect($config['dsn'], TRUE); +if(PEAR::isError($dbc)){ + echo "Database connection problem.\n"; + echo "Check if database '{$config['dsn']['database']}' exists with corresponding permissions.\n"; + echo "Database access is defined by 'dsn' values in conf.php.\n"; + exit; +} +#$dbc->setErrorHandling(PEAR_ERROR_PRINT, "%s
    \n"); +$dbc->setErrorHandling(PEAR_ERROR_RETURN); +#$$dbc->setErrorHandling(PEAR_ERROR_DIE, "%s
    \n"); +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); + +$alib =& new Alib($dbc, $config); + +echo "\n\n======\n". + "This is Alib standalone installation script, it is NOT needed to run ". + "for Campcaster.\nAlib is automatically used by storageServer without it.". + "\n======\n\n"; + +echo "Alib: uninstall ...\n"; +$alib->uninstall(); + +$dbc->setErrorHandling(PEAR_ERROR_DIE, "%s
    \n"); +echo "Alib: install ...\n"; +$alib->install(); + +#$alib->testData(); echo $alib->dumpTree(); exit; + +echo " Testing ...\n"; +$r = $alib->test(); +if($dbc->isError($r)) if($dbc->isError($r)){ echo $r->getMessage()."\n".$r->getUserInfo()."\n"; exit; } +$log = $alib->test_log; +echo " TESTS:\n$log\n---\n"; + +echo " clean up + testdata insert ...\n"; +$alib->deleteData(); +$alib->testData(); + +echo " TREE DUMP:\n"; +echo $alib->dumpTree(); +echo "\n Alib is probably installed OK\n"; + +$dbc->disconnect(); +?> diff --git a/campcaster/src/modules/alib/var/install/uninstall.php b/campcaster/src/modules/alib/var/install/uninstall.php new file mode 100644 index 000000000..e1906f487 --- /dev/null +++ b/campcaster/src/modules/alib/var/install/uninstall.php @@ -0,0 +1,38 @@ +getMessage()."\ndi:\n".$err->getDebugInfo()."\nui:\n".$err->getUserInfo()."\n
    \n"; + exit; +} + + +$dbc = DB::connect($config['dsn'], TRUE); +if(PEAR::isError($dbc)){ + echo "Database connection problem.\n"; + echo "Check if database '{$config['dsn']['database']}' exists with corresponding permissions.\n"; + echo "Database access is defined by 'dsn' values in conf.php.\n"; + exit; +} + +#PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s
    \n"); +$dbc->setErrorHandling(PEAR_ERROR_RETURN); +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$alib =& new Alib($dbc, $config); + +# $dbc->setErrorHandling(PEAR_ERROR_RETURN); +echo "Trying to uninstall all ...\n"; +$alib->uninstall(); + +$dbc->disconnect(); +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/m2tree.php b/campcaster/src/modules/alib/var/m2tree.php new file mode 100644 index 000000000..be2a3838d --- /dev/null +++ b/campcaster/src/modules/alib/var/m2tree.php @@ -0,0 +1,953 @@ + + * example minimal config: + *
    
    + *    $config = array(
    + *        'dsn'       => array(           // data source definition
    + *            'username' => DBUSER,
    + *            'password' => DBPASSWORD,
    + *            'hostspec' => 'localhost',
    + *            'phptype'  => 'pgsql',
    + *            'database' => DBNAME
    + *        ),
    + *        'tblNamePrefix'     => 'al_',
    + *        'RootNode'	=>'RootNode',
    + *    );
    + *   
    + * + * @author $Author$ + * @version $Revision$ + * @package Campcaster + * @subpackage Alib + * @see ObjClasses + * + * Original author Tom Hlava + */ +class M2tree { + /** + * Database object container + */ + var $dbc; + + /** + * Configuration tree + */ + var $config; + + /** + * Tree table name + */ + var $treeTable; + + /** + * Structure table name + */ + var $structTable; + + /** + * Root node name + */ + var $rootNodeName; + + /** + * Constructor + * + * @param DB $dbc + * @param array $config + */ + function M2tree(&$dbc, $config) + { + $this->dbc =& $dbc; + $this->config = $config; + $this->treeTable = $config['tblNamePrefix'].'tree'; + $this->structTable = $config['tblNamePrefix'].'struct'; + $this->rootNodeName = $config['RootNode']; + } // constructor + + + /* ======================================================= public methods */ + /** + * Add new object of specified type to the tree under specified parent + * node + * + * @param string $name + * mnemonic name for new object + * @param string $type + * type of new object + * @param int $parid + * optional, parent id + * @return mixed + * int/err - new id of inserted object or PEAR::error + */ + function addObj($name, $type, $parid = NULL) + { + if ( ($name == '') || ($type == '') ) { + return $this->dbc->raiseError("M2tree::addObj: Wrong name or type", ALIBERR_MTREE); + } + if (is_null($parid)) { + $parid = $this->getRootNode(); + } + // changing name if the same is in the dest. folder: + for( ; + $xid = $this->getObjId($name, $parid), + !is_null($xid) && !$this->dbc->isError($xid); + $name .= "_" + ); + if ($this->dbc->isError($xid)) { + return $xid; + } + // insert new object record: + $this->dbc->query("BEGIN"); + $oid = $this->dbc->nextId("{$this->treeTable}_id_seq"); + if ($this->dbc->isError($oid)) { + return $this->_dbRollback($oid); + } + $r = $this->dbc->query(" + INSERT INTO {$this->treeTable} (id, name, type) + VALUES ($oid, '$name', '$type') + "); + if ($this->dbc->isError($r)) { + return $this->_dbRollback($r); + } + $dataArr = array(); + // build data ($dataArr) for INSERT of structure records: + for ($p=$parid, $l=1; !is_null($p); $p=$this->getParent($p), $l++) { + $rid = $this->dbc->nextId("{$this->structTable}_id_seq"); + if ($this->dbc->isError($rid)) { + return $this->_dbRollback($rid); + } + $dataArr[] = array($rid, $oid, $p, $l); + } + // build and prepare INSERT command automatically: + $pr = $this->dbc->autoPrepare($this->structTable, + array('rid', 'objid', 'parid', 'level'), DB_AUTOQUERY_INSERT); + if ($this->dbc->isError($pr)) { + return $this->_dbRollback($pr); + } + // execute INSERT command for $dataArr: + $r = $this->dbc->executeMultiple($pr, $dataArr); + if ($this->dbc->isError($r)) { + return $this->_dbRollback($r); + } + $r = $this->dbc->query("COMMIT"); + if (PEAR::isError($r)) { + return $this->_dbRollback($r); + } + return $oid; + } // fn addObj + + + /** + * Remove specified object + * + * @param int $oid + * object id to remove + * @return mixed + * boolean/err - TRUE or PEAR::error + */ + function removeObj($oid) + { + if ($oid == $this->getRootNode()) { + return $this->dbc->raiseError( + "M2tree::removeObj: Can't remove root" + ); + } + $dir = $this->getDir($oid); + if ($this->dbc->isError($dir)) { + return $dir; + } + foreach ($dir as $k => $ch) { + $r = $this->removeObj($ch['id']); + if ($this->dbc->isError($r)) { + return $r; + } + } + $r = $this->dbc->query(" + DELETE FROM {$this->treeTable} + WHERE id=$oid + "); + if ($this->dbc->isError($r)) { + return $r; + } + /* done by automatic reference trigger: + $r = $this->dbc->query(" + DELETE FROM {$this->structTable} + WHERE objid=$oid + "); + if ($this->dbc->isError($r)) return $r; + */ + return TRUE; + } // fn removeObj + + + /** + * Create copy of specified object and insert copy to new position + * recursively + * + * @param int $oid + * source object id + * @param int $newParid + * destination parent id + * @param null $after + * dummy argument for back-compatibility + * @return mixed + * int/err - new id of inserted object or PEAR::error + */ + function copyObj($oid, $newParid, $after=NULL) + { + if (TRUE === ($r = $this->isChildOf($newParid, $oid, TRUE))) { + return $this->dbc->raiseError( + "M2tree::copyObj: Can't copy into itself" + ); + } + if ($this->dbc->isError($r)) { + return $r; + } + // get name: + $name = $this->getObjName($oid); + if ($this->dbc->isError($name)) { + return $name; + } + // get parent id: + $parid = $this->getParent($oid); + if ($this->dbc->isError($parid)) { + return $parid; + } + if ($parid == $newParid) { + $name .= "_copy"; + } + // get type: + $type = $this->getObjType($oid); + if ($this->dbc->isError($type)) { + return $type; + } + // look for children: + $dir = $this->getDir($oid, $flds='id'); + if ($this->dbc->isError($dir)) { + return $dir; + } + // insert aktual object: + $nid = $this->addObj($name, $type, $newParid); + if ($this->dbc->isError($nid)) { + return $nid; + } + // if no children: + if (is_null($dir)) { + return $nid; + } + // optionally insert children recursively: + foreach ($dir as $k => $item) { + $r = $this->copyObj($item['id'], $nid); + if ($this->dbc->isError($r)) { + return $r; + } + } + return $nid; + } // fn copyObj + + + /** + * Move subtree to another node without removing/adding + * + * @param int $oid + * @param int $newParid + * @param null $after + * dummy argument for back-compatibility + * @return boolean/err + */ + function moveObj($oid, $newParid, $after=NULL) + { + if (TRUE === ( + $r = $this->isChildOf($newParid, $oid, TRUE) + || $oid == $newParid + )) { + return $this->dbc->raiseError( + "M2tree::moveObj: Can't move into itself" + ); + } + if ($this->dbc->isError($r)) { + return $r; + } + // get name: + $name0 = $name = $this->getObjName($oid); + if ($this->dbc->isError($name)) { + return $name; + } + $this->dbc->query("BEGIN"); + // cut it from source: + $r = $this->_cutSubtree($oid); + if ($this->dbc->isError($r)) { + return $this->_dbRollback($r); + } + // changing name if the same is in the dest. folder: + for( ; + $xid = $this->getObjId($name, $newParid), + !is_null($xid) && !$this->dbc->isError($xid); + $name .= "_" + ); + if ($this->dbc->isError($xid)) { + return $this->_dbRollback($xid); + } + if ($name != $name0) { + $r = $this->renameObj($oid, $name); + if ($this->dbc->isError($r)) { + return $this->_dbRollback($r); + } + } + // paste it to dest.: + $r = $this->_pasteSubtree($oid, $newParid); + if ($this->dbc->isError($r)) { + return $this->_dbRollback($r); + } + $r = $this->dbc->query("COMMIT"); + if (PEAR::isError($r)) { + return $this->_dbRollback($r); + } + return TRUE; + } //fn moveObj + + + /** + * Rename of specified object + * + * @param int $oid + * object id to rename + * @param string $newName + * new name + * @return mixed + * boolean/err - True or PEAR::error + */ + function renameObj($oid, $newName) + { + // get parent id: + $parid = $this->getParent($oid); + if ($this->dbc->isError($parid)) { + return $parid; + } + // changing name if the same is in the folder: + for( ; + $xid = $this->getObjId($newName, $parid), + !is_null($xid) && !$this->dbc->isError($xid); + $newName .= "_" + ); + if ($this->dbc->isError($xid)) { + return $xid; + } + $newName = pg_escape_string($newName); + $r = $this->dbc->query(" + UPDATE {$this->treeTable} + SET name='$newName' + WHERE id=$oid + "); + if ($this->dbc->isError($r)) { + return $r; + } + return TRUE; + } // fn renameObj + + + /* --------------------------------------------------------- info methods */ + /** + * Search for child id by name in sibling set + * + * @param string $name + * searched name + * @param int $parId + * optional, parent id (default is root node) + * @return mixed + * int/null/err - child id (if found) or null or PEAR::error + */ + function getObjId($name, $parId = null) + { + if ( ($name == '') && is_null($parId)) { + $name = $this->rootNodeName; + } + $name = pg_escape_string($name); + $parcond = (is_null($parId) ? "parid is null" : + "parid='$parId' AND level=1"); + $r = $this->dbc->getOne(" + SELECT id FROM {$this->treeTable} t + LEFT JOIN {$this->structTable} s ON id=objid + WHERE name='$name' AND $parcond" + ); + if ($this->dbc->isError($r)) { + return $r; + } + return $r; + } // fn getObjId + + + /** + * Get one value for object by id (default: get name) + * + * @param int $oid + * @param string $fld + * optional, requested field (default: name) + * @return mixed + * string/err + */ + function getObjName($oid, $fld='name') + { + $r = $this->dbc->getOne(" + SELECT $fld FROM {$this->treeTable} + WHERE id=$oid + "); + return $r; + } // fn getObjName + + + /** + * Get object type by id. + * + * @param int $oid + * @return string/err + */ + function getObjType($oid) + { + return $this->getObjName($oid, 'type'); + } // fn getObjType + + + /** + * Get parent id + * + * @param int $oid + * @return int/err + */ + function getParent($oid) + { + $r = $this->dbc->getOne(" + SELECT parid FROM {$this->structTable} + WHERE objid=$oid AND level=1 + "); + return $r; + } // fn getParent + + + /** + * Get array of nodes in object's path from root node + * + * @param int $oid + * @param string $flds, optional + * @param boolean $withSelf + * flag for include specified object to the path + * @return array/err + */ + function getPath($oid, $flds='id', $withSelf=TRUE) + { + $path = $this->dbc->getAll(" + SELECT $flds + FROM {$this->treeTable} + LEFT JOIN {$this->structTable} s ON id=parid + WHERE objid=$oid + ORDER BY coalesce(level, 0) DESC + "); + if ($this->dbc->isError($path)) { + return $path; + } + if ($withSelf) { + $r = $this->dbc->getRow(" + SELECT $flds FROM {$this->treeTable} + WHERE id=$oid + "); + if ($this->dbc->isError($r)) { + return $r; + } + array_push($path, $r); + } + return $path; + } // fn getPath + + + /** + * Get array of childnodes + * + * @param int $oid + * @param string $flds + * optional, comma separated list of requested fields + * @param string $order + * optional, fieldname for order by clause + * @return array/err + */ + function getDir($oid, $flds='id', $order='name') + { + $r = $this->dbc->getAll(" + SELECT $flds + FROM {$this->treeTable} + INNER JOIN {$this->structTable} ON id=objid AND level=1 + WHERE parid=$oid + ORDER BY $order + "); + return $r; + } // fn getDir + + + /** + * Get level of object relatively to specified root + * + * @param int $oid + * object id + * @param string $flds + * list of field names for select + * (optional - default: 'level') + * @param int $rootId + * root for relative levels + * (optional - default: NULL - use root of whole tree) + * @return hash-array with field name/value pairs + */ + function getObjLevel($oid, $flds='level', $rootId=NULL) + { + if (is_null($rootId)) { + $rootId = $this->getRootNode(); + } + $re = $this->dbc->getRow(" + SELECT $flds + FROM {$this->treeTable} + LEFT JOIN {$this->structTable} s ON id=objid AND parid=$rootId + WHERE id=$oid + "); + if ($this->dbc->isError($re)) { + return $re; + } + $re['level'] = intval($re['level']); + return $re; + } // fn getObjLevel + + + /** + * Get subtree of specified node + * + * @param int $oid + * optional, default: root node + * @param boolean $withRoot + * optional, include/exclude specified node + * @param int $rootId + * root for relative levels, optional + * @return mixed + * array/err + */ + function getSubTree($oid=NULL, $withRoot=FALSE, $rootId=NULL) + { + if (is_null($oid)) $oid = $this->getRootNode(); + if (is_null($rootId)) $rootId = $oid; + $r = array(); + if ($withRoot) { + $r[] = $re = $this->getObjLevel($oid, 'id, name, level', $rootId); + } else { + $re=NULL; + } + if ($this->dbc->isError($re)) { + return $re; + } + $dirarr = $this->getDir($oid, 'id, level'); + if ($this->dbc->isError($dirarr)) { + return $dirarr; + } + foreach ($dirarr as $k => $snod) { + $re = $this->getObjLevel($snod['id'], 'id, name, level', $rootId); + if ($this->dbc->isError($re)) { + return $re; + } +# $re['level'] = intval($re['level'])+1; + $r[] = $re; + $r = array_merge($r, + $this->getSubTree($snod['id'], FALSE, $rootId)); + } + return $r; + } // fn getSubTree + + + /** + * Returns true if first object if child of second one + * + * @param int $oid + * object id of tested object + * @param int $parid + * object id of parent + * @param boolean $indirect + * test indirect or only direct relation + * @return boolean + */ + function isChildOf($oid, $parid, $indirect=FALSE) + { + if (!$indirect) { + $paridD = $this->getParent($oid); + if ($this->dbc->isError($paridD)) { + return $paridD; + } + return ($paridD == $parid); + } + $path = $this->getPath($oid, 'id', FALSE); + if ($this->dbc->isError($path)) { + return $path; + } + $res = FALSE; + foreach ($path as $k=>$item) { + if ($item['id'] == $parid) { + $res = TRUE; + } + } + return $res; + } // fn isChildOf + + + /** + * Get id of root node + * + * @return int/err + */ + function getRootNode() + { + return $this->getObjId($this->rootNodeName); + } // fn getRootNode + + + /** + * Get all objects in the tree as array of hashes + * + * @return array/err + */ + function getAllObjects() + { + return $this->dbc->getAll( + "SELECT * FROM {$this->treeTable}" + ); + } // fn getAllObjects + + + /* ------------------------ info methods related to application structure */ + /* (this part should be redefined in extended class to allow + * defining/modifying/using application structure) + * (only very simple structure definition - in $config - supported now) + */ + + /** + * Get child types allowed by application definition + * + * @param string $type + * @return array + */ + function getAllowedChildTypes($type) + { + return $this->config['objtypes'][$type]; + } // fn getAllowedChildTypes + + + /* ==================================================== "private" methods */ + + /** + * Cut subtree of specified object from tree. + * Preserve subtree structure. + * + * @param int $oid + * object id + * @return boolean + */ + function _cutSubtree($oid) + { + $lvl = $this->getObjLevel($oid); + if ($this->dbc->isError($lvl)) { + return $lvl; + } + $lvl = $lvl['level']; + // release downside structure + $r = $this->dbc->query(" + DELETE FROM {$this->structTable} + WHERE rid IN ( + SELECT s3.rid FROM {$this->structTable} s1 + INNER JOIN {$this->structTable} s2 ON s1.objid=s2.objid + INNER JOIN {$this->structTable} s3 ON s3.objid=s1.objid + WHERE (s1.parid=$oid OR s1.objid=$oid) + AND s2.parid=1 AND s3.level>(s2.level-$lvl) + ) + "); + if ($this->dbc->isError($r)) { + return $r; + } + return TRUE; + } // fn _cutSubtree + + + /** + * Paste subtree previously cut by _cutSubtree method into main tree + * + * @param int $oid + * object id + * @param int $newParid + * destination object id + * @return boolean + */ + function _pasteSubtree($oid, $newParid) + { + $dataArr = array(); + // build data ($dataArr) for INSERT: + foreach ($this->getSubTree($oid, TRUE) as $o) { + $l = intval($o['level'])+1; + for ($p = $newParid; !is_null($p); $p=$this->getParent($p), $l++) { + $rid = $this->dbc->nextId("{$this->structTable}_id_seq"); + if ($this->dbc->isError($rid)) { + return $rid; + } + $dataArr[] = array($rid, $o['id'], $p, $l); + } + } + // build and prepare INSERT command automatically: + $pr = $this->dbc->autoPrepare($this->structTable, + array('rid', 'objid', 'parid', 'level'), DB_AUTOQUERY_INSERT); + if ($this->dbc->isError($pr)) { + return $pr; + } + // execute INSERT command for $dataArr: + $r = $this->dbc->executeMultiple($pr, $dataArr); + if ($this->dbc->isError($r)) { + return $r; + } + return TRUE; + } // _pasteSubtree + + + /** + * Do SQL rollback and return PEAR::error + * + * @param object/string $r + * error object or error message + * @return err + */ + function _dbRollback($r) + { + $this->dbc->query("ROLLBACK"); + if ($this->dbc->isError($r)) { + return $r; + } elseif (is_string($r)) { + $msg = basename(__FILE__)."::".get_class($this).": $r"; + } else { + $msg = basename(__FILE__)."::".get_class($this).": unknown error"; + } + return $this->dbc->raiseError($msg, ALIBERR_MTREE, PEAR_ERROR_RETURN); + } // fn _dbRollback + + + /* ==================================================== auxiliary methods */ + + /** + * Human readable dump of subtree - for debug + * + * @param int $oid + * start object id + * @param string $indstr + * indentation string + * @param string $ind + * actual indentation + * @return string + */ + function dumpTree($oid=NULL, $indstr=' ', $ind='', + $format='{name}({id})', $withRoot=TRUE) + { + $r=''; + foreach ($st = $this->getSubTree($oid, $withRoot) as $o) { + if ($this->dbc->isError($st)) { + return $st; + } + $r .= $ind.str_repeat($indstr, $o['level']). + preg_replace(array('|\{name\}|', '|\{id\}|'), + array($o['name'], $o['id']), $format). + "\n"; + } + return $r; + } // fn dumpTree + + + /** + * Create tables + initialize root node + * @return err/void + */ + function install() + { + $r = $this->dbc->query("BEGIN"); + if (PEAR::isError($r)) { + return $r; + } + $r = $this->dbc->query("CREATE TABLE {$this->treeTable} ( + id int not null PRIMARY KEY, + name varchar(255) not null default'', + -- parid int, + type varchar(255) not null default'', + param varchar(255) + )"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->createSequence("{$this->treeTable}_id_seq"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("CREATE UNIQUE INDEX {$this->treeTable}_id_idx + ON {$this->treeTable} (id)"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("CREATE INDEX {$this->treeTable}_name_idx + ON {$this->treeTable} (name)"); + if ($this->dbc->isError($r)) { + return $r; + } + + $r = $this->dbc->query("CREATE TABLE {$this->structTable} ( + rid int not null PRIMARY KEY, + objid int not null REFERENCES {$this->treeTable} ON DELETE CASCADE, + parid int not null REFERENCES {$this->treeTable} ON DELETE CASCADE, + level int + )"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->createSequence("{$this->structTable}_id_seq"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("CREATE UNIQUE INDEX {$this->structTable}_rid_idx + ON {$this->structTable} (rid)"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("CREATE INDEX {$this->structTable}_objid_idx + ON {$this->structTable} (objid)"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("CREATE INDEX {$this->structTable}_parid_idx + ON {$this->structTable} (parid)"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("CREATE INDEX {$this->structTable}_level_idx + ON {$this->structTable} (level)"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query(" + CREATE UNIQUE INDEX {$this->structTable}_objid_level_idx + ON {$this->structTable} (objid, level) + "); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query(" + CREATE UNIQUE INDEX {$this->structTable}_objid_parid_idx + ON {$this->structTable} (objid, parid) + "); + if ($this->dbc->isError($r)) { + return $r; + } + + $oid = $this->dbc->nextId("{$this->treeTable}_id_seq"); + if ($this->dbc->isError($oid)) { + return $oid; + } + $r = $this->dbc->query(" + INSERT INTO {$this->treeTable} + (id, name, type) + VALUES + ($oid, '{$this->rootNodeName}', 'RootNode') + "); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("COMMIT"); + if (PEAR::isError($r)) { + return $r; + } + } // fn install + + + /** + * Drop all tables and sequences. + * @return void + */ + function uninstall() + { + $this->dbc->query("DROP TABLE {$this->structTable}"); + $this->dbc->dropSequence("{$this->structTable}_id_seq"); + $this->dbc->query("DROP TABLE {$this->treeTable}"); + $this->dbc->dropSequence("{$this->treeTable}_id_seq"); + } // fn uninstall + + + /** + * Uninstall and install. + * @return void + */ + function reinstall() + { + $this->uninstall(); + $this->install(); + } // fn reinstall + + + /** + * Clean up tree - delete all except the root node. + * @return err/void + */ + function reset() + { + $rid = $this->getRootNode(); + if ($this->dbc->isError($rid)) { + return $rid; + } + $r = $this->dbc->query("DELETE FROM {$this->structTable}"); + if ($this->dbc->isError($r)) { + return $r; + } + $r = $this->dbc->query("DELETE FROM {$this->treeTable} WHERE id<>$rid"); + if ($this->dbc->isError($r)) { + return $r; + } + } // fn reset + + + /** + * Insert test data to the tree. + * Only for compatibility with previous mtree - will be removed. + * + * @return array + */ + function test() + { + require_once "m2treeTest.php"; + $mt = &new M2treeTest($this->dbc, $this->config); + $r = $mt->_test(); + return $r; + } // fn test + + + /** + * Insert test data to the tree. + * Only for compatibility with previous mtree - will be removed. + * + * @return array + */ + function testData() + { + $o['root'] = $this->getRootNode(); + $o['pa'] = $this->addObj('Publication A', 'Publication', $o['root']); + $o['i1'] = $this->addObj('Issue 1', 'Issue', $o['pa']); + $o['s1a'] = $this->addObj('Section a', 'Section', $o['i1']); + $o['s1b'] = $this->addObj('Section b', 'Section', $o['i1']); + $o['i2'] = $this->addObj('Issue 2', 'Issue', $o['pa']); + $o['s2a'] = $this->addObj('Section a', 'Section', $o['i2']); + $o['s2b'] = $this->addObj('Section b', 'Section', $o['i2']); + $o['t1'] = $this->addObj('Title', 'Title', $o['s2b']); + $o['s2c'] = $this->addObj('Section c', 'Section', $o['i2']); + $o['pb'] = $this->addObj('Publication B', 'Publication', $o['root']); + $this->tdata['tree'] = $o; + } // fn testData + +} // class M2Tree +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/m2treeTest.php b/campcaster/src/modules/alib/var/m2treeTest.php new file mode 100644 index 000000000..e57755b61 --- /dev/null +++ b/campcaster/src/modules/alib/var/m2treeTest.php @@ -0,0 +1,210 @@ +addObj("Publication$i", "Publication"); + if($this->dbc->isError($r)) return $r; + $this->_t["p$i"] = $r; + } + for($i=1; $i<=3; $i++){ + $r = $this->addObj("Issue$i", "Issue", + $this->_t[$i<=2 ? 'p1' : 'p2']); + if($this->dbc->isError($r)) return $r; + $this->_t["i$i"] = $r; + } + for($i=1; $i<=4; $i++){ + $r = $this->addObj("Section$i", "Section", + $this->_t[$i<=3 ? 'i1' : 'i3']); + if($this->dbc->isError($r)) return $r; + $this->_t["s$i"] = $r; + } + $r = $this->addObj("Par1", "Par", $this->_t["s2"]); + if($this->dbc->isError($r)) return $r; + $this->_t["r1"] = $r; + } + function _test_check($title, $expected, $returned) + { + if($expected !== $returned){ + return $this->dbc->raiseError( + "m2tree::$title FAILED:\n". + " ###expected:\n$expected\n ---\n". + " ###returned:\n$returned\n ---\n" + ); + } + return "# ".get_class($this)."::$title: OK\n"; + } + function _test() + { + echo "# M2tree test:\n"; + + // addObj/dumpTree test: + $r = $this->_test_init(); + if($this->dbc->isError($r)) return $r; + $expected = "RootNode + Publication1 + Issue1 + Section1 + Section2 + Par1 + Section3 + Issue2 + Publication2 + Issue3 + Section4 + Publication3 +"; + $returned = $this->dumpTree(NULL, ' ', '', '{name}'); + if($this->dbc->isError($returned)) return $returned; + $r = $this->_test_check('addObj/dumpTree', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // shaking test: + $nid = $this->copyObj($this->_t['s2'], $this->_t['s4']); + if($this->dbc->isError($nid)) return $nid; + $r = $this->removeObj($this->_t['s2']); + if($this->dbc->isError($r)) return $r; + $r = $this->moveObj($nid, $this->_t['i1']); + if($this->dbc->isError($r)) return $r; + $returned = $this->dumpTree(NULL, ' ', '', '{name}'); + if($this->dbc->isError($returned)) return $returned; + $r = $this->_test_check('shaking test', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + + // removeObj test: + $r = $this->removeObj($this->_t['p2']); + if($this->dbc->isError($r)) return $r; + $expected = "RootNode + Publication1 + Issue1 + Section1 + Section2 + Par1 + Section3 + Issue2 + Publication3 +"; + $returned = $this->dumpTree(NULL, ' ', '', '{name}'); + $r = $this->_test_check('removeObj', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // renameObj/getObjName test: + $original = $this->getObjName($this->_t['i2']); + if($this->dbc->isError($original)) return $original; + $changed = 'Issue2_changed'; + $expected = $original.$changed; + $r = $this->renameObj($this->_t['i2'], $changed); + if($this->dbc->isError($r)) return $r; + $r = $this->getObjName($this->_t['i2']); + if($this->dbc->isError($r)) return $r; + $returned = $r; + $r = $this->renameObj($this->_t['i2'], $original); + if($this->dbc->isError($r)) return $r; + $r = $this->getObjName($this->_t['i2']); + $returned = $r.$returned; + if($this->dbc->isError($r)) return $r; + $r = $this->_test_check('renameObj/getObjName', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // getPath test: + $expected = "RootNode, Publication1, Issue1, Section3"; + $r = $this->getPath($this->_t['s3'], 'name'); + $returned = join(', ', array_map(create_function('$it', 'return $it["name"];'), $r)); + $r = $this->_test_check('getPath', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // getObjType test: + $expected = 'Issue'; + $returned = $this->getObjType($this->_t['i2']); + $r = $this->_test_check('getObjType', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // getParent test: + $expected = $this->_t['p1']; + $returned = $this->getParent($this->_t['i2']); + $r = $this->_test_check('getParent', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // getDir test: + $expected = "Issue1, Issue2"; + $r = $this->getDir($this->_t['p1'], 'name'); + $returned = join(', ', array_map(create_function('$it', 'return $it["name"];'), $r)); + $r = $this->_test_check('getDir', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // getObjId test: + $expected = $this->_t['i2']; + $returned = $this->getObjId('Issue2', $this->_t['p1']); + $r = $this->_test_check('getObjId', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // getObjLevel test: + $expected = 2; + $r = $this->getObjLevel($this->_t['i2']); + if($this->dbc->isError($r)) return $r; + $returned = $r['level']; + $r = $this->_test_check('getObjLevel', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // copyObj test: + $expected = "RootNode + Publication1 + Issue1 + Section1 + Section2 + Par1 + Section3 + Issue2 + Publication3 + Issue1 + Section1 + Section2 + Par1 + Section3 +"; + $nid = $this->copyObj($this->_t['i1'], $this->_t['p3']); + if($this->dbc->isError($nid)) return $nid; + $returned = $this->dumpTree(NULL, ' ', '', '{name}'); + $r = $this->_test_check('copyObj', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + $this->removeObj($nid); + + // moveObj test: + $expected = "RootNode + Publication1 + Issue2 + Publication3 + Issue1 + Section1 + Section2 + Par1 + Section3 +"; + $r = $this->moveObj($this->_t['i1'], $this->_t['p3']); + if($this->dbc->isError($r)) return $r; + $returned = $this->dumpTree(NULL, ' ', '', '{name}'); + $r = $this->_test_check('moveObj', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + // _cutSubtree test: + // _pasteSubtree test: + + echo $this->dumpTree(); + + // reset test: + $expected = "RootNode\n"; + $r = $this->reset(); + if($this->dbc->isError($r)) return $r; + $returned = $this->dumpTree(NULL, ' ', '', '{name}'); + $r = $this->_test_check('reset', $expected, $returned); + if($this->dbc->isError($r)) return $r; else echo $r; + + echo "# M2tree OK\n"; + return TRUE; + } + +} +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/m2treeTestRunner.php b/campcaster/src/modules/alib/var/m2treeTestRunner.php new file mode 100644 index 000000000..b86e8ebb5 --- /dev/null +++ b/campcaster/src/modules/alib/var/m2treeTestRunner.php @@ -0,0 +1,63 @@ +\n"; + echo "request: "; print_r($_REQUEST); + echo "\ngm:\n".$err->getMessage()."\nui:\n".$err->getUserInfo()."\n"; + echo "
    BackTrace:\n"; + print_r($err->backtrace); + echo "\n"; + exit; +} + +$dbc = DB::connect($config['dsn'], TRUE); +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); + +$m2 = &new M2treeTest($dbc, $config); +#$m2->uninstall(); +#exit; +#$r = $m2->install(); if($dbc->isError($r)){ echo $r->getMessage()."\n".$r->getUserInfo()."\n"; exit; } + +$m2->reset(); +#$r = $m2->_test_addObj(); if($dbc->isError($r)){ echo $r->getMessage()."\n".$r->getUserInfo()."\n"; exit; } +$r = $m2->_test(); if($dbc->isError($r)){ echo $r->getMessage()."\n".$r->getUserInfo()."\n"; exit; } + +/* +$parid = $m2->_t['s1']; +for($i=1; $i<=20; $i++){ + $r = $m2->addObj("X$i", "XX", $parid); + if($m2->dbc->isError($r)) return $r; + $parid = $r; + //$m2->_t["p$i"] = $r; +} +$r = $m2->dumpTree(); echo "$r\n"; +*/ + + +#$r = $m2->getSubTree($m2->_t['i1'], TRUE); var_dump($r); +#$r = $m2->getPath($m2->_t['r1'], 'id, name, level'); var_dump($r); +#$r = $m2->getPath($m2->_t['r1'], 'id, name, level', TRUE); var_dump($r); +/* +foreach($m2->getAllObjects() as $k=>$obj){ + $r = $m2->isChildOf($m2->_t['r1'], $obj['id'], TRUE); + echo "{$obj['name']}: $r\n"; +} +*/ +#$r = $m2->getDir($m2->_t['i1'], 'id, name, level'); var_dump($r); +#$r = $m2->getPath($m2->_t['s3'], 'name'); var_dump($r); +#$r = $m2->addObj("Issue1", "XX", $m2->_t["s4"]); var_dump($r); +#$r = $m2->moveObj($m2->_t['i1'], $m2->_t['s4']); var_dump($r); +#$r = $m2->copyObj($m2->_t['i1'], $m2->_t['s4']); var_dump($r); +#$r = $m2->removeObj($m2->_t['p2']); var_dump($r); +#$r = $m2->renameObj($m2->_t['s1'], 'Section2'); var_dump($r); +#$r = $m2->renameObj($m2->_t['s3'], 'Section2'); var_dump($r); + +$r = $m2->dumpTree(); echo "$r\n"; +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/subj.php b/campcaster/src/modules/alib/var/subj.php new file mode 100644 index 000000000..6dce75e76 --- /dev/null +++ b/campcaster/src/modules/alib/var/subj.php @@ -0,0 +1,714 @@ +subjTable = $config['tblNamePrefix'].'subjs'; + $this->smembTable = $config['tblNamePrefix'].'smemb'; + } // constructor + + + /* ======================================================= public methods */ + + /** + * Add new subject + * + * @param string $login + * @param string $pass + * optional + * @param string $realname + * optional + * @param boolean $passenc + * optional, password already encrypted if true + * @return int/err + */ + function addSubj($login, $pass=NULL, $realname='', $passenc=FALSE) + { + if(!$login) { + return $this->dbc->raiseError(get_class($this)."::addSubj: empty login"); + } + $id = $this->dbc->nextId("{$this->subjTable}_id_seq"); + if (PEAR::isError($id)) { + return $id; + } + if (!is_null($pass) && !$passenc) { + $pass = md5($pass); + } + $sql = "INSERT INTO {$this->subjTable} (id, login, pass, type, realname) + VALUES ($id, '$login', ". + (is_null($pass) ? "'!', 'G'" : "'$pass', 'U'").", + '$realname')"; + $r = $this->dbc->query($sql); + if (PEAR::isError($r)) { + return $r; + } + return $id; + } // fn addSubj + + + /** + * Remove subject by uid or by login + * + * @param string $login + * @param int $uid + * optional, default: null + * @return boolean/err + */ + function removeSubj($login, $uid=NULL) + { + if (is_null($uid)) { + $uid = $this->getSubjId($login); + } + if (PEAR::isError($uid)) { + return $uid; + } + $sql = "DELETE FROM {$this->smembTable} + WHERE (uid='$uid' OR gid='$uid') AND mid is null"; + $r = $this->dbc->query($sql); + if (PEAR::isError($r)) { + return $r; + } + $sql2 = "DELETE FROM {$this->subjTable} + WHERE login='$login'"; + $r = $this->dbc->query($sql2); + if (PEAR::isError($r)) { + return $r; + } + return $this->_rebuildRels(); + } // fn removeSubj + + + /** + * Check login and password + * + * @param string $login + * @param string $pass + * optional + * @return boolean/int/err + */ + function authenticate($login, $pass='') + { + $cpass = md5($pass); + $sql = "SELECT id FROM {$this->subjTable} + WHERE login='$login' AND pass='$cpass' AND type='U'"; + $id = $this->dbc->getOne($sql); + if (PEAR::isError($id)) { + return $id; + } + return (is_null($id) ? FALSE : $id); + } // fn authenticate + + + /** + * Set lastlogin or lastfail timestamp + * + * @param string $login + * @param boolean $failed + * true=> set lastfail, false=> set lastlogin + * @return boolean/int/err + */ + function setTimeStamp($login, $failed=FALSE) + { + $fld = ($failed ? 'lastfail' : 'lastlogin'); + $sql = "UPDATE {$this->subjTable} SET $fld=now() + WHERE login='$login'"; + $r = $this->dbc->query($sql); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } // fn setTimeStamp + + + /** + * Change user password + * + * @param string $login + * @param string $oldpass + * old password (optional for 'superuser mode') + * @param string $pass + * optional + * @param boolean $passenc + * optional, password already encrypted if true + * @return boolean/err + */ + function passwd($login, $oldpass=null, $pass='', $passenc=FALSE) + { + if (!$passenc) { + $cpass = md5($pass); + } else { + $cpass = $pass; + } + if (!is_null($oldpass)) { + $oldcpass = md5($oldpass); + $oldpCond = "AND pass='$oldcpass'"; + } else { + $oldpCond = ''; + } + $sql = "UPDATE {$this->subjTable} SET pass='$cpass' + WHERE login='$login' $oldpCond AND type='U'"; + $r = $this->dbc->query($sql); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } // fn passwd + + + /* --------------------------------------------------------------- groups */ + + /** + * Add {login} and direct/indirect members to {gname} and to groups, + * where {gname} is [in]direct member + * + * @param string $login + * @param string $gname + * @return int/err + */ + function addSubj2Gr($login, $gname) + { + $uid = $this->getSubjId($login); + if (PEAR::isError($uid)) { + return $uid; + } + $gid = $this->getSubjId($gname); + if (PEAR::isError($gid)) { + return $gid; + } + $isgr = $this->isGroup($gid); + if (PEAR::isError($isgr)) { + return $isgr; + } + if (!$isgr) { + return PEAR::raiseError("Subjects::addSubj2Gr: Not a group ($gname)", ALIBERR_NOTGR); + } + // add subject and all [in]direct members to group $gname: + $mid = $this->_plainAddSubj2Gr($uid, $gid); + if (PEAR::isError($mid)) { + return $mid; + } + // add it to all groups where $gname is [in]direct member: + $marr = $this->_listRMemb($gid); + if (PEAR::isError($marr)) { + return $marr; + } + foreach($marr as $k=>$v){ + $r = $this->_plainAddSubj2Gr( + $uid, $v['gid'], intval($v['level'])+1, $v['id']); + if (PEAR::isError($r)) { + return $r; + } + } + return $mid; + } // fn addSubj2Gr + + + /** + * Remove subject from group + * + * @param string $login + * @param string $gname + * @return boolean/err + */ + function removeSubjFromGr($login, $gname) + { + $uid = $this->getSubjId($login); + if (PEAR::isError($uid)) { + return $uid; + } + $gid = $this->getSubjId($gname); + if (PEAR::isError($gid)) { + return $gid; + } + $sql = "SELECT id FROM {$this->smembTable} + WHERE uid='$uid' AND gid='$gid' AND mid is null"; + $mid = $this->dbc->getOne($sql); + if (is_null($mid)) { + return FALSE; + } + if (PEAR::isError($mid)) { + return $mid; + } + // remove it: + $r = $this->_removeMemb($mid); + if (PEAR::isError($r)) { + return $r; + } + // and rebuild indirect memberships: + $r = $this->_rebuildRels(); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } // fn removeSubjFromGr + + + /* --------------------------------------------------------- info methods */ + + /** + * Get subject id from login + * + * @param string $login + * @return int/err + */ + function getSubjId($login) + { + $sql = "SELECT id FROM {$this->subjTable} + WHERE login='$login'"; + return $this->dbc->getOne($sql); + } // fn getSubjId + + + /** + * Get subject name (login) from id + * + * @param int $id + * @param string $fld + * @return string/err + */ + function getSubjName($id, $fld='login') + { + $sql = "SELECT $fld FROM {$this->subjTable} + WHERE id='$id'"; + return $this->dbc->getOne($sql); + } // fn getSubjName + + + /** + * Get all subjects + * + * @param string $flds, optional + * @return array/err + */ + function getSubjects($flds='id, login') + { + $sql = "SELECT $flds FROM {$this->subjTable}"; + return $this->dbc->getAll($sql); + } // fn getSubjects + + + /** + * Get subjects with count of direct members + * + * @return array/err + */ + function getSubjectsWCnt() + { + $sql = " + SELECT count(m.uid)as cnt, s.id, s.login, s.type + FROM {$this->subjTable} s + LEFT JOIN {$this->smembTable} m ON m.gid=s.id + WHERE m.mid is null + GROUP BY s.id, s.login, s.type + ORDER BY s.id"; + return $this->dbc->getAll($sql); + } // fn getSubjectsWCnt + + + /** + * Return true if subject is a group + * + * @param int $gid + * @return boolean/err + */ + function isGroup($gid) + { + $sql = "SELECT type FROM {$this->subjTable} + WHERE id='$gid'"; + $r = $this->dbc->getOne($sql); + if (PEAR::isError($r)) { + return $r; + } + return ($r === 'G'); + } // fn isGroup + + + /** + * List direct members of group + * + * @param int $gid + * @return array/err + */ + function listGroup($gid) + { + $sql = "SELECT s.id, s.login, s.type + FROM {$this->smembTable} m, {$this->subjTable} s + WHERE m.uid=s.id AND m.mid is null AND m.gid='$gid'"; + return $this->dbc->getAll($sql); + } // fn listGroup + + + /** + * Return true if uid is [id]direct member of gid + * + * @param int $uid + * local user id + * @param int $gid + * local group id + * @return boolean + */ + function isMemberOf($uid, $gid) + { + $sql = " + SELECT count(*)as cnt + FROM {$this->smembTable} + WHERE uid='$uid' AND gid='$gid' + "; + $res = $this->dbc->getOne($sql); + if (PEAR::isError($res)) { + return $res; + } + return (intval($res) > 0); + } // fn isMemberOf + + + /* ==================================================== "private" methods */ + + /** + * Create membership record + * + * @param int $uid + * @param int $gid + * @param int $level + * optional + * @param int $mid + * optional + * @return int/err + */ + function _addMemb($uid, $gid, $level=0, $mid='null') + { + if($uid == $gid) { + return PEAR::raiseError("Subjects::_addMemb: uid==gid ($uid)", ALIBERR_BADSMEMB); + } + $sql = "SELECT id, level, mid FROM {$this->smembTable} + WHERE uid='$uid' AND gid='$gid' ORDER BY level ASC"; + $a = $this->dbc->getAll($sql); + if (PEAR::isError($a)) { + return $a; + } + if (count($a) > 0) { + $a0 = $a[0]; + $id = $a0['id']; + if ($level < intval($a0['level'])){ + $sql2 = "UPDATE {$this->smembTable} + SET level='$level', mid=$mid WHERE id='{$a0['id']}'"; + $r = $this->dbc->query($sql2); + if (PEAR::isError($r)) { + return $r; + } + } + } else { + $id = $this->dbc->nextId("{$this->smembTable}_id_seq"); + if (PEAR::isError($id)) { + return $id; + } + $sql3 = " + INSERT INTO {$this->smembTable} (id, uid, gid, level, mid) + VALUES ($id, $uid, $gid, $level, $mid) + "; + $r = $this->dbc->query($sql3); + if (PEAR::isError($r)) { + return $r; + } + } + return $id; + } // fn _addMemb + + + /** + * Remove membership record + * + * @param int $mid + * @return null/err + */ + function _removeMemb($mid) + { + $sql = "DELETE FROM {$this->smembTable} + WHERE id='$mid'"; + return $this->dbc->query($sql); + } // fn _removeMemb + + + /** + * List [in]direct members of group + * + * @param int $gid + * @param int $uid + * optional + * @return array/err + */ + function _listMemb($gid, $uid=NULL) + { + $sql = " + SELECT id, uid, level FROM {$this->smembTable} + WHERE gid='$gid'".(is_null($uid) ? '' : " AND uid='$uid'"); + return $this->dbc->getAll($sql); + } // fn _listMemb + + + /** + * List groups where uid is [in]direct member + * + * @param int $gid + * @param int $uid + * optional + * @return array/err + */ + function _listRMemb($uid, $gid=NULL) + { + $sql = " + SELECT id, gid, level FROM {$this->smembTable} + WHERE uid='$uid'".(is_null($gid) ? '' : " AND gid='$gid'"); + return $this->dbc->getAll($sql); + } // fn listRMemb + + + /** + * Add uid and its [in]direct members to gid + * + * @param int $uid + * @param int $gid + * @param int $level + * @param int $rmid // + * @return int/err + */ + function _plainAddSubj2Gr($uid, $gid, $level=0, $rmid='null') + { + $mid = $this->_addMemb($uid, $gid, $level, $rmid); + if (PEAR::isError($mid)) { + return $mid; + } + $marr = $this->_listMemb($uid); + if (PEAR::isError($marr)) { + return $marr; + } + foreach ($marr as $k => $v) { + $r = $this->_addMemb( + $v['uid'], $gid, intval($v['level'])+$level+1, $mid + ); + if (PEAR::isError($r)) { + return $r; + } + } + return $mid; + } // fn _plainAddSubj2Gr + + + /** + * Rebuild indirect membership records
    + * it's probably more complicated to do removing without rebuild ... + * + * @return true/err + */ + function _rebuildRels() + { + $this->dbc->query("BEGIN"); + $r = $this->dbc->query("LOCK TABLE {$this->smembTable}"); + if (PEAR::isError($r)) { + return $r; + } + $r = $this->dbc->query("DELETE FROM {$this->smembTable} + WHERE mid is not null"); + if (PEAR::isError($r)) { + return $r; + } + $arr = $this->dbc->getAll("SELECT uid, gid FROM {$this->smembTable}"); + // WHERE mid is null + if (PEAR::isError($arr)) { + return $arr; + } + foreach ($arr as $it) { + $marr = $this->_listRMemb($it['gid']); + if (PEAR::isError($marr)) { + return $marr; + } + foreach ($marr as $k => $v) { + $r = $this->_plainAddSubj2Gr( + $it['uid'], $v['gid'], intval($v['level'])+1, $v['id'] + ); + if (PEAR::isError($r)) { + return $r; + } + } + } + $r = $this->dbc->query("COMMIT"); if(PEAR::isError($r)) return $r; + return TRUE; + } // fn _rebuildRels + + + /* =============================================== test and debug methods */ + + /** + * Dump subjects for debug + * + * @param string $indstr + * indentation string + * @param string $ind + * actual indentation + * @return string + */ + function dumpSubjects($indstr=' ', $ind='') + { + $r = $ind.join(', ', array_map( + create_function('$v', 'return "{$v[\'login\']}({$v[\'cnt\']})";'), + $this->getSubjectsWCnt() + ))."\n"; + return $r; + } // fn dumpSubjects + + + /** + * Delete all subjects and membership records + * + * @return void + */ + function deleteData() + { + $this->dbc->query("DELETE FROM {$this->subjTable}"); + $this->dbc->query("DELETE FROM {$this->smembTable}"); + parent::deleteData(); + } // fn deleteData + + + /** + * Insert test data + * + * @return array + */ + function testData() + { + parent::testData(); + $o['root'] = $this->addSubj('root', 'q'); + $o['test1'] = $this->addSubj('test1', 'a'); + $o['test2'] = $this->addSubj('test2', 'a'); + $o['test3'] = $this->addSubj('test3', 'a'); + $o['test4'] = $this->addSubj('test4', 'a'); + $o['test5'] = $this->addSubj('test5', 'a'); + $o['gr1'] = $this->addSubj('gr1'); + $o['gr2'] = $this->addSubj('gr2'); + $o['gr3'] = $this->addSubj('gr3'); + $o['gr4'] = $this->addSubj('gr4'); + $this->addSubj2Gr('test1', 'gr1'); + $this->addSubj2Gr('test2', 'gr2'); + $this->addSubj2Gr('test3', 'gr3'); + $this->addSubj2Gr('test4', 'gr4'); + $this->addSubj2Gr('test5', 'gr1'); + $this->addSubj2Gr('gr4', 'gr3'); + $this->addSubj2Gr('gr3', 'gr2'); + return $this->tdata['subjects'] = $o; + } // fn testData + + + /** + * Make basic test + * + */ + function test() + { + if (PEAR::isError($p = parent::test())) { + return $p; + } + $this->deleteData(); + $this->testData(); + $this->test_correct = "root(0), test1(0), test2(0), test3(0),". + " test4(0), test5(0), gr1(2), gr2(2), gr3(2), gr4(1)\n"; + $this->test_dump = $this->dumpSubjects(); + $this->removeSubj('test1'); + $this->removeSubj('test3'); + $this->removeSubjFromGr('test5', 'gr1'); + $this->removeSubjFromGr('gr3', 'gr2'); + $this->test_correct .= "root(0), test2(0), test4(0), test5(0),". + " gr1(0), gr2(1), gr3(1), gr4(1)\n"; + $this->test_dump .= $this->dumpSubjects(); + $this->deleteData(); + if ($this->test_dump == $this->test_correct) { + $this->test_log.="subj: OK\n"; + return TRUE; + } else { + return PEAR::raiseError( + 'Subjects::test:', 1, PEAR_ERROR_DIE, '%s'. + "
    \ncorrect:\n{$this->test_correct}\n".
    +            "dump:\n{$this->test_dump}\n
    \n"); + } + } // fn test + + + /** + * Create tables + initialize + * + */ + function install() + { + parent::install(); + $this->dbc->query("CREATE TABLE {$this->subjTable} ( + id int not null PRIMARY KEY, + login varchar(255) not null default'', + pass varchar(255) not null default'', + type char(1) not null default 'U', + realname varchar(255) not null default'', + lastlogin timestamp, + lastfail timestamp + )"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->subjTable}_id_idx + ON {$this->subjTable} (id)"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->subjTable}_login_idx + ON {$this->subjTable} (login)"); + $this->dbc->createSequence("{$this->subjTable}_id_seq"); + + $this->dbc->query("CREATE TABLE {$this->smembTable} ( + id int not null PRIMARY KEY, + uid int not null default 0, + gid int not null default 0, + level int not null default 0, + mid int + )"); + $this->dbc->query("CREATE UNIQUE INDEX {$this->smembTable}_id_idx + ON {$this->smembTable} (id)"); + $this->dbc->createSequence("{$this->smembTable}_id_seq"); + } // fn install + + + /** + * Drop tables etc. + * + * @return void + */ + function uninstall() + { + $this->dbc->query("DROP TABLE {$this->subjTable}"); + $this->dbc->dropSequence("{$this->subjTable}_id_seq"); + $this->dbc->query("DROP TABLE {$this->smembTable}"); + $this->dbc->dropSequence("{$this->smembTable}_id_seq"); + parent::uninstall(); + } // fn uninstall + +} // class Subjects +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/xmlrpc/alib_xr.php b/campcaster/src/modules/alib/var/xmlrpc/alib_xr.php new file mode 100644 index 000000000..711600ea1 --- /dev/null +++ b/campcaster/src/modules/alib/var/xmlrpc/alib_xr.php @@ -0,0 +1,122 @@ +$v) if($struct) $r[$k]=v2xr($v); else $r[]=v2xr($v); + return new xmlrpcval($r, ($struct ? "struct":"array")); + }else if(is_int($var)){ + return new xmlrpcval($var, "int"); + }else{ + return new xmlrpcval($var, "string"); + } +} + +/** + * XMLRPC interface for Alib class
    + * only for testing now (with example) - Campcaster uses special interface + * + * @author $Author$ + * @version $Revision$ + * @see Subjects + * @see GreenBox + */ +class XR_Alib extends Alib{ + function xr_test($input){ + $p1=$input->getParam(0); + if(isset($p1) && $p1->scalartyp()=="string") $s=$p1->scalarval(); + else return new xmlrpcresp(0, 801, + "xr_login: wrong 1st parameter, string expected."); + $p2=$input->getParam(1); + if(isset($p2) && $p2->scalartyp()=="string") $sessid=$p2->scalarval(); + else return new xmlrpcresp(0, 801, + "xr_login: wrong 2nd parameter, string expected."); + return new xmlrpcresp( + v2xr(strtoupper($s)."_".$this->getSessLogin($sessid)."_".$sessid, false) + ); + } + function xr_login($input){ + $p1=$input->getParam(0); + if(isset($p1) && $p1->scalartyp()=="string") $login=$p1->scalarval(); + else return new xmlrpcresp(0, 801, + "xr_login: wrong 1st parameter, string expected."); + $p2=$input->getParam(1); + if(isset($p2) && $p2->scalartyp()=="string") $pass=$p2->scalarval(); + else return new xmlrpcresp(0, 801, + "xr_login: wrong 2nd parameter, string expected."); + if(!($res = $this->login($login, $pass))) + return new xmlrpcresp(0, 802, + "xr_login: login failed - incorrect username or password."); + else + return new xmlrpcresp(v2xr($res, false)); + } + function xr_logout($input){ + $p1=$input->getParam(0); + if(isset($p1) && $p1->scalartyp()=="string") $sessid=$p1->scalarval(); + else return new xmlrpcresp(0, 801, + "xr_login: wrong 2nd parameter, string expected."); + $res = $this->logout($sessid); + if(!PEAR::isError($res)) return new xmlrpcresp(v2xr('Bye', false)); + else return new xmlrpcresp(0, 803, + "xr_logout: logout failed - not logged."); + } + function xr_getDir($input){ + $p1=$input->getParam(0); + if(isset($p1) && ($p1->scalartyp()=="int") && + is_numeric($id=$p1->scalarval())); + else return new xmlrpcresp(0, 801, + "xr_getDir: wrong 1st parameter, int expected."); + $res = $this->getDir($id, 'name'); + return new xmlrpcresp(v2xr($res, false)); + } + function xr_getPath($input){ + $p1=$input->getParam(0); + if(isset($p1) && ($p1->scalartyp()=="int") && + is_numeric($id=$p1->scalarval())); + else return new xmlrpcresp(0, 801, + "xr_getPath: wrong 1st parameter, int expected."); + $res = $this->getPath($id, 'id, name'); + return new xmlrpcresp(v2xr($res, false)); + } +} + +$alib = &new XR_Alib($dbc, $config); + +$s=new xmlrpc_server( array( + "alib.xrTest" => array( + "function" => array(&$alib, 'xr_test'), + "signature" => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString)), + "docstring" => "" + ), + "alib.login" => array( + "function" => array(&$alib, 'xr_login'), + "signature" => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString)), + "docstring" => "" + ), + "alib.logout" => array( + "function" => array(&$alib, 'xr_logout'), + "signature" => array(array($xmlrpcString, $xmlrpcString)), + "docstring" => "" + ), + "alib.getDir" => array( + "function" => array(&$alib, 'xr_getDir'), + "signature" => array(array($xmlrpcArray, $xmlrpcInt)), + "docstring" => "returns directory listing of object with given id" + ), + "alib.getPath" => array( + "function" => array(&$alib, 'xr_getPath'), + "signature" => array(array($xmlrpcArray, $xmlrpcInt)), + "docstring" => + "returns listing of object in path from rootnode to object with given id" + ) +)); + +require_once"../example/alib_f.php"; +?> \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/xmlrpc/index.php b/campcaster/src/modules/alib/var/xmlrpc/index.php new file mode 100644 index 000000000..7e13fde80 --- /dev/null +++ b/campcaster/src/modules/alib/var/xmlrpc/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/campcaster/src/modules/alib/var/xmlrpc/xmlrpc.inc b/campcaster/src/modules/alib/var/xmlrpc/xmlrpc.inc new file mode 100644 index 000000000..251b81e28 --- /dev/null +++ b/campcaster/src/modules/alib/var/xmlrpc/xmlrpc.inc @@ -0,0 +1,1489 @@ + +// $Id$ + + +// Copyright (c) 1999,2000,2002 Edd Dumbill. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// * Neither the name of the "XML-RPC for PHP" nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + + if (!function_exists('xml_parser_create')) + { + // Win 32 fix. From: 'Leo West' + if($WINDIR) + { + dl('php3_xml.dll'); + } + else + { + dl('xml.so'); + } + } + + $xmlrpcI4='i4'; + $xmlrpcInt='int'; + $xmlrpcBoolean='boolean'; + $xmlrpcDouble='double'; + $xmlrpcString='string'; + $xmlrpcDateTime='dateTime.iso8601'; + $xmlrpcBase64='base64'; + $xmlrpcArray='array'; + $xmlrpcStruct='struct'; + + $xmlrpcTypes=array( + $xmlrpcI4 => 1, + $xmlrpcInt => 1, + $xmlrpcBoolean => 1, + $xmlrpcString => 1, + $xmlrpcDouble => 1, + $xmlrpcDateTime => 1, + $xmlrpcBase64 => 1, + $xmlrpcArray => 2, + $xmlrpcStruct => 3 + ); + + $xmlEntities=array( + 'amp' => '&', + 'quot' => '"', + 'lt' => '<', + 'gt' => '>', + 'apos' => "'" + ); + + $xmlrpcerr['unknown_method']=1; + $xmlrpcstr['unknown_method']='Unknown method'; + $xmlrpcerr['invalid_return']=2; + $xmlrpcstr['invalid_return']='Invalid return payload: enabling debugging to examine incoming payload'; + $xmlrpcerr['incorrect_params']=3; + $xmlrpcstr['incorrect_params']='Incorrect parameters passed to method'; + $xmlrpcerr['introspect_unknown']=4; + $xmlrpcstr['introspect_unknown']="Can't introspect: method unknown"; + $xmlrpcerr['http_error']=5; + $xmlrpcstr['http_error']="Didn't receive 200 OK from remote server."; + $xmlrpcerr['no_data']=6; + $xmlrpcstr['no_data']='No data received from server.'; + $xmlrpcerr['no_ssl']=7; + $xmlrpcstr['no_ssl']='No SSL support compiled in.'; + $xmlrpcerr['curl_fail']=8; + $xmlrpcstr['curl_fail']='CURL error'; + + + $xmlrpcerr["multicall_notstruct"] = 9; + $xmlrpcstr["multicall_notstruct"] = "system.multicall expected struct"; + $xmlrpcerr["multicall_nomethod"] = 10; + $xmlrpcstr["multicall_nomethod"] = "missing methodName"; + $xmlrpcerr["multicall_notstring"] = 11; + $xmlrpcstr["multicall_notstring"] = "methodName is not a string"; + $xmlrpcerr["multicall_recursion"] = 12; + $xmlrpcstr["multicall_recursion"] = "recursive system.multicall forbidden"; + $xmlrpcerr["multicall_noparams"] = 13; + $xmlrpcstr["multicall_noparams"] = "missing params"; + $xmlrpcerr["multicall_notarray"] = 14; + $xmlrpcstr["multicall_notarray"] = "params is not an array"; + + $xmlrpc_defencoding='UTF-8'; + + $xmlrpcName='XML-RPC for PHP'; + $xmlrpcVersion='1.0.99'; + + // let user errors start at 800 + $xmlrpcerruser=800; + // let XML parse errors start at 100 + $xmlrpcerrxml=100; + + // formulate backslashes for escaping regexp + $xmlrpc_backslash=chr(92).chr(92); + + // used to store state during parsing + // quick explanation of components: + // st - used to build up a string for evaluation + // ac - used to accumulate values + // qt - used to decide if quotes are needed for evaluation + // cm - used to denote struct or array (comma needed) + // isf - used to indicate a fault + // lv - used to indicate "looking for a value": implements + // the logic to allow values with no types to be strings + // params - used to store parameters in method calls + // method - used to store method name + + $_xh=array(); + + function xmlrpc_entity_decode($string) + { + $top=split('&', $string); + $op=''; + $i=0; + while($i "; + break; + case 'BOOLEAN': + // special case here: we translate boolean 1 or 0 into PHP + // constants true or false + if ($_xh[$parser]['ac']=='1') + { + $_xh[$parser]['ac']='true'; + } + else + { + $_xh[$parser]['ac']='false'; + $_xh[$parser]['vt']=strtolower($name); + // Drop through intentionally. + } + case 'I4': + case 'INT': + case 'STRING': + case 'DOUBLE': + case 'DATETIME.ISO8601': + case 'BASE64': + if ($_xh[$parser]['qt']==1) + { + // we use double quotes rather than single so backslashification works OK + $_xh[$parser]['st'].='"'. $_xh[$parser]['ac'] . '"'; + } + elseif ($_xh[$parser]['qt']==2) + { + $_xh[$parser]['st'].="base64_decode('". $_xh[$parser]['ac'] . "')"; + } + elseif ($name=='BOOLEAN') + { + $_xh[$parser]['st'].=$_xh[$parser]['ac']; + } + else + { + // we have an I4, INT or a DOUBLE + // we must check that only 0123456789-. are characters here + if (!ereg("^\-?[0123456789 \t\.]+$", $_xh[$parser]['ac'])) + { + // TODO: find a better way of throwing an error + // than this! + error_log('XML-RPC: non numeric value received in INT or DOUBLE'); + $_xh[$parser]['st'].='ERROR_NON_NUMERIC_FOUND'; + } + else + { + // it's ok, add it on + $_xh[$parser]['st'].=$_xh[$parser]['ac']; + } + } + $_xh[$parser]['ac']=''; $_xh[$parser]['qt']=0; + $_xh[$parser]['lv']=3; // indicate we've found a value + break; + case 'VALUE': + // deal with a string value + if (strlen($_xh[$parser]['ac'])>0 && + $_xh[$parser]['vt']==$xmlrpcString) + { + $_xh[$parser]['st'].='"'. $_xh[$parser]['ac'] . '"'; + } + // This if() detects if no scalar was inside + // and pads an empty ''. + if($_xh[$parser]['st'][strlen($_xh[$parser]['st'])-1] == '(') + { + $_xh[$parser]['st'].= '""'; + } + $_xh[$parser]['st'].=", '" . $_xh[$parser]['vt'] . "')"; + if ($_xh[$parser]['cm']) + { + $_xh[$parser]['st'].=','; + } + break; + case 'MEMBER': + $_xh[$parser]['ac']=''; $_xh[$parser]['qt']=0; + break; + case 'DATA': + $_xh[$parser]['ac']=''; $_xh[$parser]['qt']=0; + break; + case 'PARAM': + $_xh[$parser]['params'][]=$_xh[$parser]['st']; + break; + case 'METHODNAME': + $_xh[$parser]['method']=ereg_replace("^[\n\r\t ]+", '', $_xh[$parser]['ac']); + break; + case 'BOOLEAN': + // special case here: we translate boolean 1 or 0 into PHP + // constants true or false + if ($_xh[$parser]['ac']=='1') + { + $_xh[$parser]['ac']='true'; + } + else + { + $_xh[$parser]['ac']='false'; + $_xh[$parser]['vt']=strtolower($name); + } + break; + default: + break; + } + // if it's a valid type name, set the type + if (isset($xmlrpcTypes[strtolower($name)])) + { + $_xh[$parser]['vt']=strtolower($name); + } + } + + function xmlrpc_cd($parser, $data) + { + global $_xh, $xmlrpc_backslash; + + //if (ereg("^[\n\r \t]+$", $data)) return; + // print "adding [${data}]\n"; + + if ($_xh[$parser]['lv']!=3) + { + // "lookforvalue==3" means that we've found an entire value + // and should discard any further character data + if ($_xh[$parser]['lv']==1) + { + // if we've found text and we're just in a then + // turn quoting on, as this will be a string + $_xh[$parser]['qt']=1; + // and say we've found a value + $_xh[$parser]['lv']=2; + } + if(!@isset($_xh[$parser]['ac'])) + { + $_xh[$parser]['ac'] = ''; + } + $_xh[$parser]['ac'].=str_replace('$', '\$', str_replace('"', '\"', str_replace(chr(92),$xmlrpc_backslash, $data))); + } + } + + function xmlrpc_dh($parser, $data) + { + global $_xh; + if (substr($data, 0, 1) == '&' && substr($data, -1, 1) == ';') + { + if ($_xh[$parser]['lv']==1) + { + $_xh[$parser]['qt']=1; + $_xh[$parser]['lv']=2; + } + $_xh[$parser]['ac'].=str_replace('$', '\$', str_replace('"', '\"', str_replace(chr(92),$xmlrpc_backslash, $data))); + } + } + + class xmlrpc_client + { + var $path; + var $server; + var $port; + var $errno; + var $errstring; + var $debug=0; + var $username=''; + var $password=''; + var $cert=''; + var $certpass=''; + var $verifypeer=1; + var $verifyhost=1; + var $no_multicall=false; + + function xmlrpc_client($path, $server, $port=0) + { + $this->port=$port; $this->server=$server; $this->path=$path; + } + + function setDebug($in) + { + if ($in) + { + $this->debug=1; + } + else + { + $this->debug=0; + } + } + + function setCredentials($u, $p) + { + $this->username=$u; + $this->password=$p; + } + + function setCertificate($cert, $certpass) + { + $this->cert = $cert; + $this->certpass = $certpass; + } + + function setSSLVerifyPeer($i) + { + $this->verifypeer = $i; + } + + function setSSLVerifyHost($i) + { + $this->verifyhost = $i; + } + + function send($msg, $timeout=0, $method='http') + { + if (is_array($msg)) + { + // $msg is an array of xmlrpcmsg's + return $this->multicall($msg, $timeout, $method); + } + + // where msg is an xmlrpcmsg + $msg->debug=$this->debug; + + if ($method == 'https') + { + return $this->sendPayloadHTTPS($msg, + $this->server, + $this->port, $timeout, + $this->username, $this->password, + $this->cert, + $this->certpass); + } + else + { + return $this->sendPayloadHTTP10($msg, $this->server, $this->port, + $timeout, $this->username, + $this->password); + } + } + + function sendPayloadHTTP10($msg, $server, $port, $timeout=0,$username='', $password='') + { + global $xmlrpcerr, $xmlrpcstr; + if ($port==0) + { + $port=80; + } + if($timeout>0) + { + $fp=fsockopen($server, $port,$this->errno, $this->errstr, $timeout); + } + else + { + $fp=fsockopen($server, $port,$this->errno, $this->errstr); + } + if (!$fp) + { + $this->errstr='Connect error'; + $r=new xmlrpcresp(0, $xmlrpcerr['http_error'],$xmlrpcstr['http_error']); + return $r; + } + // Only create the payload if it was not created previously + if(empty($msg->payload)) + { + $msg->createPayload(); + } + + // thanks to Grant Rauscher + // for this + $credentials=''; + if ($username!='') + { + $credentials='Authorization: Basic ' . base64_encode($username . ':' . $password) . "\r\n"; + } + + // "Host: ". $this->server . ":" . $this->port . "\r\n" . + + $op= "POST " . $this->path. " HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\n" . + "Host: ". $this->server . "\r\n" . + $credentials . + "Content-Type: text/xml\r\nContent-Length: " . + strlen($msg->payload) . "\r\n\r\n" . + $msg->payload; + + if (!fputs($fp, $op, strlen($op))) + { + $this->errstr='Write error'; + $r=new xmlrpcresp(0, $xmlrpcerr['http_error'], $xmlrpcstr['http_error']); + return $r; + } + $resp=$msg->parseResponseFile($fp); + fclose($fp); + return $resp; + } + + // contributed by Justin Miller + // requires curl to be built into PHP + function sendPayloadHTTPS($msg, $server, $port, $timeout=0,$username='', $password='', $cert='',$certpass='') + { + global $xmlrpcerr, $xmlrpcstr; + if ($port == 0) + { + $port = 443; + } + + // Only create the payload if it was not created previously + if(empty($msg->payload)) + { + $msg->createPayload(); + } + + if (!function_exists('curl_init')) + { + $this->errstr='SSL unavailable on this install'; + $r=new xmlrpcresp(0, $xmlrpcerr['no_ssl'], $xmlrpcstr['no_ssl']); + return $r; + } + + $curl = curl_init("https://" . $server . ':' . $port . $this->path); + + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + // results into variable + if ($this->debug) + { + curl_setopt($curl, CURLOPT_VERBOSE, 1); + } + curl_setopt($curl, CURLOPT_USERAGENT, 'PHP XMLRPC 1.0'); + // required for XMLRPC + curl_setopt($curl, CURLOPT_POST, 1); + // post the data + curl_setopt($curl, CURLOPT_POSTFIELDS, $msg->payload); + // the data + curl_setopt($curl, CURLOPT_HEADER, 1); + // return the header too + curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); + // whether to verify remote host's cert + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verifypeer); + // whether to verify cert's common name (CN); 0 for no, 1 to verify that it exists, and 2 to verify that it matches the hostname used + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $this->verifyhost); + // required for XMLRPC + if ($timeout) + { + curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 : $timeout - 1); + } + // timeout is borked + if ($username && $password) + { + curl_setopt($curl, CURLOPT_USERPWD,"$username:$password"); + } + // set auth stuff + if ($cert) + { + curl_setopt($curl, CURLOPT_SSLCERT, $cert); + } + // set cert file + if ($certpass) + { + curl_setopt($curl, CURLOPT_SSLCERTPASSWD,$certpass); + } + // set cert password + + $result = curl_exec($curl); + + if (!$result) + { + $this->errstr='no response'; + $resp=new xmlrpcresp(0, $xmlrpcerr['curl_fail'], $xmlrpcstr['curl_fail']. ': '. curl_error($curl)); + } + else + { + $resp = $msg->parseResponse($result); + } + curl_close($curl); + return $resp; + } + + function multicall($msgs, $timeout=0, $method='http') + { + $results = false; + + if (! $this->no_multicall) + { + $results = $this->_try_multicall($msgs, $timeout, $method); + /* TODO - this is not php3-friendly */ + // if($results !== false) + if($results != false) + { + // Either the system.multicall succeeded, or the send + // failed (e.g. due to HTTP timeout). In either case, + // we're done for now. + return $results; + } + else + { + // system.multicall unsupported by server, + // don't try it next time... + $this->no_multicall = true; + } + } + + // system.multicall is unupported by server: + // Emulate multicall via multiple requests + $results = array(); + //foreach($msgs as $msg) + @reset($msgs); + while(list(,$msg) = @each($msgs)) + { + $results[] = $this->send($msg, $timeout, $method); + } + return $results; + } + + // Attempt to boxcar $msgs via system.multicall. + function _try_multicall($msgs, $timeout, $method) + { + // Construct multicall message + $calls = array(); + //foreach($msgs as $msg) + @reset($msgs); + while(list(,$msg) = @each($msgs)) + { + $call['methodName'] = new xmlrpcval($msg->method(),'string'); + $numParams = $msg->getNumParams(); + $params = array(); + for ($i = 0; $i < $numParams; $i++) + { + $params[$i] = $msg->getParam($i); + } + $call['params'] = new xmlrpcval($params, 'array'); + $calls[] = new xmlrpcval($call, 'struct'); + } + $multicall = new xmlrpcmsg('system.multicall'); + $multicall->addParam(new xmlrpcval($calls, 'array')); + + // Attempt RPC call + $result = $this->send($multicall, $timeout, $method); + if (!is_object($result)) + return ($result || 0); // transport failed + + if ($result->faultCode() != 0) + return false; // system.multicall failed + + // Unpack responses. + $rets = $result->value(); + if ($rets->kindOf() != 'array') + return false; // bad return type from system.multicall + $numRets = $rets->arraysize(); + if ($numRets != count($msgs)) + return false; // wrong number of return values. + + $response = array(); + for ($i = 0; $i < $numRets; $i++) + { + $val = $rets->arraymem($i); + switch ($val->kindOf()) + { + case 'array': + if ($val->arraysize() != 1) + return false; // Bad value + // Normal return value + $response[$i] = new xmlrpcresp($val->arraymem(0)); + break; + case 'struct': + $code = $val->structmem('faultCode'); + if ($code->kindOf() != 'scalar' || $code->scalartyp() != 'int') + return false; + $str = $val->structmem('faultString'); + if ($str->kindOf() != 'scalar' || $str->scalartyp() != 'string') + return false; + $response[$i] = new xmlrpcresp(0, $code->scalarval(), $str->scalarval()); + break; + default: + return false; + } + } + return $response; + } + } // end class xmlrpc_client + + class xmlrpcresp + { + var $xv; + var $fn; + var $fs; + var $hdrs; + + function xmlrpcresp($val, $fcode=0, $fstr='',$waserror=0) + { + //print "waserror=$waserror
    "; + if(($fcode != 0) || ($waserror != 0)) + { + $this->xv = 0; + $this->fn = $fcode; + $this->fs = htmlspecialchars($fstr); + } + else + { + $this->xv = $val; + $this->fn = 0; + } + } + + function faultCode() + { + if(isset($this->fn)) + { + if($this->fn == 0) + { + return -1; + } + else + { + return $this->fn; + } + } + else + { + return 0; + } + } + + function faultString() + { + return $this->fs; + } + + function value() + { + return $this->xv; + } + + function serialize() + { + $rs="\n"; + if ($this->fn) + { + $rs.=' + + + +faultCode +' . $this->fn . ' + + +faultString +' . $this->fs . ' + + + +'; + } + else + { + $rs.="\n\n" . $this->xv->serialize() . + "\n"; + } + $rs.="\n"; + return $rs; + } + } + + class xmlrpcmsg + { + var $payload; + var $methodname; + var $params=array(); + var $debug=0; + + function xmlrpcmsg($meth, $pars=0) + { + $this->methodname=$meth; + if (is_array($pars) && sizeof($pars)>0) + { + for($i=0; $iaddParam($pars[$i]); + } + } + } + + function xml_header() + { + return "\n\n"; + } + + function xml_footer() + { + return "\n"; + } + + function createPayload() + { + $this->payload=$this->xml_header(); + $this->payload.="" . $this->methodname . "\n"; + // if (sizeof($this->params)) { + $this->payload.="\n"; + for($i=0; $iparams); $i++) + { + $p=$this->params[$i]; + $this->payload.="\n" . $p->serialize() . + "\n"; + } + $this->payload.="\n"; + // } + $this->payload.=$this->xml_footer(); + $this->payload=str_replace("\n", "\r\n", $this->payload); + } + + function method($meth='') + { + if ($meth!='') + { + $this->methodname=$meth; + } + return $this->methodname; + } + + function serialize() + { + $this->createPayload(); + return $this->payload; + } + + function addParam($par) { $this->params[]=$par; } + function getParam($i) { return $this->params[$i]; } + function getNumParams() { return sizeof($this->params); } + + function parseResponseFile($fp) + { + $ipd=''; + while($data=fread($fp, 32768)) + { + $ipd.=$data; + } + return $this->parseResponse($ipd); + } + + function parseResponse($data='') + { + global $_xh,$xmlrpcerr,$xmlrpcstr; + global $xmlrpc_defencoding; + + $parser = xml_parser_create($xmlrpc_defencoding); + + $_xh[$parser]=array(); + + $_xh[$parser]['st']=''; + $_xh[$parser]['cm']=0; + $_xh[$parser]['isf']=0; + $_xh[$parser]['ac']=''; + $_xh[$parser]['qt']=''; + $_xh[$parser]['ha']=''; + + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee'); + xml_set_character_data_handler($parser, 'xmlrpc_cd'); + xml_set_default_handler($parser, 'xmlrpc_dh'); + $xmlrpc_value=new xmlrpcval; + + $hdrfnd = 0; + if($this->debug) + { + //by maHo, replaced htmlspecialchars with htmlentities + print "
    ---GOT---\n" . htmlentities($data) . "\n---END---\n
    "; + } + if($data == '') + { + error_log('No response received from server.'); + $r = new xmlrpcresp(0, $xmlrpcerr['no_data'], $xmlrpcstr['no_data']); + xml_parser_free($parser); + return $r; + } + // see if we got an HTTP 200 OK, else bomb + // but only do this if we're using the HTTP protocol. + if(ereg("^HTTP",$data) && !ereg("^HTTP/[0-9\.]+ 200 ", $data)) + { + $errstr= substr($data, 0, strpos($data, "\n")-1); + error_log('HTTP error, got response: ' .$errstr); + $r=new xmlrpcresp(0, $xmlrpcerr['http_error'], $xmlrpcstr['http_error']. ' (' . $errstr . ')'); + xml_parser_free($parser); + return $r; + } + + // if using HTTP, then gotta get rid of HTTP headers here + // and we store them in the 'ha' bit of our data array + if (ereg("^HTTP", $data)) + { + $ar=explode("\r\n", $data); + $newdata=''; + $hdrfnd=0; + for ($i=0; $i0) + { + $_xh[$parser]['ha'].=$ar[$i]. "\r\n"; + } + else + { + $hdrfnd=1; + } + } + else + { + $newdata.=$ar[$i] . "\r\n"; + } + } + $data=$newdata; + } + + if ($this->debug) + { + @reset($_xh[$parser]['ha']); + while (list($x,$header) = @each($_xh[$parser]['ha'])) + { + echo "HEADER: $header\n"; + } + } + // end Patch + if (!xml_parse($parser, $data, sizeof($data))) + { + // thanks to Peter Kocks + if((xml_get_current_line_number($parser)) == 1) + { + $errstr = 'XML error at line 1, check URL'; + } + else + { + $errstr = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser)); + error_log($errstr); + $r=new xmlrpcresp(0, $xmlrpcerr['invalid_return'], $xmlrpcstr['invalid_return']); + xml_parser_free($parser); + echo $errstr; + return $r; + } + } + xml_parser_free($parser); + if ($this->debug) + { + print "
    ---EVALING---[" . 
    +				strlen($_xh[$parser]['st']) . " chars]---\n" . 
    +				htmlspecialchars($_xh[$parser]['st']) . ";\n---END---
    "; + } + if (strlen($_xh[$parser]['st'])==0) + { + // then something odd has happened + // and it's time to generate a client side error + // indicating something odd went on + $r=new xmlrpcresp(0, $xmlrpcerr["invalid_return"], + $xmlrpcstr["invalid_return"]); + } + else + { + eval('$v=' . $_xh[$parser]['st'] . '; $allOK=1;'); + if ($_xh[$parser]['isf']) + { + $f=$v->structmem('faultCode'); + $fs=$v->structmem('faultString'); + + $r = new xmlrpcresp($v, $f->scalarval(), + $fs->scalarval(),1 /* even if errornum=0, indicate that there is error. modified by maHo */ + ); + + } + else + { + $r=new xmlrpcresp($v); + } + } + $r->hdrs = @split("\r?\n", $_xh[$parser]['ha'][1]); + return $r; + } + } + + class xmlrpcval + { + var $me=array(); + var $mytype=0; + + function xmlrpcval($val=-1, $type='') + { + global $xmlrpcTypes; + $this->me=array(); + $this->mytype=0; + if ($val!=-1 || $type!='') + { + if ($type=='') + { + $type='string'; + } + if ($xmlrpcTypes[$type]==1) + { + $this->addScalar($val,$type); + } + elseif ($xmlrpcTypes[$type]==2) + { + $this->addArray($val); + } + elseif ($xmlrpcTypes[$type]==3) + { + $this->addStruct($val); + } + } + } + + function addScalar($val, $type='string') + { + global $xmlrpcTypes, $xmlrpcBoolean; + + if ($this->mytype==1) + { + echo 'xmlrpcval: scalar can have only one value
    '; + return 0; + } + $typeof=$xmlrpcTypes[$type]; + if ($typeof!=1) + { + echo 'xmlrpcval: not a scalar type (${typeof})
    '; + return 0; + } + + if ($type==$xmlrpcBoolean) + { + if (strcasecmp($val,'true')==0 || $val==1 || ($val==true && strcasecmp($val,'false'))) + { + $val=1; + } + else + { + $val=0; + } + } + + if ($this->mytype==2) + { + // we're adding to an array here + $ar=$this->me['array']; + $ar[]=new xmlrpcval($val, $type); + $this->me['array']=$ar; + } + else + { + // a scalar, so set the value and remember we're scalar + $this->me[$type]=$val; + $this->mytype=$typeof; + } + return 1; + } + + function addArray($vals) + { + global $xmlrpcTypes; + if ($this->mytype!=0) + { + echo 'xmlrpcval: already initialized as a [' . $this->kindOf() . ']
    '; + return 0; + } + + $this->mytype=$xmlrpcTypes['array']; + $this->me['array']=$vals; + return 1; + } + + function addStruct($vals) + { + global $xmlrpcTypes; + if ($this->mytype!=0) + { + echo 'xmlrpcval: already initialized as a [' . $this->kindOf() . ']
    '; + return 0; + } + $this->mytype=$xmlrpcTypes['struct']; + $this->me['struct']=$vals; + return 1; + } + + function dump($ar) + { + reset($ar); + while ( list( $key, $val ) = each( $ar ) ) + { + echo "$key => $val
    "; + if ($key == 'array') + { + while ( list( $key2, $val2 ) = each( $val ) ) + { + echo "-- $key2 => $val2
    "; + } + } + } + } + + function kindOf() + { + switch($this->mytype) + { + case 3: + return 'struct'; + break; + case 2: + return 'array'; + break; + case 1: + return 'scalar'; + break; + default: + return 'undef'; + } + } + + function serializedata($typ, $val) + { + $rs=''; + global $xmlrpcTypes, $xmlrpcBase64, $xmlrpcString, + $xmlrpcBoolean; + switch($xmlrpcTypes[$typ]) + { + case 3: + // struct + $rs.="\n"; + reset($val); + while(list($key2, $val2)=each($val)) + { + $rs.="${key2}\n"; + $rs.=$this->serializeval($val2); + $rs.="\n"; + } + $rs.=''; + break; + case 2: + // array + $rs.="\n\n"; + for($i=0; $iserializeval($val[$i]); + } + $rs.="\n"; + break; + case 1: + switch ($typ) + { + case $xmlrpcBase64: + $rs.="<${typ}>" . base64_encode($val) . ""; + break; + case $xmlrpcBoolean: + $rs.="<${typ}>" . ($val ? "1" : "0") . ""; + break; + case $xmlrpcString: + $rs.="<${typ}>" . rawurlencode($val). ""; // micsik + //$rs.="<${typ}>" . htmlspecialchars($val). ""; + break; + default: + $rs.="<${typ}>${val}"; + } + break; + default: + break; + } + return $rs; + } + + function serialize() + { + return $this->serializeval($this); + } + + function serializeval($o) + { + global $xmlrpcTypes; + $rs=''; + $ar=$o->me; + reset($ar); + list($typ, $val) = each($ar); + $rs.=''; + $rs.=$this->serializedata($typ, $val); + $rs.="\n"; + return $rs; + } + + function structmem($m) + { + $nv=$this->me['struct'][$m]; + return $nv; + } + + function structreset() + { + reset($this->me['struct']); + } + + function structeach() + { + return each($this->me['struct']); + } + + function getval() + { + // UNSTABLE + global $xmlrpcBoolean, $xmlrpcBase64; + reset($this->me); + list($a,$b)=each($this->me); + // contributed by I Sofer, 2001-03-24 + // add support for nested arrays to scalarval + // i've created a new method here, so as to + // preserve back compatibility + + if (is_array($b)) + { + @reset($b); + while(list($id,$cont) = @each($b)) + { + $b[$id] = $cont->scalarval(); + } + } + + // add support for structures directly encoding php objects + if (is_object($b)) + { + $t = get_object_vars($b); + @reset($t); + while(list($id,$cont) = @each($t)) + { + $t[$id] = $cont->scalarval(); + } + @reset($t); + while(list($id,$cont) = @each($t)) + { + eval('$b->'.$id.' = $cont;'); + } + } + // end contrib + return $b; + } + + function scalarval() + { + global $xmlrpcBoolean, $xmlrpcBase64; + reset($this->me); + list($a,$b)=each($this->me); + return rawurldecode($b); // micsik + } + + function scalartyp() + { + global $xmlrpcI4, $xmlrpcInt; + reset($this->me); + list($a,$b)=each($this->me); + if ($a==$xmlrpcI4) + { + $a=$xmlrpcInt; + } + return $a; + } + + function arraymem($m) + { + $nv=$this->me['array'][$m]; + return $nv; + } + + function arraysize() + { + reset($this->me); + list($a,$b)=each($this->me); + return sizeof($b); + } + } + + // date helpers + function iso8601_encode($timet, $utc=0) + { + // return an ISO8601 encoded string + // really, timezones ought to be supported + // but the XML-RPC spec says: + // + // "Don't assume a timezone. It should be specified by the server in its + // documentation what assumptions it makes about timezones." + // + // these routines always assume localtime unless + // $utc is set to 1, in which case UTC is assumed + // and an adjustment for locale is made when encoding + if (!$utc) + { + $t=strftime("%Y%m%dT%H:%M:%S", $timet); + } + else + { + if (function_exists('gmstrftime')) + { + // gmstrftime doesn't exist in some versions + // of PHP + $t=gmstrftime("%Y%m%dT%H:%M:%S", $timet); + } + else + { + $t=strftime("%Y%m%dT%H:%M:%S", $timet-date('Z')); + } + } + return $t; + } + + function iso8601_decode($idate, $utc=0) + { + // return a timet in the localtime, or UTC + $t=0; + if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})", $idate, $regs)) + { + if ($utc) + { + $t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); + } + else + { + $t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); + } + } + return $t; + } + + /**************************************************************** + * xmlrpc_decode takes a message in PHP xmlrpc object format and * + * tranlates it into native PHP types. * + * * + * author: Dan Libby (dan@libby.com) * + ****************************************************************/ + function xmlrpc_decoder($xmlrpc_val) + { + $kind = $xmlrpc_val->kindOf(); + + if($kind == 'scalar') + { + return $xmlrpc_val->scalarval(); + } + elseif($kind == 'array') + { + $size = $xmlrpc_val->arraysize(); + $arr = array(); + + for($i = 0; $i < $size; $i++) + { + $arr[]=xmlrpc_decoder($xmlrpc_val->arraymem($i)); + } + return $arr; + } + elseif($kind == 'struct') + { + $xmlrpc_val->structreset(); + $arr = array(); + + while(list($key,$value)=$xmlrpc_val->structeach()) + { + $arr[$key] = xmlrpc_decoder($value); + } + return $arr; + } + } + + /**************************************************************** + * xmlrpc_encode takes native php types and encodes them into * + * xmlrpc PHP object format. * + * BUG: All sequential arrays are turned into structs. I don't * + * know of a good way to determine if an array is sequential * + * only. * + * * + * feature creep -- could support more types via optional type * + * argument. * + * * + * author: Dan Libby (dan@libby.com) * + ****************************************************************/ + function xmlrpc_encoder($php_val) + { + global $xmlrpcInt; + global $xmlrpcDouble; + global $xmlrpcString; + global $xmlrpcArray; + global $xmlrpcStruct; + global $xmlrpcBoolean; + + $type = gettype($php_val); + $xmlrpc_val = new xmlrpcval; + + switch($type) + { + case 'array': + case 'object': + $arr = array(); + while (list($k,$v) = each($php_val)) + { + $arr[$k] = xmlrpc_encoder($v); + } + $xmlrpc_val->addStruct($arr); + break; + case 'integer': + $xmlrpc_val->addScalar($php_val, $xmlrpcInt); + break; + case 'double': + $xmlrpc_val->addScalar($php_val, $xmlrpcDouble); + break; + case 'string': + $xmlrpc_val->addScalar($php_val, $xmlrpcString); + break; + // + // Add support for encoding/decoding of booleans, since they are supported in PHP + case 'boolean': + $xmlrpc_val->addScalar($php_val, $xmlrpcBoolean); + break; + // + case 'unknown type': + default: + // giancarlo pinerolo + // it has to return + // an empty object in case (which is already + // at this point), not a boolean. + break; + } + return $xmlrpc_val; + } +?> diff --git a/campcaster/src/modules/alib/var/xmlrpc/xmlrpcs.inc b/campcaster/src/modules/alib/var/xmlrpc/xmlrpcs.inc new file mode 100644 index 000000000..63567b37f --- /dev/null +++ b/campcaster/src/modules/alib/var/xmlrpc/xmlrpcs.inc @@ -0,0 +1,450 @@ + +// $Id$ + +// Copyright (c) 1999,2000,2002 Edd Dumbill. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// * Neither the name of the "XML-RPC for PHP" nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + + // XML RPC Server class + // requires: xmlrpc.inc + + // listMethods: either a string, or nothing + $_xmlrpcs_listMethods_sig=array(array($xmlrpcArray, $xmlrpcString), array($xmlrpcArray)); + $_xmlrpcs_listMethods_doc='This method lists all the methods that the XML-RPC server knows how to dispatch'; + function _xmlrpcs_listMethods($server, $m) + { + global $xmlrpcerr, $xmlrpcstr, $_xmlrpcs_dmap; + $v=new xmlrpcval(); + $dmap=$server->dmap; + $outAr=array(); + for(reset($dmap); list($key, $val)=each($dmap); ) + { + $outAr[]=new xmlrpcval($key, 'string'); + } + $dmap=$_xmlrpcs_dmap; + for(reset($dmap); list($key, $val)=each($dmap); ) + { + $outAr[]=new xmlrpcval($key, 'string'); + } + $v->addArray($outAr); + return new xmlrpcresp($v); + } + + $_xmlrpcs_methodSignature_sig=array(array($xmlrpcArray, $xmlrpcString)); + $_xmlrpcs_methodSignature_doc='Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature)'; + function _xmlrpcs_methodSignature($server, $m) + { + global $xmlrpcerr, $xmlrpcstr, $_xmlrpcs_dmap; + + $methName=$m->getParam(0); + $methName=$methName->scalarval(); + if (ereg("^system\.", $methName)) + { + $dmap=$_xmlrpcs_dmap; $sysCall=1; + } + else + { + $dmap=$server->dmap; $sysCall=0; + } + // print "\n"; + if (isset($dmap[$methName])) + { + if ($dmap[$methName]['signature']) + { + $sigs=array(); + $thesigs=$dmap[$methName]['signature']; + for($i=0; $igetParam(0); + $methName=$methName->scalarval(); + if (ereg("^system\.", $methName)) + { + $dmap=$_xmlrpcs_dmap; $sysCall=1; + } + else + { + $dmap=$server->dmap; $sysCall=0; + } + // print "\n"; + if (isset($dmap[$methName])) + { + if ($dmap[$methName]['docstring']) + { + $r=new xmlrpcresp(new xmlrpcval($dmap[$methName]["docstring"]), 'string'); + } + else + { + $r=new xmlrpcresp(new xmlrpcval('', 'string')); + } + } + else + { + $r=new xmlrpcresp(0, $xmlrpcerr['introspect_unknown'], $xmlrpcstr['introspect_unknown']); + } + return $r; + } + + $_xmlrpcs_multicall_sig = array(array($xmlrpcArray, $xmlrpcArray)); + $_xmlrpcs_multicall_doc = 'Boxcar multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details'; + + function _xmlrpcs_multicall_error($err) + { + if (is_string($err)) + { + global $xmlrpcerr, $xmlrpcstr; + $str = $xmlrpcstr["multicall_${err}"]; + $code = $xmlrpcerr["multicall_${err}"]; + } + else + { + $code = $err->faultCode(); + $str = $err->faultString(); + } + $struct['faultCode'] = new xmlrpcval($code, 'int'); + $struct['faultString'] = new xmlrpcval($str, 'string'); + return new xmlrpcval($struct, 'struct'); + } + + function _xmlrpcs_multicall_do_call($server, $call) + { + if ($call->kindOf() != 'struct') + return _xmlrpcs_multicall_error('notstruct'); + $methName = $call->structmem('methodName'); + if (!$methName) + return _xmlrpcs_multicall_error('nomethod'); + if ($methName->kindOf() != 'scalar' || $methName->scalartyp() != 'string') + return _xmlrpcs_multicall_error('notstring'); + if ($methName->scalarval() == 'system.multicall') + return _xmlrpcs_multicall_error('recursion'); + + $params = $call->structmem('params'); + if (!$params) + return _xmlrpcs_multicall_error('noparams'); + if ($params->kindOf() != 'array') + return _xmlrpcs_multicall_error('notarray'); + $numParams = $params->arraysize(); + + $msg = new xmlrpcmsg($methName->scalarval()); + for ($i = 0; $i < $numParams; $i++) + $msg->addParam($params->arraymem($i)); + + $result = $server->execute($msg); + + if ($result->faultCode() != 0) + return _xmlrpcs_multicall_error($result); // Method returned fault. + + return new xmlrpcval(array($result->value()), "array"); + } + + function _xmlrpcs_multicall($server, $m) + { + $calls = $m->getParam(0); + $numCalls = $calls->arraysize(); + $result = array(); + + for ($i = 0; $i < $numCalls; $i++) + { + $call = $calls->arraymem($i); + $result[$i] = _xmlrpcs_multicall_do_call($server, $call); + } + + return new xmlrpcresp(new xmlrpcval($result, 'array')); + } + + $_xmlrpcs_dmap=array( + 'system.listMethods' => array( + 'function' => '_xmlrpcs_listMethods', + 'signature' => $_xmlrpcs_listMethods_sig, + 'docstring' => $_xmlrpcs_listMethods_doc), + 'system.methodHelp' => array( + 'function' => '_xmlrpcs_methodHelp', + 'signature' => $_xmlrpcs_methodHelp_sig, + 'docstring' => $_xmlrpcs_methodHelp_doc), + 'system.methodSignature' => array( + 'function' => '_xmlrpcs_methodSignature', + 'signature' => $_xmlrpcs_methodSignature_sig, + 'docstring' => $_xmlrpcs_methodSignature_doc), + 'system.multicall' => array( + 'function' => '_xmlrpcs_multicall', + 'signature' => $_xmlrpcs_multicall_sig, + 'docstring' => $_xmlrpcs_multicall_doc + ) + ); + + $_xmlrpc_debuginfo=''; + function xmlrpc_debugmsg($m) + { + global $_xmlrpc_debuginfo; + $_xmlrpc_debuginfo=$_xmlrpc_debuginfo . $m . "\n"; + } + + class xmlrpc_server + { + var $dmap=array(); + + function xmlrpc_server($dispMap='', $serviceNow=1) + { + global $HTTP_RAW_POST_DATA; + // dispMap is a dispatch array of methods + // mapped to function names and signatures + // if a method + // doesn't appear in the map then an unknown + // method error is generated + /* milosch - changed to make passing dispMap optional. + * instead, you can use the class add_to_map() function + * to add functions manually (borrowed from SOAPX4) + */ + if($dispMap) + { + $this->dmap = $dispMap; + if($serviceNow) + { + $this->service(); + } + } + } + + function serializeDebug() + { + global $_xmlrpc_debuginfo; + if ($_xmlrpc_debuginfo!='') + { + return "\n"; + } + else + { + return ''; + } + } + + function service() + { + global $xmlrpc_defencoding; + + $r=$this->parseRequest(); + $payload='' . "\n" + . $this->serializeDebug() + . $r->serialize(); + Header("Content-type: text/xml\r\nContent-length: " . + strlen($payload)); + print $payload; + } + + /* + add a method to the dispatch map + */ + function add_to_map($methodname,$function,$sig,$doc) + { + $this->dmap[$methodname] = array( + 'function' => $function, + 'signature' => $sig, + 'docstring' => $doc + ); + } + + function verifySignature($in, $sig) + { + for($i=0; $igetNumParams()+1) + { + $itsOK=1; + for($n=0; $n<$in->getNumParams(); $n++) + { + $p=$in->getParam($n); + // print "\n"; + if ($p->kindOf() == 'scalar') + { + $pt=$p->scalartyp(); + } + else + { + $pt=$p->kindOf(); + } + // $n+1 as first type of sig is return type + if ($pt != $cursig[$n+1]) + { + $itsOK=0; + $pno=$n+1; $wanted=$cursig[$n+1]; $got=$pt; + break; + } + } + if ($itsOK) + { + return array(1); + } + } + } + return array(0, "Wanted ${wanted}, got ${got} at param ${pno})"); + } + + function parseRequest($data='') + { + global $_xh,$HTTP_RAW_POST_DATA; + global $xmlrpcerr, $xmlrpcstr, $xmlrpcerrxml, $xmlrpc_defencoding, + $_xmlrpcs_dmap; + + if ($data=="") + { + $data=$HTTP_RAW_POST_DATA; + } + $parser = xml_parser_create($xmlrpc_defencoding); + + $_xh[$parser]=array(); + $_xh[$parser]['st']=''; + $_xh[$parser]['cm']=0; + $_xh[$parser]['isf']=0; + $_xh[$parser]['params']=array(); + $_xh[$parser]['method']=''; + + // decompose incoming XML into request structure + + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee'); + xml_set_character_data_handler($parser, 'xmlrpc_cd'); + xml_set_default_handler($parser, 'xmlrpc_dh'); + if (!xml_parse($parser, $data, 1)) + { + // return XML error as a faultCode + $r=new xmlrpcresp(0, + $xmlrpcerrxml+xml_get_error_code($parser), + sprintf("XML error: %s at line %d", + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser))); + xml_parser_free($parser); + } + else + { + xml_parser_free($parser); + $m=new xmlrpcmsg($_xh[$parser]['method']); + // now add parameters in + $plist=""; + for($i=0; $i\n"; + $plist.="$i - " . $_xh[$parser]['params'][$i]. " \n"; + eval('$m->addParam(' . $_xh[$parser]['params'][$i]. ");"); + } + // uncomment this to really see what the server's getting! + // xmlrpc_debugmsg($plist); + + $r = $this->execute($m); + } + return $r; + } + + function execute ($m) + { + global $xmlrpcerr, $xmlrpcstr, $_xmlrpcs_dmap; + // now to deal with the method + $methName = $m->method(); + $sysCall = ereg("^system\.", $methName); + $dmap = $sysCall ? $_xmlrpcs_dmap : $this->dmap; + + if (!isset($dmap[$methName]['function'])) + { + // No such method + return new xmlrpcresp(0, + $xmlrpcerr['unknown_method'], + $xmlrpcstr['unknown_method']); + } + + // Check signature. + if (isset($dmap[$methName]['signature'])) + { + $sig = $dmap[$methName]['signature']; + list ($ok, $errstr) = $this->verifySignature($m, $sig); + if (!$ok) + { + // Didn't match. + return new xmlrpcresp(0, + $xmlrpcerr['incorrect_params'], + $xmlrpcstr['incorrect_params'] . ": ${errstr}"); + } + } + + $func = $dmap[$methName]['function']; + + if ($sysCall) + { + return call_user_func($func, $this, $m); + } + else + { + return call_user_func($func, $m); + } + } + + function echoInput() + { + global $HTTP_RAW_POST_DATA; + + // a debugging routine: just echos back the input + // packet as a string value + + $r=new xmlrpcresp; + $r->xv=new xmlrpcval( "'Aha said I: '" . $HTTP_RAW_POST_DATA, 'string'); + print $r->serialize(); + } + } +?> diff --git a/campcaster/src/modules/alib/var/xmlrpc/xr_cli_test.php b/campcaster/src/modules/alib/var/xmlrpc/xr_cli_test.php new file mode 100644 index 000000000..f48f4956a --- /dev/null +++ b/campcaster/src/modules/alib/var/xmlrpc/xr_cli_test.php @@ -0,0 +1,94 @@ +setDebug(1); + $r=$c->send($f); + if (!($r->faultCode()>0)) { + $v=$r->value(); + $log = $v->serialize(); + if($ak=='test') + { + $log = split('_',$log); + $log="{$log[0]}\nusername: {$log[1]}\ntoken: {$log[2]}"; + } + if($ak=='login') $sessid = $v->scalarval(); + if($ak=='logout') $sessid = ''; + } else { + $log = "Fault:\n Code: ".$r->faultCode()."\n". + "Reason:'".$r->faultString()."'
    \n"; + } + break; +} + +?> + +Alib XMLRPC test client + +

    Alib XMLRPC test client

    +XMLRPC server:
    + +Output:':'')?> +
    + +
    +

    test

    +flip teststring to uppercase and print username and session token
    +
    +test string:
    +token:
    + + +
    +
    +

    login

    +
    +username:
    +password:
    + + +
    +
    +

    logout

    +
    +token:
    + + +
    +
    +Back + diff --git a/campcaster/src/modules/alib/var/xmlrpc/xr_cli_test.py b/campcaster/src/modules/alib/var/xmlrpc/xr_cli_test.py new file mode 100755 index 000000000..84c25e39d --- /dev/null +++ b/campcaster/src/modules/alib/var/xmlrpc/xr_cli_test.py @@ -0,0 +1,82 @@ +#!/usr/bin/python + +#------------------------------------------------------------------------------ +# +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +#------------------------------------------------------------------------------ + +from xmlrpclib import * +import sys + +if len(sys.argv)<3: + print """ + Usage: xr_cli_pok.py http:////xmlrpc/alib_xr.php + commands and args: + test [] + login + logout +""" + sys.exit(1) +elif sys.argv[2]=="test": + if len(sys.argv)>3: + tstr=sys.argv[3] + if len(sys.argv)>4: + sessid=sys.argv[4] + else: + sessid='' + path=sys.argv[1] + server = Server(path) + try: + r = server.alib.xrTest(tstr, sessid) + print r + except Error, v: + print "XML-RPC Error:",v +elif sys.argv[2]=="login": + login=sys.argv[3] + passwd=sys.argv[4] + path=sys.argv[1] + server = Server(path) + try: + r = server.alib.login(login, passwd) + print r + except Error, v: + print "XML-RPC Error:",v +elif sys.argv[2]=="logout": + sessid=sys.argv[3] + path=sys.argv[1] + server = Server(path) + try: + r = server.alib.logout(sessid) + print r + except Error, v: + print "XML-RPC Error:",v +else: + print "Unknown command: "+sys.argv[2] + sys.exit(1) + + + diff --git a/campcaster/src/modules/archiveServer/.htaccess b/campcaster/src/modules/archiveServer/.htaccess new file mode 100644 index 000000000..ba3404cb8 --- /dev/null +++ b/campcaster/src/modules/archiveServer/.htaccess @@ -0,0 +1,12 @@ +DirectoryIndex index.php +Options +FollowSymLinks -Indexes + + + + AddType application/x-httpd-php .php + + php_flag magic_quotes_gpc On + php_flag register_globals Off + + + diff --git a/campcaster/src/modules/archiveServer/bin/autogen.sh b/campcaster/src/modules/archiveServer/bin/autogen.sh new file mode 100755 index 000000000..7af4b7850 --- /dev/null +++ b/campcaster/src/modules/archiveServer/bin/autogen.sh @@ -0,0 +1,94 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="ArchiveServer" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +#ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +#echo " aclocal $ACLOCAL_FLAGS" +#cp -f ${configure_ac} ${tmpdir} +#cp -f ${etcdir}/acinclude.m4 ${tmpdir} +#aclocal $ACLOCAL_FLAGS + +#echo " autoheader ${configure_ac}" +#autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/archiveServer/bin/getUrl.sh b/campcaster/src/modules/archiveServer/bin/getUrl.sh new file mode 100755 index 000000000..c193a9ff8 --- /dev/null +++ b/campcaster/src/modules/archiveServer/bin/getUrl.sh @@ -0,0 +1,44 @@ +#!/bin/bash +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# This script grabs string at suplied URL +#------------------------------------------------------------------------------- + +URL=$1 +RES=`curl -sf ${URL}` || \ + { + ERN=$?; + if [ $ERN == 22 ] ; then + echo "ERROR: curl: 22 - wrong URL ($URL)"; + else + echo "ERROR: $ERN - unknown"; + fi; + exit 1; + } +echo $RES diff --git a/campcaster/src/modules/archiveServer/bin/setupDirs.sh b/campcaster/src/modules/archiveServer/bin/setupDirs.sh new file mode 100755 index 000000000..71d63fcf2 --- /dev/null +++ b/campcaster/src/modules/archiveServer/bin/setupDirs.sh @@ -0,0 +1,59 @@ +#!/bin/bash +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# This script does httpd writeable directories setup +#------------------------------------------------------------------------------- + +WWW_ROOT=`cd var/install; php -q getWwwRoot.php` || exit $? +echo "# archiveServer root URL: $WWW_ROOT" + +HTTP_GROUP=`bin/getUrl.sh $WWW_ROOT/install/getGname.php` || \ + { + ERN=$?; + echo $HTTP_GROUP; + echo " -> Probably wrong setting in var/conf.php: URL configuration"; + exit $ERN; + } +echo "# group running http daemon: $HTTP_GROUP" + +for i in $* +do + echo "mkdir $i" + mkdir -p $i || exit $? + chown :$HTTP_GROUP $i || \ + { + ERN=$?; + echo " -> You should have permissions to set group owner to group $HTTP_GROUP"; + exit $ERN; + } + chmod g+sw $i || exit $? +done + +echo "# Directories setup finished OK" +exit 0 diff --git a/campcaster/src/modules/archiveServer/configure b/campcaster/src/modules/archiveServer/configure new file mode 100755 index 000000000..03e54b0b4 --- /dev/null +++ b/campcaster/src/modules/archiveServer/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen $*) +fi + +(cd $tmpdir && $configure $*) + diff --git a/campcaster/src/modules/archiveServer/etc/Makefile.in b/campcaster/src/modules/archiveServer/etc/Makefile.in new file mode 100644 index 000000000..ba6b59ba9 --- /dev/null +++ b/campcaster/src/modules/archiveServer/etc/Makefile.in @@ -0,0 +1,201 @@ +#------------------------------------------------------------------------------- +# ArchiveServer - central archive component +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f +SED = sed +ECHO = echo +CAT = cat + + +#------------------------------------------------------------------------------- +# Misc +#------------------------------------------------------------------------------- + +MODULE_NAME = archiveServer +TAR_C = tar -cj --exclude .svn --exclude '*~' -C ${BASE_DIR} -f +DIST_EXT = .tgz +DATE = `date +%y%m%d` + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +#BASE_DIR = @builddir@ +BASE_DIR = . +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp +VAR_DIR = ${BASE_DIR}/var + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_LIB_DIR = ${USR_DIR}/lib +USR_VAR_DIR = ${USR_DIR}/var + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +PHP_DIR = ${VAR_DIR} +INSTALL_DIR = ${PHP_DIR}/install +STOR_DIR = ${PHP_DIR}/stor +ACCESS_DIR = ${PHP_DIR}/access +TRANS_DIR = ${PHP_DIR}/trans +BUFF_DIR = ${STOR_DIR}/buffer +TEST_RUNNER = ${PHP_DIR}/xmlrpc/testRunner.sh + +DEST_DIR = ${USR_VAR_DIR}/Campcaster/archiveServer/var + +HOSTNAME = @HOSTNAME@ +WWW_PORT = @WWW_PORT@ +DB_SERVER = @DB_SERVER@ +DATABASE = @DATABASE@ +DB_USER = @DB_USER@ +DB_PASSWORD = @DB_PASSWORD@ + +PHP_URL_PREFIX=campcaster + +USR_LIB_DIR_S=$(shell ${ECHO} ${USR_LIB_DIR} | ${SED} -e "s/\//\\\\\\\\\//g") +PHP_URL_PREFIX_S=$(shell ${ECHO} ${PHP_URL_PREFIX} | ${SED} -e "s/\//\\\\\\\\\//g") + +REPLACE_SED_STRING="s/ls_lib_dir/${USR_LIB_DIR_S}/; \ + s/ls_dbuser/${DB_USER}/; \ + s/ls_dbpassword/${DB_PASSWORD}/; \ + s/ls_dbserver/${DB_SERVER}/; \ + s/ls_database/${DATABASE}/; \ + s/ls_storageUrlPath/\/${PHP_URL_PREFIX_S}\/archiveServer\/var/; \ + s/ls_php_host/${HOSTNAME}/; \ + s/ls_php_port/${WWW_PORT}/; \ + s/ls_archiveUrlPath/\/${PHP_URL_PREFIX_S}\/archiveServer\/var/;" +# explanation: on archive side, archive have the storage role => +# ls_storageUrlPath shouldn't be replaced by string ending with +# 'storageServer/var' + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +#CPPFLAGS = @CPPFLAGS@ +#CXXFLAGS = @CXXFLAGS@ @DEFS@ -I${USR_INCLUDE_DIR} -I${INCLUDE_DIR} -I${TMP_DIR}\ +# -pedantic -Wall +#LDFLAGS = @LDFLAGS@ -L${USR_LIB_DIR} -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +#HELLO_LIB_OBJS = ${TMP_DIR}/Hello.o +#TEST_RUNNER_OBJS = ${TMP_DIR}/HelloTest.o ${TMP_DIR}/TestRunner.o + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean dist install +.PHONY: db_init db_clean testonly + +all: + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: db_clean + ${RMDIR} ${STOR_DIR} + ${RMDIR} ${ACCESS_DIR} + ${RMDIR} ${TRANS_DIR} + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + +depclean: clean + +dist: + ${TAR_C} ${MODULE_NAME}${DATE}${DIST_EXT} * + +distclean: clean docclean + +testonly: ${TEST_RUNNER} + ${TEST_RUNNER} + +check: all +#testonly + +recheck: clean check + +install: + ${MKDIR} ${DEST_DIR} + ${MKDIR} ${DEST_DIR}/access + ${MKDIR} ${DEST_DIR}/install + ${MKDIR} ${DEST_DIR}/stor + ${MKDIR} ${DEST_DIR}/stor/buffer + ${MKDIR} ${DEST_DIR}/trans + ${MKDIR} ${DEST_DIR}/xmlrpc + ${CP} ${VAR_DIR}/*.{php,template} ${DEST_DIR} + ${CP} ${VAR_DIR}/install/*.php ${DEST_DIR}/install + ${CP} ${VAR_DIR}/xmlrpc/*.php ${DEST_DIR}/xmlrpc + ${CAT} ${VAR_DIR}/conf.php.template | ${SED} -e ${REPLACE_SED_STRING} \ + > ${DEST_DIR}/conf.php + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +storage: dir_setup db_init + +dir_setup: ${DOXYGEN_DIR} + bin/setupDirs.sh ${STOR_DIR} ${ACCESS_DIR} ${TRANS_DIR} ${BUFF_DIR} + +db_init: + -cd var/install && php -q install.php + +db_clean: + -cd var/install && php -q uninstall.php + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${TEST_RUNNER}: + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +#${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx +# ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/src/modules/archiveServer/etc/configure.ac b/campcaster/src/modules/archiveServer/etc/configure.ac new file mode 100644 index 000000000..3e832e81c --- /dev/null +++ b/campcaster/src/modules/archiveServer/etc/configure.ac @@ -0,0 +1,138 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(ArchiveServer, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../var/Archive.php) + + +dnl----------------------------------------------------------------------------- +dnl specify the FQDN +dnl----------------------------------------------------------------------------- +AC_SUBST(HOSTNAME) + +AC_ARG_WITH([hostname], + AC_HELP_STRING([--with-hostname], + [use the specified hostname (guess)]), + [HOSTNAME=${withval}], [HOSTNAME=`hostname -f`]) + +AC_MSG_RESULT([using hostname: ${HOSTNAME}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the web server port +dnl----------------------------------------------------------------------------- +AC_SUBST(WWW_PORT) + +AC_ARG_WITH([www-port], + AC_HELP_STRING([--with-www-port], + [use the specified www port (80)]), + [WWW_PORT=${withval}], [WWW_PORT=80]) + +AC_MSG_RESULT([using www port: ${WWW_PORT}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the database server name +dnl----------------------------------------------------------------------------- +AC_SUBST(DB_SERVER) + +AC_ARG_WITH([database-server], + AC_HELP_STRING([--with-database-server], + [use the specified database server (localhost)]), + [DB_SERVER=${withval}], [DB_SERVER=localhost]) + +AC_MSG_RESULT([using database server: ${DB_SERVER}]) + + +dnl----------------------------------------------------------------------------- +dnl get the name of the Campcaster database +dnl----------------------------------------------------------------------------- +AC_SUBST(DATABASE) + +AC_ARG_WITH([database], + AC_HELP_STRING([--with-database], + [the name of the postgresql database to use (Campcaster)]), + [DATABASE=${withval}], [DATABASE=Campcaster]) + +AC_MSG_RESULT([using database: ${DATABASE}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the database server user +dnl----------------------------------------------------------------------------- +AC_SUBST(DB_USER) + +AC_ARG_WITH([database-user], + AC_HELP_STRING([--with-database-user], + [use the specified database server user (campcaster)]), + [DB_USER=${withval}], [DB_USER=campcaster]) + +AC_MSG_RESULT([using database server user: ${DB_USER}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the database server user password +dnl----------------------------------------------------------------------------- +AC_SUBST(DB_PASSWORD) + +AC_ARG_WITH([database-password], + AC_HELP_STRING([--with-database-password], + [use the specified database server user password (campcaster)]), + [DB_PASSWORD=${withval}], [DB_PASSWORD=campcaster]) + +AC_MSG_RESULT([using database server user password: ${DB_PASSWORD}]) + + +dnl display status info on what libraries will get compiled + +AC_MSG_NOTICE( +[using the following configuration settings: + + hostname: ${HOSTNAME} + www port: ${WWW_PORT} + database server: ${DB_SERVER} + database name: ${DATABASE} + database user: ${DB_USER} + database user password: ${DB_PASSWORD} + +]) + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/archiveServer/etc/doxygen.config b/campcaster/src/modules/archiveServer/etc/doxygen.config new file mode 100644 index 000000000..73bd3cdbd --- /dev/null +++ b/campcaster/src/modules/archiveServer/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# doxygen.config +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = LiveSupport - archiveServer module + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +#EXTRACT_ALL = NO +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = var var/xmlrpc + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = *.php + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/archiveServer/tmp/.keepme b/campcaster/src/modules/archiveServer/tmp/.keepme new file mode 100644 index 000000000..e69de29bb diff --git a/campcaster/src/modules/archiveServer/var/.htaccess b/campcaster/src/modules/archiveServer/var/.htaccess new file mode 100644 index 000000000..ba3404cb8 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/.htaccess @@ -0,0 +1,12 @@ +DirectoryIndex index.php +Options +FollowSymLinks -Indexes + + + + AddType application/x-httpd-php .php + + php_flag magic_quotes_gpc On + php_flag register_globals Off + + + diff --git a/campcaster/src/modules/archiveServer/var/Archive.php b/campcaster/src/modules/archiveServer/var/Archive.php new file mode 100644 index 000000000..b7b03628e --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/Archive.php @@ -0,0 +1,410 @@ +getSessUserId($sessid); + if ($this->dbc->isError($r)) { + return $r; + } + $res = $r = $this->bsOpenPut($chsum, NULL, $owner); + if ($this->dbc->isError($r)) { + return $r; + } + return array('url'=>$res['url'], 'token'=>$res['token']); + } + + + /** + * Check uploaded file + * + * @param string $token + * transport token + * @return array + * (md5h string, size int, url string) + */ + function uploadCheck($token) + { + return $this->bsCheckPut($token); + } + + + /** + * Close upload transport + * + * @param string $token + * transport token + * @param string $trtype + * transport type + * @param array $pars + * transport parameters + * @return mixed + */ + function uploadClose($token, $trtype, $pars=array()) + { + $res = $r = $this->bsClosePut($token); + if ($this->dbc->isError($r)) { + return $r; + } + extract($res); // fname, owner + switch ($trtype) { + case "audioclip": + $mdtoken = $pars['mdpdtoken']; + $res = $r = $this->bsClosePut($mdtoken); + if ($this->dbc->isError($r)) { + return $r; + } + $mdfname = $res['fname']; + if ($gunid == '') { + $gunid=NULL; + } + $parid = $r = $this->_getHomeDirId($owner); + if ($this->dbc->isError($r)) { + return $r; + } + $res = $r = $this->bsPutFile($parid, $pars['name'], + $fname, $mdfname, + $pars['gunid'], 'audioclip', 'file'); + if ($this->dbc->isError($r)) { + return $r; + } + @unlink($fname); + @unlink($mdfname); + break; + case "playlist": + if ($gunid == '') { + $gunid = NULL; + } + $parid = $r = $this->_getHomeDirId($owner); + if ($this->dbc->isError($r)) { + return $r; + } + $res = $r = $this->bsPutFile($parid, $pars['name'], + '', $fname, + $pars['gunid'], 'playlist', 'file'); + if ($this->dbc->isError($r)) { + return $r; + } + @unlink($fname); + break; + case "playlistPkg": + $chsum = md5_file($fname); + // importPlaylistOpen: + $res = $r = $this->bsOpenPut($chsum, NULL, $owner); + if ($this->dbc->isError($r)) { + return $r; + } + $dest = $res['fname']; + $token = $res['token']; + copy($fname, $dest); + $r = $this->importPlaylistClose($token); + if ($this->dbc->isError($r)) { + return $r; + } + @unlink($fname); + return $r; + break; + case "searchjob": + $crits = file_get_contents($fname); + $criteria = unserialize($crits); + @unlink($fname); + $results = $r =$this->localSearch($criteria); + if ($this->dbc->isError($r)) { + return $r; + } + $realfile = tempnam($this->accessDir, 'searchjob_'); + @chmod($realfile, 0660); + $len = $r = file_put_contents($realfile, serialize($results)); + $acc = $r = $this->bsAccess($realfile, '', NULL, 'download'); + if ($this->dbc->isError($r)) { + return $r; + } + $url = $this->getUrlPart()."access/".basename($acc['fname']); + $chsum = md5_file($realfile); + $size = filesize($realfile); + $res = array( + 'url'=>$url, 'token'=>$acc['token'], + 'chsum'=>$chsum, 'size'=>$size, + 'filename'=>$filename + ); + return $res; + break; + case "metadata": + break; + default: + } + return $res; + } + + + /** + * Open download transport + * + * @param string $sessid - session id + * @param string $trtype - transport type + * @param array $pars - transport parameters + * @return hasharray with: + * url string: writable URL + * token string: PUT token + */ + function downloadOpen($sessid, $trtype, $pars=array()) + { + switch ($trtype) { + case "unknown": + case "audioclip": + case "metadata": + case "playlist": + case "playlistPkg": + if (!isset($pars['gunid'])) { + return PEAR::raiseError("Archive::downloadOpen: gunid not set"); + } + break; + } + $gunid = $pars['gunid']; + // resolve trtype by object type: + if ( ($trtype == 'unknown') || ($trtype == 'playlistPkg') ) { + $trtype2 = $r = $this->_getType($gunid); + if ($this->dbc->isError($r)) { + return $r; + } + // required with content: + $trtype = ($trtype2 == 'playlist' && $trtype == 'playlistPkg'? + 'playlistPkg' : $trtype2); +# return PEAR::raiseError("Archive::downloadOpen: TT=$trtype TT2=$trtype2 G=$gunid"); + } + switch ($trtype) { + case "audioclip": + $res = $r = $this->downloadRawAudioDataOpen($sessid, $gunid); + break; + case "metadata": + $res = $r = $this->downloadMetadataOpen($sessid, $gunid); + break; + case "playlist": + $res = $r = $this->accessPlaylist($sessid, $gunid); + break; + case "playlistPkg": + $res = $r = $this->bsExportPlaylistOpen($gunid); + if ($this->dbc->isError($r)) { + return $r; + } + $tmpn = tempnam($this->transDir, 'plExport_'); + $plfpath = "$tmpn.lspl"; + copy($res['fname'], $plfpath); + $res = $r = $this->bsExportPlaylistClose($res['token']); + if (PEAR::isError($r)) { + return $r; + } + $fname = "transported_playlist.lspl"; + $id = $this->_idFromGunid($gunid); + $acc = $this->bsAccess($plfpath, 'lspl', NULL, 'download'); + if ($this->dbc->isError($acc)) { + return $acc; + } + $url = $this->getUrlPart()."access/".basename($acc['fname']); + $chsum = md5_file($plfpath); + $size = filesize($plfpath); + $res = array( + 'url'=>$url, 'token'=>$acc['token'], + 'chsum'=>$chsum, 'size'=>$size, + 'filename'=>$fname + ); + break; + case "searchjob": + $res = $pars; + break; + case "file": + $res = $r = array(); + break; + default: + return PEAR::raiseError("Archive::downloadOpen: NotImpl ($trtype)"); + } + if ($this->dbc->isError($r)) { + return $r; + } + switch ($trtype) { + case "audioclip": + case "metadata": + case "playlist": + case "playlistPkg": + $title = $r = $this->bsGetTitle(NULL, $gunid); + break; + case "searchjob": $title = 'searchjob'; break; + case "file": $title = 'regular file'; break; + default: + } + $res['title'] = $title; + $res['trtype'] = $trtype; + return $res; + } + + + /** + * Close download transport + * + * @param string $token + * transport token + * @param string $trtype + * transport type + * @return array + * hasharray with: + * url string: writable URL + * token string: PUT token + */ + function downloadClose($token, $trtype) + { + switch ($trtype) { + case "audioclip": + $res = $r = $this->downloadRawAudioDataClose($token); + if ($this->dbc->isError($r)) { + return $r; + } + return $res; + break; + case "metadata": + $res = $r = $this->downloadMetadataClose($token); + if ($this->dbc->isError($r)) { + return $r; + } + return $res; + break; + case "playlist": + $res = $r = $this->releasePlaylist(NULL/*$sessid*/, $token); + if ($this->dbc->isError($r)) { + return $r; + } + return $res; + break; + case "playlistPkg": + $res = $r = $this->bsRelease($token, 'download'); + if ($this->dbc->isError($r)) { + return $r; + } + $realFname = $r['realFname']; + @unlink($realFname); + if (preg_match("|(plExport_[^\.]+)\.lspl$|", $realFname, $va)) { + list(,$tmpn) = $va; + $tmpn = "{$this->transDir}/$tmpn"; + if (file_exists($tmpn)) { + @unlink($tmpn); + } + } + return $res; + break; + case "searchjob": + $res = $r = $this->bsRelease($token, 'download'); + if ($this->dbc->isError($r)) { + return $r; + } + return $res; + break; + case "file": + return array(); + break; + default: + return PEAR::raiseError("Archive::downloadClose: NotImpl ($trtype)"); + } + } + + + /** + * Prepare hub initiated transport + * + * @param string $target + * hostname of transport target + * @param string $trtype + * transport type + * @param string $direction + * 'up' | 'down' + * @param array $pars + * transport parameters + * @return mixed + */ + function prepareHubInitiatedTransfer( + $target, $trtype='file', $direction='up',$pars=array()) + { + $tr =& new Transport($this); + $trec = $r = TransportRecord::create($tr, $trtype, $direction, + array_merge($pars, array('target'=>$target)) + ); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } + + + /** + * List hub initiated transports + * + * @param string $target + * hostname of transport target + * @param string $direction + * 'up' | 'down' + * @param string $trtok + * transport token + * @return mixed + */ + function listHubInitiatedTransfers( + $target=NULL, $direction=NULL, $trtok=NULL) + { + $tr =& new Transport($this); + $res = $r = $tr->getTransports($direction, $target, $trtok); + if (PEAR::isError($r)) { + return $r; + } + return $res; + } + + + /** + * Set state of hub initiated transport + * + * @param string $target + * hostname of transport target + * @param string $trtok + * transport token + * @param string $state + * transport state + * @return + */ + function setHubInitiatedTransfer($target, $trtok, $state) + { + $tr =& new Transport($this); + $trec = $r = TransportRecord::recall($tr, $trtok); + if (PEAR::isError($r)) { + return $r; + } + $r = $trec->setState($state); + if (PEAR::isError($r)) { + return $r; + } + return $res; + } + + /* ==================================================== auxiliary methods */ + +} // class Archive +?> \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/conf.php b/campcaster/src/modules/archiveServer/var/conf.php new file mode 100644 index 000000000..37989b04b --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/conf.php @@ -0,0 +1,132 @@ + + *
    dsn
    datasource setting + *
    tblNamePrefix
    prefix for table names in the database + *
    authCookieName
    secret token cookie name + *
    storageDir
    main directory for storing binary media files + *
    bufferDir
    directory for temporary files + *
    transDir
    directory for incomplete transferred files + *
    accessDir
    directory for symlinks to accessed files + *
    isArchive
    local/central flag + *
    validate
    enable/disable validator + *
    useTrash
    enable/disable safe delete (move to trash) + * (FALSE on archiveServer) + *
    storageUrlPath
    path-URL-part of storageServer base dir + * (on central archive side: storage=archive) + *
    storageXMLRPC
    XMLRPC server script address relative to storageUrlPath + *
    storageUrlHost, storageUrlPort
    host and port of storageServer + *
    archiveUrlPath
    path-URL-part of archiveServer base dir + *
    archiveXMLRPC
    XMLRPC server script address relative to archiveUrlPath + *
    archiveUrlHost, archiveUrlPort
    host and port of archiveServer + * + */ + +// these are the default values for the config + +$config = array( + /* ================================================== basic configuration */ + 'dsn' => array( + 'username' => 'test', + 'password' => 'test', + 'hostspec' => 'localhost', + 'phptype' => 'pgsql', + 'database' => 'Campcaster-test', + ), + 'tblNamePrefix' => 'as_', + + /* ================================================ storage configuration */ + 'authCookieName'=> 'assid', + 'AdminsGr' => 'Admins', + 'StationPrefsGr'=> '', + 'AllGr' => 'All', + 'storageDir' => dirname(__FILE__).'/../../archiveServer/var/stor', + 'bufferDir' => dirname(__FILE__).'/../../archiveServer/var/stor/buffer', + 'transDir' => dirname(__FILE__).'/../../archiveServer/var/trans', + 'accessDir' => dirname(__FILE__).'/../../archiveServer/var/access', + 'pearPath' => dirname(__FILE__).'/../../../../usr/lib/pear', + 'isArchive' => TRUE, + 'validate' => TRUE, + 'useTrash' => FALSE, + + /* ==================================================== URL configuration */ + // on central archive side: archive is the storage ! + 'storageUrlPath' => '/campcasterArchiveServer', + 'storageXMLRPC' => 'xmlrpc/xrArchive.php', + 'storageUrlHost' => 'localhost', + 'storageUrlPort' => 80, + // have to be another remote archive: + #'archiveUrlPath' => '/campcasterArchiveServer', + #'archiveXMLRPC' => 'xmlrpc/xrArchive.php', + #'archiveUrlHost' => 'localhost', + #'archiveUrlPort' => 80, + + /* ==================================== aplication-specific configuration */ + 'objtypes' => array( + 'RootNode' => array('Folder'), + 'Storage' => array('Folder', 'File', 'Replica'), + 'Folder' => array('Folder', 'File', 'Replica'), + 'File' => array(), + 'audioclip' => array(), + 'playlist' => array(), + 'Replica' => array(), + ), + 'allowedActions'=> array( + 'RootNode' => array('classes', 'subjects'), + 'Folder' => array('editPrivs', 'write', 'read'), + 'File' => array('editPrivs', 'write', 'read'), + 'audioclip' => array('editPrivs', 'write', 'read'), + 'playlist' => array('editPrivs', 'write', 'read'), + 'Replica' => array('editPrivs', 'write', 'read'), + '_class' => array('editPrivs', 'write', 'read'), + ), + 'allActions' => array( + 'editPrivs', 'write', 'read', 'classes', 'subjects' + ), + + /* ============================================== auxiliary configuration */ + 'RootNode' => 'RootNode', + 'tmpRootPass' => 'q', +); +$config['sysSubjs'] = array( + 'root', $config['AdminsGr'], $config['AllGr'], $config['StationPrefsGr'] +); +$old_ip = get_include_path(); +set_include_path('.'.PATH_SEPARATOR.$config['pearPath'].PATH_SEPARATOR.$old_ip); + +// see if a ~/.campcaster/archiveServer.conf.php exists, and +// overwrite the settings from there if any + +$this_file = null; +if(isset($_SERVER["SCRIPT_FILENAME"])){ + $this_file = $_SERVER["SCRIPT_FILENAME"]; +}elseif(isset($argv[0])){ + $this_file = $argv[0]; +} +if(!is_null($this_file)){ + $fileowner_id = fileowner($this_file); + $fileowner_array = posix_getpwuid($fileowner_id); + $fileowner_homedir = $fileowner_array['dir']; + $home_conf = $fileowner_homedir . '/.campcaster/archiveServer.conf.php'; + if (file_exists($home_conf)) { + $default_config = $config; + include $home_conf; + $user_config = $config; + $config = $user_config + $default_config; + } +} + +?> diff --git a/campcaster/src/modules/archiveServer/var/conf.php.template b/campcaster/src/modules/archiveServer/var/conf.php.template new file mode 100644 index 000000000..261c412be --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/conf.php.template @@ -0,0 +1,109 @@ + + *
    dsn
    datasource setting + *
    tblNamePrefix
    prefix for table names in the database + *
    authCookieName
    secret token cookie name + *
    storageDir
    main directory for storing binary media files + *
    bufferDir
    directory for temporary files + *
    transDir
    directory for incomplete transferred files + *
    accessDir
    directory for symlinks to accessed files + *
    isArchive
    local/central flag + *
    validate
    enable/disable validator + *
    useTrash
    enable/disable safe delete (move to trash) + * (FALSE on archiveServer) + *
    storageUrlPath
    path-URL-part of storageServer base dir + * (on central archive side: storage=archive) + *
    storageXMLRPC
    XMLRPC server script address relative to storageUrlPath + *
    storageUrlHost, storageUrlPort
    host and port of storageServer + *
    archiveUrlPath
    path-URL-part of archiveServer base dir + *
    archiveXMLRPC
    XMLRPC server script address relative to archiveUrlPath + *
    archiveUrlHost, archiveUrlPort
    host and port of archiveServer + * + */ + +// these are the default values for the config + +$config = array( + /* ================================================== basic configuration */ + 'dsn' => array( + 'username' => 'ls_dbuser', + 'password' => 'ls_dbpassword', + 'hostspec' => 'ls_dbserver', + 'phptype' => 'pgsql', + 'database' => 'ls_database', + ), + 'tblNamePrefix' => 'as_', + + /* ================================================ storage configuration */ + 'authCookieName'=> 'assid', + 'AdminsGr' => 'Admins', + 'StationPrefsGr'=> '', + 'AllGr' => 'All', + 'storageDir' => dirname(__FILE__).'/../../archiveServer/var/stor', + 'bufferDir' => dirname(__FILE__).'/../../archiveServer/var/stor/buffer', + 'transDir' => dirname(__FILE__).'/../../archiveServer/var/trans', + 'accessDir' => dirname(__FILE__).'/../../archiveServer/var/access', + 'pearPath' => 'ls_lib_dir/pear', + 'isArchive' => TRUE, + 'validate' => TRUE, + 'useTrash' => FALSE, + + /* ==================================================== URL configuration */ + // on central archive side: archive is the storage ! + 'storageUrlPath' => 'ls_storageUrlPath', + 'storageXMLRPC' => 'xmlrpc/xrArchive.php', + 'storageUrlHost' => 'ls_php_host', + 'storageUrlPort' => ls_php_port, + // have to be another remote archive: + #'archiveUrlPath' => 'ls_archiveUrlPath', + #'archiveXMLRPC' => 'xmlrpc/xrArchive.php', + #'archiveUrlHost' => 'ls_php_host', + #'archiveUrlPort' => ls_php_port, + + /* ==================================== aplication-specific configuration */ + 'objtypes' => array( + 'RootNode' => array('Folder'), + 'Storage' => array('Folder', 'File', 'Replica'), + 'Folder' => array('Folder', 'File', 'Replica'), + 'File' => array(), + 'audioclip' => array(), + 'playlist' => array(), + 'Replica' => array(), + ), + 'allowedActions'=> array( + 'RootNode' => array('classes', 'subjects'), + 'Folder' => array('editPrivs', 'write', 'read'), + 'File' => array('editPrivs', 'write', 'read'), + 'audioclip' => array('editPrivs', 'write', 'read'), + 'playlist' => array('editPrivs', 'write', 'read'), + 'Replica' => array('editPrivs', 'write', 'read'), + '_class' => array('editPrivs', 'write', 'read'), + ), + 'allActions' => array( + 'editPrivs', 'write', 'read', 'classes', 'subjects' + ), + + /* ============================================== auxiliary configuration */ + 'RootNode' => 'RootNode', + 'tmpRootPass' => 'q', +); +$config['sysSubjs'] = array( + 'root', $config['AdminsGr'], $config['AllGr'], $config['StationPrefsGr'] +); +$old_ip = get_include_path(); +set_include_path('.'.PATH_SEPARATOR.$config['pearPath'].PATH_SEPARATOR.$old_ip); +?> diff --git a/campcaster/src/modules/archiveServer/var/conf_only.php.template b/campcaster/src/modules/archiveServer/var/conf_only.php.template new file mode 100644 index 000000000..3926e0bf9 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/conf_only.php.template @@ -0,0 +1,55 @@ + + *
    dsn
    datasource setting + *
    tblNamePrefix
    prefix for table names in the database + *
    authCookieName
    secret token cookie name + *
    storageDir
    main directory for storing binary media files + *
    bufferDir
    directory for temporary files + *
    transDir
    directory for incomplete transferred files + *
    accessDir
    directory for symlinks to accessed files + *
    isArchive
    local/central flag + *
    storageUrlPath
    path-URL-part of storageServer base dir + * (on central archive side: storage=archive) + *
    storageXMLRPC
    XMLRPC server script address relative to storageUrlPath + *
    storageUrlHost, storageUrlPort
    host and port of storageServer + *
    archiveUrlPath
    path-URL-part of archiveServer base dir + *
    archiveXMLRPC
    XMLRPC server script address relative to archiveUrlPath + *
    archiveUrlHost, archiveUrlPort
    host and port of archiveServer + * + */ +$config = array( + /* ================================================== basic configuration */ + 'dsn' => array( + 'username' => 'ls_dbuser', + 'password' => 'ls_dbpassword', + 'hostspec' => 'ls_dbserver', + 'phptype' => 'pgsql', + 'database' => 'ls_database', + ), + + /* ==================================================== URL configuration */ + // on central archive side: archive is the storage ! + 'storageUrlPath' => 'ls_archiveUrlPath', + 'storageXMLRPC' => 'xmlrpc/xrArchive.php', + 'storageUrlHost' => 'ls_php_host', + 'storageUrlPort' => ls_php_port, + // have to be another remote archive: + #'archiveUrlPath' => 'ls_archiveUrlPath', + #'archiveXMLRPC' => 'xmlrpc/xrArchive.php', + #'archiveUrlHost' => 'ls_php_host', + #'archiveUrlPort' => ls_php_port, + +); +?> diff --git a/campcaster/src/modules/archiveServer/var/index.php b/campcaster/src/modules/archiveServer/var/index.php new file mode 100644 index 000000000..8ad4d44f6 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/index.php @@ -0,0 +1,23 @@ + + +ArchiveServer module + +

    ArchiveServer module

    +
    +HTML client
    +XmlRpc test
    +Test
    + + \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/install/getGname.php b/campcaster/src/modules/archiveServer/var/install/getGname.php new file mode 100644 index 000000000..d459a473f --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/install/getGname.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/install/getWwwRoot.php b/campcaster/src/modules/archiveServer/var/install/getWwwRoot.php new file mode 100644 index 000000000..704c4326e --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/install/getWwwRoot.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/install/getXrUrl.php b/campcaster/src/modules/archiveServer/var/install/getXrUrl.php new file mode 100644 index 000000000..be7f47a06 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/install/getXrUrl.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/install/index.php b/campcaster/src/modules/archiveServer/var/install/index.php new file mode 100644 index 000000000..f6c14ea00 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/install/index.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/install/install.php b/campcaster/src/modules/archiveServer/var/install/install.php new file mode 100644 index 000000000..22606e70e --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/install/install.php @@ -0,0 +1,108 @@ +getMessage()."\ndi:\n".$err->getDebugInfo(). + "\nui:\n".$err->getUserInfo()."\n"; + exit(1); +} + +if (!function_exists('pg_connect')) { + trigger_error("PostgreSQL PHP extension required and not found.", E_USER_ERROR); + exit(2); +} + +PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s
    \n"); +$dbc = DB::connect($config['dsn'], TRUE); +if (PEAR::isError($dbc)) { + echo "Database connection problem.\n"; + echo "Check if database '{$config['dsn']['database']}' exists". + " with corresponding permissions.\n"; + echo "Database access is defined by 'dsn' values in var/conf.php.\n"; + exit(1); +} + +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$gb =& new Archive($dbc, $config, TRUE); +$tr =& new Transport($gb); + +echo "# archiveServer step 2:\n# trying uninstall ...\n"; +$dbc->setErrorHandling(PEAR_ERROR_RETURN); +$gb->uninstall(); +$tr->uninstall(); + +echo "# Install ...\n"; +#PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s
    \n"); +PEAR::setErrorHandling(PEAR_ERROR_DIE, "%s
    \n"); +$r = $gb->install(); +if (PEAR::isError($r)) { + echo $r->getUserInfo()."\n"; + exit(1); +} + +echo "# Testing ...\n"; +$r = $gb->test(); +if (PEAR::isError($r)) { + echo $r->getMessage()."\n"; + exit(1); +} +$log = $gb->test_log; +if ($log) { + echo "# testlog:\n{$log}"; +} + +#echo "# Reinstall + testdata insert ...\n"; +#$gb->reinstall(); +#$gb->sessid = $gb->login('root', $gb->config['tmpRootPass']); +#$gb->testData(); +#$gb->logout($gb->sessid); unset($gb->sessid); + +#echo "# TREE DUMP:\n"; +#echo $gb->dumpTree(); + +echo "# Delete test data ...\n"; +$gb->deleteData(); + +if (!($fp = @fopen($config['storageDir']."/_writeTest", 'w'))) { + echo "\nmake {$config['storageDir']} dir webdaemon-writeable". + "\nand run install again\n\n"; + exit(1); +} else { + fclose($fp); unlink($config['storageDir']."/_writeTest"); + echo "#archiveServer install: OK\n\n"; +} + +echo "# Install Transport submodule ..."; +$r = $tr->install(); +if (PEAR::isError($r)) { + echo $r->getMessage()."\n"; + echo $r->getUserInfo()."\n"; + exit(1); +} +echo "# OK\n"; + + +$dbc->disconnect(); +?> \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/install/uninstall.php b/campcaster/src/modules/archiveServer/var/install/uninstall.php new file mode 100644 index 000000000..120a64bf7 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/install/uninstall.php @@ -0,0 +1,52 @@ +getMessage()."\ndi:\n".$err->getDebugInfo(). + "\nui:\n".$err->getUserInfo()."\n\n"; + exit(1); +} + + +PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s
    \n"); +$dbc = DB::connect($config['dsn'], TRUE); +if (PEAR::isError($dbc)) { + echo "Database connection problem.\n"; + echo "Check if database '{$config['dsn']['database']}' exists". + " with corresponding permissions.\n"; + echo "Database access is defined by 'dsn' values in conf.php.\n"; + exit(1); +} + +echo "#ArchiveServer uninstall:\n"; +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$gb = &new Archive($dbc, $config, TRUE); +$tr = &new Transport($gb); + + +echo "# Uninstall Transport submodule ..."; +$r = $tr->uninstall(); +if (PEAR::isError($r)) { + echo $r->getUserInfo()."\n"; + exit; +} +echo "\n"; + +$dbc->setErrorHandling(PEAR_ERROR_RETURN); +$gb->uninstall(); +echo "#ArchiveServer uninstall: OK\n"; + +$dbc->disconnect(); +?> \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/xmlrpc/XR_Archive.php b/campcaster/src/modules/archiveServer/var/xmlrpc/XR_Archive.php new file mode 100644 index 000000000..5d67b7bf3 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/xmlrpc/XR_Archive.php @@ -0,0 +1,207 @@ +_xr_getPars($input); + if (!$ok) { + return $r; + } + $res = date("Ymd-H:i:s")." Network hub answer: {$r['par']}"; + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * @param XMLRPC_struct $input + */ + function xr_uploadOpen($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + $res = $this->uploadOpen($r['sessid'], $r['chsum']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_uploadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * Check state of file upload + * + * @param XMLRPC_struct $input + */ + function xr_uploadCheck($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + $res = $this->uploadCheck($r['token']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_uploadCheck: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * @param XMLRPC_struct $input + */ + function xr_uploadClose($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + $res = $this->uploadClose($r['token'], $r['trtype'], $r['pars']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_uploadClose: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * @param XMLRPC_strcut $input + */ + function xr_downloadOpen($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + $res = $this->downloadOpen($r['sessid'], $r['trtype'], $r['pars']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_downloadOpen: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * @param XMLRPC_struct $input + */ + function xr_downloadClose($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + $res = $this->downloadClose($r['token'], $r['trtype']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_downloadClose: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * @param XMLRPC_struct $input + */ + function xr_prepareHubInitiatedTransfer($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + foreach (array('trtype'=>NULL, 'direction'=>'up', 'pars'=>array()) as $k => $dv) { + if (!isset($r[$k])) { + $r[$k] = $dv; + } + } + $res = $this->prepareHubInitiatedTransfer( + $r['target'], $r['trtype'], $r['direction'], $r['pars']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_prepareHubInitiatedTransfer: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * @param XMLRPC_struct $input + */ + function xr_listHubInitiatedTransfers($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + foreach (array('target'=>NULL, 'direction'=>NULL, 'trtok'=>NULL) as $k=>$dv) { + if (!isset($r[$k])) { + $r[$k] = $dv; + } + } + $res = $this->listHubInitiatedTransfers( + $r['target'], $r['direction'], $r['trtok']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_listHubInitiatedTransfers: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + + /** + * @param XMLRPC_struct $input + */ + function xr_setHubInitiatedTransfer($input) + { + list($ok, $r) = $this->_xr_getPars($input); + if (!$ok) { + return $r; + } + $res = $this->setHubInitiatedTransfer( + $r['target'], $r['trtok'], $r['state']); + if (PEAR::isError($res)) + return new XML_RPC_Response(0, 803, + "xr_setHubInitiatedTransfer: ".$res->getMessage(). + " ".$res->getUserInfo() + ); + return new XML_RPC_Response(XML_RPC_encode($res)); + } + + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/xmlrpc/put.php b/campcaster/src/modules/archiveServer/var/xmlrpc/put.php new file mode 100644 index 000000000..e14ec46e0 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/xmlrpc/put.php @@ -0,0 +1,83 @@ + + *
  • token : string, put token returned by appropriate + * XMLRPC call
  • + * + * + * On success, returns HTTP return code 200. + * + * On errors, returns HTTP return code >200 + * The possible error codes are: + *
      + *
    • 400 - Incorrect parameters passed to method
    • + *
    • 403 - Access denied
    • + *
    • 500 - Application error
    • + *
    + * + * @see XR_LocStor + * @author $Author$ + * @version $Revision$ + * @package Campcaster + * @subpackage ArchiveServer + */ + +require_once dirname(__FILE__).'/../conf.php'; +require_once 'DB.php'; +require_once dirname(__FILE__).'/../Archive.php'; + +PEAR::setErrorHandling(PEAR_ERROR_RETURN); +$dbc = DB::connect($config['dsn'], TRUE); +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); +$gb = &new Archive($dbc, $config); + +function http_error($code, $err){ + header("HTTP/1.1 $code"); + header("Content-type: text/plain; charset=UTF-8"); + echo "$err\r\n"; + exit; +} + +if(preg_match("|^[0-9a-fA-F]{16}$|", $_REQUEST['token'])){ + $token = $_REQUEST['token']; +}else{ + http_error(400, "Error on token parameter. ({$_REQUEST['token']})"); +} + +$tc = $gb->bsCheckToken($token, 'put'); +if(PEAR::isError($tc)){ http_error(500, $ex->getMessage()); } +if(!$tc){ http_error(403, "Token not valid."); } +#var_dump($tc); exit; + +header("Content-type: text/plain"); +#var_dump($_SERVER); var_dump($_REQUEST); exit; + +#$destfile = $_SERVER['PATH_TRANSLATED']; +$destfile = "{$config['accessDir']}/{$token}"; + +/* PUT data comes in on the input stream */ +$putdata = @fopen("php://input", "r") or + http_error(500, "put.php: Can't read input"); + +/* Open a file for writing */ +$fp = @fopen($destfile, "ab") or + http_error(500, "put.php: Can't write to destination file (token=$token)"); + +/* Read the data 1 KB at a time and write to the file */ +while ($data = fread($putdata, 1024)){ + fwrite($fp, $data); +} + +/* Close the streams */ +fclose($fp); +fclose($putdata); + +header("HTTP/1.1 200"); +?> \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/xmlrpc/testRunner.sh b/campcaster/src/modules/archiveServer/var/xmlrpc/testRunner.sh new file mode 100755 index 000000000..34297577e --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/xmlrpc/testRunner.sh @@ -0,0 +1,371 @@ +#!/bin/sh + +# Author : $Author$ +# Version : $Revision$ +#------------------------------------------------------------------------------- + +#DEBUG=yes +#DEBUG_I=yes + +COMM=$1 +shift +GUNID=$1 + +#METADATA=" +#ěščřžé" +XMETADATA=" + + + clip 1 + 00:00:11 + +" +METADATA=" + + + Media title testRunner + 00:00:03.000000 + +" +METAREGEX="(<\\?xml version=\"1\\.0\"( encoding=\"UTF-8\")?\\?> )?\ +\ +\ +Media title testRunner\ + 00:00:03\\.000000\ + [0-9]{4}(-[0-9]{2}){2}T[0-9]{2}(:[0-9]{2}){2}([-+][0-9]{1,2}:[0-9]{2})?\ +\ +" + +echo "" +XRDIR=`dirname $0` +XMLRPC=`cd var/install; php -q getXrUrl.php` || exit $? +echo "# storageServer XMLRPC URL: $XMLRPC" + +cd $XRDIR +#XR_CLI="./xr_cli_test.py -s ${XMLRPC}" +XR_CLI="php -q xr_cli_test.php -s ${XMLRPC}" + +login() { + echo -n "# login: " + SESSID=`$XR_CLI login root q` || \ + { ERN=$?; echo $SESSID; exit $ERN; } + echo "sessid: $SESSID" +} + +test() { + echo "# test: " + $XR_CLI test $SESSID stringForUppercase || exit $? +} + +existsAudioClip() { + echo -n "# existsAudioClip (${GUNID}): " + $XR_CLI existsAudioClip $SESSID $GUNID || exit $? +} + +storeAudioClip() { + MEDIA=../tests/ex1.mp3 + MD5=`md5sum $MEDIA`; for i in $MD5; do MD5=$i; break; done + if [ $DEBUG_I ]; then echo "md5=$MD5"; fi + echo -n "# storeAudioClipOpen: " + RES=`$XR_CLI storeAudioClipOpen "$SESSID" '' "$METADATA" "stored file.mp3" "$MD5"` || \ + { ERN=$?; echo $RES; exit $ERN; } + unset URL + for i in $RES; do if [ -z $URL ] ; then URL=$i; else TOKEN=$i; fi; done + echo $TOKEN + if [ $DEBUG_I ]; then echo $URL; fi + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + echo -n "# curl (PUT): " + curl -C 0 -T $MEDIA $URL || { ERN=$?; echo $RGUNID; exit $ERN; } + echo "status: $?" + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + echo -n "# storeAudioClipClose: " + RGUNID=`$XR_CLI storeAudioClipClose "$SESSID" "$TOKEN"` || \ + { ERN=$?; echo $RGUNID; exit $ERN; } + echo $RGUNID +} + +accessRawAudioData() { + echo -n "# accessRawAudioData: " + RES=`$XR_CLI accessRawAudioData $SESSID $GUNID` || \ + { ERN=$?; echo $RES; exit $ERN; } + unset URL + for i in $RES; do if [ -z $URL ] ; then URL=$i; else TOKEN=$i; fi; done + echo $TOKEN + if [ $DEBUG_I ]; then echo $URL; fi + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + echo -n "# releaseRawAudioData: " + $XR_CLI releaseRawAudioData $SESSID $TOKEN || exit $? +} + +downloadRAD() { + echo -n "# downloadRawAudioDataOpen: " + RES=`$XR_CLI downloadRawAudioDataOpen $SESSID $GUNID` || \ + { ERN=$?; echo $RES; exit $ERN; } + unset URL + for i in $RES; do if [ -z $URL ] ; then URL=$i; else TOKEN=$i; fi; done + echo $TOKEN + if [ $DEBUG_I ]; then echo $URL; fi + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + echo -n "# curl: " + curl -Ifs $URL > /dev/null || { ERN=$?; echo $URL; exit $ERN; } + echo "status: $?" + echo -n "# downloadRawAudioDataClose: " + $XR_CLI downloadRawAudioDataClose $SESSID $TOKEN || exit $? +} + +downloadMeta() { + echo -n "# downloadMetadataOpen: " + RES=`$XR_CLI downloadMetadataOpen $SESSID $GUNID` || \ + { ERN=$?; echo $RES; exit $ERN; } + unset URL + for i in $RES; do if [ -z $URL ] ; then URL=$i; else TOKEN=$i; fi; done + echo $TOKEN + if [ $DEBUG_I ]; then echo $URL; fi + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + echo -n "# curl: " + METAOUT=`curl -fs $URL;` || { ERN=$?; echo $RES; exit $ERN; } + echo "OK" + if [ $DEBUG_I ]; then echo $METAOUT; echo -n "Press enter ..."; read KEY; fi + echo -n "# metadata check:" + METAOUT=`echo $METAOUT | sed -e 's/\\n/ /g'` + if [[ "x$METAOUT" =~ "x$METAREGEX" ]]; then + echo " OK" + else + echo " NOT MATCH ($?)" + echo " Expected match to regex:"; echo $METAREGEX + echo " Downloaded:"; echo $METAOUT + exit 1 + fi + echo -n "# downloadMetadataClose: " + $XR_CLI downloadMetadataClose $SESSID $TOKEN || exit $? +} + +deleteAudioClip() { + echo -n "# deleteAudioClip: " +# disabled: +# $XR_CLI deleteAudioClip $SESSID $GUNID || exit $? + $XR_CLI deleteAudioClip $SESSID $GUNID 0 +} + +updateAudioClipMetadata() { + echo -n "#updateAudioClipMetadata: " + $XR_CLI updateAudioClipMetadata $SESSID $GUNID "$METADATA" || exit $? +} + +getAudioClip() { + echo -n "#getAudioClip: " + $XR_CLI getAudioClip $SESSID $GUNID || exit $? +} + +searchMetadata() { + echo -n "# searchMetadata: " +# $XR_CLI searchMetadata $SESSID '../tests/srch_cri1.xml' || exit $? + $XR_CLI searchMetadata $SESSID 'John %' || exit $? +} + +PLID="123456789abcdef8" + +createPlaylist() { + echo -n "# createPlaylist: " + $XR_CLI createPlaylist $SESSID $PLID "newPlaylist.xml" || exit $? +} + +accessPlaylist() { + echo -n "# accessPlaylist: " + RES=`$XR_CLI accessPlaylist $SESSID $PLID` || \ + { ERN=$?; echo $RES; exit $ERN; } + unset URL + for i in $RES; do if [ -z $URL ] ; then URL=$i; else TOKEN=$i; fi; done + echo $TOKEN + if [ $DEBUG_I ]; then echo $URL; fi + echo "# curl: " + CURLOUT=`curl -fs $URL;` || { ERN=$?; echo $RES; exit $ERN; } + if [ $DEBUG ]; then echo $CURLOUT; fi + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + echo "# status: $?" + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + echo -n "# releasePlaylist: " + $XR_CLI releasePlaylist $SESSID $TOKEN || exit $? +} + +editPlaylist() { + DATE=`date '+%H:%M:%S'` + PLAYLIST=" + + + XY $DATE + + + " + echo -n "# editPlaylist: " + RES=`$XR_CLI editPlaylist $SESSID $PLID` || \ + { ERN=$?; echo $RES; exit $ERN; } + unset URL + for i in $RES; do if [ -z $URL ] ; then URL=$i; else TOKEN=$i; fi; done + echo $TOKEN +# deletePlaylist + if [ $DEBUG_I ]; then echo $URL; fi + if [ $DEBUG_I ]; then echo -n "Press enter ..."; read KEY; fi + if [ $DEBUG_I ]; then echo " Playlist:"; echo $PLAYLIST; fi + echo -n "# savePlaylist: " + $XR_CLI savePlaylist $SESSID $TOKEN "$PLAYLIST" || exit $? +} + +existsPlaylist() { + echo -n "# existsPlaylist (${PLID}): " + $XR_CLI existsPlaylist $SESSID $PLID || exit $? +} + +deletePlaylist() { + echo -n "# deletePlaylist (${PLID}): " + $XR_CLI deletePlaylist $SESSID $PLID + # || exit $? + echo "# status: $?" +} + +prefTest() { + PREFKEY="testKey" + PREFVAL="test preference value" + echo -n "# savePref: " + $XR_CLI savePref $SESSID "$PREFKEY" "$PREFVAL"|| exit $? + echo -n "# loadPref: " + VAL=`$XR_CLI loadPref $SESSID "$PREFKEY"` || \ + { ERN=$?; echo $VAL; exit $ERN; } + echo "$VAL " + if [ "x$VAL" != "x$PREFVAL" ] ; then + echo " NOT MATCH" + echo " Expected:"; echo $PREFVAL + echo " Returned:"; echo $VAL + exit 1 + else + echo "# pref value check: OK" + fi + echo -n "# delPref: " + $XR_CLI delPref $SESSID "$PREFKEY"|| exit $? + if [ $DEBUG ]; then + echo -n "# loadPref: " + VAL=`$XR_CLI loadPref $SESSID "$PREFKEY"` || echo $? + else + echo $VAL + fi +} + +logout() { + echo -n "# logout: " + $XR_CLI logout $SESSID || exit $? +} + +preferenceTest(){ + echo "#XMLRPC preference test" + login + prefTest + logout + echo "#XMLRPC: preference: OK." + echo "" +} + +playlistTest(){ + echo "#XMLRPC playlists test" + login + existsPlaylist + deletePlaylist + createPlaylist + existsPlaylist + accessPlaylist + editPlaylist + accessPlaylist + deletePlaylist + existsPlaylist + logout + echo "#XMLRPC: playlists: OK." + echo "" +} + +storageTest(){ + echo "#XMLRPC: storage test" + login + storeAudioClip + GUNID=$RGUNID + existsAudioClip + accessRawAudioData + downloadRAD + downloadMeta + deleteAudioClip + existsAudioClip + logout + echo "#XMLRPC: storage: OK." + echo "" +} + +usage(){ + echo "Usage: $0 [] [args]" + echo -e "commands:\n test\n existsAudioClip\n accessRawAudioData" + echo -e " storeAudioClip\n deleteAudioClip\n updateAudioClipMetadata" + echo -e " getAudioClip\n searchMetadata\n" + echo -e " preferences\n playlists\n storage\n" +} + +if [ "$COMM" == "test" ]; then + login + test + logout +elif [ "$COMM" == "existsAudioClip" ]; then + login + existsAudioClip + logout +elif [ "$COMM" == "accessRawAudioData" ]; then + login + accessRawAudioData + logout +elif [ "$COMM" == "storeAudioClip" ]; then + login + storeAudioClip + logout +elif [ "$COMM" == "deleteAudioClip" ]; then + login + deleteAudioClip + logout +elif [ "$COMM" == "updateAudioClipMetadata" ]; then + login + updateAudioClipMetadata + logout +elif [ "$COMM" == "getAudioClip" ]; then + login + getAudioClip + logout +elif [ "$COMM" == "searchMetadata" ]; then + login + searchMetadata + logout +elif [ "$COMM" == "preferences" ]; then + preferenceTest +elif [ "$COMM" == "playlists" ]; then + playlistTest +elif [ "$COMM" == "storage" ]; then + storageTest +elif [ "x$COMM" == "x" ]; then + storageTest +# playlistTest +# preferenceTest +elif [ "$COMM" == "help" ]; then + usage +else + echo "Unknown command" + usage +fi diff --git a/campcaster/src/modules/archiveServer/var/xmlrpc/xrArchive.php b/campcaster/src/modules/archiveServer/var/xmlrpc/xrArchive.php new file mode 100644 index 000000000..5d4d00f60 --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/xmlrpc/xrArchive.php @@ -0,0 +1,134 @@ +=" )); + +/* ====================================================== specific PHP config */ +//error_reporting(0); +ini_set("html_errors", FALSE); +ini_set("error_prepend_string", " + + + + + +faultCode +804 + + +faultString +"); +ini_set("error_append_string", " + + + + +"); +header("Content-type: text/xml"); + +/* ================================================================= includes */ +require_once dirname(__FILE__).'/../conf.php'; +require_once 'DB.php'; +require_once "XML/RPC/Server.php"; +require_once 'XR_Archive.php'; + +/* ============================================ setting default error handler */ +function errHndl($errno, $errmsg, $filename, $linenum, $vars){ + switch($errno){ + case E_WARNING: + case E_NOTICE: + case E_USER_WARNING: + case E_USER_NOTICE: + return; + break; + default: + $xr =& new XML_RPC_Response(0, 805, + htmlspecialchars("ERROR:xrLocStor: $errno $errmsg ($filename:$linenum)")); + header("Content-type: text/xml"); + echo $xr->serialize(); + exit($errno); + } +} +if(PHP5){ + $old_error_handler = set_error_handler("errHndl", E_ALL); +}else{ + $old_error_handler = set_error_handler("errHndl"); +} + + +/* ============================================================= runable code */ +PEAR::setErrorHandling(PEAR_ERROR_RETURN); +$dbc = DB::connect($config['dsn'], TRUE); +$dbc->setFetchMode(DB_FETCHMODE_ASSOC); + +$archive = &new XR_Archive($dbc, $config); + +$methods = array( + 'test' => 'Tests toupper and checks sessid, params: '. + 'teststring, sessid.', + 'getVersion' => 'Dummy function for connection testing.', + 'authenticate' => 'Checks authentication.', + 'login' => 'Login to storage.', + 'logout' => 'Logout from storage.', + 'existsAudioClip' => 'Checks if an Audio clip with the specified '. + 'id is stored in local storage.', + 'storeAudioClipOpen' => 'Open channel for store a new audio clip '. + 'or replace an existing one.', + 'storeAudioClipClose' => 'Close channel for store a new audio clip'. + ' or replace an existing one.', + 'downloadRawAudioDataOpen'=> 'Create and return downloadable URL'. + 'for audio file', + 'downloadRawAudioDataClose'=>'Discard downloadable URL for audio file', + 'downloadMetadataOpen' => 'Create and return downloadable URL'. + 'for metadata', + 'downloadMetadataClose' => 'Discard downloadable URL for metadata', + 'openPut' => 'openPut', + 'closePut' => 'closePut', + 'deleteAudioClip' => 'Delete an existing Audio clip.', + 'updateAudioClipMetadata' => 'Update the metadata of an Audio clip '. + 'stored in Local storage.', + 'searchMetadata' => 'Search through the metadata of stored '. + 'AudioClips, return all matching clip ids.', + 'accessRawAudioData' => 'Get access to raw audio data.', + 'releaseRawAudioData' => 'Release access to raw audio data.', + 'getAudioClip' => 'Return the contents of an Audio clip.', + 'resetStorage' => 'Reset storageServer for debugging.', + 'createPlaylist' => 'Create a new Playlist metafile.', + 'editPlaylist' => 'Open a Playlist metafile for editing.', + 'savePlaylist' => 'Save a Playlist metafile.', + 'deletePlaylist' => 'Delete a Playlist metafile.', + 'accessPlaylist' => 'Open readable URL to a Playlist metafile.', + 'releasePlaylist' => 'Release readable URL from accessPlaylist.', + 'existsPlaylist' => 'Check whether a Playlist exists.', + 'playlistIsAvailable' => 'Check whether a Playlist is available '. + 'for editing.', + + 'uploadOpen' => 'Open file-layer upload', + 'uploadCheck' => 'Check the checksum of uploaded file', + 'uploadClose' => 'Close file-layer upload', + 'downloadOpen' => 'Open file-layer download', +// 'downloadCheck' => 'Check the checksum of downloaded file', + 'downloadClose' => 'Close file-layer download', + 'prepareHubInitiatedTransfer' => 'Prepare hub initiated transfer', + 'listHubInitiatedTransfers' => 'List hub initiated transfers', + 'setHubInitiatedTransfer' => 'Set state of hub initiated transfers', + 'ping' => 'Echo request', +); + +$defs = array(); +foreach($methods as $method=>$description){ + $defs["archive.$method"] = array( + "function" => array(&$archive, "xr_$method"), +# "function" => "\$GLOBALS['archive']->xr_$method", + "signature" => array( + array($GLOBALS['XML_RPC_Struct'], $GLOBALS['XML_RPC_Struct']) + ), + "docstring" => $description + ); +} +$s = &new XML_RPC_Server( $defs ); + +?> \ No newline at end of file diff --git a/campcaster/src/modules/archiveServer/var/xmlrpc/xr_cli_test.php b/campcaster/src/modules/archiveServer/var/xmlrpc/xr_cli_test.php new file mode 100644 index 000000000..6bfc92d4b --- /dev/null +++ b/campcaster/src/modules/archiveServer/var/xmlrpc/xr_cli_test.php @@ -0,0 +1,182 @@ + array('m'=>"system.listMethods", 'p'=>NULL), + "methodHelp" => array('m'=>"system.methodHelp", 'p'=>0), + "methodSignature" => array('m'=>"system.methodSignature", 'p'=>0), + "test" => + array('m'=>"archive.test", 'p'=>array('sessid', 'teststring')), + "getVersion" => array('m'=>"archive.getVersion", + 'p'=>array(), 'r'=>'version'), + "authenticate" => array('m'=>"archive.authenticate", + 'p'=>array('login', 'pass'), 'r'=>'authenticate'), + "login" => array('m'=>"archive.login", + 'p'=>array('login', 'pass'), 'r'=>'sessid'), + "logout" => array('m'=>"archive.logout", + 'p'=>array('sessid'), 'r'=>'status'), + + "storeAudioClipOpen" => array('m'=>"archive.storeAudioClipOpen", + 'p'=>array('sessid', 'gunid', 'metadata', 'fname', 'chsum'), + 'r'=>array('url', 'token') + ), + "storeAudioClipClose" => array('m'=>"archive.storeAudioClipClose", + 'p'=>array('sessid', 'token'), 'r'=>'gunid'), + "accessRawAudioData" => array('m'=>"archive.accessRawAudioData", + 'p'=>array('sessid', 'gunid'), 'r'=>array('url', 'token')), + "releaseRawAudioData" => array('m'=>"archive.releaseRawAudioData", + 'p'=>array('sessid', 'token'), 'r'=>'status'), + "downloadRawAudioDataOpen" => + array('m'=>"archive.downloadRawAudioDataOpen", + 'p'=>array('sessid', 'gunid'), 'r'=>array('url', 'token')), + "downloadRawAudioDataClose" => + array('m'=>"archive.downloadRawAudioDataClose", + 'p'=>array('sessid', 'token'), 'r'=>'gunid'), + "downloadMetadataOpen" => array('m'=>"archive.downloadMetadataOpen", + 'p'=>array('sessid', 'gunid'), 'r'=>array('url', 'token')), + "downloadMetadataClose" => array('m'=>"archive.downloadMetadataClose", + 'p'=>array('sessid', 'token'), 'r'=>'gunid'), + + "deleteAudioClip" => + array('m'=>"archive.deleteAudioClip", + 'p'=>array('sessid', 'gunid'), 'r'=>'status'), + "existsAudioClip" => array('m'=>"archive.existsAudioClip", + 'p'=>array('sessid', 'gunid'), 'r'=>'exists'), + "getAudioClip" => array('m'=>"archive.getAudioClip", + 'p'=>array('sessid', 'gunid'), 'r'=>'metadata'), + "updateAudioClipMetadata" => array('m'=>"archive.updateAudioClipMetadata", + 'p'=>array('sessid', 'gunid', 'metadata'), 'r'=>'status'), + "searchMetadata" => array('m'=>"archive.searchMetadata", 'p'=>NULL), + "resetStorage" => array('m'=>"archive.resetStorage", 'p'=>array()), + + "createPlaylist" => array('m'=>"archive.createPlaylist", + 'p'=>array('sessid', 'plid', 'fname'), 'r'=>'plid'), + "editPlaylist" => array('m'=>"archive.editPlaylist", + 'p'=>array('sessid', 'plid'), 'r'=>array('url', 'token')), + "savePlaylist" => array('m'=>"archive.savePlaylist", + 'p'=>array('sessid', 'token', 'newPlaylist'), 'r'=>'plid'), + "deletePlaylist" => array('m'=>"archive.deletePlaylist", + 'p'=>array('sessid', 'plid'), 'r'=>'status'), + "accessPlaylist" => array('m'=>"archive.accessPlaylist", + 'p'=>array('sessid', 'plid'), 'r'=>array('url', 'token')), + "releasePlaylist" => array('m'=>"archive.releasePlaylist", + 'p'=>array('sessid', 'token'), 'r'=>'plid'), + "existsPlaylist" => array('m'=>"archive.existsPlaylist", + 'p'=>array('sessid', 'plid'), 'r'=>'exists'), + "playlistIsAvailable" => array('m'=>"archive.playlistIsAvailable", + 'p'=>array('sessid', 'plid'), 'r'=>'available'), + + "loadPref" => array('m'=>"archive.loadPref", + 'p'=>array('sessid', 'key'), 'r'=>'value'), + "savePref" => array('m'=>"archive.savePref", + 'p'=>array('sessid', 'key', 'value'), 'r'=>'status'), + "delPref" => array('m'=>"archive.delPref", + 'p'=>array('sessid', 'key'), 'r'=>'status'), + "openPut" => array('m'=>"archive.openPut", 'p'=>array()), + "closePut" => array('m'=>"archive.closePut", 'p'=>array()), + + "ping" => array('m'=>"archive.ping", 'p'=>array('par')), +); + + +$fullmethod = $infos[$method]['m']; +$pinfo = $infos[$method]['p']; +if(is_null($pinfo)){ + $parr = NULL; +}elseif(!is_array($pinfo)){ + $parr = $pars[0]; + #echo "pinfo not null and not array.\n"; exit; +}elseif(count($pinfo) == 0){ + $parr = array(); +}else{ + $parr = array(); $i=0; + foreach($pinfo as $it){ + $parr[$it] = $pars[$i++]; + } +} +switch($method){ + case 'searchMetadata': + $parr = array( + 'sessid'=>$pars[0], + 'criteria'=>array( + 'filetype'=>'audioclip', + 'operator'=>'and', + 'limit'=> 0, + 'offset'=> 0, + 'conditions'=>array( + array('cat'=>$pars[1], 'op'=>'partial', 'val'=>$pars[2]) + ) + ), + ); + break; + case 'resetStorage': + $parr = array( + 'loadSampleData'=>(boolean)$pars[0], + 'filesOnly'=>(boolean)$pars[1], + ); + break; +} +$msg = new XML_RPC_Message($fullmethod, array(XML_RPC_encode($parr))); + +if($verbose){ + echo "parr:\n"; + var_dump($parr); + echo "message:\n"; + echo $msg->serialize()."\n"; +} + +$res = $client->send($msg); +if($res->faultCode() > 0) { + echo "xr_cli_test.php: ".$res->faultString()." ".$res->faultCode()."\n"; + exit(1); +} + +if($verbose){ + echo "result:\n"; + echo $res->serialize(); +} + +$resp = XML_RPC_decode($res->value()); +if(isset($infos[$method]['r'])){ + $pom = $infos[$method]['r']; + if(is_array($pom)){ + foreach($pom as $k=>$it) $pom[$k] = $resp[$it]; + echo join(' ', $pom)."\n"; + }else switch($pom){ + case"status": + case"exists": + echo ($resp[$pom]=='1' ? "TRUE" : "FALSE" )."\n"; + break; + default: + echo "{$resp[$pom]}\n"; + } +}else{ + print_r($resp); +# echo"\n"; +} + +?> diff --git a/campcaster/src/modules/authentication/bin/autogen.sh b/campcaster/src/modules/authentication/bin/autogen.sh new file mode 100755 index 000000000..91f7c0982 --- /dev/null +++ b/campcaster/src/modules/authentication/bin/autogen.sh @@ -0,0 +1,94 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="Authentication" + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. +usrdir=`cd $basedir/../../../usr; pwd;` + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +echo " aclocal $ACLOCAL_FLAGS" +cp -f ${configure_ac} ${tmpdir} +cp -f ${etcdir}/acinclude.m4 ${tmpdir} +aclocal $ACLOCAL_FLAGS + +echo " autoheader ${configure_ac}" +autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/authentication/bin/gen_coverage_data.sh b/campcaster/src/modules/authentication/bin/gen_coverage_data.sh new file mode 100755 index 000000000..1f3ad2037 --- /dev/null +++ b/campcaster/src/modules/authentication/bin/gen_coverage_data.sh @@ -0,0 +1,80 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script generates code coverage data for the module +#------------------------------------------------------------------------------- +module="Campcaster Authentication" + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +docdir=$basedir/doc +tmpdir=$basedir/tmp + +usrdir=`cd $basedir/../../../usr; pwd;` + +coverage_report_dir=$docdir/coverage + +raw_coverage_file=$tmpdir/raw_coverage.info +coverage_file=$tmpdir/coverage.info + +lcov=$usrdir/bin/lcov +genhtml=$usrdir/bin/genhtml + + +cd $basedir + +#------------------------------------------------------------------------------- +# Re-configure with covarege collection enabled, compile and run the tests +#------------------------------------------------------------------------------- +$bindir/autogen.sh --enable-coverage +make clean +make check + +#------------------------------------------------------------------------------- +# Generate some symlinks so that the sources are visible from tmpdir +#------------------------------------------------------------------------------- +ln -s $basedir/include $tmpdir/include +ln -s $basedir/src $tmpdir/src + + +#------------------------------------------------------------------------------- +# Use lcov to generate an HTML report on the coverage data +#------------------------------------------------------------------------------- +$lcov -d $tmpdir -c > $raw_coverage_file +$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file +rm -rf $coverage_report_dir +mkdir -p $coverage_report_dir +$genhtml -t "$module" -o $coverage_report_dir $coverage_file + + +#------------------------------------------------------------------------------- +# Clean up +#------------------------------------------------------------------------------- +rm -f $tmpdir/include +rm -f $tmpdir/src diff --git a/campcaster/src/modules/authentication/configure b/campcaster/src/modules/authentication/configure new file mode 100755 index 000000000..47e6d5cd0 --- /dev/null +++ b/campcaster/src/modules/authentication/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen "$@") +fi + +(cd $tmpdir && $configure "$@") + diff --git a/campcaster/src/modules/authentication/doc/.keepme b/campcaster/src/modules/authentication/doc/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/authentication/doc/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/authentication/etc/Makefile.in b/campcaster/src/modules/authentication/etc/Makefile.in new file mode 100644 index 000000000..d7864026c --- /dev/null +++ b/campcaster/src/modules/authentication/etc/Makefile.in @@ -0,0 +1,184 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f + + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +BASE_DIR = @builddir@ +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +COVERAGE_DIR = ${DOC_DIR}/coverage +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_LIB_DIR = ${USR_DIR}/lib +BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 + +MODULES_DIR = ${BASE_DIR}/.. + +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 + +STORAGE_SERVER_DIR = ${MODULES_DIR}/storageServer + +VPATH = ${SRC_DIR} + +LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ +LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +TEST_RESULTS = ${DOC_DIR}/testResults.xml +# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +TEST_XSLT = ../etc/testResultToHtml.xsl + +AUTHENTICATION_LIB = livesupport_authentication +AUTHENTICATION_LIB_FILE = ${LIB_DIR}/lib${AUTHENTICATION_LIB}.a +TEST_RUNNER = ${TMP_DIR}/testRunner + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +export LD_LIBRARY_PATH:=${USR_LIB_DIR}:${LD_LIBRARY_PATH} + + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +CPPFLAGS = @CPPFLAGS@ +CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -pedantic -Wall -Wno-long-long \ + ${LIBXMLPP_CFLAGS} \ + -I${USR_INCLUDE_DIR} \ + -I${BOOST_INCLUDE_DIR} \ + -I${CORE_INCLUDE_DIR} \ + -I${INCLUDE_DIR} -I${TMP_DIR} +LDFLAGS = @LDFLAGS@ -pthread \ + ${LIBXMLPP_LIBS} \ + -L${USR_LIB_DIR} \ + -L${CORE_LIB_DIR} \ + -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +AUTHENTICATION_LIB_OBJS = ${TMP_DIR}/AuthenticationClientFactory.o \ + ${TMP_DIR}/TestAuthenticationClient.o \ + ${TMP_DIR}/WebAuthenticationClient.o + +TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ + ${TMP_DIR}/TestAuthenticationClientTest.o \ + ${TMP_DIR}/WebAuthenticationClientTest.o \ + ${TMP_DIR}/AuthenticationClientFactoryTest.o + +TEST_RUNNER_LIBS = -l${AUTHENTICATION_LIB} -l${CORE_LIB} \ + -lcppunit -ldl -lxmlrpc++ -lssl + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean check install + +all: dir_setup ${AUTHENTICATION_LIB_FILE} + +dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: + ${RM} ${AUTHENTICATION_LIB_OBJS} ${AUTHENTICATION_LIB_FILE} + ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER} + ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + ${RMDIR} ${COVERAGE_DIR}/* + ${RM} ${TEST_RESULTS} + +depclean: clean + +distclean: clean docclean + ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 + +check: all ${TEST_RUNNER} + ${MAKE} -C ${STORAGE_SERVER_DIR} + ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} + +install: all + ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/Authentication + ${CP} ${INCLUDE_DIR}/LiveSupport/Authentication/*.h \ + ${USR_INCLUDE_DIR}/LiveSupport/Authentication + ${CP} ${AUTHENTICATION_LIB_FILE} ${USR_LIB_DIR} + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +${AUTHENTICATION_LIB_FILE}: ${AUTHENTICATION_LIB_OBJS} + ${AR} crus $@ $^ + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${TEST_RUNNER}: ${CORE_LIB_FILE} ${TEST_RUNNER_OBJS} ${AUTHENTICATION_LIB_FILE} + ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} + +${CORE_LIB_FILE}: + ${MAKE} -C ${CORE_DIR} + + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx + ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/src/modules/authentication/etc/acinclude.m4 b/campcaster/src/modules/authentication/etc/acinclude.m4 new file mode 100644 index 000000000..9204e3ad8 --- /dev/null +++ b/campcaster/src/modules/authentication/etc/acinclude.m4 @@ -0,0 +1,92 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +dnl----------------------------------------------------------------------------- + +dnl----------------------------------------------------------------------------- +dnl Macro to check for available modules using pkg-conf +dnl +dnl usage: +dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) +dnl +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +dnl +dnl This function was taken from the glade-- project +dnl----------------------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + + diff --git a/campcaster/src/modules/authentication/etc/authenticationClient.xml b/campcaster/src/modules/authentication/etc/authenticationClient.xml new file mode 100644 index 000000000..7a1580f07 --- /dev/null +++ b/campcaster/src/modules/authentication/etc/authenticationClient.xml @@ -0,0 +1,18 @@ + + + + + + + + + +]> + + + + + diff --git a/campcaster/src/modules/authentication/etc/configure.ac b/campcaster/src/modules/authentication/etc/configure.ac new file mode 100644 index 000000000..878ef292b --- /dev/null +++ b/campcaster/src/modules/authentication/etc/configure.ac @@ -0,0 +1,107 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(Authentication, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../src/AuthenticationClientFactory.cxx) + +AC_CONFIG_HEADERS(configure.h) +AC_PROG_CXX() + +AC_CHECK_HEADERS(getopt.h) + + +dnl----------------------------------------------------------------------------- +dnl specify whether debug info should be compiled into the executable +dnl----------------------------------------------------------------------------- +AC_SUBST(CXXFLAGS) + +AC_ARG_ENABLE([debug], + AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), + [], + [enable_debug=no]) + +if test "x${enable_debug}" = "xyes"; then + CXXFLAGS="-g -O0" +else + CXXFLAGS="-O3" +fi + +AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the pkg-config path +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([pkg-config-path], + AC_HELP_STRING([--with-pkg-config-path], + [use the pkg-config path (prefix/lib/pkgconfig)]), + [PKG_CONFIG_PATH=${withval}], + [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig]) + +AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) + +export PKG_CONFIG_PATH + +export PATH=${prefix}/bin:${PATH} + + +PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) +AC_SUBST(LIBXMLPP_CFLAGS) +AC_SUBST(LIBXMLPP_LIBS) + + +dnl----------------------------------------------------------------------------- +dnl enable compilaton for code coverage data +dnl----------------------------------------------------------------------------- +AC_SUBST(COVERAGE_CXXFLAGS) + +AC_ARG_ENABLE( coverage, +[ --enable-coverage enable code coverage data generaton (no) ], + ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) + +if test "x${ENABLE_COVERAGE}" == "xyes" ; then + COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" + AC_MSG_RESULT([compiling in code coverage mode]) +else + AC_MSG_RESULT([not compiling in code coverage mode]) +fi + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/authentication/etc/doxygen.config b/campcaster/src/modules/authentication/etc/doxygen.config new file mode 100644 index 000000000..bb7b13cec --- /dev/null +++ b/campcaster/src/modules/authentication/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Campcaster + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = include src + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/authentication/etc/testAuthentication.xml b/campcaster/src/modules/authentication/etc/testAuthentication.xml new file mode 100644 index 000000000..581498e59 --- /dev/null +++ b/campcaster/src/modules/authentication/etc/testAuthentication.xml @@ -0,0 +1,12 @@ + + + + + + +]> + + + diff --git a/campcaster/src/modules/authentication/etc/webAuthentication.xml b/campcaster/src/modules/authentication/etc/webAuthentication.xml new file mode 100644 index 000000000..c10f709e7 --- /dev/null +++ b/campcaster/src/modules/authentication/etc/webAuthentication.xml @@ -0,0 +1,14 @@ + + + + + + + +]> + + + diff --git a/campcaster/src/modules/authentication/etc/webAuthentication.xml.template b/campcaster/src/modules/authentication/etc/webAuthentication.xml.template new file mode 100644 index 000000000..c5bd5dd13 --- /dev/null +++ b/campcaster/src/modules/authentication/etc/webAuthentication.xml.template @@ -0,0 +1,14 @@ + + + + + + + +]> + + + diff --git a/campcaster/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientFactory.h b/campcaster/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientFactory.h new file mode 100644 index 000000000..f4c301ee3 --- /dev/null +++ b/campcaster/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientFactory.h @@ -0,0 +1,194 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Authentication_AuthenticationClientFactory_h +#define LiveSupport_Authentication_AuthenticationClientFactory_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Authentication/AuthenticationClientInterface.h" + + +namespace LiveSupport { +namespace Authentication { + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * The factory to create AuthenticationClientInterface objects. + * + * This object has to be configured with an XML configuration element + * called authenticationClientFactory. This element contains a child element + * specifying and configuring the kind of AuthenticationClient that the + * factory builds. This client is either a TestAuthenticationClient or + * a WebAuthenticationClient, and the child element name is either + * testAuthentication or webAuthentication, correspondingly. + * + * An authenticationClientFactory configuration element may look like + * the following: + * + *
    
    + *  <authenticationClientFactory>
    + *      <webAuthentication>
    + *          ...
    + *      </webAuthentication>
    + *  </authenticationClientFactory>
    + *  
    + * + * For detais of the testAuthentication and webAuthentication elements, see the + * documentation for the TestAuthenticationClient and WebAuthenticationClient + * classes. + * + * The DTD for the above element is: + * + *
    
    + *  <!ELEMENT authenticationClientFactory (testAuthentication|
    + *                                         webAuthentication) >
    + *  
    + * + * @author $Author$ + * @version $Revision$ + * @see TestAuthenticationClient + * @see WebAuthenticationClient + */ +class AuthenticationClientFactory : + 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::Ref singleton; + + /** + * The authentication client created by this factory. + */ + Ptr::Ref authenticationClient; + + /** + * The default constructor. + */ + AuthenticationClientFactory(void) throw() + { + } + + + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~AuthenticationClientFactory(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; + } + + /** + * Returns the singleton instance of this object. + * + * @return the singleton instance of this object. + */ + static Ptr::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 an authentication client. + * + * @return the appropriate authentication client, according to the + * configuration of this factory. + */ + Ptr::Ref + getAuthenticationClient(void) throw () + { + return authenticationClient; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Authentication +} // namespace LiveSupport + +#endif // LiveSupport_Authentication_AuthenticationClientFactory_h + diff --git a/campcaster/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientInterface.h b/campcaster/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientInterface.h new file mode 100644 index 000000000..50315a79c --- /dev/null +++ b/campcaster/src/modules/authentication/include/LiveSupport/Authentication/AuthenticationClientInterface.h @@ -0,0 +1,238 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Authentication_AuthenticationClientInterface_h +#define LiveSupport_Authentication_AuthenticationClientInterface_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/SessionId.h" +#include "LiveSupport/Core/XmlRpcException.h" +#include "LiveSupport/Core/XmlRpcInvalidArgumentException.h" +#include "LiveSupport/Core/XmlRpcCommunicationException.h" +#include "LiveSupport/Core/XmlRpcMethodFaultException.h" +#include "LiveSupport/Core/XmlRpcMethodResponseException.h" + +namespace LiveSupport { +namespace Authentication { + +using namespace LiveSupport::Core; + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An interface for authentication clients. + * + * @author $Author$ + * @version $Revision$ + */ +class AuthenticationClientInterface +{ + public: + + /** + * Return the version string from the storage. + * + * @return the version string of the storage. + * @exception XmlRpcException if there is a problem with the XML-RPC + * call. + */ + virtual Ptr::Ref + getVersion(void) throw (XmlRpcException) + = 0; + + /** + * Login to the authentication server. + * Returns a new session ID; in case of an error, throws + * AuthenticationException or one of its subclasses. + * Note that an incorrect login or password is considered an error + * and will throw an XmlRpcException (in the case of WebStorageClient, + * an XmlRpcMethodFaultException, which is also an XmlRpcException). + * + * @param login the login to the server + * @param password the password to the server + * @exception XmlRpcCommunicationException problem with performing + * XML-RPC call + * @exception XmlRpcMethodFaultException XML-RPC method returned + * fault response + * @exception XmlRpcMethodResponseException response from XML-RPC + * method is incorrect + * @exception XmlRpcException other error + * (TestAuthenticationClient only) + * @return the new session ID + */ + virtual Ptr::Ref + login(const std::string &login, const std::string &password) + throw (XmlRpcException) + = 0; + + /** + * Logout from the authentication server. + * + * @param sessionId the ID of the session to end + * @exception XmlRpcCommunicationException problem with performing + * XML-RPC call + * @exception XmlRpcMethodFaultException XML-RPC method returned + * fault response + * @exception XmlRpcMethodResponseException response from XML-RPC + * method is incorrect + * @exception XmlRpcException other error + * (TestAuthenticationClient only) + */ + virtual void + logout(Ptr::Ref sessionId) + throw (XmlRpcException) + = 0; + + /** + * Load a `user preferences' item from the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * + * @exception std::invalid_argument + * no such preference key found + * @exception XmlRpcInvalidArgumentException + * bad sessionId argument + * @exception XmlRpcCommunicationException + * problem with performing XML-RPC call + * @exception XmlRpcMethodFaultException + * XML-RPC method returned fault response + * @exception XmlRpcMethodResponseException + * response from XML-RPC method is incorrect + * @exception XmlRpcException other error + * (TestAuthenticationClient only) + */ + virtual Ptr::Ref + loadPreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException, + std::invalid_argument) + = 0; + + /** + * Store a `user preferences' item on the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * @param value the (new) value of the item + * + * @exception XmlRpcInvalidArgumentException + * bad sessionId or value argument + * @exception XmlRpcCommunicationException + * problem with performing XML-RPC call + * @exception XmlRpcMethodFaultException + * XML-RPC method returned fault response + * @exception XmlRpcMethodResponseException + * response from XML-RPC method is incorrect + * @exception XmlRpcException other error + * (TestAuthenticationClient only) + */ + virtual void + savePreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key, + Ptr::Ref value) + throw (XmlRpcException) + = 0; + + /** + * Delete a `user preferences' item from the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * + * @exception XmlRpcInvalidArgumentException + * bad sessionId argument + * @exception XmlRpcCommunicationException + * problem with performing XML-RPC call + * @exception XmlRpcMethodFaultException + * XML-RPC method returned fault response + * @exception XmlRpcMethodResponseException + * response from XML-RPC method is incorrect + * @exception XmlRpcException other error + * (TestAuthenticationClient only) + */ + virtual void + deletePreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException) + = 0; + + /** + * Reset the authentication client. + * Invalidates all active session IDs, and resets the list of + * preferences to its initial (empty) state. + * + * @exception XmlRpcException if the server returns an error. + */ + virtual void + reset(void) + throw (XmlRpcException) + = 0; + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~AuthenticationClientInterface(void) throw () + { + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Authentication +} // namespace LiveSupport + +#endif // LiveSupport_Authentication_AuthenticationClientInterface_h + diff --git a/campcaster/src/modules/authentication/lib/.keepme b/campcaster/src/modules/authentication/lib/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/authentication/lib/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/authentication/src/AuthenticationClientFactory.cxx b/campcaster/src/modules/authentication/src/AuthenticationClientFactory.cxx new file mode 100644 index 000000000..881a7365b --- /dev/null +++ b/campcaster/src/modules/authentication/src/AuthenticationClientFactory.cxx @@ -0,0 +1,122 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Authentication/AuthenticationClientFactory.h" +#include "TestAuthenticationClient.h" +#include "WebAuthenticationClient.h" + +using namespace LiveSupport::Core; +using namespace LiveSupport::Authentication; + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string AuthenticationClientFactory::configElementNameStr = + "authenticationClientFactory"; + +/*------------------------------------------------------------------------------ + * The singleton instance of AuthenticationClientFactory + *----------------------------------------------------------------------------*/ +Ptr::Ref AuthenticationClientFactory::singleton; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Return the singleton instance to AuthenticationClientFactory + *----------------------------------------------------------------------------*/ +Ptr::Ref +AuthenticationClientFactory :: getInstance(void) throw () +{ + if (!singleton.get()) { + singleton.reset(new AuthenticationClientFactory()); + } + + return singleton; +} + + +/*------------------------------------------------------------------------------ + * Configure the test authentication client. + *----------------------------------------------------------------------------*/ +void +AuthenticationClientFactory :: 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); + } + + authenticationClient.reset(); + + // try to look for a TestAuthenticationClient configuration element + xmlpp::Node::NodeList nodes = + element.get_children(TestAuthenticationClient::getConfigElementName()); + if (nodes.size() >= 1) { + const xmlpp::Element * configElement = + dynamic_cast (*(nodes.begin())); + Ptr::Ref tac(new TestAuthenticationClient()); + tac->configure(*configElement); + authenticationClient = tac; + return; + } + + // try to look for a WebAuthenticationClient configuration element + nodes = + element.get_children(WebAuthenticationClient::getConfigElementName()); + if (nodes.size() >= 1) { + const xmlpp::Element * configElement = + dynamic_cast (*(nodes.begin())); + Ptr::Ref wac(new WebAuthenticationClient()); + wac->configure(*configElement); + authenticationClient = wac; + return; + } + + throw std::invalid_argument("no authentication client configuration found"); +} + diff --git a/campcaster/src/modules/authentication/src/AuthenticationClientFactoryTest.cxx b/campcaster/src/modules/authentication/src/AuthenticationClientFactoryTest.cxx new file mode 100644 index 000000000..cc995df84 --- /dev/null +++ b/campcaster/src/modules/authentication/src/AuthenticationClientFactoryTest.cxx @@ -0,0 +1,257 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include +#include + +#include "LiveSupport/Core/SessionId.h" +#include "AuthenticationClientFactoryTest.h" + + +using namespace std; +using namespace LiveSupport::Core; +using namespace LiveSupport::Authentication; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(AuthenticationClientFactoryTest); + +/** + * The name of the configuration file for the authentication client factory. + */ +static const std::string configFileName = "authenticationClient.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +AuthenticationClientFactoryTest :: setUp(void) throw () +{ + Ptr::Ref + acf = AuthenticationClientFactory::getInstance(); + try { + xmlpp::DomParser parser; + const xmlpp::Document * document = getConfigDocument(parser, + configFileName); + const xmlpp::Element * root = document->get_root_node(); + + acf->configure(*root); + } 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 +AuthenticationClientFactoryTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can log on and off + *----------------------------------------------------------------------------*/ +void +AuthenticationClientFactoryTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref + acf = AuthenticationClientFactory::getInstance(); + Ptr::Ref + authentication = acf->getAuthenticationClient(); + + CPPUNIT_ASSERT_NO_THROW( + authentication->reset() + ); + + Ptr::Ref sessionId; + + try { + sessionId = authentication->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + CPPUNIT_ASSERT(sessionId); + + try { + authentication->logout(sessionId); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can save and load user preferences. + *----------------------------------------------------------------------------*/ +void +AuthenticationClientFactoryTest :: preferencesTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref + acf = AuthenticationClientFactory::getInstance(); + Ptr::Ref + authentication = acf->getAuthenticationClient(); + + CPPUNIT_ASSERT_NO_THROW( + authentication->reset() + ); + + Ptr::Ref sessionId; + Ptr::Ref prefValue; + + // check "please log in" error + try { + prefValue = authentication->loadPreferencesItem(sessionId, "something"); + CPPUNIT_FAIL("Allowed operation without login."); + } catch (XmlRpcException &e) { + } + + // log in + try { + sessionId = authentication->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // check "no such key" error + try { + prefValue = authentication->loadPreferencesItem(sessionId, "eye_color"); + CPPUNIT_FAIL("Retrieved non-existent user preferences item."); + } catch (std::invalid_argument &e) { + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // check normal save and load + prefValue.reset(new const Glib::ustring("chyornye")); + try { + authentication->savePreferencesItem(sessionId, "eye_color", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + Ptr::Ref newPrefValue; + try { + newPrefValue = authentication->loadPreferencesItem(sessionId, "eye_color"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == *prefValue); + + // try some unicode characters + prefValue.reset(new const Glib::ustring("страстные")); + try { + authentication->savePreferencesItem(sessionId, "eye_color", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = authentication->loadPreferencesItem(sessionId, "eye_color"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == "страстные"); + + // check another normal save and load... + prefValue.reset(new const Glib::ustring("ne dobryj")); + try { + authentication->savePreferencesItem(sessionId, "hour", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // ... but now change session ID in the middle + try { + authentication->logout(sessionId); + sessionId = authentication->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = authentication->loadPreferencesItem(sessionId, "hour"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == *prefValue); + + // check the delete method + try { + authentication->deletePreferencesItem(sessionId, "hour"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = authentication->loadPreferencesItem(sessionId, "hour"); + CPPUNIT_FAIL("Allowed to load preference after it was deleted"); + } catch (std::invalid_argument &e) { + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // and log out + try { + authentication->logout(sessionId); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } +} + diff --git a/campcaster/src/modules/authentication/src/AuthenticationClientFactoryTest.h b/campcaster/src/modules/authentication/src/AuthenticationClientFactoryTest.h new file mode 100644 index 000000000..a37bfd19c --- /dev/null +++ b/campcaster/src/modules/authentication/src/AuthenticationClientFactoryTest.h @@ -0,0 +1,120 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef AuthenticationClientFactoryTest_h +#define AuthenticationClientFactoryTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/BaseTestMethod.h" + +#include "LiveSupport/Authentication/AuthenticationClientFactory.h" + +namespace LiveSupport { +namespace Authentication { + +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the AuthenticationClientFactory class. + * + * @author $Author$ + * @version $Revision$ + * @see AuthenticationClientFactory + */ +class AuthenticationClientFactoryTest : public BaseTestMethod +{ + CPPUNIT_TEST_SUITE(AuthenticationClientFactoryTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(preferencesTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test saving and load of user preferences. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + preferencesTest(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 Authentication +} // namespace LiveSupport + +#endif // AuthenticationClientFactoryTest_h + diff --git a/campcaster/src/modules/authentication/src/TestAuthenticationClient.cxx b/campcaster/src/modules/authentication/src/TestAuthenticationClient.cxx new file mode 100644 index 000000000..d7451df33 --- /dev/null +++ b/campcaster/src/modules/authentication/src/TestAuthenticationClient.cxx @@ -0,0 +1,299 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + +#include +#include +#include +#include + +#include "TestAuthenticationClient.h" + +using namespace boost::posix_time; +using namespace XmlRpc; + +using namespace LiveSupport::Core; +using namespace LiveSupport::Authentication; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ configuration file constants */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string TestAuthenticationClient::configElementNameStr + = "testAuthentication"; + +namespace { + +/*------------------------------------------------------------------------------ + * The name of the config child element for the login and password + *----------------------------------------------------------------------------*/ +const std::string userConfigElementName = "user"; + +/*------------------------------------------------------------------------------ + * The name of the config element attribute for the login + *----------------------------------------------------------------------------*/ +const std::string userLoginAttrName = "login"; + +/*------------------------------------------------------------------------------ + * The name of the config element attribute for the password + *----------------------------------------------------------------------------*/ +const std::string userPasswordAttrName = "password"; + +/*------------------------------------------------------------------------------ + * The dummy sessionId string returned by this authentication client + *----------------------------------------------------------------------------*/ +const std::string dummySessionIdString = "dummySessionId"; + +/*------------------------------------------------------------------------------ + * The version string, returned by getVersion + *----------------------------------------------------------------------------*/ +const std::string versionStr = "TestAuthentication"; + +} + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Configure the test storage client. + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClient :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + std::string eMsg = "bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + // read the user data + xmlpp::Node::NodeList childNodes + = element.get_children(userConfigElementName); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + if (it == childNodes.end()) { + std::string eMsg = "missing "; + eMsg += userConfigElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } + + const xmlpp::Element * userConfigElement + = dynamic_cast (*it); + if (!(attribute = userConfigElement + ->get_attribute(userLoginAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += userLoginAttrName; + throw std::invalid_argument(eMsg); + } + userLogin = attribute->get_value(); + + if (!(attribute = userConfigElement + ->get_attribute(userPasswordAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += userPasswordAttrName; + throw std::invalid_argument(eMsg); + } + userPassword = attribute->get_value(); + + ++it; + if (it != childNodes.end()) { + std::string eMsg = "more than one "; + eMsg += userConfigElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } + + versionString.reset(new Glib::ustring(versionStr)); + + sessionIdList.clear(); + sessionCounter = 0; +} + + +/*------------------------------------------------------------------------------ + * Return the version string of the test storage. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TestAuthenticationClient :: getVersion(void) + throw (Core::XmlRpcException) +{ + return versionString; +} + + +/*------------------------------------------------------------------------------ + * Login to the authentication server. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TestAuthenticationClient :: login(const std::string & login, + const std::string & password) + throw (XmlRpcException) +{ + Ptr::Ref sessionId; + + if (login == userLogin && password == userPassword) { + std::stringstream sessionIdStream; + sessionIdStream << dummySessionIdString + << sessionCounter++ + << '-' + << rand(); + sessionIdList.insert(sessionIdStream.str()); + sessionId.reset(new SessionId(sessionIdStream.str())); + return sessionId; + } else { + throw XmlRpcException("incorrect login or password"); + } +} + + +/*------------------------------------------------------------------------------ + * Logout from the authentication server. + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClient :: logout(Ptr::Ref sessionId) + throw (XmlRpcException) +{ + // this returns the number of entries found and erased + if (!sessionId || sessionIdList.erase(sessionId->getId())) { + return; + } else { + throw XmlRpcException("logout() called without previous login()"); + } +} + + +/*------------------------------------------------------------------------------ + * Load a `user preferences' item from the server. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TestAuthenticationClient :: loadPreferencesItem( + Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException, + std::invalid_argument) +{ + if (!sessionId + || sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { + throw XmlRpcException("bad session ID"); + } + + PreferencesType::iterator it; + + if ((it = preferences.find(key)) == preferences.end()) { + throw std::invalid_argument("no such user preferences item"); + } + + Ptr::Ref value(new Glib::ustring(*it->second)); + return value; +} + + +/*------------------------------------------------------------------------------ + * Store a `user preferences' item on the server. + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClient :: savePreferencesItem( + Ptr::Ref sessionId, + const Glib::ustring & key, + Ptr::Ref value) + throw (XmlRpcException) +{ + if (!sessionId + || sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { + throw XmlRpcException("bad session ID"); + } + + if (sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { + throw XmlRpcException("loadPreferences() called before login()"); + } + + preferences[key] = value; +} + + +/*------------------------------------------------------------------------------ + * Delete a `user preferences' item from the server. + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClient :: deletePreferencesItem( + Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException) +{ + if (!sessionId + || sessionIdList.find(sessionId->getId()) == sessionIdList.end()) { + throw XmlRpcException("bad session ID"); + } + + PreferencesType::iterator it; + + if ((it = preferences.find(key)) == preferences.end()) { + throw XmlRpcException("no such user preferences item"); + } + + preferences.erase(it); +} + + +/*------------------------------------------------------------------------------ + * Reset the list of preferences to its initial (empty) state. + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClient :: reset(void) + throw (XmlRpcException) +{ + sessionIdList.clear(); + sessionCounter = 0; + + preferences.clear(); +} + diff --git a/campcaster/src/modules/authentication/src/TestAuthenticationClient.h b/campcaster/src/modules/authentication/src/TestAuthenticationClient.h new file mode 100644 index 000000000..2671664bf --- /dev/null +++ b/campcaster/src/modules/authentication/src/TestAuthenticationClient.h @@ -0,0 +1,288 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef TestAuthenticationClient_h +#define TestAuthenticationClient_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/SessionId.h" +#include "LiveSupport/Authentication/AuthenticationClientInterface.h" + + +namespace LiveSupport { +namespace Authentication { + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A dummy authentication client. It only supports one user, whose name and + * password are read from a configuration file. It issues session IDs when + * login() is called, and deletes these session IDs when logout() is called. + * It also stores (key, value) pairs of user preferences for this one user. + * + * This object has to be configured with an XML configuration element + * called testAuthentication. This element contains a child element + * specifying the login and password. + * + * A testAuthentication configuration element may look like the following: + * + *
    
    + *  <testAuthentication>
    + *      <user
    + *          login="root"
    + *          password="q" 
    + *      />
    + *  </testAuthentication>
    + *  
    + * + * The DTD for the above element is: + * + *
    
    + *  <!ELEMENT testAuthentication (user) >
    + *  <!ELEMENT user EMPTY >
    + *  <!ATTLIST user login      CDATA      #REQUIRED >
    + *  <!ATTLIST user password   CDATA      #REQUIRED >
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class TestAuthenticationClient : + virtual public Configurable, + virtual public AuthenticationClientInterface +{ + private: + /** + * The name of the configuration XML elmenent used by + * TestAuthenticationClient + */ + static const std::string configElementNameStr; + + /** + * The version string of the test storage client. + */ + Ptr::Ref versionString; + + /** + * The login name of the (one) authorized test user. + */ + std::string userLogin; + + /** + * The password for the test user. + */ + std::string userPassword; + + /** + * A type for the list of sessionId's. + */ + typedef std::set + SessionIdListType; + + /** + * A list of the sessionId's we have issued. + */ + SessionIdListType sessionIdList; + + /** + * The number of the sessionId's we have issued. + */ + int sessionCounter; + + /** + * A type for the list of user preferences. + */ + typedef std::map::Ref> + PreferencesType; + + /** + * A list of the user preferences items stored. + */ + PreferencesType preferences; + + + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~TestAuthenticationClient(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. + * + * @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 scheduler daemon has already + * been configured, and can not be reconfigured. + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Return the version string from the storage. + * + * @return the version string of the storage. + * @exception XmlRpcException if there is a problem with the XML-RPC + * call. + */ + virtual Ptr::Ref + getVersion(void) throw (XmlRpcException); + + /** + * Login to the authentication server, using the data read from the + * configuration file. + * Returns a new session ID; in case of an error, returns a + * null pointer. + * Note that an incorrect login or password is considered an error + * and will throw an XmlRpcException. + * + * @return the new session ID + * @exception XmlRpcException login or password is incorrect + * (does not match those given in the configuration file) + */ + virtual Ptr::Ref + login(const std::string &login, const std::string &password) + throw (XmlRpcException); + + /** + * Logout from the authentication server. + * + * @param sessionId the ID of the session to end + * @exception XmlRpcException the sessionId does not match + * one issued by login() + */ + virtual void + logout(Ptr::Ref sessionId) + throw (XmlRpcException); + + /** + * Load a `user preferences' item from the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * @exception XmlRpcException invalid session ID + * @exception std::invalid_argument no such preference key found + */ + virtual Ptr::Ref + loadPreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException, + std::invalid_argument); + + /** + * Store a `user preferences' item on the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * @param value the (new) value of the item + * @exception XmlRpcException invalid session ID + */ + virtual void + savePreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key, + Ptr::Ref value) + throw (XmlRpcException); + + /** + * Delete a `user preferences' item from the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * @exception XmlRpcException invalid session ID, or no such key + */ + virtual void + deletePreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException); + + /** + * Reset the authentication client. + * Invalidates all active session IDs, and resets the list of + * preferences to its initial (empty) state. + * + * @exception XmlRpcException if the server returns an error. + */ + virtual void + reset(void) + throw (XmlRpcException); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Authentication +} // namespace LiveSupport + +#endif // TestAuthenticationClient_h + diff --git a/campcaster/src/modules/authentication/src/TestAuthenticationClientTest.cxx b/campcaster/src/modules/authentication/src/TestAuthenticationClientTest.cxx new file mode 100644 index 000000000..37e32503d --- /dev/null +++ b/campcaster/src/modules/authentication/src/TestAuthenticationClientTest.cxx @@ -0,0 +1,276 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include +#include + +#include "LiveSupport/Core/SessionId.h" +#include "TestAuthenticationClientTest.h" + + +using namespace std; +using namespace LiveSupport::Core; +using namespace LiveSupport::Authentication; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(TestAuthenticationClientTest); + +/** + * The name of the configuration file for the authentication client factory. + */ +static const std::string configFileName = "../etc/testAuthentication.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClientTest :: setUp(void) throw () +{ + try { + xmlpp::DomParser parser; + const xmlpp::Document * document = getConfigDocument(parser, + configFileName); + const xmlpp::Element * root = document->get_root_node(); + + tac.reset(new TestAuthenticationClient()); + tac->configure(*root); + } 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 +TestAuthenticationClientTest :: tearDown(void) throw () +{ + tac.reset(); +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can log on and off + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClientTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref sessionId; + + try { + sessionId = tac->login("Piszkos Fred", "malnaszor"); + CPPUNIT_FAIL("Allowed login with incorrect login and password."); + } catch (XmlRpcException &e) { + } + + // TODO: this call writes some garbage to cerr; it should be told not to + sessionId.reset(new SessionId("ceci n'est pas un session ID")); + try { + tac->logout(sessionId); + CPPUNIT_FAIL("Allowed logout without previous login."); + } catch (XmlRpcException &e) { + } + + try { + sessionId = tac->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + tac->logout(sessionId); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + tac->logout(sessionId); + CPPUNIT_FAIL("Allowed to logout twice."); + } catch (XmlRpcException &e) { + } +} + + +/*------------------------------------------------------------------------------ + * Test the getVersion function + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClientTest :: getVersionTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref version; + + try { + version = tac->getVersion(); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + CPPUNIT_ASSERT(version.get()); + CPPUNIT_ASSERT(*version == "TestAuthentication"); +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can save and load user preferences. + *----------------------------------------------------------------------------*/ +void +TestAuthenticationClientTest :: preferencesTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref sessionId; + Ptr::Ref prefValue; + + // check "please log in" error + try { + prefValue = tac->loadPreferencesItem(sessionId, "something"); + CPPUNIT_FAIL("Allowed operation without login."); + } catch (XmlRpcException &e) { + } + + // log in + try { + sessionId = tac->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // check "no such key" error + try { + prefValue = tac->loadPreferencesItem(sessionId, "eye_color"); + CPPUNIT_FAIL("Retrieved non-existent user preferences item."); + } catch (std::invalid_argument &e) { + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // check normal save and load + prefValue.reset(new const Glib::ustring("chyornye")); + try { + tac->savePreferencesItem(sessionId, "eye_color", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + Ptr::Ref newPrefValue; + try { + newPrefValue = tac->loadPreferencesItem(sessionId, "eye_color"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == *prefValue); + + // try some unicode characters + prefValue.reset(new const Glib::ustring("страстные")); + try { + tac->savePreferencesItem(sessionId, "eye_color", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = tac->loadPreferencesItem(sessionId, "eye_color"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == "страстные"); + + // check another normal save and load... + prefValue.reset(new const Glib::ustring("ne dobryj")); + try { + tac->savePreferencesItem(sessionId, "hour", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + + // ... but now change session ID in the middle + try { + tac->logout(sessionId); + sessionId = tac->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + try { + newPrefValue = tac->loadPreferencesItem(sessionId, "hour"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == *prefValue); + + // check the delete method + try { + tac->deletePreferencesItem(sessionId, "hour"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = tac->loadPreferencesItem(sessionId, "hour"); + CPPUNIT_FAIL("Allowed to load preference after it was deleted"); + } catch (std::invalid_argument &e) { + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // and log out + try { + tac->logout(sessionId); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } +} diff --git a/campcaster/src/modules/authentication/src/TestAuthenticationClientTest.h b/campcaster/src/modules/authentication/src/TestAuthenticationClientTest.h new file mode 100644 index 000000000..596b2dd14 --- /dev/null +++ b/campcaster/src/modules/authentication/src/TestAuthenticationClientTest.h @@ -0,0 +1,135 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef TestAuthenticationClientTest_h +#define TestAuthenticationClientTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/BaseTestMethod.h" + +#include "TestAuthenticationClient.h" + +namespace LiveSupport { +namespace Authentication { + +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the TestAuthenticationClient class. + * + * @author $Author$ + * @version $Revision$ + * @see TestAuthenticationClient + */ +class TestAuthenticationClientTest : public BaseTestMethod +{ + CPPUNIT_TEST_SUITE(TestAuthenticationClientTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(getVersionTest); + CPPUNIT_TEST(preferencesTest); + CPPUNIT_TEST_SUITE_END(); + + private: + /** + * The TestAuthenticationClient instance to test. + */ + Ptr::Ref tac; + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the gerVersion() function. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + getVersionTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test saving and load of user preferences. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + preferencesTest(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 Authentication +} // namespace LiveSupport + +#endif // TestAuthenticationClientTest_h + diff --git a/campcaster/src/modules/authentication/src/TestRunner.cxx b/campcaster/src/modules/authentication/src/TestRunner.cxx new file mode 100644 index 000000000..0e0930e5b --- /dev/null +++ b/campcaster/src/modules/authentication/src/TestRunner.cxx @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + +#if HAVE_GETOPT_H +#include +#else +#error "Need getopt.h" +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +using namespace LiveSupport::Core; + +/* =================================================== 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[] = "ho:s:v"; + +/** + * Structure describing the long options + */ +static const struct option longOptions[] = { + { "help", no_argument, 0, 'h' }, + { "output", required_argument, 0, 'o' }, + { "stylesheet", required_argument, 0, 's' }, + { "version", no_argument, 0, 'v' }, + { 0, 0, 0, 0 } +}; + +/** + * The encoding to use for the output file. + */ +static const std::string encoding = "utf-8"; + +/** + * The output XML file name. + */ +static Ptr::Ref xmlOutFileName; + +/** + * The XSLT attached to the output file. + */ +static Ptr::Ref xsltFileName; + + +/* =============================================== 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 ); + +/** + * Process command line arguments. + * + * @param argc the number of arguments. + * @param argv the arguments themselves. + * @return true of all went well, false in case the program should exit + * after this call. + */ +static bool +processArguments(int argc, char *argv[]); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Run all tests + *----------------------------------------------------------------------------*/ +int +main( int argc, + char * argv[] ) throw () +{ + if (!processArguments(argc, argv)) { + return 0; + } + + // 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(); + + // also generate an XML document as an output + std::ofstream xmlOutFile(xmlOutFileName->c_str()); + CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); + xmlOutputter.setStandalone(false); + if (xsltFileName) { + xmlOutputter.setStyleSheet(*xsltFileName); + } + xmlOutputter.write(); + xmlOutFile.flush(); + xmlOutFile.close(); + + return result.wasSuccessful() ? 0 : 1; +} + + +/*------------------------------------------------------------------------------ + * Process command line arguments. + *----------------------------------------------------------------------------*/ +static bool +processArguments(int argc, char *argv[]) +{ + int i; + + while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { + switch (i) { + case 'h': + printUsage(argv[0], std::cout); + return false; + + case 'o': + xmlOutFileName.reset(new std::string(optarg)); + break; + + case 's': + xsltFileName.reset(new std::string(optarg)); + break; + + case 'v': + printVersion(std::cout); + return false; + + default: + printUsage(argv[0], std::cout); + return false; + } + } + + if (optind < argc) { + std::cerr << "error processing command line arguments" << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + if (!xmlOutFileName) { + std::cerr << "mandatory option output file name not specified" + << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; + if (xsltFileName) { + std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Print program version. + *----------------------------------------------------------------------------*/ +static void +printVersion ( std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << copyrightNotice << std::endl; +} + + +/*------------------------------------------------------------------------------ + * Print program usage. + *----------------------------------------------------------------------------*/ +static void +printUsage ( const char invocation[], + std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << std::endl + << "Usage: " << invocation << " [OPTION]" + << std::endl + << " mandatory options:" << std::endl + << " -o, --output=file.name write test results into this XML file" + << std::endl + << " optional options:" << std::endl + << " -s, --stylesheet specify this XSLT for the output file" + << std::endl + << " this is either an absolute URI, or a" + << std::endl + << " relative path for the output document" + << 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; +} + diff --git a/campcaster/src/modules/authentication/src/WebAuthenticationClient.cxx b/campcaster/src/modules/authentication/src/WebAuthenticationClient.cxx new file mode 100644 index 000000000..dc7976846 --- /dev/null +++ b/campcaster/src/modules/authentication/src/WebAuthenticationClient.cxx @@ -0,0 +1,663 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + +#include +#include +#include +#include + +#include "WebAuthenticationClient.h" + +using namespace boost::posix_time; +using namespace XmlRpc; + +using namespace LiveSupport::Core; +using namespace LiveSupport::Authentication; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ configuration file constants */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string WebAuthenticationClient::configElementNameStr + = "webAuthentication"; + +namespace { + +/*------------------------------------------------------------------------------ + * The name of the config child element for the authentication server location + *----------------------------------------------------------------------------*/ +const std::string locationConfigElementName = "location"; + +/*------------------------------------------------------------------------------ + * The name of the config element attribute for the server name + *----------------------------------------------------------------------------*/ +const std::string locationServerAttrName = "server"; + +/*------------------------------------------------------------------------------ + * The name of the config element attribute for the server port + *----------------------------------------------------------------------------*/ +const std::string locationPortAttrName = "port"; + +/*------------------------------------------------------------------------------ + * The name of the config element attribute for the server php page + *----------------------------------------------------------------------------*/ +const std::string locationPathAttrName = "path"; + + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ authentication server constants: login */ + +/*------------------------------------------------------------------------------ + * The name of the get version method on the storage server + *----------------------------------------------------------------------------*/ +const std::string getVersionMethodName = "locstor.getVersion"; + +/*------------------------------------------------------------------------------ + * The name of version return parameter for getVersion + *----------------------------------------------------------------------------*/ +const std::string getVersionResultParamName = "version"; + +/*------------------------------------------------------------------------------ + * The name of the login method on the server + *----------------------------------------------------------------------------*/ +const std::string loginMethodName = "locstor.login"; + +/*------------------------------------------------------------------------------ + * The name of the login parameter in the input structure + *----------------------------------------------------------------------------*/ +const std::string loginParamName = "login"; + +/*------------------------------------------------------------------------------ + * The name of the password parameter in the input structure + *----------------------------------------------------------------------------*/ +const std::string passwordParamName = "pass"; + +/*------------------------------------------------------------------------------ + * The name of the session ID parameter in the output structure + *----------------------------------------------------------------------------*/ +const std::string outputSessionIdParamName = "sessid"; + + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ authentication server constants: logout */ + +/*------------------------------------------------------------------------------ + * The name of the logout method on the server + *----------------------------------------------------------------------------*/ +const std::string logoutMethodName = "locstor.logout"; + +/*------------------------------------------------------------------------------ + * The name of the session ID parameter in the input structure + *----------------------------------------------------------------------------*/ +const std::string inputSessionIdParamName = "sessid"; + +/*------------------------------------------------------------------------------ + * The name of the status parameter in the output structure + *----------------------------------------------------------------------------*/ +const std::string statusParamName = "status"; + + +/* ~~~~~~~~~~~~~~~~~~ authentication server constants: load/save preferences */ + +/*------------------------------------------------------------------------------ + * The name of the load preferences method on the server + *----------------------------------------------------------------------------*/ +const std::string loadPreferencesMethodName = "locstor.loadPref"; + +/*------------------------------------------------------------------------------ + * The name of the save preferences method on the server + *----------------------------------------------------------------------------*/ +const std::string savePreferencesMethodName = "locstor.savePref"; + +/*------------------------------------------------------------------------------ + * The name of the delete preferences method on the server + *----------------------------------------------------------------------------*/ +const std::string deletePreferencesMethodName = "locstor.delPref"; + +/*------------------------------------------------------------------------------ + * The name of the session ID parameter in the input structure + *----------------------------------------------------------------------------*/ +const std::string preferencesSessionIdParamName = "sessid"; + +/*------------------------------------------------------------------------------ + * The name of the key parameter in the input structure + *----------------------------------------------------------------------------*/ +const std::string preferencesKeyParamName = "key"; + +/*------------------------------------------------------------------------------ + * The name of the value parameter for both save and load methods + *----------------------------------------------------------------------------*/ +const std::string preferencesValueParamName = "value"; + +/*------------------------------------------------------------------------------ + * The name of the return parameter for the save method + *----------------------------------------------------------------------------*/ +const std::string preferencesStatusParamName = "status"; + +/*------------------------------------------------------------------------------ + * The name of the fault code parameter + *----------------------------------------------------------------------------*/ +const std::string faultCodeParamName = "faultCode"; + +/*------------------------------------------------------------------------------ + * The fault code for the "invalid preference key" error + *----------------------------------------------------------------------------*/ +const int invalidPreferenceKeyFaultCode = 849; + + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~ authentication server constants: resetStorage */ + +/*------------------------------------------------------------------------------ + * The name of the reset storage method on the server + *----------------------------------------------------------------------------*/ +const std::string resetStorageMethodName = "locstor.resetStorage"; + +/*------------------------------------------------------------------------------ + * The name of the result parameter returned by the method (ignored here) + *----------------------------------------------------------------------------*/ +const std::string resetStorageResultParamName = "results"; + +/*------------------------------------------------------------------------------ + * The name of the count parameter returned by the method (ignored here) + *----------------------------------------------------------------------------*/ +const std::string resetStorageCountParamName = "cnt"; + +} + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Configure the web storage client. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClient :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + std::string eMsg = "Bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + // read the storage server location + xmlpp::Node::NodeList childNodes + = element.get_children(locationConfigElementName); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + if (it == childNodes.end()) { + std::string eMsg = "missing "; + eMsg += locationConfigElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } + + const xmlpp::Element * locationConfigElement + = dynamic_cast (*it); + if (!(attribute = locationConfigElement + ->get_attribute(locationServerAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += locationServerAttrName; + throw std::invalid_argument(eMsg); + } + storageServerName = attribute->get_value(); + + if (!(attribute = locationConfigElement + ->get_attribute(locationPortAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += locationPortAttrName; + throw std::invalid_argument(eMsg); + } + std::stringstream storageServerPortValue(attribute->get_value()); + storageServerPortValue >> storageServerPort; + + if (!(attribute = locationConfigElement + ->get_attribute(locationPathAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += locationPathAttrName; + throw std::invalid_argument(eMsg); + } + storageServerPath = attribute->get_value(); + + ++it; + if (it != childNodes.end()) { + std::string eMsg = "more than one "; + eMsg += locationConfigElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } +} + + +/*------------------------------------------------------------------------------ + * Return the version string of the test storage. + *----------------------------------------------------------------------------*/ +Ptr::Ref +WebAuthenticationClient :: getVersion(void) + throw (Core::XmlRpcException) +{ + XmlRpcValue parameters; + XmlRpcValue result; + + XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, + storageServerPath.c_str(), false); + + parameters.clear(); + // add a dummy parameter, as this is the only way to enforce parameters + // to be of XML-RPC type struct + parameters["dummy"] = 0; + result.clear(); + if (!xmlRpcClient.execute(getVersionMethodName.c_str(), + parameters, result)) { + xmlRpcClient.close(); + std::string eMsg = "cannot execute XML-RPC method '"; + eMsg += getVersionMethodName; + eMsg += "'"; + throw XmlRpcCommunicationException(eMsg); + } + xmlRpcClient.close(); + + if (xmlRpcClient.isFault()) { + std::stringstream eMsg; + eMsg << "XML-RPC method '" + << getVersionMethodName + << "' returned error message:\n" + << result; + throw Core::XmlRpcMethodFaultException(eMsg.str()); + } + + if (!result.hasMember(getVersionResultParamName) + || result[getVersionResultParamName].getType() + != XmlRpcValue::TypeString) { + std::stringstream eMsg; + eMsg << "XML-RPC method '" + << getVersionMethodName + << "' returned unexpected value:\n" + << result; + throw XmlRpcMethodResponseException(eMsg.str()); + } + + Ptr::Ref version(new Glib::ustring( + result[getVersionResultParamName])); + + xmlRpcClient.close(); + + return version; +} + + +/*------------------------------------------------------------------------------ + * Login to the authentication server. + *----------------------------------------------------------------------------*/ +Ptr::Ref +WebAuthenticationClient :: login(const std::string & login, + const std::string & password) + throw (XmlRpcException) +{ + XmlRpcValue parameters; + XmlRpcValue result; + Ptr::Ref sessionId; + + XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, + storageServerPath.c_str(), false); + + parameters.clear(); + parameters[loginParamName] = login; + parameters[passwordParamName] = password; + + result.clear(); + if (!xmlRpcClient.execute(loginMethodName.c_str(), parameters, result)) { + xmlRpcClient.close(); + throw Authentication::XmlRpcCommunicationException("Login failed."); + } + xmlRpcClient.close(); + + if (xmlRpcClient.isFault()) { + std::stringstream eMsg; + eMsg << "Login method returned fault response:\n" + << result; + throw Core::XmlRpcMethodFaultException(eMsg.str()); + } + + if (! result.hasMember(outputSessionIdParamName)) { + std::stringstream eMsg; + eMsg << "Login method returned unexpected response:\n" + << result; + throw Core::XmlRpcMethodResponseException(eMsg.str()); + } + + if (result[outputSessionIdParamName].getType() != XmlRpcValue::TypeString) { + std::stringstream eMsg; + eMsg << "Login method returned unexpected response:\n" + << result; + throw Core::XmlRpcMethodResponseException(eMsg.str()); + } + + sessionId.reset(new SessionId(result[outputSessionIdParamName])); + return sessionId; +} + + +/*------------------------------------------------------------------------------ + * Logout from the authentication server. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClient :: logout(Ptr::Ref sessionId) + throw (XmlRpcException) +{ + if (!sessionId) { + throw Core::XmlRpcInvalidArgumentException("Missing session ID."); + } + + XmlRpcValue parameters; + XmlRpcValue result; + + XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, + storageServerPath.c_str(), false); + + parameters.clear(); + parameters[inputSessionIdParamName] = sessionId->getId(); + + result.clear(); + if (!xmlRpcClient.execute(logoutMethodName.c_str(), parameters, result)) { + xmlRpcClient.close(); + throw Core::XmlRpcCommunicationException("Logout failed."); + } + xmlRpcClient.close(); + + if (xmlRpcClient.isFault()) { + std::stringstream eMsg; + eMsg << "Logout method returned fault response:\n" + << result; + throw Core::XmlRpcMethodFaultException(eMsg.str()); + } + + if (! result.hasMember(statusParamName) + || result[statusParamName].getType() != XmlRpcValue::TypeBoolean + || ! bool(result[statusParamName])) { + std::stringstream eMsg; + eMsg << "Logout method returned unexpected response:\n" + << result; + throw Core::XmlRpcMethodResponseException(eMsg.str()); + } +} + + +/*------------------------------------------------------------------------------ + * Load a `user preferences' item from the server. + *----------------------------------------------------------------------------*/ +Ptr::Ref +WebAuthenticationClient :: loadPreferencesItem( + Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException, + std::invalid_argument) +{ + if (!sessionId) { + throw Core::XmlRpcInvalidArgumentException("Missing session ID."); + } + + XmlRpcValue parameters; + XmlRpcValue result; + + XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, + storageServerPath.c_str(), false); + + parameters.clear(); + parameters[preferencesSessionIdParamName] = sessionId->getId(); + parameters[preferencesKeyParamName] = std::string(key); + + result.clear(); + if (!xmlRpcClient.execute(loadPreferencesMethodName.c_str(), + parameters, result)) { + xmlRpcClient.close(); + throw Core::XmlRpcCommunicationException( + "Could not execute XML-RPC method."); + } + xmlRpcClient.close(); + + if (xmlRpcClient.isFault()) { + std::stringstream eMsg; + eMsg << "XML-RPC method " + << loadPreferencesMethodName + << " returned fault response:\n" + << result; + if (result.hasMember(faultCodeParamName) + && result[faultCodeParamName].getType() + == XmlRpcValue::TypeInt + && int(result[faultCodeParamName]) + == invalidPreferenceKeyFaultCode) { + throw std::invalid_argument(eMsg.str()); + } else { + throw Core::XmlRpcMethodFaultException(eMsg.str()); + } + } + + if (! result.hasMember(preferencesValueParamName) + || result[preferencesValueParamName].getType() + != XmlRpcValue::TypeString) { + std::stringstream eMsg; + eMsg << "XML-RPC method " + << loadPreferencesMethodName + << " returned unexpected response:\n" + << result; + throw Core::XmlRpcMethodResponseException(eMsg.str()); + } + + Ptr::Ref value(new Glib::ustring(std::string( + result[preferencesValueParamName] ))); + return value; +} + + +/*------------------------------------------------------------------------------ + * Store a `user preferences' item on the server. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClient :: savePreferencesItem( + Ptr::Ref sessionId, + const Glib::ustring & key, + Ptr::Ref value) + throw (XmlRpcException) +{ + if (!sessionId) { + throw Core::XmlRpcInvalidArgumentException("Missing session ID."); + } + + if (!value) { + throw Core::XmlRpcInvalidArgumentException("Missing value argument."); + } + + XmlRpcValue parameters; + XmlRpcValue result; + + XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, + storageServerPath.c_str(), false); + + parameters.clear(); + parameters[preferencesSessionIdParamName] = sessionId->getId(); + parameters[preferencesKeyParamName] = std::string(key); + parameters[preferencesValueParamName] = std::string(*value); + + result.clear(); + if (!xmlRpcClient.execute(savePreferencesMethodName.c_str(), + parameters, result)) { + xmlRpcClient.close(); + throw Core::XmlRpcCommunicationException( + "Could not execute XML-RPC method."); + } + xmlRpcClient.close(); + + if (xmlRpcClient.isFault()) { + std::stringstream eMsg; + eMsg << "XML-RPC method " + << savePreferencesMethodName + << " returned fault response:\n" + << result; + throw Core::XmlRpcMethodFaultException(eMsg.str()); + } + + if (! result.hasMember(preferencesStatusParamName) + || result[preferencesStatusParamName].getType() + != XmlRpcValue::TypeBoolean + || ! bool(result[preferencesStatusParamName])) { + std::stringstream eMsg; + eMsg << "XML-RPC method " + << savePreferencesMethodName + << " returned unexpected response:\n" + << result; + throw Core::XmlRpcMethodResponseException(eMsg.str()); + } +} + + +/*------------------------------------------------------------------------------ + * Delete a `user preferences' item from the server. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClient :: deletePreferencesItem( + Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException) +{ + if (!sessionId) { + throw Core::XmlRpcInvalidArgumentException("Missing session ID."); + } + + XmlRpcValue parameters; + XmlRpcValue result; + + XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, + storageServerPath.c_str(), false); + + parameters.clear(); + parameters[preferencesSessionIdParamName] = sessionId->getId(); + parameters[preferencesKeyParamName] = std::string(key); + + result.clear(); + if (!xmlRpcClient.execute(deletePreferencesMethodName.c_str(), + parameters, result)) { + xmlRpcClient.close(); + throw Core::XmlRpcCommunicationException( + "Could not execute XML-RPC method."); + } + xmlRpcClient.close(); + + if (xmlRpcClient.isFault()) { + std::stringstream eMsg; + eMsg << "XML-RPC method " + << deletePreferencesMethodName + << " returned fault response:\n" + << result; + throw Core::XmlRpcMethodFaultException(eMsg.str()); + } + + if (! result.hasMember(preferencesStatusParamName) + || result[preferencesStatusParamName].getType() + != XmlRpcValue::TypeBoolean + || ! bool(result[preferencesStatusParamName])) { + std::stringstream eMsg; + eMsg << "XML-RPC method " + << deletePreferencesMethodName + << " returned unexpected response:\n" + << result; + throw Core::XmlRpcMethodResponseException(eMsg.str()); + } +} + + +/*------------------------------------------------------------------------------ + * Reset the list of preferences to its initial (empty) state. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClient :: reset(void) + throw (Core::XmlRpcException) +{ + XmlRpcValue parameters; + XmlRpcValue result; + + XmlRpcClient xmlRpcClient(storageServerName.c_str(), storageServerPort, + storageServerPath.c_str(), false); + + parameters.clear(); + parameters["dummy_param"] = "dummy_value"; + + result.clear(); + if (!xmlRpcClient.execute(resetStorageMethodName.c_str(), + parameters, result)) { + xmlRpcClient.close(); + throw Core::XmlRpcCommunicationException( + "Could not execute XML-RPC method."); + } + xmlRpcClient.close(); + + if (xmlRpcClient.isFault()) { + std::stringstream eMsg; + eMsg << "XML-RPC method '" + << resetStorageMethodName + << "' returned error message:\n" + << result; + throw Core::XmlRpcMethodFaultException(eMsg.str()); + } + + if (! result.hasMember(resetStorageResultParamName) + || result[resetStorageResultParamName].getType() + != XmlRpcValue::TypeArray + || ! result.hasMember(resetStorageCountParamName) + || result[resetStorageCountParamName].getType() + != XmlRpcValue::TypeInt) { + std::stringstream eMsg; + eMsg << "XML-RPC method '" + << resetStorageMethodName + << "' returned unexpected value:\n" + << result; + throw XmlRpcMethodResponseException(eMsg.str()); + } +} + diff --git a/campcaster/src/modules/authentication/src/WebAuthenticationClient.h b/campcaster/src/modules/authentication/src/WebAuthenticationClient.h new file mode 100644 index 000000000..a8d8f9c19 --- /dev/null +++ b/campcaster/src/modules/authentication/src/WebAuthenticationClient.h @@ -0,0 +1,297 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef WebAuthenticationClient_h +#define WebAuthenticationClient_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/SessionId.h" +#include "LiveSupport/Authentication/AuthenticationClientInterface.h" + + +namespace LiveSupport { +namespace Authentication { + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An interface to the authentication methods on the php authentication + * server (which is currently the same as the storage server). + * + * This object has to be configured with an XML configuration element + * called webAuthentication. This element contains a child element + * specifying the location of the authentication server. + * + * A webAuthentication configuration element may look like the following: + * + *
    
    + *  <webAuthentication>
    + *      <location
    + *          server="localhost"
    + *          port="80" 
    + *          path="/livesupportStorageServer/xmlrpc/xrLocStor.php"
    + *      />
    + *  </webAuthentication>
    + *  
    + * + * The DTD for the above element is: + * + *
    
    + *  <!ELEMENT webAuthentication (location) >
    + *  <!ELEMENT location EMPTY >
    + *  <!ATTLIST location server   CDATA       #REQUIRED >
    + *  <!ATTLIST location port     NMTOKEN     #REQUIRED >
    + *  <!ATTLIST location path     CDATA       #REQUIRED >
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class WebAuthenticationClient : + virtual public Configurable, + virtual public AuthenticationClientInterface +{ + private: + /** + * The name of the configuration XML elmenent used by + * WebAuthenticationClient + */ + static const std::string configElementNameStr; + + /** + * The name of the authentication server, e.g. + * "myserver.mycompany.com". + */ + std::string storageServerName; + + /** + * The port wher the authentication server is listening + * (default is 80). + */ + int storageServerPort; + + /** + * The path to the authentication server php page. + */ + std::string storageServerPath; + + + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~WebAuthenticationClient(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. + * + * @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 scheduler daemon has already + * been configured, and can not be reconfigured. + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Return the version string from the storage. + * + * @return the version string of the storage. + * @exception XmlRpcException if there is a problem with the XML-RPC + * call. + */ + virtual Ptr::Ref + getVersion(void) throw (XmlRpcException); + + /** + * Login to the authentication server, using the data read from the + * configuration file. + * Returns a new session ID; in case of an error, throws one of three + * types of AuthenticationException. + * Note that an incorrect login or password is considered an error + * and will throw an XmlRpcMethodFaultException. + * + * @param login the login to the server + * @param password the password to the server + * @exception XmlRpcCommunicationException problem with performing + * XML-RPC call + * @exception XmlRpcMethodFaultException XML-RPC method returned + * fault response + * @exception XmlRpcMethodResponseException response from XML-RPC + * method is incorrect + * @return the new session ID + */ + virtual Ptr::Ref + login(const std::string &login, const std::string &password) + throw (XmlRpcException); + + /** + * Logout from the authentication server. + * + * @param sessionId the ID of the session to end + * @exception XmlRpcCommunicationException problem with performing + * XML-RPC call + * @exception XmlRpcMethodFaultException XML-RPC method returned + * fault response + * @exception XmlRpcMethodResponseException response from XML-RPC + * method is incorrect + * @return true if logged out successfully, false if not + */ + virtual void + logout(Ptr::Ref sessionId) + throw (XmlRpcException); + + /** + * Load a `user preferences' item from the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * + * @exception std::invalid_argument + * no such preference key found + * @exception XmlRpcInvalidArgumentException + * bad sessionId argument + * @exception XmlRpcCommunicationException + * problem with performing XML-RPC call + * @exception XmlRpcMethodFaultException + * XML-RPC method returned fault response + * @exception XmlRpcMethodResponseException + * response from XML-RPC method is incorrect + */ + virtual Ptr::Ref + loadPreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException, + std::invalid_argument); + + /** + * Store a `user preferences' item on the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * @param value the (new) value of the item + * + * @exception XmlRpcInvalidArgumentException + * bad sessionId or value argument + * @exception XmlRpcCommunicationException + * problem with performing XML-RPC call + * @exception XmlRpcMethodFaultException + * XML-RPC method returned fault response + * @exception XmlRpcMethodResponseException + * response from XML-RPC method is incorrect + */ + virtual void + savePreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key, + Ptr::Ref value) + throw (XmlRpcException); + + /** + * Delete a `user preferences' item from the server. + * + * @param sessionId the ID of the current session (from login()) + * @param key the name of the item + * + * @exception XmlRpcInvalidArgumentException + * bad sessionId argument + * @exception XmlRpcCommunicationException + * problem with performing XML-RPC call + * @exception XmlRpcMethodFaultException + * XML-RPC method returned fault response + * @exception XmlRpcMethodResponseException + * response from XML-RPC method is incorrect + */ + virtual void + deletePreferencesItem(Ptr::Ref sessionId, + const Glib::ustring & key) + throw (XmlRpcException); + + /** + * Reset the authentication client. + * Invalidates all active session IDs, and resets the list of + * preferences to its initial (empty) state. + * + * @exception XmlRpcException if the server returns an error. + */ + virtual void + reset(void) + throw (XmlRpcException); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Authentication +} // namespace LiveSupport + +#endif // WebAuthenticationClient_h + diff --git a/campcaster/src/modules/authentication/src/WebAuthenticationClientTest.cxx b/campcaster/src/modules/authentication/src/WebAuthenticationClientTest.cxx new file mode 100644 index 000000000..4753875a3 --- /dev/null +++ b/campcaster/src/modules/authentication/src/WebAuthenticationClientTest.cxx @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include +#include + +#include "LiveSupport/Core/SessionId.h" +#include "WebAuthenticationClientTest.h" + + +using namespace std; +using namespace LiveSupport::Core; +using namespace LiveSupport::Authentication; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(WebAuthenticationClientTest); + +/** + * The name of the configuration file for the authentication client factory. + */ +static const std::string configFileName = "webAuthentication.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClientTest :: setUp(void) throw () +{ + try { + xmlpp::DomParser parser; + const xmlpp::Document * document = getConfigDocument(parser, + configFileName); + const xmlpp::Element * root = document->get_root_node(); + + wac.reset(new WebAuthenticationClient()); + wac->configure(*root); + } 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 +WebAuthenticationClientTest :: tearDown(void) throw () +{ + wac.reset(); +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can log on and off. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClientTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref sessionId; + + try { + sessionId = wac->login("Piszkos Fred", "malnaszor"); + CPPUNIT_FAIL("Allowed login with incorrect login and password."); + } catch (XmlRpcException &e) { + } + + sessionId.reset(new SessionId("bad_session_ID")); + try { + wac->logout(sessionId); + CPPUNIT_FAIL("Allowed logout without previous login."); + } catch (XmlRpcException &e) { + } + + try { + sessionId = wac->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + wac->logout(sessionId); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + wac->logout(sessionId); + CPPUNIT_FAIL("Allowed to logout twice."); + } catch (XmlRpcException &e) { + } +} + + +/*------------------------------------------------------------------------------ + * Test the getVersion function + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClientTest :: getVersionTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref version; + + try { + version = wac->getVersion(); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + CPPUNIT_ASSERT(version.get()); +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can save and load user preferences. + *----------------------------------------------------------------------------*/ +void +WebAuthenticationClientTest :: preferencesTest(void) + throw (CPPUNIT_NS::Exception) +{ + try { + wac->reset(); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + Ptr::Ref sessionId; + Ptr::Ref prefValue; + + // check "please log in" error + try { + prefValue = wac->loadPreferencesItem(sessionId, "something"); + CPPUNIT_FAIL("Allowed operation without login."); + } catch (XmlRpcException &e) { + } + + // log in + try { + sessionId = wac->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // check "no such key" error + try { + prefValue = wac->loadPreferencesItem(sessionId, "eye_color"); + CPPUNIT_FAIL("Retrieved non-existent user preferences item"); + } catch (std::invalid_argument &e) { + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // check normal save and load + prefValue.reset(new const Glib::ustring("chjornyje")); + try { + wac->savePreferencesItem(sessionId, "eye_color", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + Ptr::Ref newPrefValue; + try { + newPrefValue = wac->loadPreferencesItem(sessionId, "eye_color"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == *prefValue); + + // try some unicode characters + prefValue.reset(new const Glib::ustring("страстные")); + try { + wac->savePreferencesItem(sessionId, "eye_color", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = wac->loadPreferencesItem(sessionId, "eye_color"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == "страстные"); + + // check another normal save and load ... + prefValue.reset(new const Glib::ustring("ne dobryj")); + try { + wac->savePreferencesItem(sessionId, "hour", prefValue); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // ... but now change session ID in the middle + try { + wac->logout(sessionId); + sessionId = wac->login("root", "q"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = wac->loadPreferencesItem(sessionId, "hour"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(*newPrefValue == *prefValue); + + // check the delete method + try { + wac->deletePreferencesItem(sessionId, "hour"); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + newPrefValue = wac->loadPreferencesItem(sessionId, "hour"); + CPPUNIT_FAIL("Allowed to load preference after it was deleted"); + } catch (std::invalid_argument &e) { + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } + + // and log out + try { + wac->logout(sessionId); + } catch (XmlRpcException &e) { + CPPUNIT_FAIL(e.what()); + } +} + diff --git a/campcaster/src/modules/authentication/src/WebAuthenticationClientTest.h b/campcaster/src/modules/authentication/src/WebAuthenticationClientTest.h new file mode 100644 index 000000000..8bbaa4891 --- /dev/null +++ b/campcaster/src/modules/authentication/src/WebAuthenticationClientTest.h @@ -0,0 +1,135 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef WebAuthenticationClientTest_h +#define WebAuthenticationClientTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/BaseTestMethod.h" + +#include "WebAuthenticationClient.h" + +namespace LiveSupport { +namespace Authentication { + +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the WebAuthenticationClient class. + * + * @author $Author$ + * @version $Revision$ + * @see WebAuthenticationClient + */ +class WebAuthenticationClientTest : public BaseTestMethod +{ + CPPUNIT_TEST_SUITE(WebAuthenticationClientTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(getVersionTest); + CPPUNIT_TEST(preferencesTest); + CPPUNIT_TEST_SUITE_END(); + + private: + /** + * The WebAuthenticationClient instance to test. + */ + Ptr::Ref wac; + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the getVersion() function. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + getVersionTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test saving and load of user preferences. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + preferencesTest(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 Authentication +} // namespace LiveSupport + +#endif // WebAuthenticationClientTest_h + diff --git a/campcaster/src/modules/authentication/tmp/.keepme b/campcaster/src/modules/authentication/tmp/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/authentication/tmp/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/core/bin/autogen.sh b/campcaster/src/modules/core/bin/autogen.sh new file mode 100755 index 000000000..2ba5414df --- /dev/null +++ b/campcaster/src/modules/core/bin/autogen.sh @@ -0,0 +1,95 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="Core" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. +usrdir=`cd $basedir/../../../usr; pwd;` + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +echo " aclocal $ACLOCAL_FLAGS" +cp -f ${configure_ac} ${tmpdir} +cp -f ${etcdir}/acinclude.m4 ${tmpdir} +aclocal $ACLOCAL_FLAGS + +echo " autoheader ${configure_ac}" +autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/core/bin/gen_coverage_data.sh b/campcaster/src/modules/core/bin/gen_coverage_data.sh new file mode 100755 index 000000000..025fd2af1 --- /dev/null +++ b/campcaster/src/modules/core/bin/gen_coverage_data.sh @@ -0,0 +1,80 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script generates code coverage data for the module +#------------------------------------------------------------------------------- +module="Campcaster Core" + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +docdir=$basedir/doc +tmpdir=$basedir/tmp + +usrdir=`cd $basedir/../../../usr; pwd;` + +coverage_report_dir=$docdir/coverage + +raw_coverage_file=$tmpdir/raw_coverage.info +coverage_file=$tmpdir/coverage.info + +lcov=$usrdir/bin/lcov +genhtml=$usrdir/bin/genhtml + + +cd $basedir + +#------------------------------------------------------------------------------- +# Re-configure with covarege collection enabled, compile and run the tests +#------------------------------------------------------------------------------- +$bindir/autogen.sh --enable-coverage +make clean +make check + +#------------------------------------------------------------------------------- +# Generate some symlinks so that the sources are visible from tmpdir +#------------------------------------------------------------------------------- +ln -s $basedir/include $tmpdir/include +ln -s $basedir/src $tmpdir/src + + +#------------------------------------------------------------------------------- +# Use lcov to generate an HTML report on the coverage data +#------------------------------------------------------------------------------- +$lcov -d $tmpdir -c > $raw_coverage_file +$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file +rm -rf $coverage_report_dir +mkdir -p $coverage_report_dir +$genhtml -t "$module" -o $coverage_report_dir $coverage_file + + +#------------------------------------------------------------------------------- +# Clean up +#------------------------------------------------------------------------------- +rm -f $tmpdir/include +rm -f $tmpdir/src diff --git a/campcaster/src/modules/core/configure b/campcaster/src/modules/core/configure new file mode 100755 index 000000000..47e6d5cd0 --- /dev/null +++ b/campcaster/src/modules/core/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen "$@") +fi + +(cd $tmpdir && $configure "$@") + diff --git a/campcaster/src/modules/core/doc/.keepme b/campcaster/src/modules/core/doc/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/core/doc/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/core/doc/doxygen/.keepme b/campcaster/src/modules/core/doc/doxygen/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/core/doc/doxygen/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/core/etc/Makefile.in b/campcaster/src/modules/core/etc/Makefile.in new file mode 100644 index 000000000..d049f5a2d --- /dev/null +++ b/campcaster/src/modules/core/etc/Makefile.in @@ -0,0 +1,240 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f + + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +PACKAGE_NAME = @PACKAGE_NAME@ + +BASE_DIR = @builddir@ +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +COVERAGE_DIR = ${DOC_DIR}/coverage +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp +VAR_DIR = ${BASE_DIR}/var + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_BIN_DIR = ${USR_DIR}/bin +USR_LIB_DIR = ${USR_DIR}/lib +BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 + +GENRB = @GENRB@ +GENRBOPTS = --destdir ${TMP_DIR} \ + --encoding utf-8 \ + --package-name ${PACKAGE_NAME} \ + --strict + +VPATH = ${SRC_DIR} + +BOOST_DATE_TIME_LIB=@BOOST_DATE_TIME_LIB@ + +LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ +LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +CURL_CFLAGS=@CURL_CFLAGS@ +CURL_LIBS=@CURL_LIBS@ + +ICU_CFLAGS=@ICU_CFLAGS@ +ICU_CXXFLAGS=@ICU_CXXFLAGS@ +ICU_LIBS=@ICU_LIBS@ + +TAGLIB_CFLAGS=@TAGLIB_CFLAGS@ +TAGLIB_LIBS=@TAGLIB_LIBS@ + +TEST_RESULTS = ${DOC_DIR}/testResults.xml +# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +TEST_XSLT = ../etc/testResultToHtml.xsl + +CORE_LIB = livesupport_core +CORE_LIB_FILE = ${LIB_DIR}/lib${CORE_LIB}.a +TEST_RUNNER = ${TMP_DIR}/testRunner + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +export LD_LIBRARY_PATH:=${USR_LIB_DIR}:${LD_LIBRARY_PATH} + + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +CPPFLAGS = @CPPFLAGS@ +CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -pedantic -Wall -Wno-long-long \ + ${TAGLIB_CFLAGS} \ + ${LIBXMLPP_CFLAGS} \ + -I${USR_INCLUDE_DIR} \ + -I${BOOST_INCLUDE_DIR} \ + -I${INCLUDE_DIR} -I${TMP_DIR} +LDFLAGS = @LDFLAGS@ -pthread \ + ${CURL_LIBS} \ + ${ICU_LIBS} \ + ${TAGLIB_LIBS} \ + ${LIBXMLPP_LIBS} \ + -L${USR_LIB_DIR} \ + -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +CORE_LIB_OBJS = ${TMP_DIR}/UniqueId.o \ + ${TMP_DIR}/Uuid.o \ + ${TMP_DIR}/Playable.o \ + ${TMP_DIR}/AudioClip.o \ + ${TMP_DIR}/FadeInfo.o \ + ${TMP_DIR}/ScheduleEntry.o \ + ${TMP_DIR}/PlaylistElement.o \ + ${TMP_DIR}/Playlist.o \ + ${TMP_DIR}/TimeConversion.o \ + ${TMP_DIR}/Thread.o \ + ${TMP_DIR}/LocalizedObject.o \ + ${TMP_DIR}/LocalizedConfigurable.o \ + ${TMP_DIR}/Md5.o \ + ${TMP_DIR}/XmlRpcTools.o \ + ${TMP_DIR}/XmlRpcException.o \ + ${TMP_DIR}/BaseTestMethod.o \ + ${TMP_DIR}/SearchCriteria.o \ + ${TMP_DIR}/MetadataType.o \ + ${TMP_DIR}/MetadataTypeContainer.o \ + ${TMP_DIR}/OptionsContainer.o \ + ${TMP_DIR}/FileTools.o \ + ${TMP_DIR}/AsyncState.o \ + ${TMP_DIR}/MetadataConstraint.o \ + ${TMP_DIR}/NumericConstraint.o \ + ${TMP_DIR}/NumericRangeConstraint.o \ + ${TMP_DIR}/EnumerationConstraint.o + +TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ + ${TMP_DIR}/FileToolsTest.o \ + ${TMP_DIR}/UuidTest.o \ + ${TMP_DIR}/UniqueIdTest.o \ + ${TMP_DIR}/AudioClipTest.o \ + ${TMP_DIR}/ScheduleEntryTest.o \ + ${TMP_DIR}/FadeInfoTest.o \ + ${TMP_DIR}/PlaylistElementTest.o \ + ${TMP_DIR}/PlaylistTest.o \ + ${TMP_DIR}/TimeConversionTest.o \ + ${TMP_DIR}/TestRunnable.o \ + ${TMP_DIR}/ThreadTest.o \ + ${TMP_DIR}/LocalizedObjectTest.o \ + ${TMP_DIR}/LocalizedConfigurableTest.o \ + ${TMP_DIR}/Md5Test.o \ + ${TMP_DIR}/XmlRpcToolsTest.o \ + ${TMP_DIR}/SearchCriteriaTest.o \ + ${TMP_DIR}/MetadataTypeContainerTest.o \ + ${TMP_DIR}/AsyncStateTest.o + +TEST_RUNNER_RES = ${TMP_DIR}/${PACKAGE_NAME}_root.res \ + ${TMP_DIR}/${PACKAGE_NAME}_en.res \ + ${TMP_DIR}/${PACKAGE_NAME}_hu.res \ + ${TMP_DIR}/${PACKAGE_NAME}_jp.res + +TEST_RUNNER_LIBS = -l${CORE_LIB} ${ICU_LIBS} \ + -l${BOOST_DATE_TIME_LIB} -lcppunit -ldl -lxmlrpc++ -ltar + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean check install + +all: dir_setup ${CORE_LIB_FILE} + +dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: + ${RM} ${CORE_LIB_OBJS} ${CORE_LIB_FILE} + ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER_RES} ${TEST_RUNNER} + ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + ${RMDIR} ${COVERAGE_DIR}/* + ${RM} ${TEST_RESULTS} + +depclean: clean + +distclean: clean docclean + ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 + +check: ${TEST_RUNNER} ${TEST_RUNNER_RES} + ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} + +install: all + ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/Core + ${CP} ${INCLUDE_DIR}/LiveSupport/Core/*.h \ + ${USR_INCLUDE_DIR}/LiveSupport/Core + ${CP} ${CORE_LIB_FILE} ${USR_LIB_DIR} + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +${CORE_LIB_FILE}: ${CORE_LIB_OBJS} + ${AR} crus $@ $^ + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${TEST_RUNNER}: ${TEST_RUNNER_OBJS} ${CORE_LIB_FILE} + ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} + + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx + ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + +${TMP_DIR}/${PACKAGE_NAME}_%.res : ${VAR_DIR}/%.txt + ${GENRB} ${GENRBOPTS} $^ + diff --git a/campcaster/src/modules/core/etc/acinclude.m4 b/campcaster/src/modules/core/etc/acinclude.m4 new file mode 100644 index 000000000..fa7d7ecee --- /dev/null +++ b/campcaster/src/modules/core/etc/acinclude.m4 @@ -0,0 +1,334 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +dnl----------------------------------------------------------------------------- + +dnl----------------------------------------------------------------------------- +dnl Macro to check for available modules using pkg-conf +dnl +dnl usage: +dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) +dnl +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +dnl +dnl This function was taken from the glade-- project +dnl----------------------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for taglib of sufficient version by looking at taglib-config +dnl +dnl usage: +dnl AC_CHECK_TAGLIB(version, action-if, action-not) +dnl +dnl defines TAGLIB_LIBS, TAGLIB_CFLAGS, see taglib-config man page +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CHECK_TAGLIB], [ + succeeded=no + + if test -z "$TAGLIB_CONFIG"; then + AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, no) + fi + + if test "$TAGLIB_CONFIG" = "no" ; then + echo "*** The taglib-config script could not be found. Make sure it is" + echo "*** in your path, and that taglib is properly installed." + echo "*** Or see http://developer.kde.org/~wheeler/taglib.html" + else + TAGLIB_VERSION=`$TAGLIB_CONFIG --version` + AC_MSG_CHECKING(for taglib >= $1) + VERSION_CHECK=`expr $TAGLIB_VERSION \>\= $1` + if test "$VERSION_CHECK" = "1" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING(TAGLIB_CFLAGS) + TAGLIB_CFLAGS=`$TAGLIB_CONFIG --cflags` + AC_MSG_RESULT($TAGLIB_CFLAGS) + + AC_MSG_CHECKING(TAGLIB_LIBS) + TAGLIB_LIBS=`$TAGLIB_CONFIG --libs` + AC_MSG_RESULT($TAGLIB_LIBS) + else + TAGLIB_CFLAGS="" + TAGLIB_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + ifelse([$3], ,echo "can't find taglib >= $1",) + fi + + AC_SUBST(TAGLIB_CFLAGS) + AC_SUBST(TAGLIB_LIBS) + fi + + if test $succeeded = yes; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , AC_MSG_ERROR([Library requirements (taglib) not met.]), [$3]) + fi +]) + + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for ICU of sufficient version by looking at icu-config +dnl +dnl usage: +dnl AC_CHECK_ICU(version, action-if, action-not) +dnl +dnl defines ICU_LIBS, ICU_CFLAGS, ICU_CXXFLAGS, see icu-config man page +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CHECK_ICU], [ + succeeded=no + + if test -z "$ICU_CONFIG"; then + AC_PATH_PROG(ICU_CONFIG, icu-config, no) + fi + + if test "$ICU_CONFIG" = "no" ; then + echo "*** The icu-config script could not be found. Make sure it is" + echo "*** in your path, and that taglib is properly installed." + echo "*** Or see http://ibm.com/software/globalization/icu/" + else + ICU_VERSION=`$ICU_CONFIG --version` + AC_MSG_CHECKING(for ICU >= $1) + VERSION_CHECK=`expr $ICU_VERSION \>\= $1` + if test "$VERSION_CHECK" = "1" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING(ICU_CFLAGS) + ICU_CFLAGS=`$ICU_CONFIG --cflags` + AC_MSG_RESULT($ICU_CFLAGS) + + AC_MSG_CHECKING(ICU_CXXFLAGS) + ICU_CXXFLAGS=`$ICU_CONFIG --cxxflags` + AC_MSG_RESULT($ICU_CXXFLAGS) + + AC_MSG_CHECKING(ICU_LIBS) + ICU_LIBS=`$ICU_CONFIG --ldflags` + AC_MSG_RESULT($ICU_LIBS) + else + ICU_CFLAGS="" + ICU_CXXFLAGS="" + ICU_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + ifelse([$3], ,echo "can't find ICU >= $1",) + fi + + AC_SUBST(ICU_CFLAGS) + AC_SUBST(ICU_CXXFLAGS) + AC_SUBST(ICU_LIBS) + fi + + if test $succeeded = yes; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , AC_MSG_ERROR([Library requirements (ICU) not met.]), [$3]) + fi +]) + + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for C++ namespaces +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +dnl +dnl usage: +dnl If the compiler can prevent names clashes using namespaces, +dnl define HAVE_NAMESPACES. +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CXX_NAMESPACES], +[AC_CACHE_CHECK(whether the compiler implements namespaces, +ac_cv_cxx_namespaces, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], + [using namespace Outer::Inner; return i;], + ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) + AC_LANG_RESTORE +]) +if test "$ac_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) +fi +]) + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for the boost datetime library. +dnl for more information on boost, see http://www.boost.org/ +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ax_boost_date-time.html +dnl +dnl usage: +dnl This macro checks to see if the Boost.DateTime library is installed. +dnl It also attempts to guess the currect library name using several attempts. +dnl It tries to build the library name using a user supplied name or suffix +dnl and then just the raw library. +dnl +dnl If the library is found, HAVE_BOOST_DATE_TIME is defined and +dnl BOOST_DATE_TIME_LIB is set to the name of the library. +dnl +dnl This macro calls AC_SUBST(BOOST_DATE_TIME_LIB). +dnl----------------------------------------------------------------------------- +AC_DEFUN([AX_BOOST_DATE_TIME], +[AC_REQUIRE([AC_CXX_NAMESPACES])dnl +AC_CACHE_CHECK(whether the Boost::DateTime library is available, +ax_cv_boost_date_time, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include ]], + [[using namespace boost::gregorian; date d(2002,Jan,10); return 0;]]), + ax_cv_boost_date_time=yes, ax_cv_boost_date_time=no) + AC_LANG_RESTORE +]) +if test "$ax_cv_boost_date_time" = yes; then + AC_DEFINE(HAVE_BOOST_DATE_TIME,,[define if the Boost::DateTime library is available]) + dnl Now determine the appropriate file names + AC_ARG_WITH([boost-date-time],AS_HELP_STRING([--with-boost-date-time], + [specify the boost date-time library or suffix to use]), + [if test "x$with_boost_date_time" != "xno"; then + ax_date_time_lib=$with_boost_date_time + ax_boost_date_time_lib=boost_date_time-$with_boost_date_time + fi]) + for ax_lib in $ax_date_time_lib $ax_boost_date_time_lib boost_date_time; do + AC_CHECK_LIB($ax_lib, main, [BOOST_DATE_TIME_LIB=$ax_lib break]) + done + AC_SUBST(BOOST_DATE_TIME_LIB) +fi +])dnl + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for curl of sufficient version by looking at curl-config +dnl +dnl usage: +dnl AC_CHECK_CURL(version, action-if, action-not) +dnl +dnl defines CURL_LIBS, CURL_CFLAGS, see curl-config man page +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CHECK_CURL], [ + succeeded=no + + if test -z "$CURL_CONFIG"; then + AC_PATH_PROG(CURL_CONFIG, curl-config, no) + fi + + if test "$CURL_CONFIG" = "no" ; then + echo "*** The curl-config script could not be found. Make sure it is" + echo "*** in your path, and that curl is properly installed." + echo "*** Or see http://curl.haxx.se/" + else + dnl curl-config --version returns "libcurl ", thus cut the number + CURL_VERSION=`$CURL_CONFIG --version | cut -d" " -f2` + AC_MSG_CHECKING(for curl >= $1) + VERSION_CHECK=`expr $CURL_VERSION \>\= $1` + if test "$VERSION_CHECK" = "1" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING(CURL_CFLAGS) + CURL_CFLAGS=`$CURL_CONFIG --cflags` + AC_MSG_RESULT($CURL_CFLAGS) + + AC_MSG_CHECKING(CURL_LIBS) + CURL_LIBS=`$CURL_CONFIG --libs` + AC_MSG_RESULT($CURL_LIBS) + else + CURL_CFLAGS="" + CURL_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + ifelse([$3], ,echo "can't find curl >= $1",) + fi + + AC_SUBST(CURL_CFLAGS) + AC_SUBST(CURL_LIBS) + fi + + if test $succeeded = yes; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , AC_MSG_ERROR([Library requirements (curl) not met.]), [$3]) + fi +]) + + + diff --git a/campcaster/src/modules/core/etc/audioClip.xml b/campcaster/src/modules/core/etc/audioClip.xml new file mode 100644 index 000000000..7bb083628 --- /dev/null +++ b/campcaster/src/modules/core/etc/audioClip.xml @@ -0,0 +1,25 @@ + + + + File Title txt + Alternative File Title ín sőmé %$#@* LÁNGŰAGÉ + Keywords: qwe, asd, zcx + Abstract txt + 2004-05-21 + 2004-05-22 + 2004-05-23 + 2004-05-24 + 2004-05-25 + 00:18:30.000000 + online + Spatial Coverage + Temporal Coverage + + diff --git a/campcaster/src/modules/core/etc/configure.ac b/campcaster/src/modules/core/etc/configure.ac new file mode 100644 index 000000000..b677fb363 --- /dev/null +++ b/campcaster/src/modules/core/etc/configure.ac @@ -0,0 +1,136 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(Core, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../src/UniqueId.cxx) + +AC_CONFIG_HEADERS(configure.h) +AC_PROG_CXX() + +AC_CHECK_TYPES([uint64_t, uint32_t, uint16_t, uint8_t], + HAVE_INTEGRAL_TYPES="yes", HAVE_INTEGRAL_TYPES="no") +if test "x${HAVE_INTEGRAL_TYPES}" = "xno" ; then + AC_MSG_ERROR([a required integral type is not available]) +fi + +AC_CHECK_HEADERS(getopt.h sys/time.h time.h sys/types.h pwd.h errno.h stdint.h) + + +dnl----------------------------------------------------------------------------- +dnl specify whether debug info should be compiled into the executable +dnl----------------------------------------------------------------------------- +AC_SUBST(CXXFLAGS) + +AC_ARG_ENABLE([debug], + AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), + [], + [enable_debug=no]) + +if test "x${enable_debug}" = "xyes"; then + CXXFLAGS="-g -O0" +else + CXXFLAGS="-O3" +fi + +AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the pkg-config path +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([pkg-config-path], + AC_HELP_STRING([--with-pkg-config-path], + [use the pkg-config path (prefix/lib/pkgconfig)]), + [PKG_CONFIG_PATH=${withval}], + [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig]) + +AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) + +export PKG_CONFIG_PATH + +export PATH=${prefix}/bin:${PATH} + + +AX_BOOST_DATE_TIME() +if test "$BOOST_DATE_TIME_LIB" = "" ; then + BOOST_DATE_TIME_LIB=boost_date_time-gcc + AC_SUBST(BOOST_DATE_TIME_LIB) +fi +AC_MSG_RESULT([checking BOOST_DATE_TIME_LIB... ${BOOST_DATE_TIME_LIB}]) + +PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) +AC_SUBST(LIBXMLPP_CFLAGS) +AC_SUBST(LIBXMLPP_LIBS) + +AC_CHECK_CURL(7.12.3) +AC_SUBST(CURL_CFLAGS) +AC_SUBST(CURL_LIBS) + +AC_CHECK_TAGLIB(1.3.1) +AC_SUBST(TAGLIB_CFLAGS) +AC_SUBST(TAGLIB_LIBS) + +AC_CHECK_ICU(3.0) +AC_SUBST(ICU_CFLAGS) +AC_SUBST(ICU_CXXFLAGS) +AC_SUBST(ICU_LIBS) + +AC_PATH_PROG(GENRB, genrb) +AC_SUBST(GENRB) + + +dnl----------------------------------------------------------------------------- +dnl enable compilaton for code coverage data +dnl----------------------------------------------------------------------------- +AC_SUBST(COVERAGE_CXXFLAGS) + +AC_ARG_ENABLE( coverage, +[ --enable-coverage enable code coverage data generaton (no) ], + ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) + +if test "x${ENABLE_COVERAGE}" == "xyes" ; then + COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" + AC_MSG_RESULT([compiling in code coverage mode]) +else + AC_MSG_RESULT([not compiling in code coverage mode]) +fi + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/core/etc/doxygen.config b/campcaster/src/modules/core/etc/doxygen.config new file mode 100644 index 000000000..bb7b13cec --- /dev/null +++ b/campcaster/src/modules/core/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Campcaster + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = include src + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/core/etc/fadeInfo.xml b/campcaster/src/modules/core/etc/fadeInfo.xml new file mode 100644 index 000000000..a10bad613 --- /dev/null +++ b/campcaster/src/modules/core/etc/fadeInfo.xml @@ -0,0 +1,10 @@ + + + + + +]> + diff --git a/campcaster/src/modules/core/etc/metadataType.xml b/campcaster/src/modules/core/etc/metadataType.xml new file mode 100644 index 000000000..2a3ded6fb --- /dev/null +++ b/campcaster/src/modules/core/etc/metadataType.xml @@ -0,0 +1,17 @@ + + + + + + + +]> + + + diff --git a/campcaster/src/modules/core/etc/metadataTypeContainer.xml b/campcaster/src/modules/core/etc/metadataTypeContainer.xml new file mode 100644 index 000000000..e0f16dfb5 --- /dev/null +++ b/campcaster/src/modules/core/etc/metadataTypeContainer.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + +]> + + + + + + + + 0 + 3000 + + + + + + + mp3 + mpeg + ogg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/campcaster/src/modules/core/etc/playlist.xml b/campcaster/src/modules/core/etc/playlist.xml new file mode 100644 index 000000000..c7c31c445 --- /dev/null +++ b/campcaster/src/modules/core/etc/playlist.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + diff --git a/campcaster/src/modules/core/etc/playlistElement.xml b/campcaster/src/modules/core/etc/playlistElement.xml new file mode 100644 index 000000000..543b3ec17 --- /dev/null +++ b/campcaster/src/modules/core/etc/playlistElement.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + diff --git a/campcaster/src/modules/core/etc/resourceBundle.xml b/campcaster/src/modules/core/etc/resourceBundle.xml new file mode 100644 index 000000000..2af0d220f --- /dev/null +++ b/campcaster/src/modules/core/etc/resourceBundle.xml @@ -0,0 +1,11 @@ + + + + + +]> + diff --git a/campcaster/src/modules/core/etc/testResultToHtml.xsl b/campcaster/src/modules/core/etc/testResultToHtml.xsl new file mode 100644 index 000000000..b70f32d45 --- /dev/null +++ b/campcaster/src/modules/core/etc/testResultToHtml.xsl @@ -0,0 +1,63 @@ + + + + + + + Campcaster unit test results + + +

    Preface

    +This document is part of the +Campcaster +project, Copyright © 2004 Media +Development Loan Fund, under the GNU +GPL. +
    +This is an automatically generated document. +

    Scope

    +This document contains the generated unit test results for the +Campcaster project. +

    Summary

    + + + + + + + + + + + + + + + + + + +
    Total number of tests:
    Tests passed:
    Tests failed:
    Test errors:
    +
    +

    Tests

    + + + + + + + + + + + + + +
    test nametest status
    failedpassed
    + + +
    + +
    + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/AsyncState.h b/campcaster/src/modules/core/include/LiveSupport/Core/AsyncState.h new file mode 100644 index 000000000..f35c1de9c --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/AsyncState.h @@ -0,0 +1,220 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_AsyncState_h +#define LiveSupport_Core_AsyncState_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#include +#include "LiveSupport/Core/Ptr.h" + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing the state of an asynchronous process. + * + * It provides some constants, plus conversion methods to and from + * strings (used when sending through XML-RPC methods). + * + * There are two sets of conversion methods, because the states have + * different names in the storage server for backup-related stuff and + * general transport stuff. + * + * @author $Author$ + * @version $Revision$ + */ +class AsyncState +{ + private: + + /** + * The possible states of an asynchronous process. + */ + typedef enum { innerInitState, + innerPendingState, + innerFinishedState, + innerClosedState, + innerFailedState, + innerInvalidState } InnerState; + /** + * The value of this state. + */ + InnerState value; + + /** + * A private constructor. + */ + AsyncState(InnerState state) throw () + : value(state) + { + } + + + public: + + /** + * Default constructor; sets the state to "invalid". + */ + AsyncState(void) throw () + : value(innerInvalidState) + { + } + + /** + * Constant instance: init. + */ + static const AsyncState initState; + + /** + * Constant instance: pending. + */ + static const AsyncState pendingState; + + /** + * Constant instance: finished. + */ + static const AsyncState finishedState; + + /** + * Constant instance: closed. + */ + static const AsyncState closedState; + + /** + * Constant instance: failed. + */ + static const AsyncState failedState; + + /** + * Constant instance: invalid. + */ + static const AsyncState invalidState; + + /** + * Construct from a transport string. + * + * @param transportString a string used by the getTransportInfo + * method of the storage server. + * @return an AsyncState with the corresponding value. + */ + static AsyncState + fromTransportString(const std::string & transportString) + throw (); + + /** + * Construct from a backup string. + * + * @param backupString a string used by the xxxxBackupCheck + * method of the storage server. + * @return an AsyncState with the corresponding value. + */ + static AsyncState + fromBackupString(const std::string & backupString) + throw (); + + /** + * Convert to a transport string. + * + * @return a string used by the getTransportInfo method of the + * storage server. + */ + Ptr::Ref + toTransportString(void) const throw (); + + /** + * Convert to a backup string. + * + * @return a string used by the xxxxBackupCheck method of the + * storage server. + */ + Ptr::Ref + toBackupString(void) const throw (); + + /** + * Check for equality. + * + * @param other the other AsyncState to compare with. + * @return true if the two states are equal. + */ + bool + operator==(const AsyncState & other) const throw () + { + return (value == other.value); + } + + /** + * Check for inequality. + * + * @param other the other AsyncState to compare with. + * @return true if the two states are not equal. + */ + bool + operator!=(const AsyncState & other) const throw () + { + return (value != other.value); + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +/** + * Print to an ostream. + * + * @param ostream the ostream to print to. + * @param state the AsyncState to print. + * @return a reference to the same ostream object. + */ +std::ostream& +operator<<(std::ostream& ostream, const LiveSupport::Core::AsyncState state) + throw (); + +#endif // LiveSupport_Core_AsyncState_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/AudioClip.h b/campcaster/src/modules/core/include/LiveSupport/Core/AudioClip.h new file mode 100644 index 000000000..75c7ec0e4 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/AudioClip.h @@ -0,0 +1,619 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_AudioClip_h +#define LiveSupport_Core_AudioClip_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/UniqueId.h" +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/Playable.h" +#include "LiveSupport/Core/MetadataTypeContainer.h" + + +namespace LiveSupport { +namespace Core { + +using namespace std; +using namespace boost::posix_time; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing an audio clip. + * AudioClips contain the basic information about the audio clip. + * An AudioClip is contained in a PlaylistElement, which provides the + * relative offset and fade in/fade out information. A PlaylistElement, + * in turn, is contained in a Playlist. + * + * This object has to be configured with an XML configuration element + * called audioClip. This may look like the following: + * + *
    
    + *  <audioClip id="1" 
    + *             title="Name of the Song"
    + *             playlength="00:18:30.000000"
    + *             uri="file:var/test1.mp3" >
    + *         <metadata
    + *                   xmlns="http://mdlf.org/livesupport/elements/1.0/"
    + *                   xmlns:ls="http://mdlf.org/livesupport/elements/1.0/"
    + *                   xmlns:dc="http://purl.org/dc/elements/1.1/"
    + *                   xmlns:dcterms="http://purl.org/dc/terms/"
    + *                   xmlns:xml="http://www.w3.org/XML/1998/namespace" >
    + *             <dc:title  >File Title txt</dc:title>
    + *             <dcterms:extent  >00:02:30.000000</dcterms:extent>
    + *             ...
    + *         </metadata>
    + *  </audioClip>
    + *  
    + * + * The metadata element is optional. The configure() method + * sets only those fields which had not been set previously: e.g., if we set + * some or all fields of the AudioClip in the constructor, then these fields + * in the XML element will be ignored by configure(). + * The title attribute and the <dc:title> + * element set the same field; if both are present, the title is set from + * the attribute and the element is ignored.. + * The same is true for the playlength attribute and the + * <dcterms:extent> element. + * It is required that by the end of the configure() method, the playlength + * is set somehow (from a constructor, the attribute or the element). + * If the title is not set by the end of the configure() method, it is then + * set to the empty string. + * Embedded XML elements are currently ignored: e.g., + *
      <group>
    + *      <member1>value1</member1>
    + *      <member2>value2</member2>
    + *  </group>
    + * produces a single metadata field group with an empty value, + * and ignores member1 and member2. + * TODO: fix this? + * + * The URI is not normally part of the XML element; it's only included + * as an optional attribute for testing purposes. + * + * The DTD for the above element is: + * + *
    
    + *  <!ELEMENT audioClip (metadata?) >
    + *  <!ATTLIST audioClip  id           NMTOKEN     #IMPLIED  >
    + *  <!ATTLIST audioClip  title        CDATA       #IMPLIED  >
    + *  <!ATTLIST audioClip  playlength   NMTOKEN     #IMPLIED  >
    + *  <!ATTLIST audioClip  uri          CDATA       #IMPLIED   >
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class AudioClip : public Configurable, + public Playable +{ + private: + /** + * The name of the configuration XML elmenent used by AudioClip. + */ + static const std::string configElementNameStr; + + /** + * The unique id of the audio clip. + */ + Ptr::Ref id; + + /** + * The title of the audio clip. + */ + Ptr::Ref title; + + /** + * The playling length of the audio clip. + */ + Ptr::Ref playlength; + + /** + * The location of the binary audio clip sound file. + */ + Ptr::Ref uri; + + /** + * The identifying token returned by the storage server. + */ + Ptr::Ref token; + + /** + * This audio clip in XML format. + */ + Ptr::Ref xmlAudioClip; + + /** + * Set the value of a metadata field in this audio clip. + * + * @param value the new value of the metadata field. + * @param name the name of the metadata field (without prefix) + * @param prefix the prefix of the metadata field + * @exception std::invalid_argument if the key is dcterms:extent, + * but the value is not a valid ISO-8601 time + */ + virtual void + setMetadata(Ptr::Ref value, + const std::string &name, const std::string &prefix) + throw (std::invalid_argument); + + /** + * Convert a time_duration to string, in format HH:MM:SS.ssssss. + */ + std::string + toFixedString(Ptr::Ref time) const throw () + { + if (time->fractional_seconds()) { + return to_simple_string(*time); + } else { + return to_simple_string(*time) + ".000000"; + } + } + + /** + * Set the playlength member of this audio clip. + * + * @param timeString the new playlength + * @exception std::invalid_argument if the argument is not + * a valid ISO-8601 time + */ + void + setPlaylength(Ptr::Ref timeString) + throw (std::invalid_argument); + + + public: + /** + * Copy constructor. + * + * Copies the pointers for all fields except xmlAudioClip. + * These fields are immutable; if you want to modify them, call the + * appropriate setter function with (a pointer to) an object + * with the new value. + * + * @param otherAudioClip the audio clip to be copied + */ + AudioClip(const AudioClip & otherAudioClip) throw (); + + /** + * Default constructor. + * + * This constructor creates an AudioClip with a null pointer + * for all (ID, playlength, title, uri) fields! It is meant for + * internal use only. If you want to upload a new audio clip to + * the storage, use the constructor with (title, playlength, uri) + * arguments. + */ + AudioClip(void) throw () + : Playable(AudioClipType) + { + } + + /** + * Create an audio clip by specifying its unique ID. + * The other fields will be filled in by configure(). + * + * This constructor creates an AudioClip with a null pointer + * for all fields except the ID! It is meant for internal use only. + * If you want to upload a new audio clip to the storage, + * use the constructor with (title, playlength, uri) arguments. + * + * @param id the id of the audio clip. + */ + AudioClip(Ptr::Ref id) throw () + : Playable(AudioClipType) + { + this->id = id; + } + + /** + * Create an audio clip by specifying all details, except + * for the title. The title is set to the empty string. + * + * This is used for testing purposes. + * If you want to upload a new audio clip to the storage, + * use the constructor with (title, playlength, uri) arguments. + * + * @param id the id of the audio clip. + * @param playlength the playing length of the audio clip. + * @param uri the location of the sound file corresponding to + * this audio clip object (optional) + */ + AudioClip(Ptr::Ref id, + Ptr::Ref playlength, + Ptr::Ref uri = Ptr::Ref()) + throw (); + + /** + * Create an audio clip by specifying all details. + * + * This is used for testing purposes. + * If you want to upload a new audio clip to the storage, + * use the constructor with (title, playlength, uri) arguments. + * + * @param id the id of the audio clip. + * @param playlength the playing length of the audio clip. + * @param uri the location of the sound file corresponding to + * this audio clip object (optional) + */ + AudioClip(Ptr::Ref id, + Ptr::Ref title, + Ptr::Ref playlength, + Ptr::Ref uri = Ptr::Ref()) + throw (); + + /** + * Create an audio clip by specifying all details which need + * to be set by the user. + * The ID is left blank (i.e., a null pointer), + * and can be set later using setId(). + * + * This constructor is used when a new audio clip is uploaded to + * the storage. For example: + *
    
    +         *  Ptr::Ref
    +         *          storageClientFactory = StorageClientFactory::getInstance();
    +         *  Ptr::Ref
    +         *          storageClient = storageClientFactory->getStorageClient();
    +         *  Ptr::Ref
    +         *          audioClip(new AudioClip(title, playlength, uri));
    +         *  storageClient->storeAudioClip(sessionId, audioClip);
    +         *  std::cerr << audioClip->getId()->getId();   // has been set by the
    +         *                                              //   storage client
    +         *  
    + * + * @see StorageClient::StorageClientFactory + * @see StorageClient::StorageClientInterface + * + * @param playlength the playing length of the audio clip. + * @param title the title of the audio clip. + * @param uri the location of the sound file corresponding to + * this audio clip object. + */ + AudioClip(Ptr::Ref title, + Ptr::Ref playlength, + Ptr::Ref uri) + throw (); + + + /** + * Convert the audio clip to an XmlRpcValue (marshalling). + * + * @return an XmlRpcValue struct, containing a + * field named audioClip, with value of type string, + * which contains an XML document representing the audio clip. + */ + operator XmlRpc::XmlRpcValue() const + throw (); + + /** + * Construct an audio clip from an XmlRpcValue (demarshalling). + * + * @param xmlRpcValue an XmlRpcValue struct, containing a + * field named audioClip, with value of type string, + * which contains an XML document, the root node of which + * can be passed to the configure() method. + * @exception std::invalid_argument if the argument is invalid + */ + AudioClip(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~AudioClip(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 + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Return the id of the audio clip. + * + * @return the unique id of the audio clip. + */ + virtual Ptr::Ref + getId(void) const throw () + { + return id; + } + + /** + * Set the ID of the object. This is only allowed if the ID was + * a null pointer; once the ID is set, it can not be changed. + * + * @param the new unique id of the audio clip. + */ + void + setId(Ptr::Ref id) throw (std::invalid_argument) + { + if (!this->id) { + this->id = id; + } + else { + throw std::invalid_argument("can not set the ID twice"); + } + } + + /** + * Return the total playing length for this audio clip. + * + * @return the playing length in microseconds. + */ + virtual Ptr::Ref + getPlaylength(void) const throw () + { + return playlength; + } + + /** + * Return the URI of the binary sound file of this audio clip, + * which can be played by the audio player. + * + * @return the URI. + */ + virtual Ptr::Ref + getUri(void) const throw () + { + return uri; + } + + /** + * Set the URI of the binary sound file of this audio clip, + * which can be played by the audio player. + * + * @param uri the new URI. + */ + virtual void + setUri(Ptr::Ref uri) throw () + { + this->uri = uri; + } + + /** + * Return the token which is used to identify this audio clip + * to the storage server. + * + * @return the token. + */ + virtual Ptr::Ref + getToken(void) const throw () + { + return token; + } + + /** + * Set the token which is used to identify this audio clip + * to the storage server. + * + * @param token a new token. + */ + virtual void + setToken(Ptr::Ref token) + throw () + { + this->token = token; + } + + + /** + * Return the title of this audio clip. + * + * @return the title. + */ + virtual Ptr::Ref + getTitle(void) const throw () + { + return title; + } + + /** + * Set the title of this audio clip. + * + * @param title a new title. + */ + virtual void + setTitle(Ptr::Ref title) + throw (); + + /** + * Return the value of a metadata field in this audio clip. + * If the audio clip does not have this metadata field, returns a null + * pointer. + * + * @param key the name of the metadata field + * @return the value of the metadata field; 0 if there is + * no such field; + */ + virtual Ptr::Ref + getMetadata(const std::string &key) const + throw (); + + /** + * Set the value of a metadata field in this audio clip. + * + * @param value the new value of the metadata field. + * @param key the name of the metadata field + * @exception std::invalid_argument if the key is dcterms:extent, + * but the value is not a valid ISO-8601 time + */ + virtual void + setMetadata(Ptr::Ref value, + const std::string &key) + throw (std::invalid_argument); + + + /** + * Return a partial XML representation of this audio clip or playlist. + * + * This is a string containing a single or + * XML element, with minimal information (ID, title, playlength) + * only, without an XML header or any other metadata. + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * @return a string representation of the audio clip as an XML element + */ + virtual Ptr::Ref + getXmlElementString(void) const throw (); + + + /** + * Return a complete XML representation of this audio clip. + * + * This is a string containing a an XML document with an + * root node, together with an XML header. + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * The audio clip or playlist can be completely reconstructed from + * the string returned by this method: + *
    
    +         *  Ptr::Ref         audioClip1 = ... something ...;
    +         *  Ptr::Ref  parser;
    +         *  parser->parse_memory(*audioClip1->getXmlDocumentString());
    +         *  const xmlpp::Document*      document = parser->get_document();
    +         *  const xmlpp::Element*       root     = document->get_root_node();
    +         *  Ptr::Ref         audioClip2(new AudioClip());
    +         *  audioClip2->configure(*root);
    +         *  
    + * results in two identical audio clips (and the same works for + * playlists, too). + * + * The XML document has the (pseudo-) DTD + *
    
    +         *  <!ELEMENT audioClip (metadata) >
    +         *  <!ATTLIST audioClip  id           NMTOKEN     #REQUIRED  >
    +         *
    +         *  <!ELEMENT metadata (dcterms:extent, dc:title, (ANY)*) >
    +         *  <!ELEMENT dcterms:extent (NMTOKEN) >
    +         *  <!ELEMENT dc:title       (CDATA) >
    +         *  
    + * + * If the audio clip has no metadata at all (this is possible if + * it was created by the default constructor or the constructor + * which takes a unique ID only), a null pointer is returned. + * + * @return a string representation of the audio clip as an XML document + */ + virtual Ptr::Ref + getXmlDocumentString(void) const throw (); + + + /** + * Read the metadata contained in the id3v2 tags of the mp3 sound + * file. If no id3v2 tags are found, the file is searched for other + * (id3v1, APE, XiphComment) tags. + * + * The tags are processed and translated into Dublin Core + * metadata fields using the MetadataTypeContainer object. + * + * @param metadataTypes contains a list of all supported + * metadata types. + * @exception std::invalid_argument if the AudioClip instance does not + * have a uri field, or the file name contained in the uri + * field is invalid. + */ + void + readTag(Ptr::Ref metadataTypes) + throw (std::invalid_argument); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + + /** + * Auxilliary method used by setMetadata() and getMetadata(). + */ + void + separateNameAndNameSpace(const std::string & key, + std::string & name, + std::string & nameSpace) + throw (); + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_AudioClip_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/BaseTestMethod.h b/campcaster/src/modules/core/include/LiveSupport/Core/BaseTestMethod.h new file mode 100644 index 000000000..48f252c39 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/BaseTestMethod.h @@ -0,0 +1,125 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_BaseTestMethod_h +#define LiveSupport_Core_BaseTestMethod_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A base class for the test methods. + * Subclass this class for the methods that use configuration files. + * This class gives helpers to access the configuration files + * from various locations (~/.campcaster, ./etc) + * + * @author $Author$ + * @version $Revision$ + */ +class BaseTestMethod : public CPPUNIT_NS::TestFixture +{ + private: + /** + * Get the current working directory. + * + * @return the current working directory. + */ + static std::string + getCwd(void) throw (); + + public: + /** + * Return the full path for a configuration file. + * + * @param configFileName the name of the configuration file. + * @return the full path of the configuration file, found in the + * appropriate directory. + * @exception std::invalid_argument if the specified config file + * does not exist. + */ + static std::string + getConfigFile(const std::string configFileName) + throw (std::invalid_argument); + + /** + * Helper function to return an XML Document object based on + * a config file name. + * First, the proper location of the config file is found. + * + * @param parser the XML DOM parser to use for parsing. + * @param configFileName the name of the configuration file. + * @return an XML document, containing the contents of the + * config file + * @exception std::invalid_argument if the configuration file + * could not be found + * @exception std::exception on parsing errors. + */ + static const xmlpp::Document * + getConfigDocument(xmlpp::DomParser & parser, + const std::string configFileName) + throw (std::invalid_argument, + std::exception); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_BaseTestMethod_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Configurable.h b/campcaster/src/modules/core/include/LiveSupport/Core/Configurable.h new file mode 100644 index 000000000..4508940f9 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Configurable.h @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Configurable_h +#define LiveSupport_Core_Configurable_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An interface marking a class configurable by an XML element. + * + * @author $Author$ + * @version $Revision$ + */ +class Configurable +{ + public: + /** + * 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) + = 0; + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~Configurable(void) throw () + { + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_Configurable_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/FadeInfo.h b/campcaster/src/modules/core/include/LiveSupport/Core/FadeInfo.h new file mode 100644 index 000000000..37dae5cee --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/FadeInfo.h @@ -0,0 +1,264 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_FadeInfo_h +#define LiveSupport_Core_FadeInfo_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/UniqueId.h" +#include "LiveSupport/Core/Configurable.h" + + +namespace LiveSupport { +namespace Core { + +using namespace std; +using namespace boost::posix_time; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing fade in / fade out information of a playlist element. + * This is contained in a PlaylistElement, a list of which, in turn, is + * contained in a Playlist. + * + * This object has to be configured with an XML configuration element + * called fadeInfo. This may look like the following: + * + *
    
    + *  <fadeInfo id="9901" 
    + *            fadeIn="00:00:02.000000"
    + *            fadeOut="00:00:01.500000" >
    + *  </fadeInfo>
    + *  
    + * + * The DTD for the above element is: + * + *
    
    + *  <!ELEMENT fadeInfo EMPTY >
    + *  <!ATTLIST fadeInfo id         NMTOKEN     #REQUIRED  >
    + *  <!ATTLIST fadeInfo fadeIn     NMTOKEN     #REQUIRED  >
    + *  <!ATTLIST fadeInfo fadeIn     NMTOKEN     #REQUIRED  >
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class FadeInfo : public Configurable +{ + private: + /** + * The name of the configuration XML elmenent used by FadeInfo. + */ + static const std::string configElementNameStr; + + /** + * The unique id of the fade info. + */ + Ptr::Ref id; + + /** + * The length of fade in period. + */ + Ptr::Ref fadeIn; + + /** + * The length of fade out period. + */ + Ptr::Ref fadeOut; + + /** + * Convert a time_duration to string, in format HH:MM:SS.ssssss. + */ + std::string + toFixedString(Ptr::Ref time) const throw () + { + if (time->fractional_seconds()) { + return to_simple_string(*time); + } else { + return to_simple_string(*time) + ".000000"; + } + } + + + public: + /** + * Default constructor. + */ + FadeInfo(void) throw () + { + } + + /** + * Create a fade info instance by specifying all details. + * This is used for testing purposes. + * + * @param id the id of the fade info. + * @param fadeIn the length of the fade in period. + * @param fadeOut the length of the fade in period. + */ + FadeInfo(Ptr::Ref id, + Ptr::Ref fadeIn, + Ptr::Ref fadeOut) throw() + { + this->id = id; + this->fadeIn = fadeIn; + this->fadeOut = fadeOut; + } + + /** + * Create a fade info instance by specifying the fade in and fade out. + * + * @param fadeIn the length of the fade in period. + * @param fadeOut the length of the fade in period. + */ + FadeInfo(Ptr::Ref fadeIn, + Ptr::Ref fadeOut) throw() + { + this->id = UniqueId::generateId(); + this->fadeIn = fadeIn; + this->fadeOut = fadeOut; + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~FadeInfo(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 + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Return the id of the fade info instance. + * + * @return the unique id of the fade info instance. + */ + Ptr::Ref + getId(void) const throw () + { + return id; + } + + /** + * Return the length of the fade in period. + * + * @return the length of the fade in period, in microseconds. + */ + Ptr::Ref + getFadeIn(void) const throw () + { + return fadeIn; + } + + /** + * Return the length of the fade in period. + * + * @return the length of the fade in period, in microseconds. + */ + Ptr::Ref + getFadeOut(void) const throw () + { + return fadeOut; + } + + /** + * Return an XML representation of this fadeInfo element. + * + * This is a string containing a single + * XML element, which is empty, and has a fadeIn and a fadeOut + * argument (of format hh:mm:ss.ssssss). + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * @return a string representation of the audio clip as an XML element + */ + Ptr::Ref + getXmlElementString(void) throw (); + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_FadeInfo_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/FileTools.h b/campcaster/src/modules/core/include/LiveSupport/Core/FileTools.h new file mode 100644 index 000000000..df0fac52d --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/FileTools.h @@ -0,0 +1,157 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author: fgerlits $ + Version : $Revision$ + Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/src/modules/core/include/LiveSupport/Core/FileTools.h $ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_FileTools_h +#define LiveSupport_Core_FileTools_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Ptr.h" + + +namespace LiveSupport { +namespace Core { + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A collection of tools for handling files and URLs. + * + * @author $Author: fgerlits $ + * @version $Revision$ + */ +class FileTools +{ + public: + /** + * Copy the contents of a URL to a local file. + * + * @param url the URL to read. + * @param path the local path where the file is saved. + * @exception std::runtime_error on errors. + */ + static void + copyUrlToFile(const std::string & url, + const std::string & path) + throw (std::runtime_error); + + /** + * Upload the contents of a local file to a writable URL. + * + * @param path the local path where the file is. + * @param url the URL to write. + * @exception std::runtime_error on errors. + */ + static void + copyFileToUrl(const std::string & path, + const std::string & url) + throw (std::runtime_error); + + /** + * Generate a temporary file name. + * + * @return a temporary file name. + */ + static const std::string + tempnam(void) throw (); + + /** + * Append a file to an existing tarball. + * + * @param tarFileName the name of the existing tar file + * @param newFileRealName the name of the new file to append + * @param newFileInTarball the name of the new file in the tarball + * @exception std::runtime_error on file / tarball handling issues. + */ + static void + appendFileToTarball(const std::string & tarFileName, + const std::string & newFileRealName, + const std::string & newFileInTarball) + throw (std::runtime_error); + + /** + * Check if a file exists in a given tarball. + * + * @param tarFileName the name of the existing tar file + * @param fileName the name of the file to check in the traball. + * @return true if a file named fileName exists in the tarball, + * false otherwise. + * @exception std::runtime_error on file / tarball handling issues. + */ + static bool + existsInTarball(const std::string & tarFileName, + const std::string & fileName) + throw (std::runtime_error); + + /** + * Extract a file from a tarball. + * + * @param tarFileName the name of the existing tar file. + * @param fileInTarball the name of the file to be extracted + * in the tarball. + * @param fileExtracted the name of the new file to create. + * @exception std::runtime_error on file / tarball handling issues. + */ + static void + extractFileFromTarball(const std::string & tarFileName, + const std::string & fileInTarball, + const std::string & fileExtracted) + throw (std::runtime_error); +}; + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_FileTools_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Installable.h b/campcaster/src/modules/core/include/LiveSupport/Core/Installable.h new file mode 100644 index 000000000..86aaf31d6 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Installable.h @@ -0,0 +1,144 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Installable_h +#define LiveSupport_Core_Installable_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An interface for having objects that can install themselves. + * The concept of installation means setting up for long-term use. + * When something installs, it creates databases, writes configuration + * files, etc. It sets up the object to be run. This is not to be + * confused with instance initialization, e.g. when a server is started + * or stopped. + * + * The following life cycle is expected from systems impelementing this + * interface: + * + *
      + *
    • install
    • + *
      • + *
      • start
      • + *
      • stop
      • + *
      • start
      • + *
      • stop
      • + *
    • + *
    • uninstall
    • + *
    + * + * Later more stages will be added, and load/save (externalization) + * facilities. + * + * @author $Author$ + * @version $Revision$ + */ +class Installable +{ + public: + /** + * 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) + = 0; + + /** + * Check to see if the component has already been installed. + * + * @return true if the component is properly installed, + * false otherwise + * @exception std::exception on generic problems + */ + virtual bool + isInstalled(void) throw (std::exception) + = 0; + + /** + * 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) + = 0; + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~Installable(void) throw () + { + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_Installable_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/LocalizedConfigurable.h b/campcaster/src/modules/core/include/LiveSupport/Core/LocalizedConfigurable.h new file mode 100644 index 000000000..9e5bf1b61 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/LocalizedConfigurable.h @@ -0,0 +1,153 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_LocalizedConfigurable_h +#define LiveSupport_Core_LocalizedConfigurable_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/LocalizedObject.h" + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A configurable element, that is also localized. Reads localization + * information from the configuration file itself. + * + * The configure() function expects the following XML element: + * + *
    
    + *  
    + *  
    + * + *
    
    + *  
    + *  
    + *  
    + *
    + *  ]>
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class LocalizedConfigurable : public Configurable, public LocalizedObject +{ + private: + /** + * The path to the resource bundles. + */ + std::string bundlePath; + + + public: + /** + * The default constructor. + */ + LocalizedConfigurable(void) throw () + { + } + + /** + * A virtual destructor. + */ + virtual + ~LocalizedConfigurable(void) throw () + { + } + + /** + * 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. + * @see LocalizedObject#getBundle + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument, + std::logic_error); + + + /** + * Change the current locale, which was previously specified by + * configure(), to the new locale. This results in a replacement + * of the resource bundle, read from the same path as in the + * configuration element sent to configure(), but with the new + * locale id. + * + * @param newLocale the new locale id. + * @exception std::invalid_argument if there is no bundle by + * the specified locale + */ + virtual void + changeLocale(const std::string newLocale) + throw (std::invalid_argument); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_LocalizedConfigurable_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/LocalizedObject.h b/campcaster/src/modules/core/include/LiveSupport/Core/LocalizedObject.h new file mode 100644 index 000000000..1263e2c7e --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/LocalizedObject.h @@ -0,0 +1,471 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_LocalizedObject_h +#define LiveSupport_Core_LocalizedObject_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Base class for localized objects, containing some helper functions + * to make localized life easier. + * + * @author $Author$ + * @version $Revision$ + */ +class LocalizedObject +{ + private: + /** + * The name of the configuration XML elmenent used by this object. + */ + static const std::string configElementNameStr; + + /** + * The resource bundle holding the localized resources for this + * object. + */ + Ptr::Ref bundle; + + + protected: + /** + * The default constructor. + */ + LocalizedObject(void) throw () + { + } + + + public: + /** + * Constructor. + * + * @param bundle the resource bundle holding the localized + * resources for this window + */ + LocalizedObject(Ptr::Ref bundle) throw () + { + this->bundle = bundle; + } + + /** + * Virtual destructor. + */ + virtual + ~LocalizedObject(void) throw () + { + } + + /** + * Return the name of the XML element that is expected + * to be sent to a call to getBundle(). + * + * @return the name of the expected XML configuration element. + * @see #getBundle(const xmlpp::Element &) + */ + static const std::string + getConfigElementName(void) throw () + { + return configElementNameStr; + } + + /** + * Load a resource bundle based on an XML configuration element. + * + * The DTD for the lement to be supplied to this function is: + *
    
    +         *  
    +         *  
    +         *  
    +         *  ]>
    +         *  
    + * + * a sample configuration element is as follows: + * + *
    
    +         *  
    +         *  
    + * + * for an overview of resource bundle parameters, see the ICU + * documentation on + * resource management + * + * @param element the XML configuration element + * @return the resource bundle, based on this element. + * @exception std::invalid_argument if the supplied element is not + * a proper resource bundle configuration element. + * @see http://oss.software.ibm.com/icu/userguide/ResourceManagement.html + */ + static Ptr::Ref + getBundle(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Get the resource bundle for this object. + * + * @return the resource bundle for this object. + */ + Ptr::Ref + getBundle(void) const throw () + { + return bundle; + } + + /** + * Change the resource bundle for this object. + * + * @param the new resource bundle used by the object. + */ + virtual void + setBundle(Ptr::Ref bundle) throw () + { + this->bundle = bundle; + } + + /** + * Get a resource bundle nested inside our bundle. + * + * @param key the name of the resource bundle to get. + * @exception std::invalid_argument if there is no bundle by + * the specified key + */ + Ptr::Ref + getBundle(const char * key) throw (std::invalid_argument) + { + return getBundle(getBundle(), key); + } + + /** + * Get a resource bundle nested inside our bundle. + * + * @param bundle the resource bundle containing the key. + * @param key the name of the nested resource bundle to get. + * @exception std::invalid_argument if there is no bundle by + * the specified key + */ + Ptr::Ref + getBundle(Ptr::Ref bundle, + const char * key) + throw (std::invalid_argument); + + /** + * Get a string from the resource bundle. + * + * @param key the key identifying the requested string. + * @return the requested string + * @exception std::invalid_argument if there is no string for the + * specified key. + */ + virtual Ptr::Ref + getResourceString(const char * key) + throw (std::invalid_argument) + { + return getResourceString(getBundle(), key); + } + + /** + * Get a string from the resource bundle. + * + * @param bundle the nested resource bundle containing the key. + * @param key the key identifying the requested string. + * @return the requested string + * @exception std::invalid_argument if there is no string for the + * specified key. + */ + virtual Ptr::Ref + getResourceString(const char * bundle, + const char * key) + throw (std::invalid_argument) + { + return getResourceString(getBundle(bundle), key); + } + + /** + * Get a string from the resource bundle. + * + * @param bundle the nested resource bundle containing the key. + * @param key the key identifying the requested string. + * @return the requested string + * @exception std::invalid_argument if there is no string for the + * specified key. + */ + virtual Ptr::Ref + getResourceString(Ptr::Ref bundle, + const char * key) + throw (std::invalid_argument); + + /** + * A convenience function to format a message. + * For more information, see the ICU MessageFormat class + * documentation. + * + * @param pattern the pattern to format + * @param arguments the arguments to use in the formatting + * @param nArguments the number of arguments supplied + * @return the formatted string + * @exception std::invalid_argument if the pattern is bad, or + * the arguments do not match + * @see http://oss.software.ibm.com/icu/apiref/classMessageFormat.html + */ + static Ptr::Ref + formatMessage(Ptr::Ref pattern, + Formattable * arguments, + unsigned int nArguments) + throw (std::invalid_argument); + + /** + * A convenience function to format a message, based on a pattern + * loaded from a resource. + * For more information, see the ICU MessageFormat class + * documentation. + * + * @param patternKey the key of the pattern to format + * @param arguments the arguments to use in the formatting + * @param nArguments the number of arguments supplied + * @return the formatted string + * @exception std::invalid_argument if the pattern is bad, or + * the arguments do not match, or there is no resource + * specified by patternKey + * @see http://oss.software.ibm.com/icu/apiref/classMessageFormat.html + */ + virtual Ptr::Ref + formatMessage(const char * patternKey, + Formattable * arguments, + unsigned int nArguments) + throw (std::invalid_argument); + + /** + * A convenience function to format a message, based on a pattern + * loaded from a resource. + * For more information, see the ICU MessageFormat class + * documentation. + * + * @param patternKey the key of the pattern to format + * @param arguments the arguments to use in the formatting + * @param nArguments the number of arguments supplied + * @return the formatted string + * @exception std::invalid_argument if the pattern is bad, or + * the arguments do not match, or there is no resource + * specified by patternKey + * @see http://oss.software.ibm.com/icu/apiref/classMessageFormat.html + */ + virtual Ptr::Ref + formatMessage(const std::string & patternKey, + Formattable * arguments, + unsigned int nArguments) + throw (std::invalid_argument) + { + return formatMessage(patternKey.c_str(), arguments, nArguments); + } + + /** + * A convenience function to format a message, based on a pattern + * loaded from a resource, with one argument. + * For more information, see the ICU MessageFormat class + * documentation. + * + * @param patternKey the key of the pattern to format + * @param argument1 the single argument to the message. + * @return the formatted string + * @exception std::invalid_argument if the pattern is bad, or + * the arguments do not match, or there is no resource + * specified by patternKey + * @see http://oss.software.ibm.com/icu/apiref/classMessageFormat.html + */ + virtual Ptr::Ref + formatMessage(const std::string & patternKey, + const Glib::ustring & argument1) + throw (std::invalid_argument); + + /** + * A convenience function to format a message, based on a pattern + * loaded from a resource, with two arguments. + * For more information, see the ICU MessageFormat class + * documentation. + * + * @param patternKey the key of the pattern to format + * @param argument1 the first argument to the message. + * @param argument2 the second argument to the message. + * @return the formatted string + * @exception std::invalid_argument if the pattern is bad, or + * the arguments do not match, or there is no resource + * specified by patternKey + * @see http://oss.software.ibm.com/icu/apiref/classMessageFormat.html + */ + virtual Ptr::Ref + formatMessage(const std::string & patternKey, + const Glib::ustring & argument1, + const Glib::ustring & argument2) + throw (std::invalid_argument); + + /** + * A convenience function to format a message, based on a pattern + * loaded from a resource, with three arguments. + * For more information, see the ICU MessageFormat class + * documentation. + * + * @param patternKey the key of the pattern to format + * @param argument1 the first argument to the message. + * @param argument2 the second argument to the message. + * @param argument3 the second argument to the message. + * @return the formatted string + * @exception std::invalid_argument if the pattern is bad, or + * the arguments do not match, or there is no resource + * specified by patternKey + * @see http://oss.software.ibm.com/icu/apiref/classMessageFormat.html + */ + virtual Ptr::Ref + formatMessage(const std::string & patternKey, + const Glib::ustring & argument1, + const Glib::ustring & argument2, + const Glib::ustring & argument3) + throw (std::invalid_argument); + + /** + * Convert an ICU unicode string to a Glib ustring. + * + * @param unicodeString the ICU unicode string to convert. + * @return the same string as supplied, in Glib ustring form. + */ + static Ptr::Ref + unicodeStringToUstring(Ptr::Ref unicodeString) + throw (); + + /** + * Convert a Glib ustring to an ICU unicode string. + * + * @param gString the Glib ustring to convert + * @return the same string as supplied, in ICU unicode form. + */ + static Ptr::Ref + ustringToUnicodeString(Ptr::Ref gString) + throw (); + + /** + * Convert a Glib ustring to an ICU unicode string. + * + * @param gString the Glib ustring to convert + * @return the same string as supplied, in ICU unicode form. + */ + static Ptr::Ref + ustringToUnicodeString(const Glib::ustring & gString) + throw (); + + /** + * Get a string from the resource bundle, as a Glib ustring. + * + * @param key the key identifying the requested string. + * @return the requested string + * @exception std::invalid_argument if there is no string for the + * specified key. + */ + Ptr::Ref + getResourceUstring(const char * key) + throw (std::invalid_argument) + { + return unicodeStringToUstring(getResourceString(key)); + } + + /** + * Get a string from the resource bundle, as a Glib ustring. + * + * @param key the key identifying the requested string. + * @return the requested string + * @exception std::invalid_argument if there is no string for the + * specified key. + */ + Ptr::Ref + getResourceUstring(const std::string &key) + throw (std::invalid_argument) + { + return unicodeStringToUstring(getResourceString(key.c_str())); + } + + /** + * Get a string from a resource bundle nested inside this bundle, + * as a Glib ustring. + * + * @param bundle the name of the resource bundle to get. + * @param key the key identifying the requested string. + * @return the requested string + * @exception std::invalid_argument if there is no string for the + * specified key. + */ + Ptr::Ref + getResourceUstring(const char * bundle, + const char * key) + throw (std::invalid_argument) + { + return unicodeStringToUstring(getResourceString(bundle, key) ); + } +}; + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_LocalizedObject_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Md5.h b/campcaster/src/modules/core/include/LiveSupport/Core/Md5.h new file mode 100644 index 000000000..6bc9e1536 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Md5.h @@ -0,0 +1,265 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + This class is based on the following with minor modifications + (see http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html). + + ------------------------------------------------------------------------------ + +// Md5.CC - source code for the C++/object oriented translation and +// modification of Md5. + +// Translation and modification (c) 1995 by Mordechai T. Abzug + +// This translation/ modification is provided "as is," without express or +// implied warranty of any kind. + +// The translator/ modifier does not claim (1) that Md5 will do what you think +// it does; (2) that this translation/ modification is accurate; or (3) that +// this software is "merchantible." (Language for this disclaimer partially +// copied from the disclaimer below). + + ------------------------------------------------------------------------------ + + Which was based on: + + ------------------------------------------------------------------------------ + + Md5.H - header file for Md5C.C + MDDRIVER.C - test driver for MD2, MD4 and Md5 + + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. Md5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. Md5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + + ------------------------------------------------------------------------------ + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Md5_h +#define LiveSupport_Core_Md5_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_STDINT_H +#include +#else +#error need stdint.h +#endif + + +#include +#include +#include +#include +#include +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class for generating md5 sums. + * + * First, one creates an Md5 object from a file, istream or string; then + * one can either call hexDigest() or simply convert the object to std::string + * in order to obtain the md5 sum in the form of 32 hexadecimal (lower case) + * digits. + * + * This is a trimmed version of the C++ class written by Mordechai T. Abzug + * on the basis of the original C code by RSA Data Security, Inc. See the + * header of the source file for further information. + * + * @author $Author$ + * @version $Revision$ + */ +class Md5 +{ + private: + + // first, some types: + typedef unsigned int uint4; // assumes integer is 4 words long + typedef unsigned short int uint2; // assumes short integer is 2 words long + typedef unsigned char uint1; // assumes char is 1 word long + + // methods for controlled operation: + void update (uint1 *input, uint4 input_length); + void update (std::istream& stream); + void update (FILE *file); + void update (const std::string& s); + void finalize () throw(std::invalid_argument); + + // next, the private data: + uint4 state[4]; + uint4 count[2]; // number of *bits*, mod 2^64 + uint1 buffer[64]; // input buffer + uint1 digest[16]; + uint1 finalized; + + /** + * The low 64 bits of the checksum. + */ + uint64_t low64; + + /** + * The high 64 bits of the checksum. + */ + uint64_t high64; + + // last, the private methods, mostly static: + void init (); // called by all constructors + void transform (uint1 *buffer); // does the real update work. Note + // that length is implied to be 64. + + static void encode (uint1 *dest, uint4 *src, uint4 length); + static void decode (uint4 *dest, uint1 *src, uint4 length); + static void memcpy (uint1 *dest, uint1 *src, uint4 length); + static void memset (uint1 *start, uint1 val, uint4 length); + + static inline uint4 rotate_left (uint4 x, uint4 n); + static inline uint4 F (uint4 x, uint4 y, uint4 z); + static inline uint4 G (uint4 x, uint4 y, uint4 z); + static inline uint4 H (uint4 x, uint4 y, uint4 z); + static inline uint4 I (uint4 x, uint4 y, uint4 z); + static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac); + static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac); + static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac); + static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac); + + /** + * Calculate the lower and higher 64 bit values for the checksum + */ + void + calcNumericRepresentation(void) throw (); + + + public: + + /** + * Construct from a std::string + */ + Md5 (const std::string &s) throw(std::invalid_argument); + + + /** + * Construct from an istream + */ + Md5 (std::istream& stream) throw(std::invalid_argument); + + + /** + * Construct from a file + */ + Md5 (FILE *file) throw(std::invalid_argument); + + + /** + * Get the md5 sum as a 32 digit ascii-hex string + */ + std::string hexDigest () throw(); + + + /** + * Get the md5 sum as a 32 digit ascii-hex string + */ + operator std::string () throw(); + + /** + * Return the lower 64 bits of the checksum. + * + * @return the lower 64 bits of the checksum. + */ + uint64_t + low64bits(void) const throw () + { + return low64; + } + + /** + * Return the higher 64 bits of the checksum. + * + * @return the higher 64 bits of the checksum. + */ + uint64_t + high64bits(void) const throw () + { + return high64; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + + +#endif // LiveSupport_Core_Md5_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/MetadataConstraint.h b/campcaster/src/modules/core/include/LiveSupport/Core/MetadataConstraint.h new file mode 100644 index 000000000..f3e12cb82 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/MetadataConstraint.h @@ -0,0 +1,181 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_MetadataConstraint_h +#define LiveSupport_Core_MetadataConstraint_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/Configurable.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class for representing a constraint on the values of a metadata type. + * + * This is an abstract-cum-factory class for constructing the concrete + * constraint subclasses. You construct and configure this class, which + * will transparently construct the concrete subclass desired, and delegate + * the actual value checking to it. + * + * This object has to be configured with an XML configuration element + * called constraint. This may look like the following: + * + *
    
    + *  
    + *      1
    + *      12
    + *  
    + *  
    + * + * The type attribute identifies this MetadataConstraint object as belonging + * to the subclass NumericRangeConstraint. Other subclasses are + * NumericConstraint, EnumerationConstraint etc. + * + * Each MetadataType object may contain an optional MetadataConstraint member + * object, which restricts the acceptable values for this metadata type. + * + * The DTD for the expected XML element looks like the following: + * + *
    
    + *  
    + *  
    + *  
    + *  
    + * + * @author $Author$ + * @version $Revision$ + * @see MetadataConstraintContainer + */ +class MetadataConstraint : public Configurable +{ + private: + /** + * The name of the configuration XML element used by MetadataConstraint. + */ + static const std::string configElementNameStr; + + /** + * A reference to a concrete subclass. + */ + Ptr::Ref concreteConstraint; + + + protected: + /** + * The name of the type attribute. + */ + static const std::string typeAttributeName; + + /** + * The name of the configuration element for the constraint values. + */ + static const std::string valueElementName; + + + public: + /** + * Constructor. + */ + MetadataConstraint() throw () + { + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~MetadataConstraint(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 metadata object based on an XML configuration element. + * + * @param elemen the XML configuration element. + * @exception std::invalid_argument of the supplied XML element + * contains bad configuration information + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Check that the given value satisfies the constraint. + * + * @param value the value to be checked against the constraint. + * @return true if the value satisfies the constraint. + * @exception std::logic_error if the object has not been + * configured yet. + */ + virtual bool + check(Ptr::Ref value) const + throw (std::logic_error); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_MetadataConstraint_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/MetadataType.h b/campcaster/src/modules/core/include/LiveSupport/Core/MetadataType.h new file mode 100644 index 000000000..280283323 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/MetadataType.h @@ -0,0 +1,296 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_MetadataType_h +#define LiveSupport_Core_MetadataType_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/MetadataConstraint.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +class MetadataTypeContainer; + + +/** + * A class for representing a metadata type. + * + * This object has to be configured with an XML configuration element + * called metadataType. This may look like the following: + * + *
    
    + *  
    + *      
    + *          1
    + *          12
    + *      
    + *  
    + *  
    + * + * The tab attribute (if present) must be one of "main", "music" or "voice" + * (all lowercase, case sensitive). + * This determines whether, at file upload, the metadata field appears in + * the Main, Music, or Voice tab. If the attribute is omitted, the metadata + * field will appear in none of the tabs. + * + * The optional constraint sub-element can give restrictions on the acceptable + * values for this type of metadata. See the MetadataConstraint class for + * more information, including the DTD of the "constraint" element. + * + * The DTD for the expected XML element looks like the following: + * + *
    
    + *  
    + *  
    + *  
    + *  
    + *  
    + *  
    + * + * + * @author $Author$ + * @version $Revision$ + * @see MetadataTypeContainer + */ +class MetadataType : public Configurable +{ + friend class MetadataTypeContainer; + + public: + /** + * An enumeration of all possible metadata categories. + */ + typedef enum { noTab, + mainTab, + musicTab, + voiceTab } TabType; + + + private: + /** + * The name of the configuration XML element used by MetadataType. + */ + static const std::string configElementNameStr; + + /** + * A reference to a metadata type container. + */ + Ptr::Ref container; + + /** + * The Dublic Core name of this metadata type. + */ + Ptr::Ref dcName; + + /** + * The ID3v2 tag for this metadata type. + */ + Ptr::Ref id3Tag; + + /** + * The localization key for this metadata type. + */ + Ptr::Ref localizationKey; + + /** + * The localization key for this metadata type. + */ + TabType tab; + + /** + * The constraint object, if any. + */ + Ptr::Ref constraint; + + + protected: + /** + * Default constructor. + * + * @param container the container this metadata type is held in. + */ + MetadataType(Ptr::Ref container) + throw (); + + /** + * Constructor. + * + * @param container the container this metadata type is held in. + * @param dcName the Dublic Core metadata name. + * @param id3Tag the ID3v2 tag assciated with the metadata. + * @param localizationKey the key to get the localized name for + * the metadata + */ + MetadataType(Ptr::Ref container, + Glib::ustring dcName, + Glib::ustring id3Tag, + Glib::ustring localizationKey, + TabType tab = noTab) + 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 metadata object based on an XML configuration element. + * + * @param elemen the XML configuration element. + * @exception std::invalid_argument of the supplied XML element + * contains bad configuration information + */ + virtual void + configure(const xmlpp::Element &element) + throw (std::invalid_argument); + + + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~MetadataType(void) throw () + { + } + + /** + * Return the Dublic Core name of the metadata type. + * + * @return the Dublic Core name of the metadata type. + */ + Ptr::Ref + getDcName(void) const throw () + { + return dcName; + } + + /** + * Return the ID3v2 tag name for the metadata type. + * + * @return the ID3v2 tag name for the metadata type, or a null + * pointer, if no ID3v2 tag exists for the metadata type. + */ + Ptr::Ref + getId3Tag(void) const throw () + { + return id3Tag; + } + + /** + * Return the localization key for the metadata type. + * + * @return the localization key for the metadata type. + */ + Ptr::Ref + getLocalizationKey(void) const throw () + { + return localizationKey; + } + + /** + * Return the localized name for the metadata type. + * + * @return the localized name for the metadata type. + * @exception std::invalid_argument if there is no localized + * name for this metadata type. + */ + Ptr::Ref + getLocalizedName(void) const throw (std::invalid_argument); + + /** + * Return the tab that this metadata type should appear in, + * when an audio clip is uploaded in the Studio client. + * + * @return the name of the tab for the metadata type. + */ + TabType + getTab(void) const throw () + { + return tab; + } + + /** + * Check that the given value satisfies the constraint. + * If the metadata type has no constraints, it returns true. + * If the constraint throws an exception, it returns false. + * + * @param value the value to be checked against the constraint. + * @return true if the value satisfies the constraint. + */ + bool + check(Ptr::Ref value) const throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_MetadataType_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/MetadataTypeContainer.h b/campcaster/src/modules/core/include/LiveSupport/Core/MetadataTypeContainer.h new file mode 100644 index 000000000..f7b0fbb41 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/MetadataTypeContainer.h @@ -0,0 +1,274 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_MetadataTypeContainer_h +#define LiveSupport_Core_MetadataTypeContainer_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/LocalizedObject.h" +#include "LiveSupport/Core/MetadataType.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Container holding MetadataType objects. + * + * This object has to be configured with an XML configuration element + * called metadataTypeContainer. This may look like the following: + * + *
    
    + *  <metadataTypeContainer>
    + *      <metadataType ... />
    + *      <metadataType ... />
    + *      ...
    + *      <metadataType ... />
    + *  </metadataTypeContainer>
    + *  
    + * + * The DTD for the expected XML element is the following: + * + *
    
    + *  
    + *  
    + * + * For a description of the metadataType XML element, see the documentation + * for the MetadataType class. + * + * @author $Author$ + * @version $Revision$ + * @see MetadataType + */ +class MetadataTypeContainer : public Configurable, + public LocalizedObject, + public boost::enable_shared_from_this +{ + public: + /** + * A vector type holding contant MetadataType references. + */ + typedef std::vector::Ref> Vector; + + + private: + /** + * Map type for storing MetadataType objects by Glib::ustrings. + */ + typedef std::map::Ref> NameMap; + + /** + * The name of the configuration XML element used by + * MetadataTypeContainer. + */ + static const std::string configElementNameStr; + + /** + * A vector holding all MetadataType references. + */ + Vector vector; + + /** + * Map of MetadaType objects, stored by DC name. + */ + NameMap dcNameMap; + + /** + * Map of MetadaType objects, stored by ID3v2 tags. + */ + NameMap id3TagMap; + + + public: + /** + * Constructor. + * + * @param bundle the resource bundle holding the localized resources. + */ + MetadataTypeContainer(Ptr::Ref bundle) + throw () + : LocalizedObject(bundle) + { + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~MetadataTypeContainer(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 metadata object based on an XML configuration element. + * + * @param elemen the XML configuration element. + * @exception std::invalid_argument of the supplied XML element + * contains bad configuration information + */ + virtual void + configure(const xmlpp::Element &element) + throw (std::invalid_argument); + + /** + * Return an interator holding all MetadataType objects. + * The iterator holds objects of type Ptr::Ref. + * + * @return an iterator holding the available metadata types. + */ + Vector::const_iterator + begin(void) const throw () + { + return vector.begin(); + } + + /** + * Return an interator pointing to the end of MetadataType objects. + * The iterator holds objects of type Ptr::Ref. + * + * @return an iterator pointing to the end of metadata types. + */ + Vector::const_iterator + end(void) const throw () + { + return vector.end(); + } + + /** + * Tells if a MetadataType object exists with the specified + * Dublic Core name. + * + * @param dcName the DC name of the metadata type. + * @return true if a metadata type exists with the specified name, + * false otherwise + */ + bool + existsByDcName(const Glib::ustring dcName) const throw (); + + /** + * Return a MetadataType object, by Dublic Core name. + * + * @param dcName the DC name of the metadata type. + * @return a MetadataType object with the supplied DC name + * @exception std::invalid_argument if no metadata type exists + * with the suplied name. + */ + Ptr::Ref + getByDcName(const Glib::ustring dcName) + throw (std::invalid_argument); + + /** + * Tells if a MetadataType object exists with the specified + * ID3v2 tag. + * + * @param id3Tag the ID3v2 tag of the metadata type. + * @return true if a metadata type exists with the specified tag name, + * false otherwise + */ + bool + existsById3Tag(const Glib::ustring id3Tag) const throw (); + + /** + * Return a MetadataType object, by ID3v2 tag. + * + * @param id3Tag the ID3v2 tag of the metadata type. + * @return a MetadataType object with the supplied ID3v2 tag name. + * @exception std::invalid_argument if no metadata type exists + * with the suplied tag name. + */ + Ptr::Ref + getById3Tag(const Glib::ustring id3Tag) + throw (std::invalid_argument); + + /** + * Check that the given value satisfies the constraint of a metadata + * type. + * If the metadata type has no constraints, it returns true. + * If the constraint throws an exception, it returns false. + * + * @param value the value to be checked against the constraint. + * @param dcName the metadata type, by its Dublin Core name. + * @return true if the value satisfies the constraint. + * @exception std::invalid_argument if no metadata type exists + * with the suplied name. + */ + bool + check(Ptr::Ref value, + const Glib::ustring & dcName) + throw (std::invalid_argument); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_MetadataTypeContainer_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/OptionsContainer.h b/campcaster/src/modules/core/include/LiveSupport/Core/OptionsContainer.h new file mode 100644 index 000000000..1952ca39b --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/OptionsContainer.h @@ -0,0 +1,249 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author $ + Version : $Revision $ + Location : $URL $ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_OptionsContainer_h +#define LiveSupport_Core_OptionsContainer_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include "libxml++/libxml++.h" + +#include "LiveSupport/Core/Ptr.h" + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A container for the options in gLiveSupport.xml. + * + * @author $Author $ + * @version $Revision $ + */ +class OptionsContainer +{ + public: + /** + * The list of string options one can set. + * + * These are options of type Glib::ustring; any string is accepted + * as value, no range checking is done. + * + * For the moment, this is the only kind of option supported. + */ + typedef enum { outputPlayerDeviceName, + cuePlayerDeviceName, + authenticationServer, + authenticationPort, + authenticationPath, + storageServer, + storagePort, + storagePath, + schedulerServer, + schedulerPort, + schedulerPath } OptionItemString; + + + private: + /** + * The XML document containing the options. + */ + xmlpp::Document optionsDocument; + + /** + * The file name (including path) used by writeToFile(). + */ + Ptr::Ref configFileName; + + /** + * Remember if we have been touched. + */ + bool touched; + + /** + * Default constructor. + */ + OptionsContainer(void) throw () + { + } + + /** + * Find the node corresponding to an OptionItemString value. + * + * If there is no matching node, it returns a 0 pointer. + * + * @param optionItem the name of the item to find the node for + * @param isAttribute return parameter; is set to true if the + * node is an attribute, false if it's + * a CDATA text + * @return a pointer to the node found, or 0 + * @exception std::invalid_argument thrown by getNode() [should + * never happen] + */ + xmlpp::Node * + selectNode(OptionItemString optionItem, + bool & isAttribute) + throw (std::invalid_argument); + + /** + * Find the node corresponding to a keyboard shortcut. + * + * If there is no matching node, it returns a 0 pointer. + * + * @param containerNo the number of the KeyboardShortcutContainer + * (starting with 1, as per XPath) + * @param shortcutNo the number of the KeyboardShortcut within + * this container (also starting with 1) + * @return a pointer to the node found, or 0 + * @exception std::invalid_argument thrown by getNode() [should + * never happen] + */ + xmlpp::Node * + selectKeyboardShortcutNode(int containerNo, + int shortcutNo) + throw (std::invalid_argument); + + /** + * Return the first node matching an XPath string. + * + * If there is no matching node, it returns a 0 pointer. + * + * @param xPath the XPath of the node (from the root node) + * @return a pointer to the node found, or 0 + * @exception std::invalid_argument if the XPath is not well formed + */ + xmlpp::Node * + getNode(const Glib::ustring & xPath) + throw (std::invalid_argument); + + + public: + /** + * Constructor with XML element parameter. + * + * @param optionsElement the XML element containing the options + * @param configFileName the name (with path) of the configuration + * file used by writeToFile() + * @see writeToFile() + */ + OptionsContainer(const xmlpp::Element & optionsElement, + Ptr::Ref configFileName) + throw (); + + /** + * Report if the object has been touched. + * + * It returns true if there has been any calls to setOptionItem() + * since its construction or the last call to writeToFile(). + * + * @return whether the options have been touched + */ + bool + isTouched(void) throw () + { + return touched; + } + + /** + * Set a string type option. + * + * @param value the new value of the option + * @exception std::invalid_argument if the option name is not found + */ + void + setOptionItem(OptionItemString optionItem, + Ptr::Ref value) + throw (std::invalid_argument); + + /** + * Get a string type option. + * + * @return the value of the option + * @exception std::invalid_argument if the option name is not found + */ + Ptr::Ref + getOptionItem(OptionItemString optionItem) + throw (std::invalid_argument); + + /** + * Set a keyboard shortcut type option. + * + * @param containerNo which container to modify + * @param shortcutNo which shortcut to modify within this + * container + * @param value the name of the new shortcut key + * @exception std::invalid_argument if the shortcut is not found + */ + void + setKeyboardShortcutItem(int containerNo, + int shortcutNo, + Ptr::Ref value) + throw (std::invalid_argument); + + /** + * Save the options to a file. + * + * This writes the options in XML format to the file specified in the + * constructor. The directory must already exist (it's OK if the file + * does not), otherwise nothing is written. + */ + void + writeToFile(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_OptionsContainer_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/PlayLogEntry.h b/campcaster/src/modules/core/include/LiveSupport/Core/PlayLogEntry.h new file mode 100644 index 000000000..a5301f6da --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/PlayLogEntry.h @@ -0,0 +1,170 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_PlayLogEntry_h +#define LiveSupport_Core_PlayLogEntry_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/UniqueId.h" + + +namespace LiveSupport { +namespace Core { + +using namespace boost::posix_time; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing a play log entry. + * PlayLogEntries contain information about the audio clips played. + * + * @author $Author$ + * @version $Revision$ + */ +class PlayLogEntry +{ + private: + /** + * The unique id of the play log entry. + */ + Ptr::Ref id; + + /** + * The id of the audio clip referenced by this play log entry. + */ + Ptr::Ref audioClipId; + + /** + * The time this audio clip was played. + */ + Ptr::Ref timestamp; + + + public: + /** + * Default constructor. + */ + PlayLogEntry(void) throw () + { + } + + /** + * Create a play log entry by specifying all details. + * + * @param id the ID of the play log entry. + * @param audioClipId the ID of the audio clip logged + * @param timestamp the time this audio clip was played. + */ + PlayLogEntry(Ptr::Ref id, + Ptr::Ref audioClipId, + Ptr::Ref timestamp) throw() + { + this->id = id; + this->audioClipId = audioClipId; + this->timestamp = timestamp; + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~PlayLogEntry(void) throw () + { + } + + /** + * Return the ID of the play log entry. + * + * @return the unique ID of the play log entry. + */ + Ptr::Ref + getId(void) const throw () + { + return id; + } + + /** + * Return the ID of the audio clip referenced by this entry. + * + * @return the unique ID of the audio clip. + */ + Ptr::Ref + getAudioClipId(void) const throw () + { + return audioClipId; + } + + /** + * Return the time this audio clip was played. + * + * @return the the time the audio clip was played. + */ + Ptr::Ref + getTimestamp(void) const throw () + { + return timestamp; + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_PlayLogEntry_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Playable.h b/campcaster/src/modules/core/include/LiveSupport/Core/Playable.h new file mode 100644 index 000000000..8fe879a6a --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Playable.h @@ -0,0 +1,316 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Playable_h +#define LiveSupport_Core_Playable_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/UniqueId.h" +#include "LiveSupport/Core/Configurable.h" + + +namespace LiveSupport { +namespace Core { + +class AudioClip; // forward declarations to avoid circularity +class Playlist; + +using namespace boost::posix_time; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An abstract class which is extended by AudioClip and Playlist. + * It contains the methods which are common to these classes. + * + * @author $Author$ + * @version $Revision$ + */ +class Playable : public boost::enable_shared_from_this +{ + public: + + /** + * The sub-types a Playable object can belong to. + */ + enum Type { AudioClipType, PlaylistType }; + + private: + + /** + * The type of this playable object (audio clip or playlist). + */ + Type type; + + protected: + + /** + * Only my children are allowed to instantiate me. + * + * @param typeParam either AudioClipType or PlaylistType. + */ + Playable(Type typeParam) throw () + : type(typeParam) + { + } + + + public: + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~Playable(void) throw () + { + } + + /** + * Return the id of the audio clip or playlist. + * + * @return the unique id of the audio clip or playlist. + */ + virtual Ptr::Ref + getId(void) const throw () = 0; + + /** + * Return the total playing length for this audio clip or playlist. + * + * @return the playing length in microseconds. + */ + virtual Ptr::Ref + getPlaylength(void) const throw () = 0; + + + /** + * Return the URI of the sound file of this audio clip or + * playlist, which can be played by the audio player. This + * sound file can be an mp3 or a SMIL file. + * + * @return the URI. + */ + virtual Ptr::Ref + getUri(void) const throw () = 0; + + /** + * Set the URI of the sound file of this audio clip or + * playlist, which can be played by the audio player. This + * sound file can be an mp3 or a SMIL file. + * + * @param uri the new URI. + */ + virtual void + setUri(Ptr::Ref uri) throw () = 0; + + + /** + * Return the token which is used to identify this audio clip + * or playlist to the storage server. + * + * The token is set when the Playable object is acquired and + * unset (made null again) when it is released. + * + * @return the token. + */ + virtual Ptr::Ref + getToken(void) const throw () = 0; + + /** + * Set the token which is used to identify this audio clip + * or playlist to the storage server. + * + * The token is set when the Playable object is acquired and + * unset (made null again) when it is released. + * + * @param token a new token. + */ + virtual void + setToken(Ptr::Ref token) + throw () = 0; + + + /** + * Return the title of this audio clip or playlist. + * + * @return the title. + */ + virtual Ptr::Ref + getTitle(void) const throw () = 0; + + /** + * Set the title of this audio clip or playlist. + * + * @param title a new title. + */ + virtual void + setTitle(Ptr::Ref title) + throw () = 0; + + + /** + * Return the value of a metadata field in this audio clip or playlist. + * If the playable does not have this metadata field, returns a null + * pointer. + * + * @param key the name of the metadata field + * @return the value of the metadata field; 0 if there is + * no such field; + */ + virtual Ptr::Ref + getMetadata(const std::string &key) const + throw () = 0; + + /** + * Set the value of a metadata field in this audio clip or playlist. + * + * @param value the new value of the metadata field. + * @param key the name of the metadata field + * @exception std::invalid_argument if the key is dcterms:extent, + * but the value is not a valid ISO-8601 time + */ + virtual void + setMetadata(Ptr::Ref value, + const std::string &key) + throw (std::invalid_argument) + = 0; + + /** + * Return a partial XML representation of this audio clip or playlist. + * + * This is a string containing a single or + * XML element, with minimal information (ID, title, playlength) + * only, without an XML header or any other metadata. + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * @return a string representation of the audio clip as an XML element + */ + virtual Ptr::Ref + getXmlElementString(void) const throw () = 0; + + + /** + * Return a complete XML representation of this audio clip or playlist. + * + * This is a string containing a an XML document with an + * or root node, together with an XML header and a + * element (in the case of playlists, for the outermost + * playlist only). + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * The audio clip or playlist can be reconstructed from + * the string returned by this method: + *
    
    +         *  Ptr::Ref         audioClip1 = ... something ...;
    +         *  Ptr::Ref  parser;
    +         *  parser->parse_memory(*audioClip1->getXmlDocumentString());
    +         *  const xmlpp::Document*      document = parser->get_document();
    +         *  const xmlpp::Element*       root     = document->get_root_node();
    +         *  Ptr::Ref         audioClip2(new AudioClip());
    +         *  audioClip2->configure(*root);
    +         *  
    + * results in two identical audio clips (this works for playlists, + * too, but see the note at Playlist::getXmlDocumentString()). + * + * @return a string representation of the audio clip as an XML document + */ + virtual Ptr::Ref + getXmlDocumentString(void) const throw () = 0; + + + /** + * Return the type of this object. + * + * @return either AudioClipType or PlaylistType. + */ + Type + getType(void) const throw () + { + return type; + } + + /** + * Return an audio clip pointer to this object. If the object's + * type is not AudioClipType, returns a zero pointer. + * + * @see getType() + * @return an audio clip pointer to this object. + */ + Ptr::Ref + getAudioClip(void) throw (); + + /** + * Return a playlist pointer to this object. If the object's + * type is not PlaylistType, returns a zero pointer. + * + * @see getType() + * @return a playlist pointer to this object. + */ + Ptr::Ref + getPlaylist(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_Playable_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Playlist.h b/campcaster/src/modules/core/include/LiveSupport/Core/Playlist.h new file mode 100644 index 000000000..4c66e5396 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Playlist.h @@ -0,0 +1,899 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Playlist_h +#define LiveSupport_Core_Playlist_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/UniqueId.h" +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/Playable.h" +#include "LiveSupport/Core/PlaylistElement.h" + + +namespace LiveSupport { +namespace Core { + +using namespace boost::posix_time; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing playlist. + * Playlist are containers for AudioClips, with the additional + * information of when and how each audio clip is played inside + * the playlist. + * + * This object has to be configured with an XML configuration element + * called playlist. This may look like the following: + * + *
    
    + *  <playlist id="0000000000000001"
    + *            title="My Playlist" 
    + *            playlength="00:18:30.000000">
    + *      <playlistElement> ... </playlistElement>
    + *      ...
    + *      <playlistElement> ... </playlistElement>
    + *      <metadata xmlns="http://mdlf.org/livesupport/elements/1.0/"
    + *                 xmlns:ls="http://mdlf.org/livesupport/elements/1.0/"
    + *                 xmlns:dc="http://purl.org/dc/elements/1.1/"
    + *                 xmlns:dcterms="http://purl.org/dc/terms/"
    + *                 xmlns:xml="http://www.w3.org/XML/1998/namespace">
    + *          <dc:title>File Title txt</dc:title>
    + *          <dcterms:extent>00:02:30.000000</dcterms:extent>
    + *          ...
    + *      </metadata>
    + *  </playlist>
    + *  
    + * + * The DTD for the above element is: + * + *
    
    + *  <!ELEMENT playlist (playlistElement*, metadata?) >
    + *  <!ATTLIST playlist  id           NMTOKEN    #REQUIRED >
    + *  <!ATTLIST playlist  title        CDATA      ""        >
    + *  <!ATTLIST playlist  playlength   NMTOKEN    #IMPLIED  >
    + *  
    + * + * For detais of the playlistElement element, see the documentation + * for the PlaylistElement class. + * + * The metadata element is optional. The configure() method + * sets only those fields which had not been set previously: e.g., if we set + * some or all fields of the Playlist in the constructor, then these fields + * in the XML element will be ignored by configure(). + * The title attribute and the <dc:title> + * element set the same field; if both are present, the title is set from + * the attribute and the element is ignored.. + * The same is true for the playlength attribute and the + * <dcterms:extent> element. + * + * It is required that by the end of the configure() method, the playlength + * is set somehow (from a constructor, the attribute or the element). + * If the title is not set by the end of the configure() method, it is then + * set to the empty string. + * + * A Playlist can be of various kinds, depending on what we want to use it + * for, and how we got it from the StorageClientInterface: + *
      + *
    • A playlist obtained by getPlaylist() has its uri, + * token and editToken fields all unset + * (i.e., null). Such playlists contain sub-playlists which + * are just stubs, i.e., id, title, playlength triples, + * without actual references to its content objects.
    • + *
    • A playlist obtained by acquirePlaylist() has its uri + * and token fields set, but its editToken + * field unset. These are complete Playlist objects, and their + * sub-playlists contain references to all their sub-objects etc. + * The sub-playlists have their uri fields set, which + * allows them to be played by the audio player, but their + * token field is unset, because these sub-playlists + * are acquired and will be released recursively when the outermost + * playlist containing them is acquired and released.
    • + *
    • A playlist obtained by editPlaylist() has its editToken + * field set (but uri and token unset). + * The sub-playlists of these are also just stubs.
    • + *
    + * + * The playlists are stored by the storage server in the format returned by + * the getXmlDocumentString() function: + *
      + *
    • The outermost <playlist> has an id attribute, + * a list of <playlistElement> children + * and a <metadata> child.
    • + *
    • Each <playlistElement> has an id + * and a relativeOffset attribute, + * either a <playlist> or an <audioClip> child, + * and optionally a <fadeInfo> child.
    • + *
    • Each <playlist> and <audioClip> has id, title + * and playlength attributes (and no children).
    • + *
    • Each <fadeInfo> has fadeIn and fadeOut attributes + * (and no children).
    • + *
    • The <metadata> element contains all the metadata of + * the outermost playlist. + * The dc:title and dcterms:extent elements are compulsory, + * everything else is optional.
    • + *
    + * An example: + * + *
    
    + *  <playlist id="0000000000000001">
    + *      <playlistElement id="0000000000000101"
    + *                       relativeOffset="00:00:00.000000">
    + *          <audioClip id="0000000000010001" 
    + *                    title="My Audio Clip"
    + *                    playlength="00:02:30.000000"/>
    + *          <fadeInfo id="0000000000009901" 
    + *                    fadeIn="00:00:02.000000"
    + *                    fadeOut="00:00:01.500000"/>
    + *      </playlistElement>
    + *      <playlistElement id="0000000000000102"
    + *                       relativeOffset="00:02:30.000000">
    + *          <playlist id="0000000000000002" 
    + *                    title="Embedded Playlist"
    + *                    playlength="00:18:30.000000"/>
    + *      </playlistElement>
    + *      <metadata xmlns="http://mdlf.org/livesupport/elements/1.0/"
    + *                xmlns:ls="http://mdlf.org/livesupport/elements/1.0/"
    + *                xmlns:dc="http://purl.org/dc/elements/1.1/"
    + *                xmlns:dcterms="http://purl.org/dc/terms/"
    + *                xmlns:xml="http://www.w3.org/XML/1998/namespace">
    + *          <dc:title>My Playlist</dc:title>
    + *          <dcterms:extent>00:21:00.000000</dcterms:extent>
    + *          ...
    + *      </metadata>
    + *  </playlist>
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class Playlist : public Configurable, + public Playable +{ + private: + /** + * The name of the configuration XML elmenent used by Playlist. + */ + static const std::string configElementNameStr; + + /** + * The unique id of the playlist. + */ + Ptr::Ref id; + + /** + * The title of the playlist. + */ + Ptr::Ref title; + + /** + * The playling length of the playlist. + */ + Ptr::Ref playlength; + + /** + * The uri of the SMIL file generated from this playlist (if any). + */ + Ptr::Ref uri; + + /** + * The token given to this playlist by the storage server when + * the playlist is acquired; removed when it is released. + */ + Ptr::Ref token; + + /** + * The token given to this playlist by the storage server when + * it is opened for editing; removed when it is saved or reverted. + */ + Ptr::Ref editToken; + + /** + * A map type for storing the playlist elements associated with + * this playlist, indexed by their relative offsets. + */ + typedef std::multimap::Ref> + PlaylistElementListType; + + /** + * The list of playlist elements for this playlist. + */ + Ptr::Ref elementList; + + /** + * A saved copy of this playlist. + */ + Ptr::Ref savedCopy; + + + /** + * This playlist in XML format. + */ + Ptr::Ref xmlPlaylist; + + /** + * Set the value of a metadata field in this playlist. + * + * @param value the new value of the metadata field. + * @param name the name of the metadata field (without prefix) + * @param prefix the prefix of the metadata field + * @exception std::invalid_argument if the key is dcterms:extent, + * but the value is not a valid ISO-8601 time + */ + void + setMetadata(Ptr::Ref value, + const std::string &name, const std::string &prefix) + throw (std::invalid_argument); + + /** + * Set the total playing length of this playlist. + * + * @param playlength the playing length in microseconds precision. + */ + void + setPlaylength(Ptr::Ref playlength) + throw (); + + /** + * Set the playlength member of this audio clip. + * + * @param timeString the playing length in microseconds precision. + * @exception std::invalid_argument if the argument is not + * a valid ISO-8601 time + */ + void + setPlaylength(Ptr::Ref timeString) + throw (std::invalid_argument); + + /** + * A private iterator type for internal use. It is non-constant; + * otherwise it is the same as Playlist::const_iterator. + */ + typedef PlaylistElementListType::iterator iterator; + + /** + * Get an iterator pointing to a playlist element with a given ID. + * + * @param playlistElementId (a pointer to) the ID of the + * playlist element. + * @return an iterator to the playlist element if it exists, + * or this->end() if it does not. + */ + iterator + find(Ptr::Ref playlistElementId) + throw (); + + /** + * Convert a time_duration to string, in format HH:MM:SS.ssssss. + */ + std::string + toFixedString(Ptr::Ref time) const + throw () + { + if (time->fractional_seconds()) { + return to_simple_string(*time); + } else { + return to_simple_string(*time) + ".000000"; + } + } + + + public: + /** + * Copy constructor. + * + * @param otherPlaylist the playlist to be copied + */ + Playlist(const Playlist & otherPlaylist) + throw (); + + /** + * Default constructor. + * + * NOTE: this constructor creates a Playlist with a null pointer + * for both the ID and the playlength fields! It is meant for + * internal use only. + * + * If you want to create an empty Playlist, use the storage client: + *
    
    +         *  Ptr::Ref
    +         *          storageClientFactory = StorageClientFactory::getInstance();
    +         *  Ptr::Ref
    +         *          storageClient = storageClientFactory->getStorageClient();
    +         *  Ptr::Ref
    +         *          playlist = storageClient->createPlaylist(sessionId);
    +         *  
    + * + * @see StorageClient::StorageClientFactory + * @see StorageClient::StorageClientInterface + */ + Playlist(void) throw () + : Playable(PlaylistType) + { + elementList.reset(new PlaylistElementListType); + } + + /** + * Create a playlist by specifying its ID only. + * + * For internal use; see the note at the default constructor. + */ + Playlist(Ptr::Ref id) throw () + : Playable(PlaylistType) + { + this->id = id; + + elementList.reset(new PlaylistElementListType); + } + + /** + * Create a playlist by specifying all details, except the title. + * + * This is used for testing purposes; + * see the note at the default constructor. + * + * @param id the id of the playlist. + * @param playlength the playing length of the playlist. + * @param uri the location of the SMIL file representing this + * playlist (optional) + */ + Playlist(Ptr::Ref id, + Ptr::Ref playlength, + Ptr::Ref uri = Ptr::Ref()) + throw (); + + /** + * Create a playlist by specifying all details. + * + * This is used for testing purposes; + * see the note at the default constructor. + * + * @param id the id of the playlist. + * @param playlength the playing length of the playlist. + * @param uri the location of the SMIL file representing this + * playlist (optional) + */ + Playlist(Ptr::Ref id, + Ptr::Ref title, + Ptr::Ref playlength, + Ptr::Ref uri = Ptr::Ref()) + throw (); + + /** + * Convert the playlist to an XmlRpcValue (marshalling). + * + * @return an XmlRpcValue struct, containing a + * field named playlist, with value of type string, + * which contains an XML document representing the playlist. + */ + operator XmlRpc::XmlRpcValue() const + throw (); + + /** + * Construct a playlist from an XmlRpcValue (demarshalling). + * + * @param xmlRpcValue an XmlRpcValue struct, containing a + * field named playlist, with value of type string, + * which contains an XML document, the root node of which + * can be passed to the configure() method. + * @exception std::invalid_argument if the argument is invalid + */ + Playlist(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~Playlist(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 + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Return the id of the playlist. + * + * @return the unique id of the playlist. + */ + virtual Ptr::Ref + getId(void) const throw () + { + return id; + } + + + /** + * Return the title of this playlist. + * + * @return the title. + */ + virtual Ptr::Ref + getTitle(void) const throw () + { + return title; + } + + /** + * Set the title of this playlist. + * + * @param title a new title. + */ + virtual void + setTitle(Ptr::Ref title) + throw (); + + + /** + * Return the total playing length for this playlist. + * + * @return the playing length in microseconds precision. + */ + virtual Ptr::Ref + getPlaylength(void) const throw () + { + return playlength; + } + + /** + * Return the URI of the SMIL file created from this + * playlist, which can be played by the audio player. + * + * @return the URI. + */ + virtual Ptr::Ref + getUri(void) const throw () + { + return uri; + } + + /** + * Set the URI of the SMIL file created from this + * playlist, which can be played by the audio player. + * + * @param uri the new URI. + */ + virtual void + setUri(Ptr::Ref uri) throw () + { + this->uri = uri; + } + + /** + * Return the token which is used to identify this + * playlist to the storage server. + * + * The token is set when the Playable object is acquired and + * unset (made null again) when it is released. + * + * @return the token. + */ + virtual Ptr::Ref + getToken(void) const throw () + { + return token; + } + + /** + * Set the token which is used to identify this + * playlist to the storage server. + * + * The token is set when the Playable object is acquired and + * unset (made null again) when it is released. + * + * @param token a new token. + */ + virtual void + setToken(Ptr::Ref token) + throw () + { + this->token = token; + } + + /** + * Return the token which is used to identify this + * playlist to the storage server. + * + * The edit token is set when the Playable object is opened for + * editing and unset (made null again) when it is saved or reverted. + * + * @return the token. + */ + virtual Ptr::Ref + getEditToken(void) const throw () + { + return editToken; + } + + /** + * Set the token which is used to identify this + * playlist to the storage server. + * + * The edit token is set when the Playable object is opened for + * editing and unset (made null again) when it is saved or reverted. + * + * @param token a new token. + */ + virtual void + setEditToken(Ptr::Ref token) + throw () + { + this->editToken = token; + } + + /** + * Test whether the playlist is locked for editing. + * + * @return true if the playlist is currently being edited + */ + bool + isLocked() const throw () + { + return (editToken.get() != 0); + } + + + /** + * The iterator type for this class. A Playlist::const_iterator + * is a (constant) pointer to a pair < time_duration, + * Ptr<PlaylistElement>::Ref >. + * If it is such an iterator, then it->second + * is the playlist element referenced by the iterator, and + * it->first is its relative offset in the playlist. + * The playlist elements are listed in the order of their relative + * offset (starting time). + * + * @see begin(), end(), find() + */ + typedef PlaylistElementListType::const_iterator const_iterator; + + /** + * Get an iterator pointing to the first playlist element. + */ + const_iterator + begin() const throw () + { + return elementList->begin(); + } + + /** + * Get an iterator pointing to one after the last playlist element. + */ + const_iterator + end() const throw () + { + return elementList->end(); + } + + /** + * Get an iterator pointing to the first playlist element at a given + * relative offset. + * + * @param relativeOffset (a pointer to) the relative offset where + * the playlist element is. + * @return a constant iterator to the playlist element if it exists, + * or this->end() if it does not. + */ + const_iterator + find(Ptr::Ref relativeOffset) const + throw () + { + return elementList->find(*relativeOffset); + } + + /** + * Return the number of playlist elements in the playlist. + */ + int + size() const throw () + { + return elementList->size(); + } + + /** + * Add a new audio clip or sub-playlist to the playlist. + * + * Checks the type of the playlist, and calls either addAudioClip() + * or addPlaylist(). + * + * @param playable the new playable item to be added + * @param relativeOffset the start of the playable item, relative + * to the start of the playlist + * @param fadeInfo the fade in / fade out info (optional) + * @return the ID of the new PlaylistElement + * @exception std::invalid_argument if playable is neither an AudioClip + * nor a Playlist + */ + Ptr::Ref + addPlayable(Ptr::Ref playable, + Ptr::Ref relativeOffset, + Ptr::Ref fadeInfo + = Ptr::Ref()) + throw (std::invalid_argument); + + /** + * Add a new audio clip to the playlist. + * + * The playlist is not checked for gaps (use valid() for that), + * but the playlength is adjusted if the new audio clip is added + * at the end of the playlist. + * + * @param audioClip the new audio clip to be added + * @param relativeOffset the start of the audio clip, relative + * to the start of the playlist + * @param fadeInfo the fade in / fade out info (optional) + * @return the ID of the new PlaylistElement + */ + Ptr::Ref + addAudioClip(Ptr::Ref audioClip, + Ptr::Ref relativeOffset, + Ptr::Ref fadeInfo + = Ptr::Ref()) + throw (); + + /** + * Add a new sub-playlist to the playlist. + * + * The playlist is not checked for gaps (use valid() for that), + * but the playlength is adjusted if the new sub-playlist is added + * at the end of the playlist. + * + * @param playlist the sub-playlist to be added + * @param relativeOffset the start of the sub-playlist, relative + * to the start of the containing playlist + * @param fadeInfo the fade in / fade out info (optional) + * @return the ID of the new PlaylistElement + */ + Ptr::Ref + addPlaylist(Ptr::Ref playlist, + Ptr::Ref relativeOffset, + Ptr::Ref fadeInfo + = Ptr::Ref()) + throw (); + + /** + * Add a new playlist element to the playlist. + * + * @param playlistElement the new playlist element to be added + */ + void + addPlaylistElement(Ptr::Ref playlistElement) + throw (); + + /** + * Set the fade in / fade out info for a playlist element. + * + * @param playlistElementId the ID of the playlist element + * @param fadeInfo the new fade in / fade out info + * @exception std::invalid_argument if there is no playlist element + * at the given relative offset + */ + void + setFadeInfo(Ptr::Ref playlistElementId, + Ptr::Ref fadeInfo) + throw (std::invalid_argument); + + /** + * Remove a playlist element from the playlist. + * + * @param playlistElementId the ID of the playlist element + * @exception std::invalid_argument if the playlist element does not + * exist + */ + void + removePlaylistElement(Ptr::Ref playlistElementId) + throw (std::invalid_argument); + + /** + * Check if the playlist is valid. + * + * This means that + *
      + *
    • there are no gaps between the playlist elements + * (overlaps are allowed); and
    • + *
    • the length of the playlist is equal + * to the ending time of the last item in it.
    • + *
    + * + * This is checked for the playlist itself, and all sub-playlists + * contained inside it. + * + * NOTE: all kinds of overlaps are allowed. + * TODO: restrict it somehow? + */ + bool + valid(void) const throw (); + + + /** + * Create a saved copy of this playlist. If a saved copy exists + * already, it is replaced by the current state. + */ + void + createSavedCopy(void) throw (); + + /** + * Delete the saved copy of the playlist, if exists (or do nothing). + */ + void + deleteSavedCopy(void) throw () + { + savedCopy.reset(); + } + + /** + * Revert to the saved copy of this playlist. If there is no + * saved copy, do nothing and throw an exception. + */ + void + revertToSavedCopy(void) throw (std::invalid_argument); + + + /** + * Return the value of a metadata field in this playlist. + * If the playlist does not have this metadata field, returns a null + * pointer. + * + * @param key the name of the metadata field + * @return the value of the metadata field; 0 if there is + * no such field; + */ + virtual Ptr::Ref + getMetadata(const std::string &key) const + throw (); + + /** + * Set the value of a metadata field in this playlist. + * + * @param value the new value of the metadata field. + * @param key the name of the metadata field + * @exception std::invalid_argument if the key is dcterms:extent, + * but the value is not a valid ISO-8601 time + */ + virtual void + setMetadata(Ptr::Ref value, + const std::string &key) + throw (std::invalid_argument); + + + /** + * Return a partial XML representation of this audio clip or playlist. + * + * This is a string containing a single <playlist> + * XML element, with minimal information { id, title, playlength } + * only, without an XML header or any other metadata. + * It does not contain the list of playlist elements in the playlist. + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * @return a string representation of the playlist as an XML element + */ + virtual Ptr::Ref + getXmlElementString(void) const throw (); + + + /** + * Return a complete XML representation of this playlist. + * + * This is a string containing a an XML document with a + * <playlist> root node, together with an XML header and a + * <metadata> element (for the outermost playlist only). + * + * The playlist elements listed are only stubs returned by + * getXmlElementString(), i.e., { id, title, playlength } triples, + * without their contents. See the more detailed description at + * the top of this page. + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * The uri, token and editToken fields are not + * part of the XML document string returned. + * + * @return a string representation of the playlist as an XML document + */ + virtual Ptr::Ref + getXmlDocumentString(void) const throw (); + + + /** + * Eliminate the gaps in the playlist. + * + * If there is a 2s gap between elements 2 and 3, then elements 3, + * 4, etc. are moved to 2s earlier. Elements 2 and 3 will not + * overlap, even if the first has a fade-out and the second has a + * fade-in. + * + * @return true if some gaps have been found and eliminated + */ + virtual bool + eliminateGaps(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_Playlist_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/PlaylistElement.h b/campcaster/src/modules/core/include/LiveSupport/Core/PlaylistElement.h new file mode 100644 index 000000000..2967a41e3 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/PlaylistElement.h @@ -0,0 +1,455 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef PlaylistElement_h +#define PlaylistElement_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/UniqueId.h" +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Core/Playable.h" +#include "LiveSupport/Core/AudioClip.h" +#include "LiveSupport/Core/Playlist.h" +#include "LiveSupport/Core/FadeInfo.h" + + +namespace LiveSupport { +namespace Core { + +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +// forward declaration to avoid circular reference +class Playlist; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An item in a Playlist, consisting of an AudioClip or another Playlist + * and optional FadeInfo (fade in / fade out information). + * + * The contents of the playlist element can be accessed either by calling + * getPlayable(), or, if a specific type of element is needed, by checking + * getType() first, and then calling either getAudioClip() or getPlaylist(). + * + * This object has to be configured with an XML configuration element + * called playlistElement. This may look like the following: + * + *
    
    + *  <playlistElement id="707" relativeOffset="00:12:34.000000" >
    + *      <audioClip> ... </audioClip>
    + *      <fadeInfo> ... </fadeInfo>
    + *  </playlist>
    + *  
    + * + * For detais of the audioClip and fadeInfo elements, see the documentation + * for the AudioClip and FadeInfo classes. + * + * The DTD for the above element is: + * + *
    
    + *  <!ELEMENT playlistElement ((audioClip|playlist), fadeInfo?) >
    + *  <!ATTLIST playlistElement  id              NMTOKEN   #REQUIRED  >
    + *  <!ATTLIST playlistElement  relativeOffset  NMTOKEN   #REQUIRED  >
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class PlaylistElement : public Configurable +{ + public: + /** + * The possible types of the playlist element (audio clip or + * sub-playlist). + */ + enum Type { AudioClipType, PlaylistType }; + + private: + /** + * The name of the configuration XML element used by Playlist. + */ + static const std::string configElementNameStr; + + /** + * The id of the playlist element. + */ + Ptr::Ref id; + + /** + * The starting time of the event. + */ + Ptr::Ref relativeOffset; + + /** + * The type of the entry (audio clip or sub-playlist). + */ + Type type; + + /** + * The generic playable object associated with the entry. + * This is either an audio clip or a playlist. + */ + Ptr::Ref playable; + + /** + * The audio clip associated with the entry. + */ + Ptr::Ref audioClip; + + /** + * The playlist associated with the entry. + */ + Ptr::Ref playlist; + + /** + * The fade in / fade out info associated with the entry. + */ + Ptr::Ref fadeInfo; + + /** + * Convert a time_duration to string, in format HH:MM:SS.ssssss. + */ + std::string + toFixedString(Ptr::Ref time) const throw () + { + if (time->fractional_seconds()) { + return to_simple_string(*time); + } else { + return to_simple_string(*time) + ".000000"; + } + } + + + public: + + /** + * The default constructor. + */ + PlaylistElement(void) throw () + { + } + + /** + * Create a playlist element by specifying all details. + * This is used for testing purposes. + * + * @param id the id of the entry. + * @param relativeOffset the start time of this element, relative to + * the start of the playlist. + * @param audioClip (a pointer to) the audio clip associated + * with the playlist element. + * @param fadeInfo fade in / fade out information (optional) + */ + PlaylistElement(Ptr::Ref id, + Ptr::Ref relativeOffset, + Ptr::Ref audioClip, + Ptr::Ref fadeInfo + = Ptr::Ref()) + throw () + { + this->id = id; + this->relativeOffset = relativeOffset; + this->audioClip = audioClip; + this->playable = audioClip; + this->fadeInfo = fadeInfo; + this->type = AudioClipType; + } + + /** + * Create a new audio clip playlist element, with a new UniqueId, + * to be added to a playlist. + * + * @param relativeOffset the start time of this element, relative to + * the start of the playlist. + * @param audioClip (a pointer to) the audio clip associated + * with the playlist element. + * @param fadeInfo fade in / fade out information (optional) + */ + PlaylistElement(Ptr::Ref relativeOffset, + Ptr::Ref audioClip, + Ptr::Ref fadeInfo + = Ptr::Ref()) + throw () + { + this->id = UniqueId::generateId(); + this->relativeOffset = relativeOffset; + this->audioClip = audioClip; + this->playable = audioClip; + this->fadeInfo = fadeInfo; + this->type = AudioClipType; + } + + /** + * Create a new sub-playlist playlist element, with a new UniqueId, + * to be added to a playlist. + * + * @param relativeOffset the start time of this element, relative to + * the start of the playlist. + * @param playlist (a pointer to) the sub-playlist associated + * with the playlist element. + * @param fadeInfo fade in / fade out information (optional) + */ + PlaylistElement(Ptr::Ref relativeOffset, + Ptr::Ref playlist, + Ptr::Ref fadeInfo + = Ptr::Ref()) + throw () + { + this->id = UniqueId::generateId(); + this->relativeOffset = relativeOffset; + this->playlist = playlist; + this->playable = playlist; + this->fadeInfo = fadeInfo; + this->type = PlaylistType; + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~PlaylistElement(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 configuration information + */ + virtual void + configure(const xmlpp::Element & element) + throw (std::invalid_argument); + + /** + * Return the id of the playlist element. + * + * @return the id of the playlist element. + */ + Ptr::Ref + getId(void) const throw () + { + return id; + } + + /** + * Set the relative offset of the playlist element. + * Note: this is very dangerous; use only if you know what you are + * doing. Never ever change the relative offset of a PlaylistElement + * which is contained in a Playlist. + * + * @param newOffset the new relative offset of the element. + */ + void + setRelativeOffset(Ptr::Ref newOffset) + throw () + { + relativeOffset = newOffset; + } + + /** + * Return the relative offset of the playlist element. + * + * @return the relative offset of the element. + */ + Ptr::Ref + getRelativeOffset(void) const throw () + { + return relativeOffset; + } + + /** + * Return the type of this playlist element. If the return + * value is PlaylistElement::AudioClipType (resp. PlaylistType), + * the getAudioClip() (resp. getPlaylist()) + * method is guaranteed to return a non-zero value. + * + * @return either AudioClipType or PlaylistType. + */ + Type + getType(void) const throw () + { + return type; + } + + /** + * Return the Playable instance (an AudioClip or a Playlist) + * associated with the playlist element. Use this if you don't + * care which type this playlist element is, e.g., you + * just want to play it in an audio player. + * + * @return the Playable instance associated with the element. + */ + Ptr::Ref + getPlayable(void) const throw () + { + return playable; + } + + /** + * Set the Playable instance (an AudioClip or a Playlist) + * associated with the playlist element. + * + * This is used by WebStorageClient::acquirePlaylist() to replace + * a stub (id, title, playlength only) sub-playlist with a full one. + * + * @param playable the new Playable object. + */ + void + setPlayable(Ptr::Ref playable) throw () + { + this->playable = playable; + switch (playable->getType()) { + case Playable::AudioClipType : + audioClip = playable->getAudioClip(); + type = AudioClipType; + break; + case Playable::PlaylistType : + playlist = playable->getPlaylist(); + type = PlaylistType; + break; + } + } + + /** + * Return the audio clip associated with the playlist element. + * + * @see getType() + * @return the audio clip associated with the element. + */ + Ptr::Ref + getAudioClip(void) const throw () + { + return audioClip; + } + + /** + * Return the sub-playlist associated with the playlist element. + * + * @see getType() + * @return the sub-playlist associated with the element. + */ + Ptr::Ref + getPlaylist(void) const throw () + { + return playlist; + } + + /** + * Set the fade info associated with the playlist element. + * + * @param fadeInfo the fade info to be associated with the element. + */ + void + setFadeInfo(Ptr::Ref fadeInfo) throw () + { + this->fadeInfo = fadeInfo; + } + + /** + * Return the fade info associated with the playlist element. + * + * @return the fade info associated with the element. + */ + Ptr::Ref + getFadeInfo(void) const throw () + { + return fadeInfo; + } + + + /** + * Return an XML representation of this playlist element. + * + * This is a string containing a single + * XML element, with its ID and relativeOffset attributes, + * plus an or XML element, + * plus an optional element. + * + * The encoding is UTF-8. IDs are 16-digit hexadecimal numbers, + * time durations have the format "hh:mm:ss.ssssss". + * + * @return a string representation of the audio clip as an XML element + */ + Ptr::Ref + getXmlElementString(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // PlaylistElement_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Ptr.h b/campcaster/src/modules/core/include/LiveSupport/Core/Ptr.h new file mode 100644 index 000000000..d0114d036 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Ptr.h @@ -0,0 +1,108 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Ptr_h +#define LiveSupport_Core_Ptr_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A placeholder class for holidng typedefs to smart pointers. + * This is a workaround, as unfortunately typedfs in themselves may + * not be templated. For a discussion on the issue, see + * http://www.gotw.ca/gotw/079.htm + * + * The smart pointers here are typedefs to the smart pointers in the + * boost library. For documentation of the boost smart pointers, + * see http://www.boost.org/libs/smart_ptr/ + * + * @author $Author$ + * @version $Revision$ + */ +template +class Ptr +{ + private: + /** + * Default constructor. + */ + Ptr(void) throw () + { + } + + + public: + /** + * This is actually a typedef to the boost shared_ptr, which + * is a reference counting shared smart pointer. + * For more on boost::shared_ptr, see + * http://www.boost.org/libs/smart_ptr/shared_ptr.htm + * + * To use this pointer, define as follows: + * + * Ptr::Ref myPointer; + * + */ + typedef boost::shared_ptr Ref; +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_Ptr_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/RunnableInterface.h b/campcaster/src/modules/core/include/LiveSupport/Core/RunnableInterface.h new file mode 100644 index 000000000..82c5e84d7 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/RunnableInterface.h @@ -0,0 +1,108 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_RunnableInterface_h +#define LiveSupport_Core_RunnableInterface_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A Runnable object, that can form the main execution body of a thread. + * + * @author $Author$ + * @version $Revision$ + * @see Thread + */ +class RunnableInterface +{ + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~RunnableInterface(void) throw () + { + } + + /** + * The main execution loop for the thread. + */ + virtual void + run(void) throw () = 0; + + /** + * Send a signal to the runnable object. + * + * @param userData user-specific parameter for the signal. + */ + virtual void + signal(int userData) throw () = 0; + + /** + * Signal the thread to stop, gracefully. + * This is just a call to signal the execution to stop, eventually. + */ + virtual void + stop(void) throw () = 0; +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + + +#endif // LiveSupport_Core_RunnableInterface_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/ScheduleEntry.h b/campcaster/src/modules/core/include/LiveSupport/Core/ScheduleEntry.h new file mode 100644 index 000000000..0f72b9672 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/ScheduleEntry.h @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_ScheduleEntry_h +#define LiveSupport_Core_ScheduleEntry_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/UniqueId.h" + + +namespace LiveSupport { +namespace Core { + +using namespace boost::posix_time; + +using namespace LiveSupport; + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A scheduled event. + * + * @author $Author$ + * @version $Revision$ + */ +class ScheduleEntry +{ + private: + /** + * The name of the schedule entry element + */ + static const std::string scheduleEntryElementName; + + /** + * The name of the id attribute in the schedule entry element + */ + static const std::string idAttrName; + + /** + * The name of the playlist attribute in the schedule entry element + */ + static const std::string playlistIdAttrName; + + /** + * The name of the startTime attribute in the schedule entry element + */ + static const std::string startTimeAttrName; + + /** + * The name of the endTime attribute in the schedule entry element + */ + static const std::string endTimeAttrName; + + /** + * The name of the playlength attribute in the schedule entry element + */ + static const std::string playlengthAttrName; + + /** + * The id of the schedule entry. + */ + Ptr::Ref id; + + /** + * The id of the playlist associated with the entry. + */ + Ptr::Ref playlistId; + + /** + * The starting time of the event. + */ + Ptr::Ref startTime; + + /** + * The end time for the event. + */ + Ptr::Ref endTime; + + /** + * The playling length of the event. + */ + Ptr::Ref playlength; + + /** + * The default constructor. + */ + ScheduleEntry(void) throw () + { + } + + + public: + + /** + * A constructor with initialization values. + * + * @param id the id of the entry. + * @param playlistId the id of the playlist associated with the entry. + * @param startTime the starting time for the entry. + * @param endTime the ending time for the entry. + */ + ScheduleEntry(Ptr::Ref id, + Ptr::Ref playlistId, + Ptr::Ref startTime, + Ptr::Ref endTime) + throw () + { + this->id = id; + this->playlistId = playlistId; + this->startTime = startTime; + this->endTime = endTime; + + playlength.reset(new time_duration(*endTime - *startTime)); + } + + /** + * A constructor based on a DOM element + * + * @param element a DOM element returned earlier by a + * getDom() call from another schedule entry. + * @throws std::invalid_argument in case of a bad DOM element + * @see #getElementName + * @see #getDom + */ + ScheduleEntry(xmlpp::Element * element) + throw (std::invalid_argument); + + /** + * Return the name of the DOM element used to export / import + * a schedule entry. + * + * @return the DOM element name used at export / import. + */ + static const std::string + getElementName(void) throw () + { + return scheduleEntryElementName; + } + + /** + * Return the id of the entry. + * + * @return the id of the entry. + */ + Ptr::Ref + getId(void) const throw () + { + return id; + } + + /** + * Return the id of the playlist associated with the entry. + * + * @return the id of the playlist associated with the entry. + */ + Ptr::Ref + getPlaylistId(void) const throw () + { + return playlistId; + } + + /** + * Return the starting time for the entry. + * + * @return the starting time for the entry. + */ + Ptr::Ref + getStartTime(void) const throw () + { + return startTime; + } + + /** + * Return the ending time for the entry. + * + * @return the ending time for the entry. + */ + Ptr::Ref + getEndTime(void) const throw () + { + return endTime; + } + + /** + * Return the playlength of the schedule entry. + * + * @return the playing length of the schedule entry. + */ + Ptr::Ref + getPlaylength(void) const throw () + { + return playlength; + } + + /** + * Return a DOM representation of this object. + * Can be used to serialize or generate another object with + * a DOM-based constructor. + * + * @param element the new DOM node will be a new child of this + * element. + * @see #getElementName + */ + void + toDom(xmlpp::Element * element) const throw (); + + /** + * Compare a schedule entry to another one. + * + * @param other the other entry to compare to. + */ + bool + operator==(const ScheduleEntry & other) const throw () + { + return *id == *other.id + && *playlistId == *other.playlistId + && *startTime == *other.startTime + && *endTime == *other.endTime + && *playlength == *other.playlength; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_ScheduleEntry_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/SearchCriteria.h b/campcaster/src/modules/core/include/LiveSupport/Core/SearchCriteria.h new file mode 100644 index 000000000..76fe4a79b --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/SearchCriteria.h @@ -0,0 +1,379 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_SearchCriteria_h +#define LiveSupport_Core_SearchCriteria_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + +// forward declaration of friend class +namespace LiveSupport { +namespace StorageClient { + class TestStorageClient; +} } + +namespace LiveSupport { +namespace Core { + +using namespace boost::posix_time; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An object which contains a collection of search conditions. + * + * Its fields are: + *
      + *
    • type - values in (audioClip | playlist | all); the default is + * all
    • + *
    • operator - values in (and | or); the default is and
    • + *
    • condition1 : { key : string, comparison: string, value : string } + * - a search condition, where key is one of the + * fields in the metadata, and comparison is + * one of ("=" | "partial" | "prefix" + * | "<" | "<=" | ">" | ">=")
    • + *
    • ...
    • + *
    • conditionN
    • + *
    • limit : int - the maximum number of results to be returned; + * the default is 0, which means unlimited
    • + *
    • offset : int - ignore the first offset matches; + * the default is 0.
    • + *
    + * + * Usage: construct a SearchCriteria object either directly using the + * constructor with 4 string arguments, or in several steps using + * addCondition() and the setter methods; + * then pass this object to StorageClientInterface::search() + * to search the local storage. + * + * The key and value fields are case-sensitive, all the other + * strings (type, operator names) are case-insensitive. + */ +class SearchCriteria +{ + public: + + /** + * A type to hold a single search condition. + */ + struct SearchConditionType + { + std::string key; + std::string comparisonOperator; + std::string value; + + SearchConditionType(const std::string & key, + const std::string & comparisonOperator, + const std::string & value) + : key(key), comparisonOperator(comparisonOperator), value(value) + { + } + }; + + private: + + /** + * The kind of object we are searching for. + */ + std::string type; + + /** + * The logical operator joining the conditions: "and" or "or". + */ + std::string logicalOperator; + + /** + * A type to hold the list of search conditions. + */ + typedef std::vector + SearchConditionListType; + + /** + * The vector of search conditions. + */ + SearchConditionListType searchConditions; + + /** + * The mtime to use for "ls:mtime". + */ + Ptr::Ref mtimeValue; + + /** + * The comparison operator to use for "ls:mtime". + */ + std::string mtimeComparisonOperator; + + /** + * The maximum number of conditions to be returned. + */ + int limit; + + /** + * The index of the first matching condition to be returned. + */ + int offset; + + /** + * Lowercase a string. + */ + std::string + lowerCase(const std::string & s) throw() + { + std::string returnValue; + std::string::const_iterator it = s.begin(); + while (it != s.end()) { + returnValue += std::tolower(*it); + ++it; + } + return returnValue; + } + + /** + * Give access of private members to the TestStorageClient. + */ + friend class LiveSupport::StorageClient::TestStorageClient; + + /** + * Add a search condition. + * + * @param xmlRpcValue the condition to add. + * @exception std::invalid_argument on syntax errors. + */ + void + addCondition(const XmlRpc::XmlRpcValue & xmlRpcValue) + throw(std::invalid_argument); + + + public: + + /** + * Construct an empty SearchCriteria object. + * This also works as a default constructor. + * + * @param type one of "audioClip" (default), "playlist" or "all" + * @param logicalOperator either "and" (default) or "or" + * @exception std::invalid_argument on syntax errors. + */ + SearchCriteria(const std::string & type = "all", + const std::string & logicalOperator = "and") + throw(std::invalid_argument) + : limit(0), offset(0) + { + setType(type); + setLogicalOperator(logicalOperator); + } + + /** + * Construct a SearchCriteria object with a single condition. + * + * @param type one of "audioClip", "playlist" or "all" + * @param key the metadata field to search in + * @param comparisonOperator one of "=", "partial", "prefix", + * "<", "<=", ">" or ">=" + * @param value the value to compare to + * @exception std::invalid_argument on syntax errors. + */ + SearchCriteria(const std::string & type, + const std::string & key, + const std::string & comparisonOperator, + const std::string & value) + throw(std::invalid_argument); + + /** + * Construct a SearchCriteria object from an XmlRpcValue. + * + * @param xmlRpcValue an XmlRpcValue struct, containing + * the search criteria. + * @exception std::invalid_argument on syntax errors. + */ + SearchCriteria(const XmlRpc::XmlRpcValue & xmlRpcValue) + throw(std::invalid_argument); + + /** + * Set the type field. + * + * @param type one of "audioClip", "playlist" or "all" + * @exception std::invalid_argument on syntax errors. + */ + void + setType(const std::string & type) + throw(std::invalid_argument) + { + std::string lowerCaseType = lowerCase(type); + if (lowerCaseType == "audioclip" + || lowerCaseType == "playlist" + || lowerCaseType == "all") { + this->type = lowerCaseType; + } else { + throw std::invalid_argument("bad type argument"); + } + + } + + /** + * Set the logical operator field. + * + * @param logicalOperator either "and" or "or" + * @exception std::invalid_argument on syntax errors. + */ + void + setLogicalOperator(const std::string & logicalOperator) + throw(std::invalid_argument) + { + std::string lowerCaseOp = lowerCase(logicalOperator); + if (lowerCaseOp == "and" || lowerCaseOp == "or") { + this->logicalOperator = lowerCaseOp; + } else { + throw std::invalid_argument("bad logical operator argument"); + } + } + + /** + * Add a search condition. + * + * @param key the metadata field to search in + * @param comparisonOperator one of "=", "partial", "prefix", + * "<", "<=", ">" or ">=" + * @param value the value to compare to + * @exception std::invalid_argument on syntax errors. + */ + void + addCondition(const std::string & key, + const std::string & comparisonOperator, + const std::string & value) + throw(std::invalid_argument); + + /** + * Add a search condition specifying the mtime (modified-at time). + * + * @param comparisonOperator one of "=", "partial", "prefix", + * "<", "<=", ">" or ">=" + * @param value the value of the mtime to compare to + * @exception std::invalid_argument on syntax errors. + */ + void + addMtimeCondition(const std::string & comparisonOperator, + Ptr::Ref value) + throw(std::invalid_argument); + + /** + * Add a search condition. + * + * @param condition the search condition to add + * @exception std::invalid_argument on syntax errors. + */ + void + addCondition(const Ptr::Ref condition) + throw(std::invalid_argument) + { + addCondition(condition->key, + condition->comparisonOperator, + condition->value); + } + + /** + * Set the limit field. + * + * @param limit the maximum number of search results to be returned + * @exception std::invalid_argument on syntax errors. + */ + void + setLimit(const int limit) + throw(std::invalid_argument) + { + if (limit >= 0) { + this->limit = limit; + } else { + throw std::invalid_argument("bad argument: less than zero"); + } + } + + /** + * Set the offset field. + * + * @param offset the index of the first matching condition + * to be returned (first = 0) + * @exception std::invalid_argument on syntax errors. + */ + void + setOffset(const int offset) + throw(std::invalid_argument) + { + if (offset >= 0) { + this->offset = offset; + } else { + throw std::invalid_argument("bad argument: less than zero"); + } + } + + /** + * Convert to an XmlRpc::XmlRpcValue. + */ + operator XmlRpc::XmlRpcValue() const throw(); + + /** + * Check two SearchCriteria objects for equality. + */ + bool + operator ==(const SearchCriteria & other) const throw(); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_SearchCriteria_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/SessionId.h b/campcaster/src/modules/core/include/LiveSupport/Core/SessionId.h new file mode 100644 index 000000000..cd66c8348 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/SessionId.h @@ -0,0 +1,160 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_SessionId_h +#define LiveSupport_Core_SessionId_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing session identifiers. + * + * @author $Author$ + * @version $Revision$ + */ +class SessionId +{ + private: + /** + * The value of the session ID. + */ + std::string id; + + /** + * Default constructor. + */ + SessionId(void) throw () + { + } + + + public: + /** + * The type for the value the session id is represented in. + */ + typedef std::string IdType; + + /** + * Constructor to create a SessionId with a specific value. + * + * @param id the value of the created id object. + */ + SessionId(const IdType id) throw () + { + this->id = id; + } + + /** + * Compare this is with an other one. + * + * @param otherId the other unqiue id to compare to. + * @return true if this another sessionId have the same value, + * false otherwise. + */ + bool + operator==(const SessionId & otherId) const + throw () + { + return this->id == otherId.id; + } + + /** + * Compare this is with an other one. + * + * @param otherId the other unqiue id to compare to. + * @return true if this another sessionId do not have the same value, + * false otherwise. + */ + bool + operator!=(const SessionId & otherId) const + throw () + { + return this->id != otherId.id; + } + + /** + * Compare this id with an other one. + * + * @param otherId the other session id to compare to. + * @return true if this id is smaller than the other one, + * false otherwise. + */ + bool + operator<(const SessionId & otherId) const + throw () + { + return this->id < otherId.id; + } + + /** + * Return the (string) value of this session ID. + * + * @return the value of this id. + */ + const IdType + getId(void) const throw () + { + return id; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_SessionId_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Thread.h b/campcaster/src/modules/core/include/LiveSupport/Core/Thread.h new file mode 100644 index 000000000..c5e81ba03 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Thread.h @@ -0,0 +1,181 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Thread_h +#define LiveSupport_Core_Thread_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/RunnableInterface.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A generic thread executor class. + * + * @author $Author$ + * @version $Revision$ + * @see RunnableInterface + */ +class Thread +{ + private: + /** + * The POSIX thread for this object. + */ + pthread_t thread; + + /** + * The Runnable object, that constitutes the main running body + * of the thread. + */ + Ptr::Ref runnable; + + /** + * Default constructor. + */ + Thread(void) throw () + { + } + + /** + * The thread function for the POSIX thread interface. + * + * @param thread pointer to this thread instance. + * @return always 0 + */ + static void * + posixThreadFunction(void * thread) throw (); + + public: + /** + * Constructor. + * + * @param runnable the Runnable object making up the execution + * part of the thread. + */ + Thread(Ptr::Ref runnable) throw (); + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~Thread(void) throw () + { + } + + /** + * Start the execution of the thread. + * This funcion will create a new thread and starts executing + * it by the run() function of the Runnable object. Start will + * return immediately. + * + * @exception std::exception if the thread could not be started. + */ + virtual void + start(void) throw (std::exception); + + /** + * Signal the thread to stop, gracefully. + * This is just a call to signal the execution to stop, eventually. + * The thread still has to be joined after calling stop(). + * + * @see #join + */ + virtual void + stop(void) throw () + { + runnable->stop(); + } + + /** + * Force the current thread to relinquish use of its processor. + * So that other threads get a chance to run. + */ + static void + yield(void) throw () + { + pthread_yield(); + } + + /** + * Join the thread. + * Wait for the thread to terminate and free up all its resources. + */ + virtual void + join(void) throw (); + + /** + * Send a signal to the runnable object inside this thread. + * + * @param userData user-specific parameter for the signal. + */ + virtual void + signal(int userData) throw () + { + runnable->signal(userData); + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + + +#endif // LiveSupport_Core_Thread_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/TimeConversion.h b/campcaster/src/modules/core/include/LiveSupport/Core/TimeConversion.h new file mode 100644 index 000000000..7ba1161b7 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/TimeConversion.h @@ -0,0 +1,277 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_TimeConversion_h +#define LiveSupport_Core_TimeConversion_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_SYS_TIME_H +#include +#else +#error need sys/time.h +#endif + +#include + +#include "LiveSupport/Core/Ptr.h" + + +namespace LiveSupport { +namespace Core { + +using namespace boost::posix_time; + +using namespace LiveSupport; + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A helper object holding static time conversion functions. + * + * TODO: clean this up, and use the boost conversion functions, instead of + * converting stuff manually + * (see http://boost.org/doc/html/date_time/posix_time.html). + * + * @author $Author$ + * @version $Revision$ + */ +class TimeConversion +{ + private: + /** + * Parse a time string. + * + * It cuts off the portion between the end of the string and the last + * occurrence of the separator character. For example, if called with + * the parameters "00:01:02" and ':', the function returns "02" and + * truncates the original string to "00:01". + * + * If the separator character is not found in timeString, + * a copy of the whole timeString is returned, and the + * original timeString is changed to the empty string. + * + * @param timeString the input argument; on return, the rest of the + * string, after the return value cut off + * @param separator a separator character, usually ':' + * @return the part of the string which was cut off + */ + static Ptr::Ref + nextNumberFromEnd(Ptr::Ref timeString, + char separator) throw (); + + /** + * Parse a decimal string. + * + * It cuts off the portion between the end of the string and the last + * occurrence of the separator character. For example, if called with + * the parameters "1.23" and '.', the function returns "23" and + * truncates the original string to "1". + * + * If the separator character is not found in timeString, + * then an empty string is returned, and the + * original timeString remains unchanged. + * + * @param decimalString the input argument; on return, the rest of + * the string, after the return value cut off + * @param separator a separator character, usually '.' + * @return the part of the string which was cut off + */ + static Ptr::Ref + nextNumberFromStart(Ptr::Ref decimalString, + char separator) throw (); + + /** + * The default constructor. + */ + TimeConversion(void) throw () + { + } + + + public: + /** + * Convert a struct timeval to a boost::posix_time::ptime, + * with microsecond precision. + * + * @param timeval the struct timeval to convert. + * @return a boost::posix_time::ptime, holding the same time. + * @exception std::out_of_range if timeval represents a time that + * can not be handled by ptime + */ + static Ptr::Ref + timevalToPtime(const struct timeval *timeval) + throw (std::out_of_range); + + /** + * Convert a struct tm to a boost::posix_time::ptime, + * with second precision. + * + * @param time the struct tm to convert. + * @return a boost::posix_time::ptime, holding the same time. + * @exception std::out_of_range if time represents a time that + * can not be handled by ptime + */ + static Ptr::Ref + tmToPtime(const struct tm *time) + throw (std::out_of_range); + + /** + * Convert a boost::posix_time::ptime to a struct tm, + * with second precision. + * + * @param convertFrom the boost::posix_time::ptime to convert. + * @param convertTo holds the result of the conversion + * @return a struct tm, holding the same time. + */ + static void + ptimeToTm(Ptr::Ref convertFrom, struct tm & convertTo) + throw (); + + /** + * Return the current time, with microsecond precision. + * + * @return the current time, with microsecond precision. + */ + static Ptr::Ref + now(void) throw (); + + /** + * Return the current time, with microsecond precision, as a string. + * + * @return the current time, with microsecond precision. + */ + static Ptr::Ref + nowString(void) throw (); + + /** + * Sleep for the specified time duration, with microsecond precision. + * + * @param duration sleep for this duration. + */ + static void + sleep(Ptr::Ref duration) throw (); + + /** + * Convert a time_duration to a format used in SMILs. + * This means number of seconds, rounded to the nearest millisecond. + * For example: "1234.567s", "0.890s", or "3.000s". + * + * @param duration the time duration to convert. + */ + static Ptr::Ref + timeDurationToSmilString(Ptr::Ref duration) + throw (); + + /** + * Convert a time_duration to a rounded format used on the screen. + * + * This means a hh:mm:ss format, rounded to the nearest second. + * + * For example: "01:02:03" or "00:10:00". The hours field can be + * more than two characters wide, e.g.: "8765:48:45". + * + * @param duration the time duration to convert. + * @return the time duration in string format + */ + static Ptr::Ref + timeDurationToHhMmSsString(Ptr::Ref duration) + throw (); + + /** + * Convert a time_duration to a format used for fade info. + * + * This means a hh:mm:ss.ffffff format, with hours, minutes and + * fractions left off when zero. + * + * For example: 01:02:03.004, 1:02 (meaning 1m 2s), 3 (meaning 3s), + * 0.002 (meaning 2ms). Zero is represented as 0. + * + * @param duration the time duration to convert. + * @return the time duration in string format + */ + static Ptr::Ref + timeDurationToShortString(Ptr::Ref duration) + throw (); + + /** + * Parse a string to a time_duration. + * Similar to boost::posix_time::duration_from_string(), only + * not broken quite as badly. + * + * Parsing is right-to-left, starting with seconds: for example, + * 5 means 5 seconds; 01:02.03 means 1m 2.03s; 1:2:3 means 1h 2m 3s. + * + * If the time format is invalid, no exception is thrown, but the + * result is undefined (usually 00:00:00). + * TODO: fix this, by adding a format check + * + * @param durationString the duration as string + * @return the duration as a time_duration + */ + static Ptr::Ref + parseTimeDuration(Ptr::Ref durationString) + throw (); + + /** + * Get the number of digits used for fractional seconds + * in time durations. + * Returns the constant 6, for microsecond precision. + */ + static int + getNumberOfDigitsPrecision(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_TimeConversion_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/UniqueId.h b/campcaster/src/modules/core/include/LiveSupport/Core/UniqueId.h new file mode 100644 index 000000000..0425e5878 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/UniqueId.h @@ -0,0 +1,255 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_UniqueId_h +#define LiveSupport_Core_UniqueId_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include +#include +#include +#include "LiveSupport/Core/Ptr.h" + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing globally unique identifiers. + * + * @author $Author$ + * @version $Revision$ + */ +class UniqueId +{ + public: + /** + * The type for the numeric value the unique id is represented in. + * This is set to 'long long int', i.e., 64-bit signed integers. + * TODO: change this into something not quite as non-portable. + */ + typedef long long int IdType; + + private: + /** + * The value of the id. + */ + IdType id; + + /** + * A string representation of the id, in hexadecimal notation. + */ + std::string idAsString; + + /** + * Default constructor. + */ + UniqueId(void) throw () + { + } + + + public: + /** + * Constructor to create a UniqueId with a specific integer value. + * The argument is expected to be between 0 and 2^31-1 (inclusive). + * + * @param id the numeric value of the created id object. + */ + UniqueId(const IdType id) throw () + { + this->id = id; + std::stringstream idWriter; + idWriter << std::hex << std::setw(16) << std::setfill('0') << id; + this->idAsString = idWriter.str(); + } + + /** + * Constructor to create a UniqueId with a specific string value. + * If the argument is not a valid hexadecimal number between 0 and + * 2^31-1 (inclusive), the integer value of the UniqueId will be + * bogus. + * + * @param idAsString the string value of the created id object, + * in hexadecimal notation. + */ + UniqueId(const std::string idAsString) throw () + { + this->idAsString = idAsString; + // TODO: add error checking + std::stringstream idReader(idAsString); + idReader >> std::hex >> this->id; + } + + /** + * Create a UniqueId from a numeric value, which is a string + * representation of the id, in base 10. + * If the argument is not a valid decimal number between 0 and + * 2^31-1 (inclusive), the value of the UniqueId will be + * bogus. + * + * @param strValue the id in base 10, in string from. + * @return a new UniqueId with the specified ID value. + */ + static Ptr::Ref + fromDecimalString(const std::string idStr) throw () + { + IdType id; + // TODO: error checking + std::stringstream idReader(idStr); + idReader >> id; + + Ptr::Ref uid(new UniqueId(id)); + return uid; + } + + /** + * Return the UniqueId as a string in base 10. + * + * @return a new string containing the value of the UniqueId. + */ + Ptr::Ref + toDecimalString(void) const throw () + { + std::stringstream idWriter; + idWriter << std::dec << id; + Ptr::Ref idString(new std::string( + idWriter.str() )); + return idString; + } + + /** + * Compare this is with an other one. + * + * @param otherId the other unqiue id to compare to. + * @return true if this an otherId have the same ID value, + * false otherwise. + */ + bool + operator==(const UniqueId & otherId) const throw () + { + return this->id == otherId.id; + } + + /** + * Compare this is with an other one. + * + * @param otherId the other unqiue id to compare to. + * @return true if this an otherId do not have the same ID value, + * false otherwise. + */ + bool + operator!=(const UniqueId & otherId) const throw () + { + return this->id != otherId.id; + } + + /** + * Compare this id with an other one. + * + * @param otherId the other unique id to compare to. + * @return true if this id is smaller than the other one, + * false otherwise. + */ + bool + operator<(const UniqueId & otherId) const throw () + { + return this->id < otherId.id; + } + + /** + * Generate a globally unique id. This is used for testing. + * In real life, unique IDs are generated by the storage server. + */ + static Ptr::Ref + generateId(void) throw (); + + /** + * Return the numeric value of this globally unique id. + * + * @return the numeric value of this id. + */ + const IdType + getId(void) const throw () + { + return id; + } + + /** + * Return the numeric value of this globally unique id + * (alternative syntax). + * + * @return the numeric value of this id. + */ + operator IdType() const throw () + { + return id; + } + + /** + * Return the string value of this globally unique id. + * + * @return the string value of this id. + */ + operator std::string() const throw () + { + return idAsString; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_UniqueId_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/Uuid.h b/campcaster/src/modules/core/include/LiveSupport/Core/Uuid.h new file mode 100644 index 000000000..b571ccd4f --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/Uuid.h @@ -0,0 +1,320 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + This code is based upon the Leach working draft for UUIDs, + http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt + and the sample code therein. + The original copyright message of the sample code is the following: + +** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & +** Digital Equipment Corporation, Maynard, Mass. +** Copyright (c) 1998 Microsoft. +** To anyone who acknowledges that this file is provided "AS IS" +** without any express or implied warranty: permission to use, copy, +** modify, and distribute this file for any purpose is hereby +** granted without fee, provided that the above copyright notices and +** this notice appears in all source code copies, and that none of +** the names of Open Software Foundation, Inc., Hewlett-Packard +** Company, or Digital Equipment Corporation be used in advertising +** or publicity pertaining to distribution of the software without +** specific, written prior permission. Neither Open Software +** Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment +** Corporation makes any representations about the suitability of +** this software for any purpose. + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_Uuid_h +#define LiveSupport_Core_Uuid_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_STDINT_H +#include +#else +#error need stdint.h +#endif + + +#include +#include "LiveSupport/Core/Ptr.h" + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class representing globally unique identifiers. + * This implementation is based on the Leach UUID/GUID draft: + * http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt + * + * @author $Author$ + * @version $Revision$ + * @see http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt + */ +class Uuid +{ + private: + /** + * The raw time type + */ + typedef uint64_t UuidTime; + + /** + * Structure holding a 6-byte system node id. + */ + typedef struct { + char nodeId[6]; + } UuidNode; + + /** + * The value of the id. + */ + long long int id; + + /** + * A string representation of the id, in hexadecimal notation. + */ + std::string idAsString; + + /** + * The low part of time. + */ + uint32_t timeLow; + + /** + * The middle part of time. + */ + uint16_t timeMid; + + /** + * The high part of time, with version included. + */ + uint16_t timeHiAndVersion; + + /** + * Clock sequence number high and reserved parts. + */ + uint8_t clockSeqHiAndReserved; + + /** + * Clock sequenc number, low part. + */ + uint8_t clockSeqLow; + + /** + * The 6 byte system node id. + */ + uint8_t node[6]; + + /** + * Default constructor. + */ + Uuid(void) throw () + { + } + + /** + * Compare two UUIDs + * + * @param id1 one id to compare + * @param id2 the other id to compare + * @return true if they are equal, false otherwise + */ + static bool + compare(const Uuid & id1, + const Uuid & id2) throw (); + + /** + * Return the current time, but always return a different value, + * even if the system clock granularity is not fine enough. + * + * @param timestamp an out parameter for the current time. + */ + static void + getCurrentTime(UuidTime * timestamp) throw (); + + /** + * Try to generate a truely random number (which is not possible, + * of course). + * + * @return a random number + */ + static uint16_t + trueRandom(void) throw (); + + /** + * Read the last saved state of the UUID generator from + * non-volatile storage. + * + * @param clockSeq out parameter for the clock sequence + * @param timestamp out parameter for the timestamp + * @param node out parameter for the system node id + */ + int + readState(uint16_t * clockSeq, + UuidTime * timestamp, + UuidNode * node) throw (); + + /** + * Write the last saved state of the UUID generator to + * non-volatile storage. + * + * @param clockSeq the clock sequence + * @param timestamp the timestamp + * @param node the system node id + */ + void + writeState(uint16_t clockSeq, + UuidTime timestamp, + UuidNode node) throw (); + + /** + * Generate a type 1 UUID. + * This function will fill out the object's internal attributes + * for it to become a proper UUID. + * + * For UUID types, see + * http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt + * + * @param clockSeq the clock sequence + * @param timestamp the time stamp + * @param node the system node id + */ + void + format(uint16_t clockSeq, + UuidTime timestamp, + UuidNode node) throw (); + + /** + * Get the system time in the UUID UTC base time, + * which is October 15, 1582. + * + * @param uuidTime an out parameter for the time. + */ + static void + getSystemTime(UuidTime * uuidTime) throw (); + + /** + * Return the IEEE node id. + * + * @param node an out parameter for the node id. + */ + static void + getIeeeNodeIdentifier(UuidNode * node) throw (); + + /** + * Create a string representation of the UUID. + * Store the result in the idAsString attribute. + */ + void + representAsString(void) throw (); + + + public: + /** + * Generate a globally unique id. This is used for testing. + * In real life, unique IDs are generated by the storage server. + */ + static Ptr::Ref + generateId(void) throw (); + + /** + * Compare this is with an other one. + * + * @param otherId the other unqiue id to compare to. + * @return true if this an otherId have the same ID value, + * false otherwise. + */ + bool + operator==(const Uuid & otherId) const throw () + { + return compare(*this, otherId); + } + + /** + * Compare this is with an other one. + * + * @param otherId the other unqiue id to compare to. + * @return true if this an otherId do not have the same ID value, + * false otherwise. + */ + bool + operator!=(const Uuid & otherId) const throw () + { + return !compare(*this, otherId); + } + + /** + * Return the string value of this globally unique id. + * + * @return the string value of this id. + */ + operator std::string() const throw () + { + return idAsString; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + +inline std::ostream & +operator<< (std::ostream & os, + const Uuid & id) +{ + os << (std::string) id; + + return os; +} + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_Uuid_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcCommunicationException.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcCommunicationException.h new file mode 100644 index 000000000..af163219c --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcCommunicationException.h @@ -0,0 +1,122 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcCommunicationException_h +#define LiveSupport_Core_XmlRpcCommunicationException_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/XmlRpcException.h" + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Exception signaling an XML-RPC problem: could not find the XML-RPC server, + * the server responded 'no such method', or the method response could not be + * parsed. + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcCommunicationException : public XmlRpcException +{ + public: + /** + * Constructor based on a string. + * + * @param msg the message of the exception. + */ + XmlRpcCommunicationException(const std::string &msg) throw () + : XmlRpcException(msg) + { + } + + /** + * Constructor based on a parent exception. + * + * @param parent the parent exception to this one. + */ + XmlRpcCommunicationException(const std::exception & parent) + throw () + : XmlRpcException(parent) + { + } + + /** + * Constructor based on a message ant a parent exception. + * + * @param msg the message of the exception. + * @param parent the parent exception. + */ + XmlRpcCommunicationException(const std::string & msg, + const std::exception & parent) + throw () + : XmlRpcException(msg, parent) + { + } + + /** + * Virtual destructor. + */ + ~XmlRpcCommunicationException(void) throw () + { + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcCommunicationException_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcException.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcException.h new file mode 100644 index 000000000..e29295235 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcException.h @@ -0,0 +1,151 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcException_h +#define LiveSupport_Core_XmlRpcException_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Ptr.h" + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Common parent of exception classes for XML-RPC related problems. + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcException : public std::exception +{ + private: + /** + * The message of the exception. + */ + Ptr::Ref message; + + /** + * A possible embedded exception. + */ + const std::exception & parent; + + public: + /** + * Constructor based on a string. + * + * @param msg the message of the exception. + */ + XmlRpcException(const std::string &msg) throw () + : parent(*this) + { + message.reset(new std::string(msg)); + } + + /** + * Constructor based on a parent exception. + * + * @param parent the parent exception to this one. + */ + XmlRpcException(const std::exception & parent) throw () + : parent(parent) + { + message.reset(new std::string(parent.what())); + } + + /** + * Constructor based on a message ant a parent exception. + * + * @param msg the message of the exception. + * @param parent the parent exception. + */ + XmlRpcException(const std::string & msg, + const std::exception & parent) throw (); + + /** + * Virtual destructor. + */ + ~XmlRpcException(void) throw () + { + } + + /** + * Get the message of the exception. + * + * @return the message of the exception. + */ + virtual const char * + what(void) const throw () + { + return message->c_str(); + } + + /** + * Get the parent exception. + * + * @return the parent exception, which may be null. + */ + virtual const std::exception * + getParent(void) const throw () + { + return &parent == this ? 0 : &parent; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcException_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcIOException.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcIOException.h new file mode 100644 index 000000000..7b81a34d0 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcIOException.h @@ -0,0 +1,121 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcIOException_h +#define LiveSupport_Core_XmlRpcIOException_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/XmlRpcException.h" + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Exception signaling an XML-RPC problem: there was a problem with a local + * I/O operation. + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcIOException : public XmlRpcException +{ + public: + /** + * Constructor based on a string. + * + * @param msg the message of the exception. + */ + XmlRpcIOException(const std::string &msg) throw () + : XmlRpcException(msg) + { + } + + /** + * Constructor based on a parent exception. + * + * @param parent the parent exception to this one. + */ + XmlRpcIOException(const std::exception & parent) + throw () + : XmlRpcException(parent) + { + } + + /** + * Constructor based on a message ant a parent exception. + * + * @param msg the message of the exception. + * @param parent the parent exception. + */ + XmlRpcIOException(const std::string & msg, + const std::exception & parent) + throw () + : XmlRpcException(msg, parent) + { + } + + /** + * Virtual destructor. + */ + ~XmlRpcIOException(void) throw () + { + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcIOException_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcInvalidArgumentException.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcInvalidArgumentException.h new file mode 100644 index 000000000..284d59f69 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcInvalidArgumentException.h @@ -0,0 +1,122 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcInvalidArgumentException_h +#define LiveSupport_Core_XmlRpcInvalidArgumentException_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/XmlRpcException.h" + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Exception signaling an XML-RPC problem: invalid argument (functions which + * throw an XmlRpcException throw this when they would normally throw a + * std::invalid_argument). + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcInvalidArgumentException : public XmlRpcException +{ + public: + /** + * Constructor based on a string. + * + * @param msg the message of the exception. + */ + XmlRpcInvalidArgumentException(const std::string &msg) throw () + : XmlRpcException(msg) + { + } + + /** + * Constructor based on a parent exception. + * + * @param parent the parent exception to this one. + */ + XmlRpcInvalidArgumentException(const std::exception & parent) + throw () + : XmlRpcException(parent) + { + } + + /** + * Constructor based on a message ant a parent exception. + * + * @param msg the message of the exception. + * @param parent the parent exception. + */ + XmlRpcInvalidArgumentException(const std::string & msg, + const std::exception & parent) + throw () + : XmlRpcException(msg, parent) + { + } + + /** + * Virtual destructor. + */ + ~XmlRpcInvalidArgumentException(void) throw () + { + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcInvalidArgumentException_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcInvalidDataException.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcInvalidDataException.h new file mode 100644 index 000000000..315e77e2f --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcInvalidDataException.h @@ -0,0 +1,121 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcInvalidDataException_h +#define LiveSupport_Core_XmlRpcInvalidDataException_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/XmlRpcException.h" + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Exception signaling an XML-RPC problem: invalid data returned by the method. + * This could be a malformed AudioClip or Playlist, for example. + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcInvalidDataException : public XmlRpcException +{ + public: + /** + * Constructor based on a string. + * + * @param msg the message of the exception. + */ + XmlRpcInvalidDataException(const std::string &msg) throw () + : XmlRpcException(msg) + { + } + + /** + * Constructor based on a parent exception. + * + * @param parent the parent exception to this one. + */ + XmlRpcInvalidDataException(const std::exception & parent) + throw () + : XmlRpcException(parent) + { + } + + /** + * Constructor based on a message ant a parent exception. + * + * @param msg the message of the exception. + * @param parent the parent exception. + */ + XmlRpcInvalidDataException(const std::string & msg, + const std::exception & parent) + throw () + : XmlRpcException(msg, parent) + { + } + + /** + * Virtual destructor. + */ + ~XmlRpcInvalidDataException(void) throw () + { + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcInvalidDataException_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcMethodFaultException.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcMethodFaultException.h new file mode 100644 index 000000000..3b23d9a26 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcMethodFaultException.h @@ -0,0 +1,121 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcMethodFaultException_h +#define LiveSupport_Core_XmlRpcMethodFaultException_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/XmlRpcException.h" + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Exception signaling an XML-RPC problem: the XML-RPC method returned a fault + * response. + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcMethodFaultException : public XmlRpcException +{ + public: + /** + * Constructor based on a string. + * + * @param msg the message of the exception. + */ + XmlRpcMethodFaultException(const std::string &msg) throw () + : XmlRpcException(msg) + { + } + + /** + * Constructor based on a parent exception. + * + * @param parent the parent exception to this one. + */ + XmlRpcMethodFaultException(const std::exception & parent) + throw () + : XmlRpcException(parent) + { + } + + /** + * Constructor based on a message ant a parent exception. + * + * @param msg the message of the exception. + * @param parent the parent exception. + */ + XmlRpcMethodFaultException(const std::string & msg, + const std::exception & parent) + throw () + : XmlRpcException(msg, parent) + { + } + + /** + * Virtual destructor. + */ + ~XmlRpcMethodFaultException(void) throw () + { + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcMethodFaultException_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcMethodResponseException.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcMethodResponseException.h new file mode 100644 index 000000000..f4c7e050c --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcMethodResponseException.h @@ -0,0 +1,121 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcMethodResponseException_h +#define LiveSupport_Core_XmlRpcMethodResponseException_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/XmlRpcException.h" + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Exception signaling an XML-RPC problem: the XML-RPC method call completed + * normally, but the response received has incorrect syntax. + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcMethodResponseException : public XmlRpcException +{ + public: + /** + * Constructor based on a string. + * + * @param msg the message of the exception. + */ + XmlRpcMethodResponseException(const std::string &msg) throw () + : XmlRpcException(msg) + { + } + + /** + * Constructor based on a parent exception. + * + * @param parent the parent exception to this one. + */ + XmlRpcMethodResponseException(const std::exception & parent) + throw () + : XmlRpcException(parent) + { + } + + /** + * Constructor based on a message ant a parent exception. + * + * @param msg the message of the exception. + * @param parent the parent exception. + */ + XmlRpcMethodResponseException(const std::string & msg, + const std::exception & parent) + throw () + : XmlRpcException(msg, parent) + { + } + + /** + * Virtual destructor. + */ + ~XmlRpcMethodResponseException(void) throw () + { + } + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcMethodResponseException_h + diff --git a/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcTools.h b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcTools.h new file mode 100644 index 000000000..bd7df24e4 --- /dev/null +++ b/campcaster/src/modules/core/include/LiveSupport/Core/XmlRpcTools.h @@ -0,0 +1,719 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_XmlRpcTools_h +#define LiveSupport_Core_XmlRpcTools_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" +#include "LiveSupport/Core/SessionId.h" +#include "LiveSupport/Core/Playlist.h" +#include "LiveSupport/Core/ScheduleEntry.h" +#include "LiveSupport/Core/PlayLogEntry.h" +#include "LiveSupport/Core/SearchCriteria.h" +#include "LiveSupport/Core/AsyncState.h" + + +namespace LiveSupport { +namespace Core { + +using namespace LiveSupport; +using namespace LiveSupport::Core; +using namespace LiveSupport::StorageClient; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A toolbox for converting between inner representations of classes + * and XmlRpcValues. Used by almost all XmlRpcServerMethod subclasses + * in the Scheduler. + * + * @author $Author$ + * @version $Revision$ + */ +class XmlRpcTools +{ + private: + + /** + * Convert a boost::posix_time::ptime to an XmlRpcValue + * + * @param ptime the ptime to convert + * @param xmlRpcValue the output parameter holding the value of + * the conversion. + */ + static void + ptimeToXmlRpcValue(Ptr::Ref ptime, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (); + + /** + * Convert a PlayLogEntry to an XmlRpcValue + * + * @param playLogEntry the PlayLogEntry to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + playLogEntryToXmlRpcValue(Ptr::Ref playLogEntry, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + public: + /** + * Extract the schedule entry 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 + */ + static Ptr::Ref + extractScheduleEntryId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the generic '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 playlistId + * member in xmlRpcValue + */ + static Ptr::Ref + extractId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * 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 playlistId + * member in xmlRpcValue + */ + static Ptr::Ref + extractPlaylistId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the playlist element 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 playlistElementId + * member in xmlRpcValue + */ + static Ptr::Ref + extractPlaylistElementId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the audio clip 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 audioClipId + * member in xmlRpcValue + */ + static Ptr::Ref + extractAudioClipId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the relative offset from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a time_duration that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no relativeOffset + * member in xmlRpcValue + */ + static Ptr::Ref + extractRelativeOffset(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert a Playlist to an XmlRpcValue + * + * @param playlist the Playlist to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + playlistToXmlRpcValue(Ptr::Ref playlist, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (); + + /** + * Convert a vector of Playlists to an XML-RPC return value. + * + * @param playlistVector a list of Playlists. + * @param returnValue the output parameter holding an XML-RPC + * representation of the list of Playlists. + */ + static void + playlistVectorToXmlRpcValue( + const Ptr::Ref> >::Ref playlistVector, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Convert an AudioClip to an XmlRpcValue + * + * @param audioClip the AudioClip to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + audioClipToXmlRpcValue(Ptr::Ref audioClip, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (); + + /** + * Convert a vector of AudioClips to an XML-RPC return value. + * + * @param audioClipVector a list of AudioClips. + * @param returnValue the output parameter holding an XML-RPC + * representation of the list of AudioClips. + */ + static void + audioClipVectorToXmlRpcValue( + const Ptr::Ref> >::Ref audioClipVector, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Extract a Playlist from an XML-RPC parameter. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return the extracted Playlist. + */ + static Ptr::Ref + extractPlaylist(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract a vector of Playlists from an XML-RPC parameter. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a list of Playlists. + */ + static Ptr::Ref> >::Ref + extractPlaylistVector(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract an AudioClip from an XML-RPC parameter. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return the extracted AudioClip. + */ + static Ptr::Ref + extractAudioClip(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract a vector of AudioClips from an XML-RPC parameter. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a list of AudioClips. + */ + static Ptr::Ref> >::Ref + extractAudioClipVector(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert an error code, message pair to an XML-RPC fault response. + * This is done by throwing an XmlRpc::XmlRpcException. The client + * receives a fault response, and the return value is set to a + * { faultCode, faultString } structure holding the error code and + * message. + * + * @param errorCode the numerical code of the error. + * @param errorMessage a short English description of the error. + * @param xmlRpcValue remains here from an earlier version + * TODO: remove this later. + */ + static void + markError(int errorCode, const std::string errorMessage, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (XmlRpc::XmlRpcException); + + /** + * Convert the valid status of a playlist to an XmlRpcValue + * + * @param validStatus true if the playlist is valid, false otherwise. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + validStatusToXmlRpcValue(bool validStatus, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (); + + /** + * Extract the 'from' time parameter from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return the time value for the 'from' parameter + * @exception std::invalid_argument if there was no from parameter + * in xmlRpcValue + */ + static Ptr::Ref + extractFromTime(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the 'to' parameter from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return the time value for the 'to' parameter + * @exception std::invalid_argument if there was no to parameter + * in xmlRpcValue + */ + static Ptr::Ref + extractToTime(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the 'start' parameter from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return the time value for the 'start' parameter + * @exception std::invalid_argument if there was no to parameter + * in xmlRpcValue + */ + static Ptr::Ref + extractStartTime(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the 'end' parameter from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return the time value for the 'end' parameter + * @exception std::invalid_argument if there was no to parameter + * in xmlRpcValue + */ + static Ptr::Ref + extractEndTime(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Add a 'from' time value to an XmlRpcValue. + * + * @param from the 'from' time value to add. + * @param returnValue an output parameter, which has the + * 'from' time added after the function returns. + */ + static void + fromTimeToXmlRpcValue( + Ptr::Ref from, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (); + + /** + * Add a 'to' time value to an XmlRpcValue. + * + * @param to the 'to' time value to add. + * @param returnValue an output parameter, which has the + * 'to' time added after the function returns. + */ + static void + toTimeToXmlRpcValue( + Ptr::Ref to, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (); + + /** + * 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 + */ + static Ptr::Ref + extractPlayschedule(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the fade in time from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a time_duration that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no fadeIn + * member in xmlRpcValue + */ + static Ptr::Ref + extractFadeIn(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the fade out time from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a time_duration that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no fadeOut + * member in xmlRpcValue + */ + static Ptr::Ref + extractFadeOut(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert a vector of ScheduleEntries to an XML-RPC return value. + * + * @param scheduleEntries a list of ScheduleEntries. + * @param returnValue the output parameter holding an XML-RPC + * representation of the suppied schedule entires. + */ + static void + scheduleEntriesToXmlRpcValue( + Ptr::Ref> >::Ref scheduleEntries, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Convert an XmlRpcValue array, holding schedule entries, + * to a vector of ScheduleEntry object references. + * + * @param xmlRpcValue the XML-RPC array holding the schedule entry + * data + * @return a vector of ScheduleEntry object references, holding + * the same data. + */ + static Ptr::Ref> >::Ref + extractScheduleEntries(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (); + + /** + * Convert a schedule entry ID (a UniqueId) to an XmlRpcValue + * + * @param scheduleEntryId the UniqueId to convert. + * @param returnValue the output parameter holding the result of + * the conversion. + */ + static void + scheduleEntryIdToXmlRpcValue( + Ptr::Ref scheduleEntryId, + XmlRpc::XmlRpcValue & returnValue) throw (); + + /** + * Add a session id to an XmlRpcValue + * + * @param sessionId the session id to add to the XmlRpcValue + * @param returnValue an output parameter, which has the + * session id added after the function returns. + */ + static void + sessionIdToXmlRpcValue( + Ptr::Ref sessionId, + XmlRpc::XmlRpcValue & returnValue) throw (); + + /** + * Add a playlist ID to an XmlRpcValue + * + * @param playlistId the playlist ID to add to the XmlRpcValue + * @param returnValue an output parameter, which has the + * playlist ID added after the function returns. + */ + static void + playlistIdToXmlRpcValue( + Ptr::Ref playlistId, + XmlRpc::XmlRpcValue & returnValue) throw (); + + /** + * Add an audio clip ID to an XmlRpcValue + * + * @param audioClipId the audio clip ID to add to the XmlRpcValue + * @param returnValue an output parameter, which has the + * audio clip ID added after the function returns. + */ + static void + audioClipIdToXmlRpcValue( + Ptr::Ref audioClipId, + XmlRpc::XmlRpcValue & returnValue) throw (); + + /** + * Add a playlist element ID to an XmlRpcValue + * + * @param playlistElementId the playlist element ID + * to add to the XmlRpcValue + * @param returnValue an output parameter, which has the + * playlist element ID added after the function returns. + */ + static void + playlistElementIdToXmlRpcValue( + Ptr::Ref playlistElementId, + XmlRpc::XmlRpcValue & returnValue) throw (); + + /** + * Add a playtime value to an XmlRpcValue. + * + * @param playtime the playtime to add to the XmlRpcValue + * @param returnValue an output parameter, which has the + * playtime added after the function returns. + */ + static void + playtimeToXmlRpcValue( + Ptr::Ref playtime, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Convert a vector of PlayLogEntries to an XML-RPC return value. + * + * @param playLogVector a list of PlayLogEntries. + * @param returnValue the output parameter holding an XML-RPC + * representation of the list of PlayLogEntries. + */ + static void + playLogVectorToXmlRpcValue( + Ptr::Ref> >::Ref + playLogVector, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Extract the session ID from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a SessionId that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no sessionId + * member in xmlRpcValue + */ + static Ptr::Ref + extractSessionId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the login name from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a std::string that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no login + * member in xmlRpcValue + */ + static Ptr::Ref + extractLoginName(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the password from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a std::string that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no sessionId + * member in xmlRpcValue + */ + static Ptr::Ref + extractPassword(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Extract the search criteria from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a search criteria that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no criteria + * member in xmlRpcValue. + */ + static Ptr::Ref + extractSearchCriteria(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert a SearchCriteria to an XmlRpcValue. + * + * @param criteria the SearchCriteria to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + searchCriteriaToXmlRpcValue( + Ptr::Ref criteria, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Extract a token from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a string token that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no token + * member in xmlRpcValue. + */ + static Ptr::Ref + extractToken(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert a string token to an XmlRpcValue. + * + * @param criteria the string token to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + tokenToXmlRpcValue(Ptr::Ref token, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Extract the backup status from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return an AsyncState that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no "status" + * member in xmlRpcValue. + */ + static AsyncState + extractBackupStatus(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert an AsyncState returned by one + * of the backup methods to an XmlRpcValue. + * + * @param status the AsyncState to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + backupStatusToXmlRpcValue(AsyncState status, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Extract a URL string from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a URL string that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no "url" + * member in xmlRpcValue. + */ + static Ptr::Ref + extractUrl(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert a URL string to an XmlRpcValue. + * + * @param url the URL string to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + urlToXmlRpcValue(Ptr::Ref url, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Extract a path string from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a path string that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no "path" + * member in xmlRpcValue. + */ + static Ptr::Ref + extractPath(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert a path string to an XmlRpcValue. + * + * @param path the path string to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + pathToXmlRpcValue(Ptr::Ref path, + XmlRpc::XmlRpcValue & returnValue) + throw (); + + /** + * Extract a fault string from the XML-RPC parameters. + * + * @param xmlRpcValue the XML-RPC parameter to extract from. + * @return a fault string that was found in the XML-RPC parameter. + * @exception std::invalid_argument if there was no "faultString" + * member in xmlRpcValue. + */ + static Ptr::Ref + extractFaultString(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument); + + /** + * Convert a fault string to an XmlRpcValue. + * + * @param path the fault string to convert. + * @param xmlRpcValue the output parameter holding the result of + * the conversion. + */ + static void + faultStringToXmlRpcValue(Ptr::Ref faultString, + XmlRpc::XmlRpcValue & returnValue) + throw (); +}; + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_XmlRpcTools_h + diff --git a/campcaster/src/modules/core/lib/.keepme b/campcaster/src/modules/core/lib/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/core/lib/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/core/src/AsyncState.cxx b/campcaster/src/modules/core/src/AsyncState.cxx new file mode 100644 index 000000000..ae1ee2c94 --- /dev/null +++ b/campcaster/src/modules/core/src/AsyncState.cxx @@ -0,0 +1,201 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include "LiveSupport/Core/AsyncState.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * Constant instance: init. + *----------------------------------------------------------------------------*/ +const AsyncState AsyncState::initState(innerInitState); + +/*------------------------------------------------------------------------------ + * Constant instance: pending. + *----------------------------------------------------------------------------*/ +const AsyncState AsyncState::pendingState(innerPendingState); + +/*------------------------------------------------------------------------------ + * Constant instance: finished. + *----------------------------------------------------------------------------*/ +const AsyncState AsyncState::finishedState(innerFinishedState); + +/*------------------------------------------------------------------------------ + * Constant instance: closed. + *----------------------------------------------------------------------------*/ +const AsyncState AsyncState::closedState(innerClosedState); + +/*------------------------------------------------------------------------------ + * Constant instance: failed. + *----------------------------------------------------------------------------*/ +const AsyncState AsyncState::failedState(innerFailedState); + +/*------------------------------------------------------------------------------ + * Constant instance: invalid. + *----------------------------------------------------------------------------*/ +const AsyncState AsyncState::invalidState(innerInvalidState); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Construct from a transport string. + *----------------------------------------------------------------------------*/ +AsyncState +AsyncState :: fromTransportString(const std::string & transportString) + throw () +{ + if (transportString == "init") { + return initState; + + } else if (transportString == "pending" || transportString == "waiting") { + return pendingState; + + } else if (transportString == "finished") { + return finishedState; + + } else if (transportString == "closed") { + return closedState; + + } else if (transportString == "failed") { + return failedState; + } + + return invalidState; +} + + +/*------------------------------------------------------------------------------ + * Construct from a backup string. + *----------------------------------------------------------------------------*/ +AsyncState +AsyncState :: fromBackupString(const std::string & backupString) + throw () +{ + if (backupString == "working") { + return pendingState; + + } else if (backupString == "success") { + return finishedState; + + } else if (backupString == "fault") { + return failedState; + } + + return invalidState; +} + + +/*------------------------------------------------------------------------------ + * Convert to a transport string. + *----------------------------------------------------------------------------*/ +Ptr::Ref +AsyncState :: toTransportString(void) const throw () +{ + Ptr::Ref transportString(new std::string()); + + switch (value) { + case innerInitState: *transportString = "init"; + break; + + case innerPendingState: *transportString = "pending"; + break; + + case innerFinishedState: *transportString = "finished"; + break; + + case innerClosedState: *transportString = "closed"; + break; + + case innerFailedState: *transportString = "failed"; + break; + + case innerInvalidState: *transportString = "(invalid)"; + break; + } + + return transportString; +} + + +/*------------------------------------------------------------------------------ + * Convert to a backup string. + *----------------------------------------------------------------------------*/ +Ptr::Ref +AsyncState :: toBackupString(void) const throw () +{ + Ptr::Ref backupString(new std::string()); + + switch (value) { + case innerInitState: *backupString = "(init)"; + break; + + case innerPendingState: *backupString = "working"; + break; + + case innerFinishedState: *backupString = "success"; + break; + + case innerClosedState: *backupString = "(closed)"; + break; + + case innerFailedState: *backupString = "fault"; + break; + + case innerInvalidState: *backupString = "(invalid)"; + break; + } + + return backupString; +} + + +/*------------------------------------------------------------------------------ + * Print to an ostream. + *----------------------------------------------------------------------------*/ +std::ostream & +operator<<(std::ostream & ostream, const LiveSupport::Core::AsyncState state) + throw () +{ + Ptr::Ref transportState = state.toTransportString(); + ostream << *transportState; + return ostream; +} + diff --git a/campcaster/src/modules/core/src/AsyncStateTest.cxx b/campcaster/src/modules/core/src/AsyncStateTest.cxx new file mode 100644 index 000000000..5d586b985 --- /dev/null +++ b/campcaster/src/modules/core/src/AsyncStateTest.cxx @@ -0,0 +1,133 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include +#include + +#include "LiveSupport/Core/AsyncState.h" +#include "AsyncStateTest.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(AsyncStateTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +AsyncStateTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +AsyncStateTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test the basic conversions. + *----------------------------------------------------------------------------*/ +void +AsyncStateTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + AsyncState state = AsyncState::invalidState; + Ptr::Ref transportString; + Ptr::Ref backupString; + + state = AsyncState::initState; + transportString = state.toTransportString(); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromTransportString(*transportString), + state); + + state = AsyncState::pendingState; + transportString = state.toTransportString(); + backupString = state.toBackupString(); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromTransportString(*transportString), + state); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromBackupString(*backupString), + state); + + state = AsyncState::finishedState; + transportString = state.toTransportString(); + backupString = state.toBackupString(); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromTransportString(*transportString), + state); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromBackupString(*backupString), + state); + + state = AsyncState::closedState; + transportString = state.toTransportString(); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromTransportString(*transportString), + state); + + state = AsyncState::failedState; + transportString = state.toTransportString(); + backupString = state.toBackupString(); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromTransportString(*transportString), + state); + CPPUNIT_ASSERT_EQUAL(AsyncState::fromBackupString(*backupString), + state); + +} + + +/*------------------------------------------------------------------------------ + * Test the printing to an ostream. + *----------------------------------------------------------------------------*/ +void +AsyncStateTest :: ostreamTest(void) + throw (CPPUNIT_NS::Exception) +{ + std::ostringstream stream; + AsyncState state = AsyncState::finishedState; + + stream << state; + CPPUNIT_ASSERT(stream.str() == "finished"); +} + diff --git a/campcaster/src/modules/core/src/AsyncStateTest.h b/campcaster/src/modules/core/src/AsyncStateTest.h new file mode 100644 index 000000000..91390f8c1 --- /dev/null +++ b/campcaster/src/modules/core/src/AsyncStateTest.h @@ -0,0 +1,112 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef AsyncStateTest_h +#define AsyncStateTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the AsyncState class. + * + * @author $Author$ + * @version $Revision$ + * @see AsyncState + */ +class AsyncStateTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(AsyncStateTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(ostreamTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * Test the basic conversions. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the printing to an ostream. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + ostreamTest(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 Core +} // namespace LiveSupport + +#endif // AsyncStateTest_h + diff --git a/campcaster/src/modules/core/src/AudioClip.cxx b/campcaster/src/modules/core/src/AudioClip.cxx new file mode 100644 index 000000000..38b290d78 --- /dev/null +++ b/campcaster/src/modules/core/src/AudioClip.cxx @@ -0,0 +1,748 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include // for TagLib +#include // for TagLib +#include // for TagLib +#include // for TagLib + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/Core/AudioClip.h" + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/** + * The name of the config element for this class + */ +const std::string AudioClip::configElementNameStr = "audioClip"; + +/** + * The name of the attribute to get the id of the audio clip. + */ +static const std::string idAttrName = "id"; + +/** + * The name of the attribute to get the URI of the audio clip. + */ +static const std::string uriAttrName = "uri"; + +/** + * The name of the attribute to get the playlength of the audio clip. + */ +static const std::string playlengthAttrName = "playlength"; + +/** + * The name of the attribute to get the title of the audio clip. + */ +static const std::string titleAttrName = "title"; + +/** + * The name of the metadata child element. + */ +static const std::string metadataElementName = "metadata"; + +/** + * The prefix of the extent (length) metadata element. + */ +static const std::string extentElementPrefix = "dcterms"; + +/** + * The name of the extent (length) metadata element. + */ +static const std::string extentElementName = "extent"; + +/** + * The prefix of the title metadata element. + */ +static const std::string titleElementPrefix = "dc"; + +/** + * The name of the title metadata element. + */ +static const std::string titleElementName = "title"; + +/** + * The prefix for the Live Support extension elements. + */ +static const std::string liveSupportNamespacePrefix = "ls"; + +/** + * The prefix for the "xml:" prefix elements. + */ +static const std::string xmlNamespacePrefix = "xml"; + +/** + * The URI identifier for the default namespace + */ +static const std::string defaultNamespaceUri + = "http://mdlf.org/livesupport/elements/1.0/"; + +/** + * The URI identifier for the "ls" prefix. + */ +static const std::string liveSupportNamespaceUri + = "http://mdlf.org/livesupport/elements/1.0/"; + +/** + * The URI identifier for the "dc" prefix + */ +static const std::string dcNamespaceUri + = "http://purl.org/dc/elements/1.1/"; + +/** + * The URI identifier for the "dcterms" prefix + */ +static const std::string dctermsNamespaceUri + = "http://purl.org/dc/terms/"; + +/** + * The URI identifier for the "xml" prefix + */ +static const std::string xmlNamespaceUri + = "http://www.w3.org/XML/1998/namespace"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Copy constructor. + *----------------------------------------------------------------------------*/ +AudioClip :: AudioClip(const AudioClip & otherAudioClip) throw () + : Playable(AudioClipType) +{ + this->id = otherAudioClip.id; + this->title = otherAudioClip.title; + this->playlength = otherAudioClip.playlength; + this->uri = otherAudioClip.uri; + this->token = otherAudioClip.token; + + if (otherAudioClip.xmlAudioClip) { + xmlAudioClip.reset(new xmlpp::Document); + xmlAudioClip->create_root_node_by_import( + otherAudioClip.xmlAudioClip->get_root_node(), + true); // true == recursive + } +} + + +/*------------------------------------------------------------------------------ + * Test constructor without title. + *----------------------------------------------------------------------------*/ +AudioClip :: AudioClip(Ptr::Ref id, + Ptr::Ref playlength, + Ptr::Ref uri) + throw () + : Playable(AudioClipType) +{ + this->id = id; + this->title.reset(new Glib::ustring("")); + this->playlength = playlength; + this->uri = uri; + + setMetadata(title, titleElementName, titleElementPrefix); + + Ptr::Ref playlengthString(new const Glib::ustring( + toFixedString(playlength) )); + setMetadata(playlengthString, extentElementName, extentElementPrefix); +} + + +/*------------------------------------------------------------------------------ + * Test constructor with title. + *----------------------------------------------------------------------------*/ +AudioClip :: AudioClip(Ptr::Ref id, + Ptr::Ref title, + Ptr::Ref playlength, + Ptr::Ref uri) + throw () + : Playable(AudioClipType) +{ + this->id = id; + this->title = title; + this->playlength = playlength; + this->uri = uri; + + setMetadata(title, titleElementName, titleElementPrefix); + + Ptr::Ref playlengthString(new const Glib::ustring( + toFixedString(playlength) )); + setMetadata(playlengthString, extentElementName, extentElementPrefix); +} + + +/*------------------------------------------------------------------------------ + * Constructor without ID. + *----------------------------------------------------------------------------*/ +AudioClip :: AudioClip(Ptr::Ref title, + Ptr::Ref playlength, + Ptr::Ref uri) + throw () + : Playable(AudioClipType) +{ + this->title = title; + this->playlength = playlength; + this->uri = uri; + + setMetadata(title, titleElementName, titleElementPrefix); + + Ptr::Ref playlengthString(new const Glib::ustring( + toFixedString(playlength) )); + setMetadata(playlengthString, extentElementName, extentElementPrefix); +} + + +/*------------------------------------------------------------------------------ + * Convert to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +AudioClip :: operator XmlRpc::XmlRpcValue() const + throw() +{ + XmlRpc::XmlRpcValue xmlRpcValue; + xmlRpcValue[configElementNameStr] = std::string(*getXmlDocumentString()); + + return xmlRpcValue; +} + + +/*------------------------------------------------------------------------------ + * Construct from an XmlRpcValue. + *----------------------------------------------------------------------------*/ +AudioClip :: AudioClip(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) + : Playable(AudioClipType) +{ + if (!xmlRpcValue.hasMember(configElementNameStr)) { + throw std::invalid_argument("no audio clip data found in XmlRpcValue"); + } + + xmlpp::DomParser parser; + try { + parser.parse_memory(std::string(xmlRpcValue[configElementNameStr])); + } catch (xmlpp::exception &e) { + throw std::invalid_argument("error parsing XML document"); + } + + configure(*parser.get_document()->get_root_node()); // may throw +} + + +/*------------------------------------------------------------------------------ + * Set the value of the title field. + *----------------------------------------------------------------------------*/ +void +AudioClip :: setTitle(Ptr::Ref title) + throw () +{ + this->title = title; + setMetadata(title, titleElementName, titleElementPrefix); +} + + +/*------------------------------------------------------------------------------ + * Set the value of the playlength from a string (private). + *----------------------------------------------------------------------------*/ +void +AudioClip :: setPlaylength(Ptr::Ref timeString) + throw (std::invalid_argument) +{ + try { + playlength = TimeConversion::parseTimeDuration(timeString); + } catch (std::exception &e) { + std::string eMsg = "bad time format in playlength: "; + eMsg += e.what(); + throw std::invalid_argument(eMsg); + } +} + + +/*------------------------------------------------------------------------------ + * Create an audio clip object based on an XML element. + *----------------------------------------------------------------------------*/ +void +AudioClip :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + std::string eMsg = "bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + if (!id) { + if (!(attribute = element.get_attribute(idAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + id.reset(new UniqueId(attribute->get_value())); + } + + if (!playlength + && (attribute = element.get_attribute(playlengthAttrName))) { + Ptr::Ref playlengthString(new const Glib::ustring( + attribute->get_value() )); + setMetadata(playlengthString, extentElementName, extentElementPrefix); + } + + if (!title + && (attribute = element.get_attribute(titleAttrName))) { + title.reset(new const Glib::ustring(attribute->get_value())); + setMetadata(title, titleElementName, titleElementPrefix); + } + + if (!uri + && (attribute = element.get_attribute(uriAttrName))) { + uri.reset(new const std::string(attribute->get_value())); + } + + xmlpp::Node::NodeList childNodes + = element.get_children(metadataElementName); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + if (it != childNodes.end()) { + const xmlpp::Element * metadataElement + = dynamic_cast (*it); + + xmlAudioClip.reset(new xmlpp::Document); + xmlpp::Element* root = xmlAudioClip->create_root_node( + configElementNameStr); + root->set_attribute(idAttrName, std::string(*id)); + root->import_node(metadataElement, true); // true = recursive + + const xmlpp::Node::NodeList dataFieldList + = metadataElement->get_children(); + xmlpp::Node::NodeList::const_iterator listIt = dataFieldList.begin(); + + while (listIt != dataFieldList.end()) { + const xmlpp::Node* dataNode = *listIt; + std::string prefix = dataNode->get_namespace_prefix(); + std::string name = dataNode->get_name(); + const xmlpp::Element* + dataElement + = dynamic_cast (dataNode); + if (!dataElement) { + ++listIt; + continue; + } + + if (!playlength && prefix == extentElementPrefix + && name == extentElementName) { + if (dataElement->has_child_text()) { + Ptr::Ref playlengthString(new std::string( + dataElement->get_child_text() + ->get_content() )); + setPlaylength(playlengthString); + } else { // or just leave blank? bad either way + playlength.reset(new time_duration(0,0,0,0)); + } + } + + if (!title && prefix == titleElementPrefix + && name == titleElementName) { + Glib::ustring value; + if (dataElement->has_child_text()) { + value = dataElement->get_child_text()->get_content(); + } else { + value = ""; + } + Ptr::Ref ptrToValue( + new const Glib::ustring(value)); + title = ptrToValue; + } + + ++listIt; + } + + ++it; + if (it != childNodes.end()) { + std::string eMsg = "more than one "; + eMsg += metadataElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } + } + + if (!playlength) { + std::string eMsg = "missing attribute "; + eMsg += playlengthAttrName; + eMsg += " or metadata element "; + eMsg += extentElementPrefix + ":" + extentElementName; + throw std::invalid_argument(eMsg); + } + + if (!title) { + title.reset(new const Glib::ustring("")); + } +} + + +/*------------------------------------------------------------------------------ + * Return the value of a metadata field. + *----------------------------------------------------------------------------*/ +Ptr::Ref +AudioClip :: getMetadata(const string &key) const + throw () +{ + std::string name, prefix; + separateNameAndNameSpace(key, name, prefix); + + Ptr::Ref value; + + if (! xmlAudioClip) { + return value; + } + xmlpp::Element* rootNode = xmlAudioClip->get_root_node(); + if (! rootNode) { + return value; + } + xmlpp::Node::NodeList rootList = rootNode->get_children( + metadataElementName); + if (rootList.size() == 0) { + return value; + } + + xmlpp::Node* metadata = rootList.front(); + xmlpp::Node::NodeList nodeList = metadata->get_children(name); + xmlpp::Node::NodeList::iterator it = nodeList.begin(); + + while (it != nodeList.end()) { + xmlpp::Node* node = *it; + if (node->get_namespace_prefix() == prefix) { + xmlpp::Element* element = dynamic_cast (node); + xmlpp::TextNode* textNode = element->get_child_text(); + if (textNode) { + value.reset(new Glib::ustring(textNode->get_content())); + } else { + value.reset(new Glib::ustring("")); + } + return value; + } + ++it; + } + + return value; +} + + +/*------------------------------------------------------------------------------ + * Set the value of a metadata field (public). + *----------------------------------------------------------------------------*/ +void +AudioClip :: setMetadata(Ptr::Ref value, + const std::string &key) + throw (std::invalid_argument) +{ + std::string name; + std::string prefix; + + separateNameAndNameSpace(key, name, prefix); + setMetadata(value, name, prefix); +} + + +/*------------------------------------------------------------------------------ + * Set the value of a metadata field (private). + *----------------------------------------------------------------------------*/ +void +AudioClip :: setMetadata(Ptr::Ref value, + const std::string &name, const std::string &prefix) + throw (std::invalid_argument) +{ + if (prefix == extentElementPrefix && name == extentElementName) { + Ptr::Ref valueString(new const std::string( + *value)); + setPlaylength(valueString); // may throw invalid_argument + } + + if (prefix == titleElementPrefix && name == titleElementName) { + title = value; + } + + // create a new xmlpp::Document for the metadata if necessary + if (! xmlAudioClip) { + xmlAudioClip.reset(new xmlpp::Document); + } + xmlpp::Element* rootNode = xmlAudioClip->get_root_node(); + if (! rootNode) { + rootNode = xmlAudioClip->create_root_node(configElementNameStr); + if (id) { + rootNode->set_attribute(idAttrName, std::string(*id)); + } + } + xmlpp::Node::NodeList rootList = rootNode->get_children( + metadataElementName); + xmlpp::Element* metadata; + if (rootList.size() > 0) { + metadata = dynamic_cast (rootList.front()); + } else { + metadata = rootNode->add_child(metadataElementName); + metadata->set_namespace_declaration(defaultNamespaceUri); + metadata->set_namespace_declaration(liveSupportNamespaceUri, + liveSupportNamespacePrefix); + metadata->set_namespace_declaration(dcNamespaceUri, + titleElementPrefix); + metadata->set_namespace_declaration(dctermsNamespaceUri, + extentElementPrefix); + metadata->set_namespace_declaration(xmlNamespaceUri, + xmlNamespacePrefix); + } + + // find the element to be modified + xmlpp::Node::NodeList nodeList = metadata->get_children(name); + xmlpp::Node::NodeList::iterator it = nodeList.begin(); + xmlpp::Element* element = 0; + + while (it != nodeList.end()) { + xmlpp::Node* node = *it; + if (node->get_namespace_prefix() == prefix) { + element = dynamic_cast (nodeList.front()); + break; + } + ++it; + } + + // or add it if it did not exist before + if (it == nodeList.end()) { + element = metadata->add_child(name); + try { + element->set_namespace(prefix); + } + catch (xmlpp::exception &e) { + // this namespace has not been declared; well OK, do nothing then + } + } + + element->set_child_text(*value); +} + + +/*------------------------------------------------------------------------------ + * Return a string containing the essential fields of this object, in XML. + *----------------------------------------------------------------------------*/ +Ptr::Ref +AudioClip :: getXmlElementString(void) const throw () +{ + Ptr::Ref xmlString(new Glib::ustring); + + xmlString->append("<"); + xmlString->append(configElementNameStr + " "); + xmlString->append(idAttrName + "=\"" + + std::string(*id) + + "\" "); + xmlString->append(Glib::ustring(titleAttrName) + "=\"" + + *title + + "\" "); + xmlString->append(playlengthAttrName + "=\"" + + toFixedString(playlength) + + "\"/>"); + return xmlString; +} + + +/*------------------------------------------------------------------------------ + * Return a string containing an XML representation of this audio clip. + *----------------------------------------------------------------------------*/ +Ptr::Ref +AudioClip :: getXmlDocumentString() const throw () +{ + Ptr::Ref localDocument; + + if (xmlAudioClip) { + localDocument = xmlAudioClip; + } else { + localDocument.reset(new xmlpp::Document()); + xmlpp::Element* rootNode = localDocument->create_root_node( + configElementNameStr); + if (id) { + rootNode->set_attribute(idAttrName, std::string(*id)); + } + + xmlpp::Element* metadata = rootNode->add_child(metadataElementName); + metadata->set_namespace_declaration(defaultNamespaceUri); + metadata->set_namespace_declaration(liveSupportNamespaceUri, + liveSupportNamespacePrefix); + metadata->set_namespace_declaration(dcNamespaceUri, + titleElementPrefix); + metadata->set_namespace_declaration(dctermsNamespaceUri, + extentElementPrefix); + metadata->set_namespace_declaration(xmlNamespaceUri, + xmlNamespacePrefix); + } + + Ptr::Ref metadataString(new Glib::ustring( + localDocument->write_to_string() )); + return metadataString; +} + + +/*------------------------------------------------------------------------------ + * Read the metadata contained in the id3v2 tag of the binary sound file. + *----------------------------------------------------------------------------*/ +void +AudioClip :: readTag(Ptr::Ref metadataTypes) + throw (std::invalid_argument) +{ + if (!getUri()) { + throw std::invalid_argument("audio clip has no uri field"); + } + + std::string uri = *getUri(); + if (uri.substr(0,7) == "file://") { + uri = uri.substr(7); + } else if (uri.substr(0,5) == "file:") { + uri = uri.substr(5); + } + + if (!TagLib::File::isReadable(uri.c_str())) { + throw std::invalid_argument("binary sound file not found"); + } + + TagLib::MPEG::File mpegFile(uri.c_str()); + TagLib::ID3v2::Tag* id3v2Tag = mpegFile.ID3v2Tag(); + if (id3v2Tag) { + Ptr::Ref metadata; + Ptr::Ref value; + + TagLib::ID3v2::FrameListMap frameListMap = id3v2Tag->frameListMap(); + TagLib::ID3v2::FrameListMap::ConstIterator it; + + for (it = frameListMap.begin(); it != frameListMap.end(); ++it) { + std::string keyString(it->first.data(), 4); + try { + metadata = metadataTypes->getById3Tag(keyString); + TagLib::ID3v2::FrameList frameList = it->second; + if (!frameList.isEmpty()) { + value.reset(new const Glib::ustring( + frameList.front()->toString().to8Bit(true))); + setMetadata(value, *metadata->getDcName()); + } + } catch (std::invalid_argument &e) { + // id3v2 tag name not found in MetadataTypeContainer + // TODO: print warning? + } + } + return; + } + + TagLib::FileRef genericFileRef(uri.c_str()); + TagLib::Tag* tag = genericFileRef.tag(); + if (tag) { + TagLib::String stringValue; + TagLib::uint intValue; + Ptr::Ref value; + + stringValue = tag->artist(); + if (!stringValue.isNull()) { + value.reset(new const Glib::ustring(stringValue.to8Bit(true))); + setMetadata(value, "dc:creator"); + } + + stringValue = tag->title(); + if (!stringValue.isNull()) { + value.reset(new const Glib::ustring(stringValue.to8Bit(true))); + setMetadata(value, "dc:title"); + } + + stringValue = tag->album(); + if (!stringValue.isNull()) { + value.reset(new const Glib::ustring(stringValue.to8Bit(true))); + setMetadata(value, "dc:source"); + } + + stringValue = tag->comment(); + if (!stringValue.isNull()) { + value.reset(new const Glib::ustring(stringValue.to8Bit(true))); + setMetadata(value, "dc:description"); + } + + stringValue = tag->genre(); + if (!stringValue.isNull()) { + value.reset(new const Glib::ustring(stringValue.to8Bit(true))); + setMetadata(value, "dc:type"); + } + + intValue = tag->year(); + if (intValue != 0) { + std::stringstream yearString; + yearString << intValue; + value.reset(new const Glib::ustring(yearString.str())); + setMetadata(value, "ls:year"); + } + + intValue = tag->track(); + if (intValue != 0) { + std::stringstream trackString; + trackString << intValue; + value.reset(new const Glib::ustring(trackString.str())); + setMetadata(value, "ls:track_num"); + } + } +} + + +/*------------------------------------------------------------------------------ + * Separate a key into the metadata name and its namespace + *----------------------------------------------------------------------------*/ +void +LiveSupport::Core :: separateNameAndNameSpace(const std::string & key, + std::string & name, + std::string & prefix) + throw () +{ + unsigned int colonPosition = key.find(':'); + + if (colonPosition != std::string::npos) { // there is a colon + prefix = key.substr(0, colonPosition); + name = key.substr(colonPosition+1); + } else { // no colon found + prefix = ""; + name = key; + } +} + diff --git a/campcaster/src/modules/core/src/AudioClipTest.cxx b/campcaster/src/modules/core/src/AudioClipTest.cxx new file mode 100644 index 000000000..b0e6eefeb --- /dev/null +++ b/campcaster/src/modules/core/src/AudioClipTest.cxx @@ -0,0 +1,278 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/AudioClip.h" +#include "LiveSupport/Core/Playlist.h" +#include "AudioClipTest.h" + + +using namespace std; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(AudioClipTest); + +/** + * The name of the configuration file for the audio clip. + */ +static const std::string configFileName = "etc/audioClip.xml"; + +/** + * The name of the configuration file for the resource bundle. + */ +static const std::string bundleConfigFileName = "etc/resourceBundle.xml"; + +/** + * The name of the configuration file for the metadata type container. + */ +static const std::string metadataConfigFileName + = "etc/metadataTypeContainer.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +AudioClipTest :: setUp(void) throw (CPPUNIT_NS::Exception) +{ + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, false)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + audioClip.reset(new AudioClip()); + audioClip->configure(*root); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in audio clip configuration file"); + } catch (xmlpp::exception &e) { + std::string eMsg = "error parsing audio clip configuration file\n"; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + + Ptr::Ref bundle; + try { + Ptr::Ref parser( + new xmlpp::DomParser(bundleConfigFileName, false)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + bundle = LocalizedObject::getBundle(*root); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in configuration file"); + } catch (std::exception &e) { + std::string eMsg = "error parsing audio clip configuration file\n"; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + CPPUNIT_ASSERT(bundle); + + try { + Ptr::Ref parser( + new xmlpp::DomParser(metadataConfigFileName, false)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + metadataTypes.reset(new MetadataTypeContainer(bundle)); + metadataTypes->configure(*root); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in metadata configuration file"); + } catch (xmlpp::exception &e) { + std::string eMsg = "error parsing metadata configuration file\n"; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +AudioClipTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +AudioClipTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + CPPUNIT_ASSERT(audioClip); + CPPUNIT_ASSERT(audioClip->getId()); + CPPUNIT_ASSERT(audioClip->getId()->getId() == 0x1); + Ptr::Ref duration + = audioClip->getPlaylength(); + CPPUNIT_ASSERT(duration); + CPPUNIT_ASSERT(duration->hours() == 0); + CPPUNIT_ASSERT(duration->minutes() == 18); + CPPUNIT_ASSERT(duration->seconds() == 30); + + Ptr::Ref title = audioClip->getTitle(); + CPPUNIT_ASSERT(title); + CPPUNIT_ASSERT(*title == "File Title txt"); + + Ptr::Ref subject = audioClip + ->getMetadata("dc:subject"); + CPPUNIT_ASSERT(subject); + CPPUNIT_ASSERT(*subject == "Keywords: qwe, asd, zcx"); + + Ptr::Ref alternativeTitle = audioClip + ->getMetadata("dcterms:alternative"); + CPPUNIT_ASSERT(alternativeTitle); + CPPUNIT_ASSERT(*alternativeTitle == + "Alternative File Title ín sőmé %$#@* LÁNGŰAGÉ"); + + CPPUNIT_ASSERT(audioClip->getXmlElementString()); + CPPUNIT_ASSERT(*audioClip->getXmlElementString() == + ""); +} + + +/*------------------------------------------------------------------------------ + * Test conversion to and from Playable + *----------------------------------------------------------------------------*/ +void +AudioClipTest :: conversionTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref playable = audioClip; + CPPUNIT_ASSERT(playable->getType() == Playable::AudioClipType); + + Ptr::Ref otherAudioClip = playable->getAudioClip(); + CPPUNIT_ASSERT(otherAudioClip == audioClip); + + Ptr::Ref playlist = playable->getPlaylist(); + CPPUNIT_ASSERT(!playlist); +} + + +/*------------------------------------------------------------------------------ + * Test id3v2 tag extraction + *----------------------------------------------------------------------------*/ +void +AudioClipTest :: tagTest(void) + throw (CPPUNIT_NS::Exception) +{ + // should work with either plain file path... + Ptr::Ref uri(new std::string("var/test10001.mp3")); + audioClip->setUri(uri); + try { + audioClip->readTag(metadataTypes); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + Ptr::Ref title + = audioClip->getMetadata("dc:title"); + CPPUNIT_ASSERT(*title == "Theme Song"); + + Ptr::Ref artist + = audioClip->getMetadata("dc:creator"); + CPPUNIT_ASSERT(*artist == "The Muppets"); + + Ptr::Ref album + = audioClip->getMetadata("dc:source"); + CPPUNIT_ASSERT(*album == "מוישה אופניק"); + + // ... or with URI + uri.reset(new std::string("file:var/test10001.mp3")); + audioClip->setUri(uri); + try { + audioClip->readTag(metadataTypes); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + title = audioClip->getMetadata("dc:title"); + CPPUNIT_ASSERT(*title == "Theme Song"); + + artist = audioClip->getMetadata("dc:creator"); + CPPUNIT_ASSERT(*artist == "The Muppets"); + + album = audioClip->getMetadata("dc:source"); + CPPUNIT_ASSERT(*album == "מוישה אופניק"); + // Moshe Offnik is the Israeli/Palestinian version of Oscar The Grouch +} + + +/*------------------------------------------------------------------------------ + * Marshalling test + *----------------------------------------------------------------------------*/ +void +AudioClipTest :: marshallingTest(void) + throw (CPPUNIT_NS::Exception) +{ + XmlRpc::XmlRpcValue xmlRpcValue = *audioClip; + CPPUNIT_ASSERT(xmlRpcValue.hasMember("audioClip")); + + Ptr::Ref otherAudioClip; + CPPUNIT_ASSERT_NO_THROW(otherAudioClip.reset(new AudioClip(xmlRpcValue))); + + CPPUNIT_ASSERT(*audioClip->getId() == *otherAudioClip->getId()); + CPPUNIT_ASSERT(*audioClip->getTitle() + == *otherAudioClip->getTitle()); + CPPUNIT_ASSERT(*audioClip->getPlaylength() + == *otherAudioClip->getPlaylength()); +} + diff --git a/campcaster/src/modules/core/src/AudioClipTest.h b/campcaster/src/modules/core/src/AudioClipTest.h new file mode 100644 index 000000000..5e86420ef --- /dev/null +++ b/campcaster/src/modules/core/src/AudioClipTest.h @@ -0,0 +1,146 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef AudioClipTest_h +#define AudioClipTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include "LiveSupport/Core/AudioClip.h" + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the AudioClip class. + * + * @author $Author$ + * @version $Revision$ + * @see AudioClip + */ +class AudioClipTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(AudioClipTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(conversionTest); + CPPUNIT_TEST(tagTest); + CPPUNIT_TEST(marshallingTest); + CPPUNIT_TEST_SUITE_END(); + + private: + /** + * The audio clip to test. + */ + Ptr::Ref audioClip; + + /** + * The list of supported metadata types. + */ + Ptr::Ref metadataTypes; + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing conversion to and from Playable. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + conversionTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Id3v2 tag extraction test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + tagTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing conversion to and from XmlRpcValue. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + marshallingTest(void) throw (CPPUNIT_NS::Exception); + + + public: + + /** + * Set up the environment for the test case. + */ + void + setUp(void) throw (CPPUNIT_NS::Exception); + + /** + * Clean up the environment after the test case. + */ + void + tearDown(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // AudioClipTest_h + diff --git a/campcaster/src/modules/core/src/BaseTestMethod.cxx b/campcaster/src/modules/core/src/BaseTestMethod.cxx new file mode 100644 index 000000000..ed56d1acd --- /dev/null +++ b/campcaster/src/modules/core/src/BaseTestMethod.cxx @@ -0,0 +1,150 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#else +#error need sys/types.h +#endif + +#ifdef HAVE_PWD_H +#include +#else +#error need pwd.h +#endif + +#ifdef HAVE_ERRNO_H +#include +#else +#error need errno.h +#endif + +#include + +#include "LiveSupport/Core/BaseTestMethod.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Return the current working directory + *----------------------------------------------------------------------------*/ +std::string +BaseTestMethod :: getCwd(void) throw () +{ + size_t size = 100; + char * buffer; + + while (true) { + buffer = new char[size]; + if (getcwd(buffer, size)) { + break; + } + delete[] buffer; + if (errno != ERANGE) { + return ""; + } + size *= 2; + } + + std::string cwd(buffer); + delete[] buffer; + return cwd; +} + + +/*------------------------------------------------------------------------------ + * Return the full path for a configuration file. + *----------------------------------------------------------------------------*/ +std::string +BaseTestMethod :: getConfigFile(const std::string configFileName) + throw (std::invalid_argument) +{ + std::string fileName; + std::ifstream file; + + // first, try with ~/.campcaster/configFileName + struct passwd * pwd = getpwuid(getuid()); + if (pwd) { + fileName += pwd->pw_dir; + fileName += "/.campcaster/" + configFileName; + file.open(fileName.c_str()); + if (file.good()) { + file.close(); + return fileName; + } + file.close(); + file.clear(); + } + + // second, try with ./etc/configFileName + fileName = getCwd() + "/etc/" + configFileName; + file.open(fileName.c_str()); + if (file.good()) { + file.close(); + return fileName; + } + file.close(); + + throw std::invalid_argument("can't find config file " + configFileName); +} + + +/*------------------------------------------------------------------------------ + * Return a configuration document + *----------------------------------------------------------------------------*/ +const xmlpp::Document * +BaseTestMethod :: getConfigDocument(xmlpp::DomParser & parser, + const std::string configFileName) + throw (std::invalid_argument, + std::exception) +{ + std::string realFileName = getConfigFile(configFileName); + parser.set_validate(); + parser.parse_file(realFileName); + return parser.get_document(); +} + diff --git a/campcaster/src/modules/core/src/EnumerationConstraint.cxx b/campcaster/src/modules/core/src/EnumerationConstraint.cxx new file mode 100644 index 000000000..e7d581e0e --- /dev/null +++ b/campcaster/src/modules/core/src/EnumerationConstraint.cxx @@ -0,0 +1,134 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include "EnumerationConstraint.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +namespace { + +/*------------------------------------------------------------------------------ + * The value of the type attribute for this class. + *----------------------------------------------------------------------------*/ +const std::string typeAttributeValue = "enumeration"; + +} + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a constraint element object based on an XML element. + *----------------------------------------------------------------------------*/ +void +EnumerationConstraint :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != getConfigElementName()) { + throw std::invalid_argument("bad configuration element " + + element.get_name()); + } + + const xmlpp::Attribute* typeAttribute; + if (!(typeAttribute = element.get_attribute(typeAttributeName))) { + throw std::invalid_argument("missing attribute " + typeAttributeName); + } + std::string type = typeAttribute->get_value(); + + if (type != typeAttributeValue) { + throw std::invalid_argument(typeAttributeValue + + " constraint configured with a" + + " constraint element of type " + + type); + } + + xmlpp::Node::NodeList childNodes = element.get_children(valueElementName); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + if (it == childNodes.end()) { + throw std::invalid_argument("empty enumeration constraint"); + } + + for (; it != childNodes.end(); ++it) { + readValue(*it); + } +} + + +/*------------------------------------------------------------------------------ + * Read an enumeration value from an XML node. + *----------------------------------------------------------------------------*/ +void +EnumerationConstraint :: readValue(const xmlpp::Node * node) + throw (std::invalid_argument) +{ + const xmlpp::Element * valueElement + = dynamic_cast (node); + if (valueElement) { + allowedValues.push_back(valueElement->get_child_text() + ->get_content() ); + } else { + throw std::invalid_argument("bad sub-element found in constraint"); + } +} + + +/*------------------------------------------------------------------------------ + * Check that the given value satisfies the constraint. + *----------------------------------------------------------------------------*/ +bool +EnumerationConstraint :: check(Ptr::Ref value) const + throw (std::logic_error) +{ + if (!value) { + throw std::logic_error("EnumerationConstraint::check() called with " + "a 0 pointer value"); + } + + ListType::const_iterator it; + for (it = allowedValues.begin(); it != allowedValues.end(); ++it) { + if (*it == *value) { + return true; + } + } + + return false; +} + diff --git a/campcaster/src/modules/core/src/EnumerationConstraint.h b/campcaster/src/modules/core/src/EnumerationConstraint.h new file mode 100644 index 000000000..a22907353 --- /dev/null +++ b/campcaster/src/modules/core/src/EnumerationConstraint.h @@ -0,0 +1,174 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_EnumerationConstraint_h +#define LiveSupport_Core_EnumerationConstraint_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#include "LiveSupport/Core/MetadataConstraint.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class for representing a metadata constraint allowing only strings from + * a given list of values. + * + * This is a concrete subclass of MetadataConstraint. Do not explicitly + * instantiate this class; create a MetadataConstraint object instead, and + * configure it with an XML element with the appropriate type attribute. + * + * This object has to be configured with an XML configuration element + * called constraint. This may look like the following: + * + *
    
    + *  
    + *      Monday
    + *      ...
    + *      Sunday
    + *  
    + *  
    + * + * A metadata type with this kind of constraint can only accept one of the + * strings listed in the value elements (in a case-sensitive way). + * + * The DTD for the expected XML element looks like the following: + * + *
    
    + *  
    + *  
    + *  
    + *  
    + * + * @author $Author$ + * @version $Revision$ + * @see EnumerationConstraintContainer + */ +class EnumerationConstraint : public MetadataConstraint +{ + private: + /** + * The type for storing the enumeration values. + */ + typedef std::vector ListType; + + /** + * The list of allowed enumeration values. + */ + ListType allowedValues; + + /** + * Read an enumeration value from an XML node. + * + * @param node the node containing the value. + * @exception std::invalid_argument if the XML node is not + * of the expected form. + */ + void + readValue(const xmlpp::Node * node) throw (std::invalid_argument); + + + public: + /** + * Constructor. + */ + EnumerationConstraint() throw () + { + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~EnumerationConstraint(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 MetadataConstraint::getConfigElementName(); + } + + /** + * Configure the metadata object based on an XML configuration element. + * + * @param elemen the XML configuration element. + * @exception std::invalid_argument of the supplied XML element + * contains bad configuration information + */ + virtual void + configure(const xmlpp::Element &element) + throw (std::invalid_argument); + + /** + * Check that the given value satisfies the constraint. + * + * @param value the value to be checked against the constraint. + * @return true if the value satisfies the constraint. + * @exception std::logic_error if the parameter is a 0 pointer. + */ + virtual bool + check(Ptr::Ref value) const + throw (std::logic_error); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_EnumerationConstraint_h + diff --git a/campcaster/src/modules/core/src/FadeInfo.cxx b/campcaster/src/modules/core/src/FadeInfo.cxx new file mode 100644 index 000000000..710a3d00c --- /dev/null +++ b/campcaster/src/modules/core/src/FadeInfo.cxx @@ -0,0 +1,139 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/Core/FadeInfo.h" + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string FadeInfo::configElementNameStr = "fadeInfo"; + +/** + * The name of the attribute to get the id of the audio clip. + */ +static const std::string idAttrName = "id"; + +/** + * The name of the attribute to get the fade in. + */ +static const std::string fadeInAttrName = "fadeIn"; + +/** + * The name of the attribute to get the fade out. + */ +static const std::string fadeOutAttrName = "fadeOut"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a fade info object based on an XML element. + *----------------------------------------------------------------------------*/ +void +FadeInfo :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + std::string eMsg = "bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + if (!(attribute = element.get_attribute(idAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + id.reset(new UniqueId(attribute->get_value())); + + if (!(attribute = element.get_attribute(fadeInAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + Ptr::Ref fadeInString(new std::string( + attribute->get_value() )); + fadeIn = TimeConversion::parseTimeDuration(fadeInString); + + if (!(attribute = element.get_attribute(fadeOutAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + Ptr::Ref fadeOutString(new std::string( + attribute->get_value() )); + fadeOut = TimeConversion::parseTimeDuration(fadeOutString); +} + + +/*------------------------------------------------------------------------------ + * Return a string containing the essential fields of this object, in XML. + *----------------------------------------------------------------------------*/ +Ptr::Ref +FadeInfo :: getXmlElementString(void) throw () +{ + Ptr::Ref xmlString(new Glib::ustring); + + xmlString->append("<"); + xmlString->append(configElementNameStr + " "); + xmlString->append(idAttrName + "=\"" + + std::string(*id) + + "\" "); + xmlString->append(fadeInAttrName + "=\"" + + toFixedString(fadeIn) + + "\" "); + xmlString->append(fadeOutAttrName + "=\"" + + toFixedString(fadeOut) + + "\"/>"); + return xmlString; +} + diff --git a/campcaster/src/modules/core/src/FadeInfoTest.cxx b/campcaster/src/modules/core/src/FadeInfoTest.cxx new file mode 100644 index 000000000..77666045a --- /dev/null +++ b/campcaster/src/modules/core/src/FadeInfoTest.cxx @@ -0,0 +1,134 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/FadeInfo.h" +#include "FadeInfoTest.h" + + +using namespace std; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(FadeInfoTest); + +/** + * The name of the configuration file for the audio clip. + */ +static const std::string configFileName = "etc/fadeInfo.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +FadeInfoTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +FadeInfoTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +FadeInfoTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + Ptr::Ref fadeInfo(new FadeInfo()); + + fadeInfo->configure(*root); + + CPPUNIT_ASSERT(fadeInfo->getId()->getId() == 0x9901); + + Ptr::Ref + fadeIn = fadeInfo->getFadeIn(); + CPPUNIT_ASSERT(fadeIn->hours() == 0); + CPPUNIT_ASSERT(fadeIn->minutes() == 0); + CPPUNIT_ASSERT(fadeIn->seconds() == 2); + + Ptr::Ref + fadeOut = fadeInfo->getFadeOut(); + CPPUNIT_ASSERT(fadeOut->hours() == 0); + CPPUNIT_ASSERT(fadeOut->minutes() == 0); + CPPUNIT_ASSERT(fadeOut->seconds() == 1); + CPPUNIT_ASSERT(fadeOut->fractional_seconds() == 500); + + CPPUNIT_ASSERT(*fadeInfo->getXmlElementString() == + ""); + + } catch (std::invalid_argument &e) { + std::string eMsg = "semantic error in configuration file:\n"; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } catch (xmlpp::exception &e) { + std::string eMsg = "error parsing configuration file:\n"; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } +} diff --git a/campcaster/src/modules/core/src/FadeInfoTest.h b/campcaster/src/modules/core/src/FadeInfoTest.h new file mode 100644 index 000000000..91a79e09a --- /dev/null +++ b/campcaster/src/modules/core/src/FadeInfoTest.h @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef FadeInfoTest_h +#define FadeInfoTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the FadeInfo class. + * + * @author $Author$ + * @version $Revision$ + * @see FadeInfo + */ +class FadeInfoTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(FadeInfoTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 Core +} // namespace LiveSupport + +#endif // FadeInfoTest_h + diff --git a/campcaster/src/modules/core/src/FileTools.cxx b/campcaster/src/modules/core/src/FileTools.cxx new file mode 100644 index 000000000..8f428c705 --- /dev/null +++ b/campcaster/src/modules/core/src/FileTools.cxx @@ -0,0 +1,332 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author: fgerlits $ + Version : $Revision$ + Location : $URL: svn+ssh://fgerlits@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/src/modules/core/src/FileTools.cxx $ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_TIME_H +#include +#else +#error need time.h +#endif + +#ifdef HAVE_TIME_H +#include +#else +#error need stdio.h +#endif + + +#include +#include + +#include + +#include +#include +#include + +#include "LiveSupport/Core/FileTools.h" + + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Copy the contents of a URL to a local file. + *----------------------------------------------------------------------------*/ +void +FileTools :: copyUrlToFile(const std::string & url, + const std::string & path) + throw (std::runtime_error) +{ + FILE* file = fopen(path.c_str(), "wb"); + if (!file) { + throw std::runtime_error("File location is not writable."); + } + + CURL* handle = curl_easy_init(); + if (!handle) { + fclose(file); + throw std::runtime_error("Could not obtain curl handle."); + } + + int status = curl_easy_setopt(handle, CURLOPT_URL, url.c_str()); + status |= curl_easy_setopt(handle, CURLOPT_WRITEDATA, file); + status |= curl_easy_setopt(handle, CURLOPT_HTTPGET); + + if (status) { + fclose(file); + throw std::runtime_error("Could not set curl options."); + } + + status = curl_easy_perform(handle); + + if (status) { + fclose(file); + throw std::runtime_error("Error downloading file."); + } + + curl_easy_cleanup(handle); + fclose(file); +} + + +/*------------------------------------------------------------------------------ + * Upload the contents of a local file to a writable URL. + *----------------------------------------------------------------------------*/ +void +FileTools :: copyFileToUrl(const std::string & path, + const std::string & url) + throw (std::runtime_error) +{ + FILE* file = fopen(path.c_str(), "rb"); + if (!file) { + throw std::runtime_error("File not found."); + } + fseek(file, 0, SEEK_END); + long fileSize = ftell(file); + rewind(file); + + CURL* handle = curl_easy_init(); + if (!handle) { + throw std::runtime_error("Could not obtain curl handle."); + } + + int status = curl_easy_setopt(handle, CURLOPT_READDATA, file); + status |= curl_easy_setopt(handle, CURLOPT_INFILESIZE, fileSize); + // works for files of size up to 2 GB + status |= curl_easy_setopt(handle, CURLOPT_PUT, 1); + status |= curl_easy_setopt(handle, CURLOPT_URL, url.c_str()); +// status |= curl_easy_setopt(handle, CURLOPT_HEADER, 1); +// status |= curl_easy_setopt(handle, CURLOPT_ENCODING, "deflate"); + + if (status) { + throw std::runtime_error("Could not set curl options."); + } + + status = curl_easy_perform(handle); + + if (status) { + throw std::runtime_error("Error uploading file."); + } + + curl_easy_cleanup(handle); + fclose(file); +} + + +/*------------------------------------------------------------------------------ + * Create a temporary file name + *----------------------------------------------------------------------------*/ +const std::string +FileTools :: tempnam(void) throw () +{ + std::string fileName(::tempnam(NULL, NULL)); + + return fileName; +} + + +/*------------------------------------------------------------------------------ + * Append a file to an existing tarball + *----------------------------------------------------------------------------*/ +void +FileTools :: appendFileToTarball(const std::string & tarFileName, + const std::string & newFileRealName, + const std::string & newFileInTarball) + throw (std::runtime_error) +{ + TAR * tar; + off_t tarFileEnd; // keeps read position it tarball + + // first chop off the existing EOF from the tarball + + // open for reading first to determine where EOT block begins + if (tar_open(&tar, + (char*) tarFileName.c_str(), + NULL, + O_RDONLY, + 0, + 0) == -1) { + throw std::runtime_error("can't open tarball"); + } + + // go through all files in tarball and record end position + // of the last file read + tarFileEnd = 0; + while (th_read(tar) == 0) { + if (TH_ISREG(tar)) { + tar_skip_regfile(tar); + } + tarFileEnd = lseek(tar->fd, 0, SEEK_CUR); + } + + // at this point, tarFileEnd is position where EOT block begins + tar_close(tar); // close for reading + + //truncate EOT from the tarball + if (truncate(tarFileName.c_str(), tarFileEnd) == -1) { + throw std::runtime_error("can't truncate tarball"); + } + + // and now append the new file, and put an EOF at the end + + // open truncated tarball (without EOT block) for writing and append + if (tar_open(&tar, + (char*) tarFileName.c_str(), + NULL, + O_WRONLY | O_APPEND, + 0666, + 0) == -1) { + throw std::runtime_error("can't open tarball"); + } + + // add the new file + if (tar_append_file(tar, + (char*) newFileRealName.c_str(), + (char*) newFileInTarball.c_str()) == -1) { + tar_close(tar); + throw std::runtime_error("can't append file to tarball"); + } + + // add EOT at the end and close tarball + tar_append_eof(tar); + tar_close(tar); +} + + +/*------------------------------------------------------------------------------ + * Check if a file is in the tarball + *----------------------------------------------------------------------------*/ +bool +FileTools :: existsInTarball(const std::string & tarFileName, + const std::string & fileName) + throw (std::runtime_error) +{ + TAR * tar; + bool result = false; + + if (tar_open(&tar, + (char*) tarFileName.c_str(), + NULL, + O_RDONLY, + 0, + 0) == -1) { + throw std::runtime_error("can't open tarball"); + } + + while (th_read(tar) == 0) { + if (TH_ISREG(tar)) { + char * path = th_get_pathname(tar); + + if (fileName == path) { + result = true; + break; + } + + tar_skip_regfile(tar); + } + } + + // at this point, tarFileEnd is position where EOT block begins + tar_close(tar); // close for reading + + return result; +} + + +/*------------------------------------------------------------------------------ + * Extract a file from a tarball. + *----------------------------------------------------------------------------*/ +void +FileTools :: extractFileFromTarball(const std::string & tarFileName, + const std::string & fileInTarball, + const std::string & fileExtracted) + throw (std::runtime_error) +{ + TAR * tar; + bool found = false; + + if (tar_open(&tar, + (char*) tarFileName.c_str(), + NULL, + O_RDONLY, + 0, + 0) == -1) { + throw std::runtime_error("can't open tarball"); + } + + while (th_read(tar) == 0) { + if (TH_ISREG(tar)) { + char * path = th_get_pathname(tar); + + if (fileInTarball == path) { + found = true; + if (tar_extract_file(tar, + (char *) fileExtracted.c_str()) != 0) { + std::string errorMsg = "can't extract file "; + errorMsg += fileInTarball; + errorMsg += " from tarball "; + errorMsg += tarFileName; + throw std::runtime_error(errorMsg); + } + break; + } + + tar_skip_regfile(tar); + } + } + + // at this point, tarFileEnd is position where EOT block begins + tar_close(tar); // close for reading + + if (!found) { + std::string errorMsg = "could not find file "; + errorMsg += fileInTarball; + errorMsg += " in the tarball "; + errorMsg += tarFileName; + throw std::runtime_error(errorMsg); + } +} + diff --git a/campcaster/src/modules/core/src/FileToolsTest.cxx b/campcaster/src/modules/core/src/FileToolsTest.cxx new file mode 100644 index 000000000..52aaf6f3a --- /dev/null +++ b/campcaster/src/modules/core/src/FileToolsTest.cxx @@ -0,0 +1,149 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author: fgerlits $ + Version : $Revision: 1871 $ + Location : $URL: svn+ssh://maroy@code.campware.org/home/svn/repo/livesupport/trunk/livesupport/src/modules/core/src/FileToolsTest.cxx $ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/FileTools.h" +#include "LiveSupport/Core/Playlist.h" +#include "FileToolsTest.h" + + +using namespace std; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(FileToolsTest); + +namespace { + +/** + * The name of the test tar file + */ +const std::string tarFileName = "var/hello.tar"; + +/** + * The name of the test file in the tar file + */ +const std::string fileInTarName = "hello"; + +/** + * The name of the test file after extraction + */ +const std::string fileExtracted = "tmp/hello.txt"; + +} + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +FileToolsTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +FileToolsTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the sample hello tarfile is accessible + *----------------------------------------------------------------------------*/ +void +FileToolsTest :: existsInTarTest(void) + throw (CPPUNIT_NS::Exception) +{ + CPPUNIT_ASSERT(FileTools::existsInTarball(tarFileName, fileInTarName)); + CPPUNIT_ASSERT(!FileTools::existsInTarball(tarFileName, "foobar")); +} + + +/*------------------------------------------------------------------------------ + * Test to see if the sample hello tarfile is accessible + *----------------------------------------------------------------------------*/ +void +FileToolsTest :: extractFileFromTarballTest(void) + throw (CPPUNIT_NS::Exception) +{ + FILE * file; + + remove(fileExtracted.c_str()); + file = fopen(fileExtracted.c_str(), "r"); + CPPUNIT_ASSERT(file == 0); + + CPPUNIT_ASSERT_NO_THROW( + FileTools::extractFileFromTarball(tarFileName, + fileInTarName, + fileExtracted) + ); + + file = fopen(fileExtracted.c_str(), "r"); + CPPUNIT_ASSERT(file != 0); + CPPUNIT_ASSERT(fclose(file) == 0); + + CPPUNIT_ASSERT(remove(fileExtracted.c_str()) == 0); + file = fopen(fileExtracted.c_str(), "r"); + CPPUNIT_ASSERT(file == 0); + + CPPUNIT_ASSERT_THROW( + FileTools::extractFileFromTarball(tarFileName, + "foobar", + fileExtracted), + std::runtime_error + ); +} + diff --git a/campcaster/src/modules/core/src/FileToolsTest.h b/campcaster/src/modules/core/src/FileToolsTest.h new file mode 100644 index 000000000..8b77e8ddb --- /dev/null +++ b/campcaster/src/modules/core/src/FileToolsTest.h @@ -0,0 +1,119 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef FileToolsTest_h +#define FileToolsTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include "LiveSupport/Core/FileTools.h" + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the FileTools class. + * + * @author $Author$ + * @version $Revision$ + * @see FileTools + */ +class FileToolsTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(FileToolsTest); + CPPUNIT_TEST(existsInTarTest); + CPPUNIT_TEST(extractFileFromTarballTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + protected: + + /** + * Test the existsInTarball() function. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + existsInTarTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the extractFileFromTarball() function. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + extractFileFromTarballTest(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 Core +} // namespace LiveSupport + +#endif // FileToolsTest_h + diff --git a/campcaster/src/modules/core/src/LocalizedConfigurable.cxx b/campcaster/src/modules/core/src/LocalizedConfigurable.cxx new file mode 100644 index 000000000..50990a648 --- /dev/null +++ b/campcaster/src/modules/core/src/LocalizedConfigurable.cxx @@ -0,0 +1,117 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/LocalizedConfigurable.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/** + * The name of the attribute to get the path of the resource bundle. + */ +static const std::string pathAttrName = "path"; + +/** + * The name of the attribute to get the locale of the resource bundle. + */ +static const std::string localeAttrName = "locale"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Load a resource bunlde based on an XML configuration element. + *----------------------------------------------------------------------------*/ +void +LocalizedConfigurable :: configure(const xmlpp::Element & element) + throw (std::invalid_argument, + std::logic_error) +{ + if (element.get_name() != LocalizedObject::getConfigElementName()) { + std::string eMsg = "Bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + if (!(attribute = element.get_attribute(pathAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += pathAttrName; + throw std::invalid_argument(eMsg); + } + bundlePath = attribute->get_value(); + + if (!(attribute = element.get_attribute(localeAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += localeAttrName; + throw std::invalid_argument(eMsg); + } + std::string locale = attribute->get_value(); + + changeLocale(locale); +} + + +/*------------------------------------------------------------------------------ + * Change the resource bundle to reflect the specified locale + *----------------------------------------------------------------------------*/ +void +LocalizedConfigurable :: changeLocale(const std::string newLocale) + throw (std::invalid_argument) +{ + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref resourceBundle( + new ResourceBundle(bundlePath.c_str(), + newLocale.c_str(), + status)); + if (!U_SUCCESS(status)) { + throw std::invalid_argument("opening resource bundle a failure"); + } + + setBundle(resourceBundle); +} + + diff --git a/campcaster/src/modules/core/src/LocalizedConfigurableTest.cxx b/campcaster/src/modules/core/src/LocalizedConfigurableTest.cxx new file mode 100644 index 000000000..d7eef4065 --- /dev/null +++ b/campcaster/src/modules/core/src/LocalizedConfigurableTest.cxx @@ -0,0 +1,173 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include + +#include "LiveSupport/Core/LocalizedConfigurable.h" +#include "LocalizedConfigurableTest.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(LocalizedConfigurableTest); + +/** + * The name of the configuration file for the resource bundle. + */ +static const std::string configFileName = "etc/resourceBundle.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +LocalizedConfigurableTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +LocalizedConfigurableTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +LocalizedConfigurableTest :: simpleTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref locConf(new LocalizedConfigurable()); + + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + locConf->configure(*root); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in configuration file"); + } catch (std::exception &e) { + CPPUNIT_FAIL(e.what()); + } + + try { + Ptr::Ref section1(new LocalizedObject( + locConf->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->compare("fou") == 0); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * A test to see if chaning the locale works. + *----------------------------------------------------------------------------*/ +void +LocalizedConfigurableTest :: changeLocaleTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref locConf(new LocalizedConfigurable()); + + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + locConf->configure(*root); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in configuration file"); + } catch (std::exception &e) { + CPPUNIT_FAIL(e.what()); + } + + // see if all is OK in english + try { + Ptr::Ref section1(new LocalizedObject( + locConf->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->compare("fou") == 0); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + // see if all is OK when changing to hungarian. + try { + locConf->changeLocale("hu"); + + Ptr::Ref section1(new LocalizedObject( + locConf->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->charAt(0) == 0x0066); // 'f' + CPPUNIT_ASSERT(foo->charAt(1) == 0x00fa); // 'u' with acute + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + // see if all is OK when changing to japanese. + try { + locConf->changeLocale("jp"); + + Ptr::Ref section1(new LocalizedObject( + locConf->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->charAt(0) == 0x3075); // hiragana fu + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + diff --git a/campcaster/src/modules/core/src/LocalizedConfigurableTest.h b/campcaster/src/modules/core/src/LocalizedConfigurableTest.h new file mode 100644 index 000000000..93855085a --- /dev/null +++ b/campcaster/src/modules/core/src/LocalizedConfigurableTest.h @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LocalizedConfigurableTest_h +#define LocalizedConfigurableTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the LocalizedConfigurable class. + * + * @author $Author$ + * @version $Revision$ + * @see LocalizedObject + */ +class LocalizedConfigurableTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(LocalizedConfigurableTest); + CPPUNIT_TEST(simpleTest); + CPPUNIT_TEST(changeLocaleTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + simpleTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to see if changing the locale works. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + changeLocaleTest(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 Core +} // namespace LiveSupport + +#endif // LocalizedConfigurableTest_h + diff --git a/campcaster/src/modules/core/src/LocalizedObject.cxx b/campcaster/src/modules/core/src/LocalizedObject.cxx new file mode 100644 index 000000000..774c91f72 --- /dev/null +++ b/campcaster/src/modules/core/src/LocalizedObject.cxx @@ -0,0 +1,306 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/LocalizedObject.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string LocalizedObject::configElementNameStr = "resourceBundle"; + +/** + * The name of the attribute to get the path of the resource bundle. + */ +static const std::string pathAttrName = "path"; + +/** + * The name of the attribute to get the locale of the resource bundle. + */ +static const std::string localeAttrName = "locale"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Load a resource bunlde based on an XML configuration element. + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: getBundle(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + std::string eMsg = "Bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + if (!(attribute = element.get_attribute(pathAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += pathAttrName; + throw std::invalid_argument(eMsg); + } + std::string path = attribute->get_value(); + + if (!(attribute = element.get_attribute(localeAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += localeAttrName; + throw std::invalid_argument(eMsg); + } + std::string locale = attribute->get_value(); + + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref resourceBundle( + new ResourceBundle(path.c_str(), + locale.c_str(), + status)); + if (!U_SUCCESS(status)) { + throw std::invalid_argument("opening resource bundle a failure"); + } + + return resourceBundle; +} + + +/*------------------------------------------------------------------------------ + * Get a resource bundle by the specified key + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: getBundle(Ptr::Ref bundle, + const char * key) + throw (std::invalid_argument) +{ + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref resourceBundle(new ResourceBundle( + bundle->getWithFallback(key, status))); + if (!U_SUCCESS(status)) { + std::string eMsg = "can't get resource bundle for key '"; + eMsg += key; + eMsg += "' and locale '"; + eMsg += bundle->getLocale().getName(); + eMsg += "'"; + throw std::invalid_argument(eMsg); + } + + return resourceBundle; +} + + +/*------------------------------------------------------------------------------ + * Get a string from a resource bundle in the ICU string format + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: getResourceString(Ptr::Ref bundle, + const char * key) + throw (std::invalid_argument) +{ + Ptr::Ref rb = getBundle(bundle, key); + if (rb->getType() == URES_STRING) { + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref str(new UnicodeString(rb->getString(status))); + if (!U_SUCCESS(status)) { + throw std::invalid_argument("requested resource not a string"); + } + + return str; + } else { + throw std::invalid_argument("requested resource not a string"); + } +} + + +/*------------------------------------------------------------------------------ + * Format a message + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: formatMessage(Ptr::Ref pattern, + Formattable * arguments, + unsigned int nArguments) + throw (std::invalid_argument) +{ + Ptr::Ref message(new UnicodeString()); + UErrorCode err = U_ZERO_ERROR; + MessageFormat::format(*pattern, arguments, nArguments, *message, err); + if (!U_SUCCESS(err)) { + throw std::invalid_argument("can't format string"); + } + + return message; +} + + +/*------------------------------------------------------------------------------ + * Format a message, based on a resource key for its pattern + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: formatMessage(const char * patternKey, + Formattable * arguments, + unsigned int nArguments) + throw (std::invalid_argument) +{ + return unicodeStringToUstring( + formatMessage(getResourceString(patternKey), arguments, nArguments)); +} + + +/*------------------------------------------------------------------------------ + * Format a message, based on a resource key for its pattern + * and one argument for formatting. + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: formatMessage(const std::string & patternKey, + const Glib::ustring & argument1) + throw (std::invalid_argument) +{ + Ptr::Ref uArgument1 = ustringToUnicodeString(argument1); + Formattable arguments[] = { *uArgument1 }; + + return formatMessage(patternKey, arguments, 1); +} + + +/*------------------------------------------------------------------------------ + * Format a message, based on a resource key for its pattern + * and two arguments for formatting. + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: formatMessage(const std::string & patternKey, + const Glib::ustring & argument1, + const Glib::ustring & argument2) + throw (std::invalid_argument) +{ + Ptr::Ref uArgument1 = ustringToUnicodeString(argument1); + Ptr::Ref uArgument2 = ustringToUnicodeString(argument2); + Formattable arguments[] = { *uArgument1, + *uArgument2 }; + + return formatMessage(patternKey, arguments, 2); +} + + +/*------------------------------------------------------------------------------ + * Format a message, based on a resource key for its pattern + * and one argument for formatting. + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: formatMessage(const std::string & patternKey, + const Glib::ustring & argument1, + const Glib::ustring & argument2, + const Glib::ustring & argument3) + throw (std::invalid_argument) +{ + Ptr::Ref uArgument1 = ustringToUnicodeString(argument1); + Ptr::Ref uArgument2 = ustringToUnicodeString(argument2); + Ptr::Ref uArgument3 = ustringToUnicodeString(argument3); + Formattable arguments[] = { *uArgument1, + *uArgument2, + *uArgument3 }; + return formatMessage(patternKey, arguments, 3); +} + + +/*------------------------------------------------------------------------------ + * Create a Glib ustring from an ICU UnicodeString + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: unicodeStringToUstring( + Ptr::Ref unicodeString) + throw () +{ + const UChar * uchars = unicodeString->getBuffer(); + int32_t length = unicodeString->length(); + Ptr::Ref ustr(new Glib::ustring()); + ustr->reserve(length); + + while (length--) { + ustr->push_back((gunichar) (*(uchars++))); + } + + return ustr; +} + + +/*------------------------------------------------------------------------------ + * Create an ICU UnicodeString from a Glib ustring + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: ustringToUnicodeString( + Ptr::Ref gString) + throw () +{ + Ptr::Ref uString(new UnicodeString()); + + Glib::ustring::const_iterator it = gString->begin(); + Glib::ustring::const_iterator end = gString->end(); + while (it < end) { + uString->append((UChar32) *it++); + } + + return uString; +} + + +/*------------------------------------------------------------------------------ + * Create an ICU UnicodeString from a Glib ustring + *----------------------------------------------------------------------------*/ +Ptr::Ref +LocalizedObject :: ustringToUnicodeString(const Glib::ustring & gString) + throw () +{ + Ptr::Ref uString(new UnicodeString()); + + Glib::ustring::const_iterator it = gString.begin(); + Glib::ustring::const_iterator end = gString.end(); + while (it < end) { + uString->append((UChar32) *it++); + } + + return uString; +} + diff --git a/campcaster/src/modules/core/src/LocalizedObjectTest.cxx b/campcaster/src/modules/core/src/LocalizedObjectTest.cxx new file mode 100644 index 000000000..fee7bd29e --- /dev/null +++ b/campcaster/src/modules/core/src/LocalizedObjectTest.cxx @@ -0,0 +1,348 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include + +#include "LiveSupport/Core/LocalizedObject.h" +#include "LocalizedObjectTest.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(LocalizedObjectTest); + +/** + * The name of the configuration file for the resource bundle. + */ +static const std::string configFileName = "etc/resourceBundle.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: simpleTest(void) + throw (CPPUNIT_NS::Exception) +{ + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref bundle(new ResourceBundle("./tmp/" PACKAGE_NAME, + "root", + status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + + try { + Ptr::Ref locObj(new LocalizedObject(bundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->compare("foo") == 0); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * A test to see different locales and fallback to work. + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: fallbackTest(void) + throw (CPPUNIT_NS::Exception) +{ + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref rootBundle; + Ptr::Ref enBundle; + + rootBundle.reset(new ResourceBundle("./tmp/" PACKAGE_NAME, "root", status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + enBundle.reset(new ResourceBundle("./tmp/" PACKAGE_NAME, "en", status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + + // first, see the root bundle + try { + Ptr::Ref locObj(new LocalizedObject(rootBundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->compare("foo") == 0); + Ptr::Ref bar = section1->getResourceString("bar"); + CPPUNIT_ASSERT(bar->compare("bar") == 0); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + // now, the en bundle + try { + Ptr::Ref locObj(new LocalizedObject(enBundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->compare("fou") == 0); + Ptr::Ref bar = section1->getResourceString("bar"); + CPPUNIT_ASSERT(bar->compare("bar") == 0); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * A test to see funny unicode characters to work. + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: unicodeTest(void) + throw (CPPUNIT_NS::Exception) +{ + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref huBundle; + Ptr::Ref jpBundle; + + huBundle.reset(new ResourceBundle("./tmp/" PACKAGE_NAME, "hu", status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + try { + Ptr::Ref locObj(new LocalizedObject(huBundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->charAt(0) == 0x0066); // 'f' + CPPUNIT_ASSERT(foo->charAt(1) == 0x00fa); // 'u' with acute + Ptr::Ref bar = section1->getResourceString("bar"); + CPPUNIT_ASSERT(bar->charAt(0) == 0x0062); // 'b' + CPPUNIT_ASSERT(bar->charAt(1) == 0x00e1); // 'a' with acute + CPPUNIT_ASSERT(bar->charAt(2) == 0x0072); // 'r' + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + jpBundle.reset(new ResourceBundle("./tmp/" PACKAGE_NAME, "jp", status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + try { + Ptr::Ref locObj(new LocalizedObject(jpBundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->charAt(0) == 0x3075); // hiragana fu + Ptr::Ref bar = section1->getResourceString("bar"); + CPPUNIT_ASSERT(bar->charAt(0) == 0x3070); // hiragana ba + CPPUNIT_ASSERT(bar->charAt(1) == 0x308b); // hiragana ru + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * Test message formatting. + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: formatMessageTest(void) + throw (CPPUNIT_NS::Exception) +{ + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref bundle(new ResourceBundle("./tmp/" PACKAGE_NAME, + "root", + status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + + try { + Ptr::Ref message; + Ptr::Ref locObj(new LocalizedObject(bundle)); + Ptr::Ref messages(new LocalizedObject( + locObj->getBundle("messages"))); + Formattable arguments[] = { "p1", "p2" }; + + // test formatting through a key + message = messages->formatMessage("aMessage", arguments, 2); + CPPUNIT_ASSERT(*message == "parameter 0: p1, parameter 1: p2"); + + // test formatting through an explicit pattern + Ptr::Ref uMessage; + Ptr::Ref pattern(new UnicodeString( + "only 1 parameter: {0}")); + uMessage = LocalizedObject::formatMessage(pattern, arguments, 1); + CPPUNIT_ASSERT(uMessage->compare("only 1 parameter: p1") == 0); + + // test formatting through a key, and a fixed number of parameters + message = messages->formatMessage("aMessage3Args", "p0"); + CPPUNIT_ASSERT(*message == "p0: p0, p2: {2}, p1: {1}"); + message = messages->formatMessage("aMessage3Args", "p0", "p1"); + CPPUNIT_ASSERT(*message == "p0: p0, p2: {2}, p1: p1"); + message = messages->formatMessage("aMessage3Args", "p0", "p1", "p2"); + CPPUNIT_ASSERT(*message == "p0: p0, p2: p2, p1: p1"); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * Test to see if resource bundle can be loaded based on a config file + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: loadFromConfigTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref bundle; + + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + bundle = LocalizedObject::getBundle(*root); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in configuration file"); + } catch (std::exception &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(bundle.get()); + + // now, see if this really is the en bundle + try { + Ptr::Ref locObj(new LocalizedObject(bundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceString("foo"); + CPPUNIT_ASSERT(foo->compare("fou") == 0); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * Test the ustring related functions. + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: ustringTest(void) + throw (CPPUNIT_NS::Exception) +{ + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref bundle(new ResourceBundle("./tmp/" PACKAGE_NAME, + "root", + status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + + // test getting an ustring resource + try { + Ptr::Ref locObj(new LocalizedObject(bundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = section1->getResourceUstring("foo"); + CPPUNIT_ASSERT(*foo == "foo"); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + // test message formatting to ustring + try { + Ptr::Ref message; + Ptr::Ref locObj(new LocalizedObject(bundle)); + Ptr::Ref messages(new LocalizedObject( + locObj->getBundle("messages"))); + Formattable arguments[] = { "p1", "p2" }; + + // test formatting through a key + message = messages->formatMessage("aMessage", arguments, 2); + CPPUNIT_ASSERT(*message == "parameter 0: p1, parameter 1: p2"); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * Test the ustring related functions in problematic situations + * see http://bugs.campware.org/view.php?id=792 + *----------------------------------------------------------------------------*/ +void +LocalizedObjectTest :: ustringNegativeTest(void) + throw (CPPUNIT_NS::Exception) +{ + bool gotException; + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref bundle(new ResourceBundle("./tmp/" PACKAGE_NAME, + "root", + status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + + // test getting a missing ustring resource + gotException = false; + try { + Ptr::Ref locObj(new LocalizedObject(bundle)); + Ptr::Ref section1(new LocalizedObject( + locObj->getBundle("section1"))); + Ptr::Ref foo = + section1->getResourceUstring("nonexistentKey"); + } catch (std::invalid_argument &e) { + gotException = true; + } + CPPUNIT_ASSERT(gotException); +} + + diff --git a/campcaster/src/modules/core/src/LocalizedObjectTest.h b/campcaster/src/modules/core/src/LocalizedObjectTest.h new file mode 100644 index 000000000..66d544358 --- /dev/null +++ b/campcaster/src/modules/core/src/LocalizedObjectTest.h @@ -0,0 +1,164 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LocalizedObjectTest_h +#define LocalizedObjectTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the LocalizedObject class. + * + * @author $Author$ + * @version $Revision$ + * @see LocalizedObject + */ +class LocalizedObjectTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(LocalizedObjectTest); + CPPUNIT_TEST(simpleTest); + CPPUNIT_TEST(fallbackTest); + CPPUNIT_TEST(unicodeTest); + CPPUNIT_TEST(formatMessageTest); + CPPUNIT_TEST(loadFromConfigTest); + CPPUNIT_TEST(ustringTest); + CPPUNIT_TEST(ustringNegativeTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + simpleTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test to see if multiple locales work, and they fall back to + * more generic values. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + fallbackTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test to see if funny unicode characters work properly. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + unicodeTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to see if message formatting works all right. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + formatMessageTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to see if a resource bundle can be loaded based on a + * configuration file + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + loadFromConfigTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to check the Glib::ustring related functions. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + ustringTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to check the Glib::ustring related function beaviour + * in problematic situations. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + ustringNegativeTest(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 Core +} // namespace LiveSupport + +#endif // LocalizedObjectTest_h + diff --git a/campcaster/src/modules/core/src/Md5.cxx b/campcaster/src/modules/core/src/Md5.cxx new file mode 100644 index 000000000..311139a58 --- /dev/null +++ b/campcaster/src/modules/core/src/Md5.cxx @@ -0,0 +1,593 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + This class is based on the following with minor modifications + (see http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html). + + ------------------------------------------------------------------------------ + +// Md5.CC - source code for the C++/object oriented translation and +// modification of Md5. + +// Translation and modification (c) 1995 by Mordechai T. Abzug + +// This translation/ modification is provided "as is," without express or +// implied warranty of any kind. + +// The translator/ modifier does not claim (1) that Md5 will do what you think +// it does; (2) that this translation/ modification is accurate; or (3) that +// this software is "merchantible." (Language for this disclaimer partially +// copied from the disclaimer below). + + ------------------------------------------------------------------------------ + + Which was based on: + + ------------------------------------------------------------------------------ + + Md5.H - header file for Md5C.C + MDDRIVER.C - test driver for MD2, MD4 and Md5 + + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. Md5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. Md5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + + ------------------------------------------------------------------------------ + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include "LiveSupport/Core/Md5.h" + +#include +#include +#include + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Construct from a string. + *----------------------------------------------------------------------------*/ +Md5::Md5(const std::string &s) throw(std::invalid_argument) +{ + init(); + update (s); + finalize(); + calcNumericRepresentation(); +} + + +/*------------------------------------------------------------------------------ + * Construct from an istream. + *----------------------------------------------------------------------------*/ +Md5::Md5(std::istream& stream) throw(std::invalid_argument) +{ + init(); + update (stream); + finalize(); + calcNumericRepresentation(); +} + + +/*------------------------------------------------------------------------------ + * Construct from a file. + *----------------------------------------------------------------------------*/ +Md5::Md5(FILE *file) throw(std::invalid_argument) +{ + init(); + update(file); + finalize (); + calcNumericRepresentation(); +} + + +/*------------------------------------------------------------------------------ + * Output the md5 sum as a hexadecimal string. + *----------------------------------------------------------------------------*/ +std::string Md5::hexDigest() throw() +{ + std::stringstream strStr; + + for (int i=0; i<16; i++) { + strStr << std::hex << std::setw(2) << std::setfill('0') + << int(digest[i]); + } + + return strStr.str(); +} + + +/*------------------------------------------------------------------------------ + * Calculate the numeric representation of the checksum + *----------------------------------------------------------------------------*/ +void +Md5 :: calcNumericRepresentation(void) throw () +{ + low64 = (uint64_t) digest[15]; + low64 |= ((uint64_t) digest[14]) << 8; + low64 |= ((uint64_t) digest[13]) << 16; + low64 |= ((uint64_t) digest[12]) << 24; + low64 |= ((uint64_t) digest[11]) << 32; + low64 |= ((uint64_t) digest[10]) << 40; + low64 |= ((uint64_t) digest[9]) << 48; + low64 |= ((uint64_t) digest[8]) << 56; + + high64 = (uint64_t) digest[7]; + high64 |= ((uint64_t) digest[6]) << 8; + high64 |= ((uint64_t) digest[5]) << 16; + high64 |= ((uint64_t) digest[4]) << 24; + high64 |= ((uint64_t) digest[3]) << 32; + high64 |= ((uint64_t) digest[2]) << 40; + high64 |= ((uint64_t) digest[1]) << 48; + high64 |= ((uint64_t) digest[0]) << 56; +} + + +/*------------------------------------------------------------------------------ + * Convert the md5 sum to a hexadecimal string. + *----------------------------------------------------------------------------*/ +Md5::operator std::string() throw() +{ + return hexDigest(); +} + + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ private methods */ + +// Md5 block update operation. Continues an Md5 message-digest +// operation, processing another message block, and updating the +// context. + +void Md5::update (uint1 *input, uint4 input_length) +{ + uint4 input_index, buffer_index; + uint4 buffer_space; // how much space is left in buffer + + if (finalized){ // so we can't update! + throw std::invalid_argument("Md5::update: " + "Can't update a finalized digest!"); + } + + // Compute number of bytes mod 64 + buffer_index = (unsigned int)((count[0] >> 3) & 0x3F); + + // Update number of bits + if ( (count[0] += ((uint4) input_length << 3))<((uint4) input_length << 3) ) + count[1]++; + + count[1] += ((uint4)input_length >> 29); + + + buffer_space = 64 - buffer_index; // how much space is left in buffer + + // Transform as many times as possible. + if (input_length >= buffer_space) { // ie. we have enough to fill the buffer + // fill the rest of the buffer and transform + memcpy (buffer + buffer_index, input, buffer_space); + transform (buffer); + + // now, transform each 64-byte piece of the input, bypassing the buffer + for (input_index = buffer_space; input_index + 63 < input_length; + input_index += 64) { + transform (input+input_index); + } + buffer_index = 0; // so we can buffer remaining + } else { + input_index=0; // so we can buffer the whole input + } + + // and here we do the buffering: + memcpy(buffer+buffer_index, input+input_index, input_length-input_index); +} + + + +// Md5 update for files. +// Like above, except that it works on files (and uses above as a primitive.) + +void Md5::update(FILE *file) +{ + uint1 buffer[1024]; + uint4 len; + + while ((len=fread(buffer, 1, 1024, file))) + update(buffer, len); + +// deleted by me (fgerlits) to make it work more like the istream version +// fclose (file); +} + + + + + + +// Md5 update for istreams. +// Like update for files; see above. + +void Md5::update(std::istream& stream) +{ + uint1 buffer[1024]; + uint4 len; + + while (stream.good()){ // note that return value of read is unusable. + stream.read((char *)buffer, 1024); + len=stream.gcount(); + update(buffer, len); + } +} + + + + + + +// Md5 update for strings. +// Like update for files; see above. + +void Md5::update(const std::string &s) +{ + uint1 buffer[1024]; + uint4 len; + uint4 pos = 0; + + while (pos < s.size()){ + len = s.copy((char *)buffer, 1024, pos); + update(buffer, len); + pos += len; + } +} + + + + + + +// Md5 finalization. Ends an Md5 message-digest operation, writing the +// the message digest and zeroizing the context. + + +void Md5::finalize () throw (std::invalid_argument) +{ + uint1 bits[8]; + uint4 index, padLen; + static uint1 PADDING[64]={ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + if (finalized){ + throw std::invalid_argument("Md5::finalize: " + "Already finalized this digest!"); + } + + // Save number of bits + encode (bits, count, 8); + + // Pad out to 56 mod 64. + index = (uint4) ((count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + update (PADDING, padLen); + + // Append length (before padding) + update (bits, 8); + + // Store state in digest + encode (digest, state, 16); + + // Zeroize sensitive information + memset (buffer, 0, sizeof(*buffer)); + + finalized=1; +} + + + + +// PRIVATE METHODS: + + + +void Md5::init(){ + finalized=0; // we just started! + + // Nothing counted, so count=0 + count[0] = 0; + count[1] = 0; + + // Load magic initialization constants. + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; +} + + + +// Constants for Md5Transform routine. +// Although we could use C++ style constants, defines are actually better, +// since they let us easily evade scope clashes. + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + + + + +// Md5 basic transformation. Transforms state based on block. +void Md5::transform (uint1 block[64]){ + + uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + decode (x, block, 64); + + assert(!finalized); // not just a user error, since the method is private + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + // Zeroize sensitive information. + memset ( (uint1 *) x, 0, sizeof(x)); + +} + + + +// Encodes input (UINT4) into output (unsigned char). Assumes len is +// a multiple of 4. +void Md5::encode (uint1 *output, uint4 *input, uint4 len) { + + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (uint1) (input[i] & 0xff); + output[j+1] = (uint1) ((input[i] >> 8) & 0xff); + output[j+2] = (uint1) ((input[i] >> 16) & 0xff); + output[j+3] = (uint1) ((input[i] >> 24) & 0xff); + } +} + + + + +// Decodes input (unsigned char) into output (UINT4). Assumes len is +// a multiple of 4. +void Md5::decode (uint4 *output, uint1 *input, uint4 len){ + + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) | + (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24); +} + + + + + +// Note: Replace "for loop" with standard memcpy if possible. +void Md5::memcpy (uint1 *output, uint1 *input, uint4 len){ + + unsigned int i; + + for (i = 0; i < len; i++) + output[i] = input[i]; +} + + + +// Note: Replace "for loop" with standard memset if possible. +void Md5::memset (uint1 *output, uint1 value, uint4 len){ + + unsigned int i; + + for (i = 0; i < len; i++) + output[i] = value; +} + + + +// ROTATE_LEFT rotates x left n bits. + +inline unsigned int Md5::rotate_left (uint4 x, uint4 n){ + return (x << n) | (x >> (32-n)) ; +} + + + + +// F, G, H and I are basic Md5 functions. + +inline unsigned int Md5::F (uint4 x, uint4 y, uint4 z){ + return (x & y) | (~x & z); +} + +inline unsigned int Md5::G (uint4 x, uint4 y, uint4 z){ + return (x & z) | (y & ~z); +} + +inline unsigned int Md5::H (uint4 x, uint4 y, uint4 z){ + return x ^ y ^ z; +} + +inline unsigned int Md5::I (uint4 x, uint4 y, uint4 z){ + return y ^ (x | ~z); +} + + + +// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +// Rotation is separate from addition to prevent recomputation. + + +inline void Md5::FF(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac){ + a += F(b, c, d) + x + ac; + a = rotate_left (a, s) +b; +} + +inline void Md5::GG(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac){ + a += G(b, c, d) + x + ac; + a = rotate_left (a, s) +b; +} + +inline void Md5::HH(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac){ + a += H(b, c, d) + x + ac; + a = rotate_left (a, s) +b; +} + +inline void Md5::II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, + uint4 s, uint4 ac){ + a += I(b, c, d) + x + ac; + a = rotate_left (a, s) +b; +} + + + + diff --git a/campcaster/src/modules/core/src/Md5Test.cxx b/campcaster/src/modules/core/src/Md5Test.cxx new file mode 100644 index 000000000..203a3d575 --- /dev/null +++ b/campcaster/src/modules/core/src/Md5Test.cxx @@ -0,0 +1,119 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/Md5.h" +#include "Md5Test.h" + + +using namespace std; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(Md5Test); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +Md5Test :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +Md5Test :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can construct some simple md5 sums + *----------------------------------------------------------------------------*/ +void +Md5Test :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + // test the construction from string + Md5 emptyString(""); + CPPUNIT_ASSERT(emptyString.hexDigest() + == "d41d8cd98f00b204e9800998ecf8427e"); + + Md5 someString("Some other random string."); + CPPUNIT_ASSERT(someString.hexDigest() + == "9007a3599f5d3ae2ac11a29308f964eb"); + + std::string s = someString; + CPPUNIT_ASSERT(s == "9007a3599f5d3ae2ac11a29308f964eb"); + CPPUNIT_ASSERT(someString.low64bits() == 0xac11a29308f964ebLL); + CPPUNIT_ASSERT(someString.high64bits() == 0x9007a3599f5d3ae2LL); + + // test the construction from a FILE* + FILE *f = fopen("var/md5test.data", "r"); + Md5 testFile(f); + CPPUNIT_ASSERT(testFile.hexDigest() + == "fc359d2b366cc110db86c3d68bdf39c4"); + fclose(f); + + // test the construction from an istream + std::ifstream ifs("var/md5test.data"); + Md5 testFileStream(ifs); + CPPUNIT_ASSERT(testFileStream.hexDigest() + == "fc359d2b366cc110db86c3d68bdf39c4"); + ifs.close(); +} + diff --git a/campcaster/src/modules/core/src/Md5Test.h b/campcaster/src/modules/core/src/Md5Test.h new file mode 100644 index 000000000..c53b8b4fd --- /dev/null +++ b/campcaster/src/modules/core/src/Md5Test.h @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef Md5Test_h +#define Md5Test_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the Md5 class. + * + * @author $Author$ + * @version $Revision$ + * @see Md5 + */ +class Md5Test : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(Md5Test); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 Core +} // namespace LiveSupport + +#endif // Md5Test_h + diff --git a/campcaster/src/modules/core/src/MetadataConstraint.cxx b/campcaster/src/modules/core/src/MetadataConstraint.cxx new file mode 100644 index 000000000..a0edc35e7 --- /dev/null +++ b/campcaster/src/modules/core/src/MetadataConstraint.cxx @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include "NumericConstraint.h" +#include "NumericRangeConstraint.h" +#include "EnumerationConstraint.h" + +#include "LiveSupport/Core/MetadataConstraint.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string MetadataConstraint::configElementNameStr = "constraint"; + +/*------------------------------------------------------------------------------ + * The name of the type attribute. + *----------------------------------------------------------------------------*/ +const std::string MetadataConstraint::typeAttributeName = "type"; + +/*------------------------------------------------------------------------------ + * The name of the configuration element for the constraint values. + *----------------------------------------------------------------------------*/ +const std::string MetadataConstraint::valueElementName = "value"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a constraint element object based on an XML element. + *----------------------------------------------------------------------------*/ +void +MetadataConstraint :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + throw std::invalid_argument("bad configuration element " + + element.get_name()); + } + + const xmlpp::Attribute* typeAttribute; + if (!(typeAttribute = element.get_attribute(typeAttributeName))) { + throw std::invalid_argument("missing attribute " + typeAttributeName); + } + std::string type = typeAttribute->get_value(); + + if (type == "numeric") { + concreteConstraint.reset(new NumericConstraint()); + concreteConstraint->configure(element); + + } else if (type == "numericRange") { + concreteConstraint.reset(new NumericRangeConstraint()); + concreteConstraint->configure(element); + + } else if (type == "enumeration") { + concreteConstraint.reset(new EnumerationConstraint()); + concreteConstraint->configure(element); + + } else { + throw std::invalid_argument("unknown metadata constraint" + type); + } +} + + +/*------------------------------------------------------------------------------ + * Check that the given value satisfies the constraint. + *----------------------------------------------------------------------------*/ +inline bool +MetadataConstraint :: check(Ptr::Ref value) const + throw (std::logic_error) +{ + if (concreteConstraint) { + return concreteConstraint->check(value); + } else { + throw std::logic_error("MetadataConstraint not configured yet"); + } +} + diff --git a/campcaster/src/modules/core/src/MetadataType.cxx b/campcaster/src/modules/core/src/MetadataType.cxx new file mode 100644 index 000000000..cfd5dc68b --- /dev/null +++ b/campcaster/src/modules/core/src/MetadataType.cxx @@ -0,0 +1,201 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/MetadataTypeContainer.h" +#include "LiveSupport/Core/MetadataType.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string MetadataType::configElementNameStr = "metadataType"; + +/** + * The name of the attribute of the DC name in the metadataType element. + */ +static const std::string dcNameAttrName = "dcName"; + +/** + * The name of the attribute of the ID3v2 tag in the metadataType element + */ +static const std::string id3TagAttrName = "id3Tag"; + +/** + * The name of the attribute of the localization key in the + * metadataType element. + */ +static const std::string localizationKeyAttrName = "localizationKey"; + +/** + * The name of the attribute of the tab name in the metadataType element + */ +static const std::string tabAttrName = "tab"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +MetadataType :: MetadataType(Ptr::Ref container) + throw () + : container(container), + tab(noTab) +{ +} + + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +MetadataType :: MetadataType(Ptr::Ref container, + Glib::ustring dcName, + Glib::ustring id3Tag, + Glib::ustring localizationKey, + TabType tab) + throw () + : container(container), + tab(tab) +{ + this->dcName.reset(new Glib::ustring(dcName)); + this->id3Tag.reset(new Glib::ustring(id3Tag)); + this->localizationKey.reset(new Glib::ustring(localizationKey)); +} + + +/*------------------------------------------------------------------------------ + * Create a metadata type element object based on an XML element. + *----------------------------------------------------------------------------*/ +void +MetadataType :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + throw std::invalid_argument("bad configuration element " + + element.get_name()); + } + + const xmlpp::Attribute* attribute; + + // set the DC name + if (!(attribute = element.get_attribute(dcNameAttrName))) { + throw std::invalid_argument("missing attribute " + dcNameAttrName); + } + dcName.reset(new Glib::ustring(attribute->get_value())); + + // get the ID3v2 tag name, optional + if ((attribute = element.get_attribute(id3TagAttrName))) { + id3Tag.reset(new Glib::ustring(attribute->get_value())); + } + + // get the localization key + if (!(attribute = element.get_attribute(localizationKeyAttrName))) { + throw std::invalid_argument("missing attribute " + + localizationKeyAttrName); + } + localizationKey.reset(new Glib::ustring(attribute->get_value())); + + // get the tab, optional + tab = noTab; + if ((attribute = element.get_attribute(tabAttrName))) { + Glib::ustring tabString = attribute->get_value(); + if (tabString == "main") { + tab = mainTab; + } else if (tabString == "music") { + tab = musicTab; + } else if (tabString == "voice") { + tab = voiceTab; + } + } + + // get the constraint, optional + xmlpp::Node::NodeList childNodes = element.get_children( + MetadataConstraint::getConfigElementName()); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + if (it != childNodes.end()) { + const xmlpp::Element * constraintElement + = dynamic_cast (*it); + if (constraintElement) { + constraint.reset(new MetadataConstraint()); + constraint->configure(*constraintElement); + } + } +} + + +/*------------------------------------------------------------------------------ + * Return the localized name for this metadata type. + *----------------------------------------------------------------------------*/ +Ptr::Ref +MetadataType :: getLocalizedName(void) const + throw (std::invalid_argument) +{ + return container->getResourceUstring(*localizationKey); +} + + +/*------------------------------------------------------------------------------ + * Check that the given value satisfies the constraint. + *----------------------------------------------------------------------------*/ +bool +MetadataType :: check(Ptr::Ref value) const + throw () +{ + if (!value) { + return false; + } + + if (constraint) { + try { + return constraint->check(value); + } catch (std::logic_error &e) { + return false; + } + } else { + return true; + } +} + diff --git a/campcaster/src/modules/core/src/MetadataTypeContainer.cxx b/campcaster/src/modules/core/src/MetadataTypeContainer.cxx new file mode 100644 index 000000000..286493887 --- /dev/null +++ b/campcaster/src/modules/core/src/MetadataTypeContainer.cxx @@ -0,0 +1,171 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/MetadataTypeContainer.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string MetadataTypeContainer::configElementNameStr + = "metadataTypeContainer"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a metadata type container element object based on an XML element. + *----------------------------------------------------------------------------*/ +void +MetadataTypeContainer :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + throw std::invalid_argument("bad configuration element " + + element.get_name()); + } + + // get the metadataType child elements, and process them + xmlpp::Node::NodeList childNodes = element.get_children( + MetadataType::getConfigElementName()); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + xmlpp::Node::NodeList::iterator end = childNodes.end(); + + while (it != end) { + const xmlpp::Element * metadataTypeElement + = dynamic_cast (*it); + Ptr::Ref metadataType( + new MetadataType(shared_from_this())); + + metadataType->configure(*metadataTypeElement); + + if (dcNameMap.find(*metadataType->getDcName()) != dcNameMap.end()) { + throw std::invalid_argument("trying to insert duplicate metadata " + "type: " + *metadataType->getDcName()); + } + if (metadataType->getId3Tag().get()) { + if (id3TagMap.find(*metadataType->getId3Tag()) != id3TagMap.end()) { + throw std::invalid_argument("trying to insert duplicate " + "metadata by ID3v2 tag: " + + *metadataType->getId3Tag()); + } + } + + dcNameMap[*metadataType->getDcName()] = metadataType; + if (metadataType->getId3Tag().get()) { + id3TagMap[*metadataType->getId3Tag()] = metadataType; + } + vector.push_back(metadataType); + + ++it; + } +} + + +/*------------------------------------------------------------------------------ + * Tell if a metadata type object by the Dublin Core name exists + *----------------------------------------------------------------------------*/ +bool +MetadataTypeContainer :: existsByDcName(const Glib::ustring dcName) const + throw () +{ + return dcNameMap.find(dcName) != dcNameMap.end(); +} + + +/*------------------------------------------------------------------------------ + * Look for a metadata type object by the Dublin Core name + *----------------------------------------------------------------------------*/ +Ptr::Ref +MetadataTypeContainer :: getByDcName(const Glib::ustring dcName) + throw (std::invalid_argument) +{ + if (!existsByDcName(dcName)) { + throw std::invalid_argument("no metadata type by the DC name " +dcName); + } + + return dcNameMap[dcName]; +} + + +/*------------------------------------------------------------------------------ + * Tell if a metadata type object by the ID3v2 tag name exists. + *----------------------------------------------------------------------------*/ +bool +MetadataTypeContainer :: existsById3Tag(const Glib::ustring id3Tag) const + throw () +{ + return id3TagMap.find(id3Tag) != id3TagMap.end(); +} + + +/*------------------------------------------------------------------------------ + * Look for a metadata type object by the ID3v2 tag name. + *----------------------------------------------------------------------------*/ +Ptr::Ref +MetadataTypeContainer :: getById3Tag(const Glib::ustring id3Tag) + throw (std::invalid_argument) +{ + if (!existsById3Tag(id3Tag)) { + throw std::invalid_argument("no metadata type by the ID3v2 Tag " + + id3Tag); + } + + return id3TagMap[id3Tag]; +} + + +/*------------------------------------------------------------------------------ + * Check that the given value satisfies the constraint of a metadata type. + *----------------------------------------------------------------------------*/ +bool +MetadataTypeContainer :: check(Ptr::Ref value, + const Glib::ustring & dcName) + throw (std::invalid_argument) +{ + Ptr::Ref metadataType = getByDcName(dcName); + return metadataType->check(value); +} + diff --git a/campcaster/src/modules/core/src/MetadataTypeContainerTest.cxx b/campcaster/src/modules/core/src/MetadataTypeContainerTest.cxx new file mode 100644 index 000000000..5a0b67d60 --- /dev/null +++ b/campcaster/src/modules/core/src/MetadataTypeContainerTest.cxx @@ -0,0 +1,343 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/MetadataTypeContainer.h" + +#include "MetadataTypeContainerTest.h" + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(MetadataTypeContainerTest); + +/** + * The name of the configuration file for the resource bundle. + */ +static const std::string bundleConfigFileName = "etc/resourceBundle.xml"; + +/** + * The name of the configuration file for the metadataType element. + */ +static const std::string metadataTypeConfigFileName = "etc/metadataType.xml"; + +/** + * The name of the configuration file for the metadataTypeContainer element. + */ +static const std::string configFileName = "etc/metadataTypeContainer.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +MetadataTypeContainerTest :: setUp(void) throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref rootBundle; + try { + Ptr::Ref parser( + new xmlpp::DomParser(bundleConfigFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + rootBundle = LocalizedObject::getBundle(*root); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in bundle configuration file"); + } catch (std::exception &e) { + CPPUNIT_FAIL(std::string("XML error in bundle configuration file:\n") + + e.what()); + } + CPPUNIT_ASSERT(rootBundle); + + UErrorCode icuError = U_ZERO_ERROR; + bundle.reset(new ResourceBundle(rootBundle->get("metadata", icuError))); + CPPUNIT_ASSERT(U_SUCCESS(icuError)); + CPPUNIT_ASSERT(bundle); + + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + container.reset(new MetadataTypeContainer(bundle)); + container->configure(*root); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(std::string("semantic error in metadata container" + " configuration file:\n") + + e.what()); + } catch (xmlpp::exception &e) { + CPPUNIT_FAIL(std::string("XML error in metadata container" + " configuration file:\n") + + e.what()); + } + +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +MetadataTypeContainerTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +MetadataTypeContainerTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref metadataType; + bool gotException; + + // test double-configuration + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + gotException = false; + try { + container->configure(*root); + } catch (std::invalid_argument &e) { + gotException = true; + } + CPPUNIT_ASSERT(gotException); + + } catch (xmlpp::exception &e) { + CPPUNIT_FAIL(std::string("XML error in configuration file:\n") + + e.what()); + } + + // a simple positive check on the DC name + CPPUNIT_ASSERT(container->existsByDcName("dc:creator")); + metadataType = container->getByDcName("dc:creator"); + + CPPUNIT_ASSERT(*metadataType->getDcName() == "dc:creator"); + CPPUNIT_ASSERT(*metadataType->getId3Tag() == "TPE1"); + CPPUNIT_ASSERT(*metadataType->getLocalizationKey() == "creator"); + + // a negative check on the DC name + CPPUNIT_ASSERT(!container->existsByDcName("dc:nonExistent")); + + gotException = false; + try { + container->getByDcName("dc:nonExistent"); + } catch (std::invalid_argument &e) { + gotException = true; + } + CPPUNIT_ASSERT(gotException); + + // a simple positive check on the ID3v2 tag + CPPUNIT_ASSERT(container->existsById3Tag("TPE1")); + metadataType = container->getById3Tag("TPE1"); + + CPPUNIT_ASSERT(*metadataType->getDcName() == "dc:creator"); + CPPUNIT_ASSERT(*metadataType->getId3Tag() == "TPE1"); + CPPUNIT_ASSERT(*metadataType->getLocalizationKey() == "creator"); + + // a negative check on the ID3v2 tag + CPPUNIT_ASSERT(!container->existsById3Tag("NonExistentTag")); + + gotException = false; + try { + container->getById3Tag("NonExistentTag"); + } catch (std::invalid_argument &e) { + gotException = true; + } + CPPUNIT_ASSERT(gotException); + + // two simple positive checks on the tab attribute + CPPUNIT_ASSERT(container->existsByDcName("dc:title")); + metadataType = container->getByDcName("dc:title"); + CPPUNIT_ASSERT(metadataType->getTab() == MetadataType::mainTab); + + CPPUNIT_ASSERT(container->existsByDcName("ls:buycdurl")); + metadataType = container->getByDcName("ls:buycdurl"); + CPPUNIT_ASSERT(metadataType->getTab() == MetadataType::noTab); +} + + +/*------------------------------------------------------------------------------ + * Test the iterator feature of the container. + *----------------------------------------------------------------------------*/ +void +MetadataTypeContainerTest :: iteratorTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref metadataType; + MetadataTypeContainer::Vector::const_iterator it; + MetadataTypeContainer::Vector::const_iterator end; + + // check the first two elements in the container + it = container->begin(); + end = container->end(); + + CPPUNIT_ASSERT(it != end); + metadataType = (Ptr::Ref) *it; + CPPUNIT_ASSERT(*metadataType->getDcName() == "dc:title"); + CPPUNIT_ASSERT(*metadataType->getId3Tag() == "TIT2"); + CPPUNIT_ASSERT(*metadataType->getLocalizationKey() == "title"); + + ++it; + CPPUNIT_ASSERT(it != end); + metadataType = (Ptr::Ref) *it; + CPPUNIT_ASSERT(*metadataType->getDcName() == "dc:creator"); + CPPUNIT_ASSERT(*metadataType->getId3Tag() == "TPE1"); + CPPUNIT_ASSERT(*metadataType->getLocalizationKey() == "creator"); + + // test on an empty container + container.reset(new MetadataTypeContainer(bundle)); + it = container->begin(); + end = container->end(); + CPPUNIT_ASSERT(it == end); +} + + +/*------------------------------------------------------------------------------ + * Test localized metadata type names. + *----------------------------------------------------------------------------*/ +void +MetadataTypeContainerTest :: localizedTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref metadataType; + + CPPUNIT_ASSERT(container->existsByDcName("dc:creator")); + metadataType = container->getByDcName("dc:creator"); + + CPPUNIT_ASSERT(*metadataType->getLocalizedName() == "Creator"); + + UErrorCode status = U_ZERO_ERROR; + Ptr::Ref rootBundle; + Ptr::Ref huBundle; + Ptr::Ref jpBundle; + Ptr::Ref ustr; + + // test with hungarian + rootBundle.reset(new ResourceBundle("./tmp/" PACKAGE_NAME, "hu", status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + huBundle.reset(new ResourceBundle(rootBundle->get("metadata", status))); + CPPUNIT_ASSERT(U_SUCCESS(status)); + container->setBundle(huBundle); + + ustr = metadataType->getLocalizedName(); + CPPUNIT_ASSERT(ustr->length() == 6); + CPPUNIT_ASSERT((*ustr)[0] == 0x0045); // 'E' + CPPUNIT_ASSERT((*ustr)[1] == 0x006C); // 'l' + CPPUNIT_ASSERT((*ustr)[2] == 0x0151); // 'o' with double acute + CPPUNIT_ASSERT((*ustr)[3] == 0x0061); // 'a' + CPPUNIT_ASSERT((*ustr)[4] == 0x0064); // 'd' + CPPUNIT_ASSERT((*ustr)[5] == 0x00F3); // 'o' with acute + + // test with japanese + rootBundle.reset(new ResourceBundle("./tmp/" PACKAGE_NAME, "jp", status)); + CPPUNIT_ASSERT(U_SUCCESS(status)); + jpBundle.reset(new ResourceBundle(rootBundle->get("metadata", status))); + CPPUNIT_ASSERT(U_SUCCESS(status)); + container->setBundle(jpBundle); + + ustr = metadataType->getLocalizedName(); + CPPUNIT_ASSERT(ustr->length() == 6); + CPPUNIT_ASSERT((*ustr)[0] == 0x30af); // katakana ku + CPPUNIT_ASSERT((*ustr)[1] == 0x30ea); // katakana ri + CPPUNIT_ASSERT((*ustr)[2] == 0x30a8); // katakana e + CPPUNIT_ASSERT((*ustr)[3] == 0x30fc); // katakana '-' + CPPUNIT_ASSERT((*ustr)[4] == 0x30bf); // katakana ta + CPPUNIT_ASSERT((*ustr)[5] == 0x30fc); // katakana '-' +} + + +/*------------------------------------------------------------------------------ + * Test to see if the constraints work. + *----------------------------------------------------------------------------*/ +void +MetadataTypeContainerTest :: constraintTest(void) + throw (CPPUNIT_NS::Exception) +{ + // test the case of no constraint; everything is OK + Ptr::Ref title; + CPPUNIT_ASSERT(!container->check(title, "dc:title")); // except a 0 pointer + title.reset(new Glib::ustring("Some title")); + CPPUNIT_ASSERT(container->check(title, "dc:title")); + + // test the numeric constraint; [0-9]+ required + Ptr::Ref bpm(new Glib::ustring ("1000")); + CPPUNIT_ASSERT(container->check(bpm, "ls:bpm")); + bpm->assign("2000 or more"); + CPPUNIT_ASSERT(!container->check(bpm, "ls:bpm")); + bpm->assign(""); + CPPUNIT_ASSERT(!container->check(bpm, "ls:bpm")); + + // test the numeric range constraint; [0-9]+ required, between 0 and 3000 + Ptr::Ref year(new Glib::ustring ("1000")); + CPPUNIT_ASSERT(container->check(year, "ls:year")); + year->assign("1066 AD"); + CPPUNIT_ASSERT(!container->check(year, "ls:year")); + year->assign("20066"); + CPPUNIT_ASSERT(!container->check(year, "ls:year")); + + // test the enumeration constraint; "mp3", "mpeg" or "ogg" are allowed + Ptr::Ref format(new Glib::ustring ("mp3")); + CPPUNIT_ASSERT(container->check(format, "dc:format")); + format->assign("wma"); + CPPUNIT_ASSERT(!container->check(format, "dc:format")); +} + diff --git a/campcaster/src/modules/core/src/MetadataTypeContainerTest.h b/campcaster/src/modules/core/src/MetadataTypeContainerTest.h new file mode 100644 index 000000000..47bd84422 --- /dev/null +++ b/campcaster/src/modules/core/src/MetadataTypeContainerTest.h @@ -0,0 +1,144 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef MetadataTypeContainerTest_h +#define MetadataTypeContainerTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the MetadataTypeContainer class. + * + * @author $Author$ + * @version $Revision$ + * @see MetadataTypeContainer + */ +class MetadataTypeContainerTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(MetadataTypeContainerTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(iteratorTest); + CPPUNIT_TEST(localizedTest); + CPPUNIT_TEST(constraintTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * The resource bundle used by the container. + */ + Ptr::Ref bundle; + + /** + * The metadata container used in the tests. + */ + Ptr::Ref container; + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing the iterators available from the container. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + iteratorTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test to see if localized metadata type names work. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + localizedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test to see if the constraints work. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + constraintTest(void) throw (CPPUNIT_NS::Exception); + + + public: + + /** + * Set up the environment for the test case. + */ + void + setUp(void) throw (CPPUNIT_NS::Exception); + + /** + * Clean up the environment after the test case. + */ + void + tearDown(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // MetadataTypeContainerTest_h + diff --git a/campcaster/src/modules/core/src/NumericConstraint.cxx b/campcaster/src/modules/core/src/NumericConstraint.cxx new file mode 100644 index 000000000..7a70067bc --- /dev/null +++ b/campcaster/src/modules/core/src/NumericConstraint.cxx @@ -0,0 +1,110 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include "NumericConstraint.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +namespace { + +/*------------------------------------------------------------------------------ + * The value of the type attribute for this class. + *----------------------------------------------------------------------------*/ +const std::string typeAttributeValue = "numeric"; + +} + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a constraint element object based on an XML element. + *----------------------------------------------------------------------------*/ +void +NumericConstraint :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != getConfigElementName()) { + throw std::invalid_argument("bad configuration element " + + element.get_name()); + } + + const xmlpp::Attribute* typeAttribute; + if (!(typeAttribute = element.get_attribute(typeAttributeName))) { + throw std::invalid_argument("missing attribute " + typeAttributeName); + } + std::string type = typeAttribute->get_value(); + + if (type != typeAttributeValue) { + throw std::invalid_argument(typeAttributeValue + + " constraint configured with a" + + " constraint element of type " + + type); + } +} + + +/*------------------------------------------------------------------------------ + * Check that the given value satisfies the constraint. + *----------------------------------------------------------------------------*/ +bool +NumericConstraint :: check(Ptr::Ref value) const + throw (std::logic_error) +{ + if (!value) { + throw std::logic_error("NumericConstraint::check() called with " + "a 0 pointer value"); + } + + Glib::ustring::const_iterator it = value->begin(); + + if (it == value->end()) { // the empty string is not a number + return false; + } + + for (; it != value->end(); ++it) { + if (*it < '0' || *it > '9') { + return false; + } + } + + return true; +} + diff --git a/campcaster/src/modules/core/src/NumericConstraint.h b/campcaster/src/modules/core/src/NumericConstraint.h new file mode 100644 index 000000000..0bf290f5c --- /dev/null +++ b/campcaster/src/modules/core/src/NumericConstraint.h @@ -0,0 +1,146 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_NumericConstraint_h +#define LiveSupport_Core_NumericConstraint_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#include "LiveSupport/Core/MetadataConstraint.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class for representing a numeric metadata constraint. + * + * This is a concrete subclass of MetadataConstraint. Do not explicitly + * instantiate this class; create a MetadataConstraint object instead, and + * configure it with an XML element with the appropriate type attribute. + * + * This object has to be configured with an XML configuration element + * called constraint. This may look like the following: + * + *
    
    + *  
    + *  
    + * + * A metadata type with this kind of constraint can only accept (decimal, + * non-negative) integer values, i.e., [0-9]+. + * + * The DTD for the expected XML element looks like the following: + * + *
    
    + *  
    + *  
    + *  
    + * + * @author $Author$ + * @version $Revision$ + * @see NumericConstraintContainer + */ +class NumericConstraint : public MetadataConstraint +{ + public: + /** + * Constructor. + */ + NumericConstraint() throw () + { + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~NumericConstraint(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 MetadataConstraint::getConfigElementName(); + } + + /** + * Configure the metadata object based on an XML configuration element. + * + * @param elemen the XML configuration element. + * @exception std::invalid_argument of the supplied XML element + * contains bad configuration information + */ + virtual void + configure(const xmlpp::Element &element) + throw (std::invalid_argument); + + /** + * Check that the given value satisfies the constraint. + * + * @param value the value to be checked against the constraint. + * @return true if the value satisfies the constraint. + * @exception std::logic_error if the parameter is a 0 pointer. + */ + virtual bool + check(Ptr::Ref value) const + throw (std::logic_error); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_NumericConstraint_h + diff --git a/campcaster/src/modules/core/src/NumericRangeConstraint.cxx b/campcaster/src/modules/core/src/NumericRangeConstraint.cxx new file mode 100644 index 000000000..8571ff106 --- /dev/null +++ b/campcaster/src/modules/core/src/NumericRangeConstraint.cxx @@ -0,0 +1,161 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include + +#include "NumericConstraint.h" + +#include "NumericRangeConstraint.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +namespace { + +/*------------------------------------------------------------------------------ + * The value of the type attribute for this class. + *----------------------------------------------------------------------------*/ +const std::string typeAttributeValue = "numericRange"; + +} + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a constraint element object based on an XML element. + *----------------------------------------------------------------------------*/ +void +NumericRangeConstraint :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != getConfigElementName()) { + throw std::invalid_argument("bad configuration element " + + element.get_name()); + } + + const xmlpp::Attribute* typeAttribute; + if (!(typeAttribute = element.get_attribute(typeAttributeName))) { + throw std::invalid_argument("missing attribute " + typeAttributeName); + } + std::string type = typeAttribute->get_value(); + + if (type != typeAttributeValue) { + throw std::invalid_argument(typeAttributeValue + + " constraint configured with a" + + " constraint element of type " + + type); + } + + xmlpp::Node::NodeList childNodes = element.get_children(valueElementName); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + if (it != childNodes.end()) { + minValue = readNumberFromNode(*it); + } else { + throw std::invalid_argument("sub-element not found in constraint"); + } + + ++it; + if (it != childNodes.end()) { + maxValue = readNumberFromNode(*it); + } else { + throw std::invalid_argument("sub-element not found in constraint"); + } +} + + +/*------------------------------------------------------------------------------ + * Read a number from an xml element. + *----------------------------------------------------------------------------*/ +NumericRangeConstraint :: ValueType +NumericRangeConstraint :: readNumberFromNode( + const xmlpp::Node * node) const + throw (std::invalid_argument) +{ + const xmlpp::Element * valueElement + = dynamic_cast (node); + if (valueElement) { + Ptr::Ref value(new Glib::ustring( + valueElement->get_child_text() + ->get_content() )); + return readNumber(value); + } else { + throw std::invalid_argument("bad sub-element found in constraint"); + } +} + + +/*------------------------------------------------------------------------------ + * Read a number from a string. + *----------------------------------------------------------------------------*/ +NumericRangeConstraint :: ValueType +NumericRangeConstraint :: readNumber( + Ptr::Ref value) const + throw (std::invalid_argument) +{ + NumericConstraint numericConstraint; + if (!numericConstraint.check(value)) { + throw std::invalid_argument("bad number found in constraint"); + } + + std::istringstream valueStream(*value); + ValueType valueNumber; + valueStream >> valueNumber; + + return valueNumber; +} + + +/*------------------------------------------------------------------------------ + * Check that the given value satisfies the constraint. + *----------------------------------------------------------------------------*/ +bool +NumericRangeConstraint :: check(Ptr::Ref value) const + throw (std::logic_error) +{ + ValueType valueNumber = readNumber(value); + + if (valueNumber >= minValue && valueNumber <= maxValue) { + return true; + } else { + return false; + } +} + diff --git a/campcaster/src/modules/core/src/NumericRangeConstraint.h b/campcaster/src/modules/core/src/NumericRangeConstraint.h new file mode 100644 index 000000000..10a08fd16 --- /dev/null +++ b/campcaster/src/modules/core/src/NumericRangeConstraint.h @@ -0,0 +1,194 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Core_NumericRangeConstraint_h +#define LiveSupport_Core_NumericRangeConstraint_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#include "LiveSupport/Core/MetadataConstraint.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A class for representing a metadata constraint which allows numbers between + * two given values (inclusive). + * + * This is a concrete subclass of MetadataConstraint. Do not explicitly + * instantiate this class; create a MetadataConstraint object instead, and + * configure it with an XML element with the appropriate type attribute. + * + * This object has to be configured with an XML configuration element + * called constraint. This may look like the following: + * + *
    
    + *  
    + *      1
    + *      12
    + *  
    + *  
    + * + * A metadata type with this kind of constraint can only accept (decimal, + * non-negative) integer values, i.e., [0-9]+, which are greater than or + * equal to the first value given, and less than or equal to the second + * value given. + * + * The DTD for the expected XML element looks like the following: + * + *
    
    + *  
    + *  
    + *  
    + *  
    + * + * @author $Author$ + * @version $Revision$ + * @see NumericRangeConstraintContainer + */ +class NumericRangeConstraint : public MetadataConstraint +{ + private: + /** + * The integer type used by the constraint. + */ + typedef unsigned long long ValueType; + + /** + * The smallest value allowed by the constraint. + */ + ValueType minValue; + + /** + * The largest value allowed by the constraint. + */ + ValueType maxValue; + + /** + * Read a number from an XML node. + * + * @param node the node containing the number. + * @return the number read from the node. + * @exception std::invalid_argument if the XML node is not + * of the expected form. + */ + ValueType + readNumberFromNode(const xmlpp::Node * node) const + throw (std::invalid_argument); + + /** + * Read a number from a string. + * + * @param value the string containing the number. + * @return the number read from the string. + * @exception std::invalid_argument if the string does not contain + * a number. + */ + ValueType + readNumber(Ptr::Ref value) const + throw (std::invalid_argument); + + + public: + /** + * Constructor. + */ + NumericRangeConstraint() throw () + { + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~NumericRangeConstraint(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 MetadataConstraint::getConfigElementName(); + } + + /** + * Configure the metadata object based on an XML configuration element. + * + * @param elemen the XML configuration element. + * @exception std::invalid_argument of the supplied XML element + * contains bad configuration information + */ + virtual void + configure(const xmlpp::Element &element) + throw (std::invalid_argument); + + /** + * Check that the given value satisfies the constraint. + * + * @param value the value to be checked against the constraint. + * @return true if the value satisfies the constraint. + * @exception std::logic_error if the parameter is a 0 pointer. + */ + virtual bool + check(Ptr::Ref value) const + throw (std::logic_error); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + +#endif // LiveSupport_Core_NumericRangeConstraint_h + diff --git a/campcaster/src/modules/core/src/OptionsContainer.cxx b/campcaster/src/modules/core/src/OptionsContainer.cxx new file mode 100644 index 000000000..f92bc46de --- /dev/null +++ b/campcaster/src/modules/core/src/OptionsContainer.cxx @@ -0,0 +1,300 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author $ + Version : $Revision $ + Location : $URL $ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include +#include + +#include "LiveSupport/Core/OptionsContainer.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +OptionsContainer :: OptionsContainer( + const xmlpp::Element & optionsElement, + Ptr::Ref configFileName) + throw () + : configFileName(configFileName), + touched(false) +{ + optionsDocument.create_root_node_by_import(&optionsElement, true); + // true == recursive +} + + +/*------------------------------------------------------------------------------ + * Set a string type option. + *----------------------------------------------------------------------------*/ +void +OptionsContainer :: setOptionItem(OptionItemString optionItem, + Ptr::Ref value) + throw (std::invalid_argument) +{ + bool isAttribute = false; // text node or attr node + xmlpp::Node * targetNode = selectNode(optionItem, isAttribute); + + if (isAttribute) { + xmlpp::Attribute * attr = dynamic_cast(targetNode); + if (attr != 0) { + attr->set_value(*value); + touched = true; + return; + } + } else { + xmlpp::TextNode * text = dynamic_cast(targetNode); + if (text != 0) { + text->set_content(*value); + touched = true; + return; + } + } + + throw std::invalid_argument("option item not found"); +} + + +/*------------------------------------------------------------------------------ + * Get a string type option. + *----------------------------------------------------------------------------*/ +Ptr::Ref +OptionsContainer :: getOptionItem(OptionItemString optionItem) + throw (std::invalid_argument) +{ + bool isAttribute = false; // text node or attr node + const xmlpp::Node * targetNode = selectNode(optionItem, isAttribute); + + if (isAttribute) { + const xmlpp::Attribute * + attr = dynamic_cast(targetNode); + if (attr != 0) { + Ptr::Ref value(new Glib::ustring( + attr->get_value() )); + return value; + } + } else { + const xmlpp::TextNode * + text = dynamic_cast(targetNode); + if (text != 0) { + Ptr::Ref value(new Glib::ustring( + text->get_content() )); + return value; + } + } + + throw std::invalid_argument("option item not found"); +} + + +/*------------------------------------------------------------------------------ + * Set a keyboard shortcut type option. + *----------------------------------------------------------------------------*/ +void +OptionsContainer :: setKeyboardShortcutItem( + int containerNo, + int shortcutNo, + Ptr::Ref value) + throw (std::invalid_argument) +{ + xmlpp::Node * targetNode = selectKeyboardShortcutNode( + containerNo, shortcutNo); + + xmlpp::Attribute * attr = dynamic_cast(targetNode); + if (attr != 0) { + attr->set_value(*value); + touched = true; + return; + + } else { + throw std::invalid_argument("keyboard shortcut not found"); + } +} + + +/*------------------------------------------------------------------------------ + * Find the node corresponding to an OptionItemString value. + *----------------------------------------------------------------------------*/ +xmlpp::Node * +OptionsContainer :: selectNode(OptionItemString optionItem, + bool & isAttribute) + throw (std::invalid_argument) +{ + xmlpp::Node * targetNode = 0; + + switch (optionItem) { + case outputPlayerDeviceName : + targetNode = getNode("outputPlayer/audioPlayer/gstreamerPlayer/" + "@audioDevice"); + isAttribute = true; + break; + + case cuePlayerDeviceName : + targetNode = getNode("cuePlayer/audioPlayer/gstreamerPlayer/" + "@audioDevice"); + isAttribute = true; + break; + + case authenticationServer : + targetNode = getNode("authenticationClientFactory/" + "webAuthentication/location/@server"); + isAttribute = true; + break; + + case authenticationPort : + targetNode = getNode("authenticationClientFactory/" + "webAuthentication/location/@port"); + isAttribute = true; + break; + + case authenticationPath : + targetNode = getNode("authenticationClientFactory/" + "webAuthentication/location/@path"); + isAttribute = true; + break; + + case storageServer : + targetNode = getNode("storageClientFactory/" + "webStorage/location/@server"); + isAttribute = true; + break; + + case storagePort : + targetNode = getNode("storageClientFactory/" + "webStorage/location/@port"); + isAttribute = true; + break; + + case storagePath : + targetNode = getNode("storageClientFactory/" + "webStorage/location/@path"); + isAttribute = true; + break; + + case schedulerServer : + targetNode = getNode("schedulerClientFactory/" + "schedulerDaemonXmlRpcClient/@xmlRpcHost"); + isAttribute = true; + break; + + case schedulerPort : + targetNode = getNode("schedulerClientFactory/" + "schedulerDaemonXmlRpcClient/@xmlRpcPort"); + isAttribute = true; + break; + + case schedulerPath : + targetNode = getNode("schedulerClientFactory/" + "schedulerDaemonXmlRpcClient/@xmlRpcUri"); + isAttribute = true; + break; + } + + return targetNode; +} + + +/*------------------------------------------------------------------------------ + * Find the node corresponding to a keyboard shortcut. + *----------------------------------------------------------------------------*/ +xmlpp::Node * +OptionsContainer :: selectKeyboardShortcutNode(int containerNo, + int shortcutNo) + throw (std::invalid_argument) +{ + std::stringstream xPathStream; + xPathStream << "keyboardShortcutList/keyboardShortcutContainer[" + << containerNo + << "]/keyboardShortcut[" + << shortcutNo + << "]/@key"; + return getNode(xPathStream.str()); +} + + +/*------------------------------------------------------------------------------ + * Return the first node matching an XPath string. + *----------------------------------------------------------------------------*/ +xmlpp::Node * +OptionsContainer :: getNode(const Glib::ustring & xPath) + throw (std::invalid_argument) +{ + xmlpp::Element * rootNode = optionsDocument.get_root_node(); + xmlpp::NodeSet nodes; + + try { + nodes = rootNode->find(xPath); + + } catch (xmlpp::exception &e) { + throw std::invalid_argument(e.what()); + } + + std::vector::iterator it = nodes.begin(); + if (it != nodes.end()) { + return *it; + } else { + return 0; + } +} + + +/*------------------------------------------------------------------------------ + * Save the options to a file. + *----------------------------------------------------------------------------*/ +void +OptionsContainer :: writeToFile(void) throw () +{ + if (configFileName) { + std::ofstream file(configFileName->c_str()); + if (file.good()) { + optionsDocument.write_to_stream_formatted(file, "utf-8"); + touched = false; + } + file.close(); + } +} + diff --git a/campcaster/src/modules/core/src/Playable.cxx b/campcaster/src/modules/core/src/Playable.cxx new file mode 100644 index 000000000..8b97b7177 --- /dev/null +++ b/campcaster/src/modules/core/src/Playable.cxx @@ -0,0 +1,78 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include "LiveSupport/Core/AudioClip.h" +#include "LiveSupport/Core/Playlist.h" + +#include "LiveSupport/Core/Playable.h" + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Return an audio clip pointer to this object. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playable :: getAudioClip(void) throw () +{ + Ptr::Ref audioClip; + if (type == AudioClipType) { + audioClip = boost::dynamic_pointer_cast + (shared_from_this()); + } + return audioClip; +} + + +/*------------------------------------------------------------------------------ + * Return a playlist pointer to this object. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playable :: getPlaylist(void) throw () +{ + Ptr::Ref playlist; + if (type == PlaylistType) { + playlist = boost::dynamic_pointer_cast + (shared_from_this()); + } + return playlist; +} + diff --git a/campcaster/src/modules/core/src/Playlist.cxx b/campcaster/src/modules/core/src/Playlist.cxx new file mode 100644 index 000000000..664897962 --- /dev/null +++ b/campcaster/src/modules/core/src/Playlist.cxx @@ -0,0 +1,903 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/Core/Playlist.h" + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/** + * The name of the config element for this class + */ +const std::string Playlist::configElementNameStr = "playlist"; + +/** + * The name of the attribute to get the id of the playlist. + */ +static const std::string idAttrName = "id"; + +/** + * The name of the attribute to get the playlength of the playlist. + */ +static const std::string playlengthAttrName = "playlength"; + +/** + * The name of the attribute to get the title of the playlist. + */ +static const std::string titleAttrName = "title"; + +/** + * The name of playlist element child nodes. + */ +static const std::string elementListAttrName = "playlistElement"; + +/** + * The name of the metadata child element. + */ +static const std::string metadataElementName = "metadata"; + +/** + * The prefix of the extent (length) metadata element. + */ +static const std::string extentElementPrefix = "dcterms"; + +/** + * The name of the extent (length) metadata element. + */ +static const std::string extentElementName = "extent"; + +/** + * The prefix of the title metadata element. + */ +static const std::string titleElementPrefix = "dc"; + +/** + * The name of the title metadata element. + */ +static const std::string titleElementName = "title"; + +/** + * The prefix for the Live Support extension elements. + */ +static const std::string liveSupportNamespacePrefix = "ls"; + +/** + * The prefix for the "xml:" prefix elements. + */ +static const std::string xmlNamespacePrefix = "xml"; + +/** + * The URI identifier for the default namespace + */ +static const std::string defaultNamespaceUri + = "http://mdlf.org/livesupport/elements/1.0/"; + +/** + * The URI identifier for the "ls" prefix. + */ +static const std::string liveSupportNamespaceUri + = "http://mdlf.org/livesupport/elements/1.0/"; + +/** + * The URI identifier for the "dc" prefix + */ +static const std::string dcNamespaceUri + = "http://purl.org/dc/elements/1.1/"; + +/** + * The URI identifier for the "dcterms" prefix + */ +static const std::string dctermsNamespaceUri + = "http://purl.org/dc/terms/"; + +/** + * The URI identifier for the "xml" prefix + */ +static const std::string xmlNamespaceUri + = "http://www.w3.org/XML/1998/namespace"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Copy constructor. + *----------------------------------------------------------------------------*/ +Playlist :: Playlist(const Playlist & otherPlaylist) + throw () + : Playable(PlaylistType), + id (otherPlaylist.id), + title (otherPlaylist.title), + playlength(otherPlaylist.playlength), + uri (otherPlaylist.uri), + token (otherPlaylist.token) +{ + elementList.reset(new PlaylistElementListType); + const_iterator it; + for (it = otherPlaylist.begin(); it != otherPlaylist.end(); ++it) { + Ptr::Ref otherElement(new PlaylistElement( + *it->second )); + elementList->insert(std::make_pair(it->first, otherElement)); + } + + if (otherPlaylist.savedCopy) { + savedCopy.reset(new Playlist(*otherPlaylist.savedCopy)); + } + + if (otherPlaylist.xmlPlaylist) { + xmlPlaylist.reset(new xmlpp::Document); + xmlPlaylist->create_root_node_by_import( + otherPlaylist.xmlPlaylist->get_root_node(), + true); // true == recursive + } +} + + +/*------------------------------------------------------------------------------ + * Test constructor without title. + *----------------------------------------------------------------------------*/ +Playlist :: Playlist(Ptr::Ref id, + Ptr::Ref playlength, + Ptr::Ref uri) + throw () + : Playable(PlaylistType), + id(id), + uri(uri) +{ + this->title.reset(new Glib::ustring("")); + + elementList.reset(new PlaylistElementListType); + + setTitle(title); + setPlaylength(playlength); +} + + +/*------------------------------------------------------------------------------ + * Test constructor with title. + *----------------------------------------------------------------------------*/ +Playlist :: Playlist(Ptr::Ref id, + Ptr::Ref title, + Ptr::Ref playlength, + Ptr::Ref uri) + throw () + : Playable(PlaylistType), + id(id), + uri(uri) +{ + elementList.reset(new PlaylistElementListType); + + setTitle(title); + setPlaylength(playlength); +} + + +/*------------------------------------------------------------------------------ + * Convert to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +Playlist :: operator XmlRpc::XmlRpcValue() const + throw() +{ + XmlRpc::XmlRpcValue xmlRpcValue; + xmlRpcValue[configElementNameStr] = std::string(*getXmlDocumentString()); + + return xmlRpcValue; +} + + +/*------------------------------------------------------------------------------ + * Construct from an XmlRpcValue. + *----------------------------------------------------------------------------*/ +Playlist :: Playlist(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) + : Playable(PlaylistType) +{ + elementList.reset(new PlaylistElementListType); + + if (!xmlRpcValue.hasMember(configElementNameStr)) { + throw std::invalid_argument("no playlist data found in XmlRpcValue"); + } + + xmlpp::DomParser parser; + try { + parser.parse_memory(std::string(xmlRpcValue[configElementNameStr])); + } catch (xmlpp::exception &e) { + throw std::invalid_argument("error parsing XML document"); + } + + configure(*parser.get_document()->get_root_node()); // may throw +} + + +/*------------------------------------------------------------------------------ + * Set the value of the title field. + *----------------------------------------------------------------------------*/ +void +Playlist :: setTitle(Ptr::Ref title) + throw () +{ + setMetadata(title, titleElementName, titleElementPrefix); +} + + +/*------------------------------------------------------------------------------ + * Set the value of the playlength field (private). + *----------------------------------------------------------------------------*/ +void +Playlist :: setPlaylength(Ptr::Ref playlength) + throw () +{ + Ptr::Ref playlengthString(new const Glib::ustring( + toFixedString(playlength) )); + setMetadata(playlengthString, extentElementName, extentElementPrefix); +} + + +/*------------------------------------------------------------------------------ + * Set the value of the playlength from a string (private). + *----------------------------------------------------------------------------*/ +void +Playlist :: setPlaylength(Ptr::Ref timeString) + throw (std::invalid_argument) +{ + try { + playlength = TimeConversion::parseTimeDuration(timeString); + } catch (std::exception &e) { + std::string eMsg = "bad time format in playlength: "; + eMsg += e.what(); + throw std::invalid_argument(eMsg); + } +} + + +/*------------------------------------------------------------------------------ + * Create a playlist object based on an XML element. + *----------------------------------------------------------------------------*/ +void +Playlist :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + std::string eMsg = "bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + if (!id) { + if (!(attribute = element.get_attribute(idAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + id.reset(new UniqueId(attribute->get_value())); + } + + if (!playlength + && (attribute = element.get_attribute(playlengthAttrName))) { + Ptr::Ref playlengthString(new Glib::ustring( + attribute->get_value() )); + setMetadata(playlengthString, extentElementName, extentElementPrefix); + } + + if (!title + && (attribute = element.get_attribute(titleAttrName))) { + title.reset(new const Glib::ustring(attribute->get_value())); + setMetadata(title, titleElementName, titleElementPrefix); + } + + xmlpp::Node::NodeList childNodes + = element.get_children(elementListAttrName); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + while (it != childNodes.end()) { + Ptr::Ref newPlaylistElement(new PlaylistElement); + const xmlpp::Element * childElement + = dynamic_cast (*it); + newPlaylistElement->configure(*childElement); // may throw exception + addPlaylistElement(newPlaylistElement); + ++it; + } + + childNodes = element.get_children(metadataElementName); + it = childNodes.begin(); + + if (it != childNodes.end()) { + const xmlpp::Element * metadataElement + = dynamic_cast (*it); + + xmlPlaylist.reset(new xmlpp::Document); + xmlpp::Element* root = xmlPlaylist->create_root_node( + configElementNameStr); + root->set_attribute(idAttrName, std::string(*id)); + root->import_node(metadataElement, true); // true = recursive + + const xmlpp::Node::NodeList dataFieldList + = metadataElement->get_children(); + xmlpp::Node::NodeList::const_iterator listIt = dataFieldList.begin(); + + while (listIt != dataFieldList.end()) { + const xmlpp::Node* dataNode = *listIt; + std::string prefix = dataNode->get_namespace_prefix(); + std::string name = dataNode->get_name(); + const xmlpp::Element* + dataElement + = dynamic_cast (dataNode); + if (!dataElement) { + ++listIt; + continue; + } + + if (!playlength && prefix == extentElementPrefix + && name == extentElementName) { + if (dataElement->has_child_text()) { + Ptr::Ref playlengthString( + new std::string(dataElement->get_child_text() + ->get_content() )); + setPlaylength(playlengthString); + } else { // or just leave blank? bad either way + playlength.reset(new time_duration(0,0,0,0)); + } + } + + if (!title && prefix == titleElementPrefix + && name == titleElementName) { + Glib::ustring value; + if (dataElement->has_child_text()) { + value = dataElement->get_child_text()->get_content(); + } else { + value = ""; + } + Ptr::Ref ptrToValue( + new const Glib::ustring(value)); + title = ptrToValue; + } + + ++listIt; + } + + ++it; + if (it != childNodes.end()) { + std::string eMsg = "more than one "; + eMsg += metadataElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } + } + + if (!playlength) { + std::string eMsg = "missing attribute "; + eMsg += playlengthAttrName; + eMsg += " or metadata element "; + eMsg += extentElementPrefix + ":" + extentElementName; + throw std::invalid_argument(eMsg); + } + + if (!title) { + title.reset(new const Glib::ustring("")); + } +} + + +/*------------------------------------------------------------------------------ + * Add a new playlist element to the playlist. + *----------------------------------------------------------------------------*/ +void +Playlist::addPlaylistElement(Ptr::Ref playlistElement) + throw () +{ + Ptr::Ref relativeOffset + = playlistElement->getRelativeOffset(); + elementList->insert(std::make_pair(*relativeOffset, playlistElement)); +} + + +/*------------------------------------------------------------------------------ + * Add a new audio clip or sub-playlist to the playlist. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playlist::addPlayable(Ptr::Ref playable, + Ptr::Ref relativeOffset, + Ptr::Ref fadeInfo) + throw (std::invalid_argument) +{ + Ptr::Ref audioClip; + Ptr::Ref playlist; + + switch (playable->getType()) { + case Playable::AudioClipType : + audioClip = boost::dynamic_pointer_cast(playable); + return addAudioClip(audioClip, relativeOffset, fadeInfo); + + case Playable::PlaylistType : + playlist = boost::dynamic_pointer_cast(playable); + return addPlaylist(playlist, relativeOffset, fadeInfo); + + default : + throw std::invalid_argument("Playable object is neither AudioClip" + " nor Playlist?!"); + } +} + + +/*------------------------------------------------------------------------------ + * Add a new audio clip to the playlist. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playlist::addAudioClip(Ptr::Ref audioClip, + Ptr::Ref relativeOffset, + Ptr::Ref fadeInfo) + throw () +{ + Ptr::Ref playlistElement(new PlaylistElement( + relativeOffset, audioClip, fadeInfo)); + elementList->insert(std::make_pair(*relativeOffset, playlistElement)); + + Ptr::Ref endOffset(new time_duration( + *relativeOffset + + *audioClip->getPlaylength())); + if (*endOffset > *playlength) { + setPlaylength(endOffset); + } + + return playlistElement->getId(); +} + + +/*------------------------------------------------------------------------------ + * Add a new sub-playlist to the playlist. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playlist::addPlaylist(Ptr::Ref playlist, + Ptr::Ref relativeOffset, + Ptr::Ref fadeInfo) + throw () +{ + Ptr::Ref playlistElement(new PlaylistElement( + relativeOffset, playlist, fadeInfo)); + elementList->insert(std::make_pair(*relativeOffset, playlistElement)); + + Ptr::Ref endOffset(new time_duration( + *relativeOffset + + *playlist->getPlaylength())); + if (*endOffset > *playlength) { + setPlaylength(endOffset); + } + + return playlistElement->getId(); +} + + +/*------------------------------------------------------------------------------ + * Get an iterator pointing to a playlist element with a given ID. + *----------------------------------------------------------------------------*/ +Playlist::iterator +Playlist::find(Ptr::Ref playlistElementId) + throw () +{ + Playlist::iterator it = elementList->begin(); + while (it != elementList->end() + && *(it->second->getId()) != *playlistElementId) { + ++it; + } + return it; +} + + +/*------------------------------------------------------------------------------ + * Change the fade in / fade out info of a playlist element. + *----------------------------------------------------------------------------*/ +void +Playlist::setFadeInfo(Ptr::Ref playlistElementId, + Ptr::Ref fadeInfo) + throw (std::invalid_argument) +{ + Playlist::iterator it = this->find(playlistElementId); + + if (it == this->end()) { + throw std::invalid_argument("no playlist element with this ID"); + } + + it->second->setFadeInfo(fadeInfo); +} + + +/*------------------------------------------------------------------------------ + * Remove a playlist element from the playlist. + *----------------------------------------------------------------------------*/ +void +Playlist::removePlaylistElement(Ptr::Ref playlistElementId) + throw (std::invalid_argument) +{ + Playlist::iterator it = this->find(playlistElementId); + + if (it == this->end()) { + throw std::invalid_argument("no playlist element with this ID"); + } + + elementList->erase(it); +} + + +/*------------------------------------------------------------------------------ + * Validate the playlist. + *----------------------------------------------------------------------------*/ +bool +Playlist::valid(void) const throw () +{ + time_duration runningTime(0,0,0,0); + + PlaylistElementListType::const_iterator it = elementList->begin(); + while (it != elementList->end()) { + Ptr::Ref playlistElement = it->second; + + if (playlistElement->getType() == PlaylistElement::PlaylistType + && !playlistElement->getPlaylist()->valid()) { + return false; + } + + time_duration relativeOffset = *playlistElement->getRelativeOffset(); + if (runningTime < relativeOffset) { + return false; // found a gap in the playlist + } + + time_duration endTime = + relativeOffset + + *playlistElement->getPlayable()->getPlaylength(); + if (endTime > runningTime) { + runningTime = endTime; + } + + ++it; + } + + if (runningTime != *getPlaylength()) { + return false; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Create a saved copy of the playlist. + *----------------------------------------------------------------------------*/ +void +Playlist::createSavedCopy(void) throw () +{ + savedCopy = Ptr::Ref(new Playlist(*this)); +} + + +/*------------------------------------------------------------------------------ + * Revert to a saved copy of the playlist. + *----------------------------------------------------------------------------*/ +void +Playlist::revertToSavedCopy(void) throw (std::invalid_argument) +{ + if (savedCopy == 0) { + throw (std::invalid_argument("playlist has no saved copy")); + } + + this->id = savedCopy->id; + this->title = savedCopy->title; + this->playlength = savedCopy->playlength; + this->uri = savedCopy->uri; + this->token = savedCopy->token; + this->elementList = savedCopy->elementList; + this->xmlPlaylist = savedCopy->xmlPlaylist; + + savedCopy.reset(); +} + + +/*------------------------------------------------------------------------------ + * Return the value of a metadata field. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playlist :: getMetadata(const string &key) const + throw () +{ + std::string name, prefix; + separateNameAndNameSpace(key, name, prefix); + + Ptr::Ref value; + + if (! xmlPlaylist) { + return value; + } + xmlpp::Element* rootNode = xmlPlaylist->get_root_node(); + if (! rootNode) { + return value; + } + xmlpp::Node::NodeList rootList = rootNode->get_children( + metadataElementName); + if (rootList.size() == 0) { + return value; + } + + xmlpp::Node* metadata = rootList.front(); + xmlpp::Node::NodeList nodeList = metadata->get_children(name); + xmlpp::Node::NodeList::iterator it = nodeList.begin(); + + while (it != nodeList.end()) { + xmlpp::Node* node = *it; + if (node->get_namespace_prefix() == prefix) { + xmlpp::Element* element = dynamic_cast (node); + xmlpp::TextNode* textNode = element->get_child_text(); + if (textNode) { + value.reset(new Glib::ustring(textNode->get_content())); + } else { + value.reset(new Glib::ustring("")); + } + return value; + } + ++it; + } + + return value; +} + + +/*------------------------------------------------------------------------------ + * Set the value of a metadata field (public). + *----------------------------------------------------------------------------*/ +void +Playlist :: setMetadata(Ptr::Ref value, + const std::string &key) + throw (std::invalid_argument) +{ + std::string name, prefix; + separateNameAndNameSpace(key, name, prefix); + setMetadata(value, name, prefix); +} + + +/*------------------------------------------------------------------------------ + * Set the value of a metadata field (private). + *----------------------------------------------------------------------------*/ +void +Playlist :: setMetadata(Ptr::Ref value, + const std::string &name, const std::string &prefix) + throw (std::invalid_argument) +{ + if (prefix == extentElementPrefix && name == extentElementName) { + Ptr::Ref valueString(new const std::string( + *value)); + setPlaylength(valueString); + } + + if (prefix == titleElementPrefix && name == titleElementName) { + title = value; + } + + // create a new xmlpp::Document for the metadata if necessary + if (! xmlPlaylist) { + xmlPlaylist.reset(new xmlpp::Document); + } + xmlpp::Element* rootNode = xmlPlaylist->get_root_node(); + if (! rootNode) { + rootNode = xmlPlaylist->create_root_node(configElementNameStr); + if (id) { + rootNode->set_attribute(idAttrName, std::string(*id)); + } + } + xmlpp::Node::NodeList rootList = rootNode->get_children( + metadataElementName); + xmlpp::Element* metadata; + if (rootList.size() > 0) { + metadata = dynamic_cast (rootList.front()); + } else { + metadata = rootNode->add_child(metadataElementName); + metadata->set_namespace_declaration(defaultNamespaceUri); + metadata->set_namespace_declaration(liveSupportNamespaceUri, + liveSupportNamespacePrefix); + metadata->set_namespace_declaration(dcNamespaceUri, + titleElementPrefix); + metadata->set_namespace_declaration(dctermsNamespaceUri, + extentElementPrefix); + metadata->set_namespace_declaration(xmlNamespaceUri, + xmlNamespacePrefix); + } + + // find the element to be modified + xmlpp::Node::NodeList nodeList = metadata->get_children(name); + xmlpp::Node::NodeList::iterator it = nodeList.begin(); + xmlpp::Element* element = 0; + + while (it != nodeList.end()) { + xmlpp::Node* node = *it; + if (node->get_namespace_prefix() == prefix) { + element = dynamic_cast (nodeList.front()); + break; + } + ++it; + } + + // or add it if it did not exist before + if (it == nodeList.end()) { + element = metadata->add_child(name); + try { + element->set_namespace(prefix); + } + catch (xmlpp::exception &e) { + // this namespace has not been declared; well OK, do nothing then + } + } + + element->set_child_text(*value); +} + + +/*------------------------------------------------------------------------------ + * Return a string containing the essential fields of this object, in XML. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playlist :: getXmlElementString(void) const throw () +{ + Ptr::Ref xmlString(new Glib::ustring); + + xmlString->append("<"); + xmlString->append(configElementNameStr + " "); + xmlString->append(idAttrName + "=\"" + + std::string(*getId()) + + "\" "); + xmlString->append(Glib::ustring(titleAttrName) + "=\"" + + *getTitle() + + "\" "); + xmlString->append(playlengthAttrName + "=\"" + + toFixedString(getPlaylength()) + + "\"/>"); + + return xmlString; +} + + +/*------------------------------------------------------------------------------ + * Return a string containing an XML representation of this playlist. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Playlist :: getXmlDocumentString() const throw () +{ + Ptr::Ref localDocument; + + if (xmlPlaylist) { + localDocument = xmlPlaylist; + } else { + localDocument.reset(new xmlpp::Document()); + xmlpp::Element* rootNode = localDocument->create_root_node( + configElementNameStr); + if (id) { + rootNode->set_attribute(idAttrName, std::string(*id)); + } + + xmlpp::Element* metadata = rootNode->add_child(metadataElementName); + metadata->set_namespace_declaration(defaultNamespaceUri); + metadata->set_namespace_declaration(liveSupportNamespaceUri, + liveSupportNamespacePrefix); + metadata->set_namespace_declaration(dcNamespaceUri, + titleElementPrefix); + metadata->set_namespace_declaration(dctermsNamespaceUri, + extentElementPrefix); + metadata->set_namespace_declaration(xmlNamespaceUri, + xmlNamespacePrefix); + } + + Glib::ustring playlistElementsXmlString("\n"); + Playlist::const_iterator it = this->begin(); + while (it != this->end()) { + playlistElementsXmlString += *(it->second->getXmlElementString()); + playlistElementsXmlString += '\n'; + ++it; + } + + Ptr::Ref metadataString(new Glib::ustring( + localDocument->write_to_string() )); + unsigned int insertPosition = metadataString->find(metadataElementName); + insertPosition = metadataString->rfind('<', insertPosition); + metadataString->insert(insertPosition, playlistElementsXmlString); + + return metadataString; +} + + +/*------------------------------------------------------------------------------ + * Eliminate the gaps in the playlist. + *----------------------------------------------------------------------------*/ +bool +Playlist :: eliminateGaps(void) throw () +{ + bool didSomething = false; + + Playlist::const_iterator it = this->begin(); + while (it != this->end()) { + Ptr::Ref playlistElement = it->second; + if (playlistElement->getType() == PlaylistElement::PlaylistType) { + Ptr::Ref playlist = playlistElement->getPlaylist(); + didSomething |= playlist->eliminateGaps(); + } + ++it; + } + + time_duration position(0,0,0,0); + time_duration gapsFound(0,0,0,0); + + it = this->begin(); + while (it != this->end()) { + Ptr::Ref playlistElement = it->second; + Ptr::Ref startTime + = playlistElement->getRelativeOffset(); + Ptr::Ref newStartTime; + + if (*startTime - gapsFound > position) { + newStartTime.reset(new time_duration(position)); + playlistElement->setRelativeOffset(newStartTime); + gapsFound = *startTime - position; + didSomething = true; + + } else if (gapsFound.total_microseconds() != 0) { + newStartTime.reset(new time_duration(*startTime - gapsFound)); + playlistElement->setRelativeOffset(newStartTime); + + } else { + newStartTime = startTime; + } + + position = *newStartTime + *playlistElement->getPlayable() + ->getPlaylength(); + ++it; + } + + if (didSomething || position != *getPlaylength()) { + Ptr::Ref newPlaylength(new time_duration(position)); + setPlaylength(newPlaylength); + return true; + } else { + return false; + } +} + diff --git a/campcaster/src/modules/core/src/PlaylistElement.cxx b/campcaster/src/modules/core/src/PlaylistElement.cxx new file mode 100644 index 000000000..d15aa3b98 --- /dev/null +++ b/campcaster/src/modules/core/src/PlaylistElement.cxx @@ -0,0 +1,216 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/Core/Playlist.h" +#include "LiveSupport/Core/PlaylistElement.h" + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string PlaylistElement::configElementNameStr = "playlistElement"; + +/** + * The name of the attribute of the id of the playlist element. + */ +static const std::string idAttrName = "id"; + +/** + * The name of the attribute of the relative offset of the playlist element. + */ +static const std::string relativeOffsetAttrName = "relativeOffset"; + +/** + * The name of the audio clip child element of the playlist element. + */ +static const std::string audioClipElementName = "audioClip"; + +/** + * The name of the playlist child element of the playlist element. + */ +static const std::string playlistElementName = "playlist"; + +/** + * The name of the fade info child element of the playlist element. + */ +static const std::string fadeInfoElementName = "fadeInfo"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a playlist element object based on an XML element. + *----------------------------------------------------------------------------*/ +void +PlaylistElement :: configure(const xmlpp::Element & element) + throw (std::invalid_argument) +{ + if (element.get_name() != configElementNameStr) { + std::string eMsg = "bad configuration element "; + eMsg += element.get_name(); + throw std::invalid_argument(eMsg); + } + + // set id + const xmlpp::Attribute* attribute; + + if (!(attribute = element.get_attribute(idAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + id.reset(new UniqueId(attribute->get_value())); + + // set relative offset + if (!(attribute = element.get_attribute(relativeOffsetAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += relativeOffsetAttrName; + throw std::invalid_argument(eMsg); + } + Ptr::Ref relativeOffsetString(new std::string( + attribute->get_value() )); + relativeOffset = TimeConversion::parseTimeDuration(relativeOffsetString); + + // set audio clip + xmlpp::Node::NodeList childNodes + = element.get_children(audioClipElementName); + xmlpp::Node::NodeList::iterator it = childNodes.begin(); + + if (it != childNodes.end()) { + const xmlpp::Element * audioClipElement + = dynamic_cast (*it); + type = AudioClipType; + audioClip.reset(new AudioClip); + playable = audioClip; + audioClip->configure(*audioClipElement); // may throw exception + + ++it; + if (it != childNodes.end()) { + std::string eMsg = "more than one "; + eMsg += audioClipElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } + } else { + childNodes = element.get_children(playlistElementName); + it = childNodes.begin(); + if (it != childNodes.end()) { + const xmlpp::Element * playlistElement + = dynamic_cast (*it); + type = PlaylistType; + playlist.reset(new Playlist); + playable = playlist; + playlist->configure(*playlistElement); // may throw exception + ++it; + if (it != childNodes.end()) { + std::string eMsg = "more than one "; + eMsg += playlistElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } + } else { + std::string eMsg = "missing "; + eMsg += audioClipElementName; + eMsg += " or "; + eMsg += playlistElementName; + eMsg += " XML element in PlaylistElement configuration"; + throw std::invalid_argument(eMsg); + } + } + + // set fade info + childNodes = element.get_children(fadeInfoElementName); + it = childNodes.begin(); + + if (it == childNodes.end()) { // no fade info is OK + return; + } + + const xmlpp::Element * fadeInfoElement + = dynamic_cast (*it); + fadeInfo.reset(new FadeInfo); + fadeInfo->configure(*fadeInfoElement); // may throw exception + + ++it; + if (it != childNodes.end()) { + std::string eMsg = "more than one "; + eMsg += fadeInfoElementName; + eMsg += " XML element"; + throw std::invalid_argument(eMsg); + } +} + + +/*------------------------------------------------------------------------------ + * Return a string containing the essential fields of this object, in XML. + *----------------------------------------------------------------------------*/ +Ptr::Ref +PlaylistElement :: getXmlElementString(void) throw () +{ + Ptr::Ref xmlString(new Glib::ustring); + + xmlString->append("<"); + xmlString->append(configElementNameStr + " "); + xmlString->append(idAttrName + "=\"" + + std::string(*id) + + "\" "); + xmlString->append(relativeOffsetAttrName + "=\"" + + toFixedString(relativeOffset) + + "\">\n"); + + xmlString->append(*getPlayable()->getXmlElementString() + "\n"); + if (fadeInfo) { + xmlString->append(*fadeInfo->getXmlElementString() + "\n"); + } + xmlString->append("append(configElementNameStr + ">"); + + return xmlString; +} + diff --git a/campcaster/src/modules/core/src/PlaylistElementTest.cxx b/campcaster/src/modules/core/src/PlaylistElementTest.cxx new file mode 100644 index 000000000..cd8f3067e --- /dev/null +++ b/campcaster/src/modules/core/src/PlaylistElementTest.cxx @@ -0,0 +1,176 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/Playlist.h" +#include "LiveSupport/Core/PlaylistElement.h" + +#include "PlaylistElementTest.h" + +using namespace std; +using namespace LiveSupport::Core; +using namespace boost::posix_time; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(PlaylistElementTest); + +/** + * The name of the configuration file for the playlist element. + */ +static const std::string configFileName = "etc/playlistElement.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +PlaylistElementTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +PlaylistElementTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +PlaylistElementTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref playlistElement(new PlaylistElement); + try { + + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + playlistElement->configure(*root); + + // the playlist element + CPPUNIT_ASSERT(playlistElement->getId()->getId() == 0x103); + Ptr::Ref relativeOffset + = playlistElement->getRelativeOffset(); + CPPUNIT_ASSERT(relativeOffset->total_seconds() == 11); + + CPPUNIT_ASSERT(playlistElement->getFadeInfo()->getId()->getId() + == 0x9901); + Ptr::Ref fadeIn + = playlistElement->getFadeInfo() + ->getFadeIn(); + CPPUNIT_ASSERT(fadeIn->total_milliseconds() == 2000); + Ptr::Ref fadeOut + = playlistElement->getFadeInfo() + ->getFadeOut(); + CPPUNIT_ASSERT(fadeOut->total_milliseconds() == 1500); + + CPPUNIT_ASSERT(playlistElement->getType() + == PlaylistElement::PlaylistType); + + // check that we can access the playlist inside the playlist element + // as a Playable instance + CPPUNIT_ASSERT(playlistElement->getPlaylist() + == playlistElement->getPlayable()); + + // the playlist inside the playlist element + CPPUNIT_ASSERT(playlistElement->getPlaylist()->getId()->getId() + == 0x2); + Ptr::Ref playlist = playlistElement->getPlaylist(); + Playlist::const_iterator it = playlist->begin(); + CPPUNIT_ASSERT(it != playlist->end()); + playlistElement = it->second; + ++it; + CPPUNIT_ASSERT(it == playlist->end()); + + // the playlist element inside the playlist + CPPUNIT_ASSERT(playlistElement->getId()->getId() == 0x111); + relativeOffset = playlistElement->getRelativeOffset(); + CPPUNIT_ASSERT(relativeOffset->total_seconds() == 0); + + CPPUNIT_ASSERT(playlistElement->getType() + == PlaylistElement::AudioClipType); + + CPPUNIT_ASSERT(*playlistElement->getXmlElementString() == + "\n" + "\n" + ""); + + // and the audio clip inside the playlist element + CPPUNIT_ASSERT(playlistElement->getAudioClip()->getId()->getId() + == 0x10003); + + // check that we can access this audio clip as a Playable instance + CPPUNIT_ASSERT(playlistElement->getAudioClip() + == playlistElement->getPlayable()); + + } catch (std::invalid_argument &e) { + std::string eMsg = "semantic error in configuration file:\n"; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } catch (xmlpp::exception &e) { + std::string eMsg = "error parsing configuration file:\n"; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } +} diff --git a/campcaster/src/modules/core/src/PlaylistElementTest.h b/campcaster/src/modules/core/src/PlaylistElementTest.h new file mode 100644 index 000000000..fa6463275 --- /dev/null +++ b/campcaster/src/modules/core/src/PlaylistElementTest.h @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef PlaylistElementTest_h +#define PlaylistElementTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the PlaylistElement class. + * + * @author $Author$ + * @version $Revision$ + * @see PlaylistElement + */ +class PlaylistElementTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(PlaylistElementTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 Core +} // namespace LiveSupport + +#endif // PlaylistElementTest_h + diff --git a/campcaster/src/modules/core/src/PlaylistTest.cxx b/campcaster/src/modules/core/src/PlaylistTest.cxx new file mode 100644 index 000000000..28682f663 --- /dev/null +++ b/campcaster/src/modules/core/src/PlaylistTest.cxx @@ -0,0 +1,483 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/Playlist.h" +#include "PlaylistTest.h" + + +using namespace std; +using namespace LiveSupport::Core; + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(PlaylistTest); + +/** + * The name of the configuration file for the playlist. + */ +static const std::string configFileName = "etc/playlist.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: setUp(void) throw () +{ + playlist.reset(new Playlist); + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + playlist->configure(*root); + + } 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 +PlaylistTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + CPPUNIT_ASSERT(playlist->getId()->getId() == 0x1); + Ptr::Ref duration + = playlist->getPlaylength(); + CPPUNIT_ASSERT(duration->total_seconds() == 34); + + CPPUNIT_ASSERT(playlist->valid()); + CPPUNIT_ASSERT(*playlist->getXmlElementString() == + ""); + Playlist::const_iterator it = playlist->begin(); + CPPUNIT_ASSERT(it != playlist->end()); + Ptr::Ref playlistElement = it->second; + CPPUNIT_ASSERT(playlistElement->getId()->getId() == 0x101); + Ptr::Ref relativeOffset + = playlistElement->getRelativeOffset(); + CPPUNIT_ASSERT(relativeOffset->total_seconds() == 0); + CPPUNIT_ASSERT(playlistElement->getType() + == PlaylistElement::AudioClipType); + CPPUNIT_ASSERT(playlistElement->getAudioClip()->getId()->getId() + == 0x10001); + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + playlistElement = it->second; + CPPUNIT_ASSERT(playlistElement->getId()->getId() == 0x102); + relativeOffset = playlistElement->getRelativeOffset(); + CPPUNIT_ASSERT(relativeOffset->total_seconds() == 11); + CPPUNIT_ASSERT(playlistElement->getType() + == PlaylistElement::AudioClipType); + CPPUNIT_ASSERT(playlistElement->getAudioClip()->getId()->getId() + == 0x10002); + + ++it; + ++it; + CPPUNIT_ASSERT(it == playlist->end()); +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can add or remove an audio clip + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: audioClipTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref clipId(new UniqueId("20001")); + Ptr::Ref clipLength(new time_duration(0,30,0,0)); + Ptr::Ref audioClip(new AudioClip(clipId, clipLength)); + + Ptr::Ref relativeOffset(new time_duration(0,10,0,0)); + // hour, min, sec, frac_sec + try { + playlist->addAudioClip(audioClip, relativeOffset); + } catch (std::invalid_argument &e) { + string eMsg = "addAudioClip returned with error: "; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + + CPPUNIT_ASSERT(playlist->getPlaylength()); + CPPUNIT_ASSERT(*playlist->getPlaylength() == *relativeOffset + *clipLength); + + CPPUNIT_ASSERT(!playlist->valid()); // big gap in playlist + + Playlist::const_iterator it = playlist->begin(); + CPPUNIT_ASSERT(it != playlist->end()); + + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + + Ptr::Ref playlistElement = it->second; + CPPUNIT_ASSERT(playlistElement->getType() + == PlaylistElement::AudioClipType); + CPPUNIT_ASSERT(playlistElement->getAudioClip()->getId()->getId() + == 0x20001); + + Ptr::Ref otherRelativeOffset + = playlistElement->getRelativeOffset(); + CPPUNIT_ASSERT(otherRelativeOffset->total_seconds() == 10*60); + + ++it; + CPPUNIT_ASSERT(it == playlist->end()); + + try { + playlist->removePlaylistElement(playlistElement->getId()); + } catch (std::invalid_argument &e) { + string eMsg = "removePlaylistElement returned with error: "; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + + it = playlist->begin(); + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it == playlist->end()); + + Ptr::Ref phonyPlaylistElementId(new UniqueId(9999)); + try { + playlist->removePlaylistElement(phonyPlaylistElementId); + CPPUNIT_FAIL("removePlaylistElement allowed to remove " + "non-existent audio clip"); + } catch (std::invalid_argument &e) { + } +} + + +/*------------------------------------------------------------------------------ + * Test the "save/revert to current state" mechanism + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: savedCopyTest(void) + throw (CPPUNIT_NS::Exception) +{ + try { + playlist->revertToSavedCopy(); + CPPUNIT_FAIL("allowed to revert to non-existent state"); + } catch (std::invalid_argument &e) { + } + + playlist->createSavedCopy(); + playlist->removePlaylistElement(playlist->begin()->second->getId()); + playlist->removePlaylistElement(playlist->begin()->second->getId()); + playlist->removePlaylistElement(playlist->begin()->second->getId()); + CPPUNIT_ASSERT(playlist->begin() == playlist->end()); + + try { + playlist->revertToSavedCopy(); + } catch (std::logic_error &e) { + CPPUNIT_FAIL("could not revert to saved state"); + } + + Playlist::const_iterator it = playlist->begin(); + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + Ptr::Ref playlistElement = it->second; + CPPUNIT_ASSERT(playlistElement->getType() + == PlaylistElement::AudioClipType); + CPPUNIT_ASSERT(playlistElement->getAudioClip()->getId()->getId() + == 0x10002); + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it == playlist->end()); + + playlist->deleteSavedCopy(); + try { + playlist->revertToSavedCopy(); + CPPUNIT_FAIL("allowed to revert to deleted state"); + } catch (std::logic_error &e) { + } +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can add a fade info + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: fadeInfoTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref playlistElementOne, + playlistElementTwo; + + Playlist::const_iterator it = playlist->begin(); + CPPUNIT_ASSERT(it != playlist->end()); + playlistElementOne = it->second; + CPPUNIT_ASSERT(playlistElementOne->getFadeInfo().get() == 0); + + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + playlistElementTwo = it->second; + CPPUNIT_ASSERT(playlistElementTwo->getFadeInfo()->getFadeIn() + ->total_milliseconds() == 2000); + CPPUNIT_ASSERT(playlistElementTwo->getFadeInfo()->getFadeOut() + ->total_milliseconds() == 1500); + + ++it; + CPPUNIT_ASSERT(it != playlist->end()); + ++it; + CPPUNIT_ASSERT(it == playlist->end()); + + Ptr::Ref fadeIn (new time_duration(0,0,3,200000)); + Ptr::Ref fadeOut(new time_duration(0,0,4,0)); + Ptr::Ref fadeInfo(new FadeInfo(fadeIn, fadeOut)); + + try { + playlist->setFadeInfo(playlistElementOne->getId(), fadeInfo); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("could not add new fade info"); + } + + try { + playlist->setFadeInfo(playlistElementTwo->getId(), fadeInfo); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("could not update fade info"); + } + + it = playlist->begin(); + playlistElementOne = it->second; + CPPUNIT_ASSERT(playlistElementOne->getFadeInfo()->getFadeIn() + ->total_milliseconds() == 3200); + CPPUNIT_ASSERT(playlistElementOne->getFadeInfo()->getFadeOut() + ->total_milliseconds() == 4000); + ++it; + playlistElementTwo = it->second; + CPPUNIT_ASSERT(playlistElementTwo->getFadeInfo()->getFadeIn() + ->total_milliseconds() == 3200); + CPPUNIT_ASSERT(playlistElementTwo->getFadeInfo()->getFadeOut() + ->total_milliseconds() == 4000); + + Ptr::Ref phonyPlaylistElementId(new UniqueId(9999)); + try { + playlist->setFadeInfo(phonyPlaylistElementId, fadeInfo); + CPPUNIT_FAIL("allowed to set fade info for non-existent element"); + } catch (std::invalid_argument &e) { + } +} + + +/*------------------------------------------------------------------------------ + * Test conversion to and from Playable + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: conversionTest(void) + throw (CPPUNIT_NS::Exception) +{ + CPPUNIT_ASSERT(playlist.use_count() == 1); + + Ptr::Ref playable = playlist; + CPPUNIT_ASSERT(playable->getType() == Playable::PlaylistType); + CPPUNIT_ASSERT(playlist.use_count() == 2); + + Ptr::Ref otherPlaylist = playable->getPlaylist(); + CPPUNIT_ASSERT(otherPlaylist == playlist); + CPPUNIT_ASSERT(playlist.use_count() == 3); + + Ptr::Ref audioClip = playable->getAudioClip(); + CPPUNIT_ASSERT(!audioClip); +} + + +/*------------------------------------------------------------------------------ + * Marshalling test + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: marshallingTest(void) + throw (CPPUNIT_NS::Exception) +{ + XmlRpc::XmlRpcValue xmlRpcValue = *playlist; + CPPUNIT_ASSERT(xmlRpcValue.hasMember("playlist")); + + Ptr::Ref otherPlaylist; + CPPUNIT_ASSERT_NO_THROW(otherPlaylist.reset(new Playlist(xmlRpcValue))); + + CPPUNIT_ASSERT(*playlist->getId() == *otherPlaylist->getId()); + CPPUNIT_ASSERT(*playlist->getTitle() + == *otherPlaylist->getTitle()); + CPPUNIT_ASSERT(*playlist->getPlaylength() + == *otherPlaylist->getPlaylength()); +} + + +/*------------------------------------------------------------------------------ + * Testing the addPlayable() method + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: addPlayableTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref newPlaylist(new Playlist(*playlist)); + // make a copy + + Ptr::Ref clipId(new UniqueId("20001")); + Ptr::Ref clipLength(new time_duration(0,0,10,0)); + Ptr::Ref audioClip(new AudioClip(clipId, clipLength)); + + Ptr::Ref firstOffset(new time_duration(0,0,30,0)); + // hour, min, sec, frac_sec + try { + newPlaylist->addPlayable(audioClip, firstOffset); + } catch (std::invalid_argument &e) { + string eMsg = "addPlayable returned with error: "; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + + CPPUNIT_ASSERT(newPlaylist->getPlaylength()); + CPPUNIT_ASSERT(*newPlaylist->getPlaylength() == *firstOffset + + *audioClip->getPlaylength()); + + Ptr::Ref secondOffset(new time_duration(0,0,40,0)); + try { + newPlaylist->addPlayable(playlist, secondOffset); + } catch (std::invalid_argument &e) { + string eMsg = "addPlayable returned with error: "; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + + CPPUNIT_ASSERT(newPlaylist->getPlaylength()); + CPPUNIT_ASSERT(*newPlaylist->getPlaylength() == *secondOffset + + *playlist->getPlaylength()); +} + + +/*------------------------------------------------------------------------------ + * Testing the eliminateGaps() method + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: eliminateGapsTest(void) + throw (CPPUNIT_NS::Exception) +{ + // a simple negative test + bool result = playlist->eliminateGaps(); + CPPUNIT_ASSERT(result == false); + + // a simple positive test + Ptr::Ref secondElement(new UniqueId("101")); + try { + playlist->removePlaylistElement(secondElement); + } catch (std::invalid_argument &e) { + string eMsg = "removePlaylistElement() returned with error: "; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + CPPUNIT_ASSERT(!playlist->valid()); // big gap in playlist + CPPUNIT_ASSERT(playlist->getPlaylength()); + CPPUNIT_ASSERT(*playlist->getPlaylength() == seconds(34)); + + result = playlist->eliminateGaps(); + CPPUNIT_ASSERT(result == true); + CPPUNIT_ASSERT(playlist->valid()); // the gap is gone + CPPUNIT_ASSERT(playlist->getPlaylength()); + CPPUNIT_ASSERT(*playlist->getPlaylength() == seconds(23)); +} + + +/*------------------------------------------------------------------------------ + * A second test of the eliminateGaps() method + *----------------------------------------------------------------------------*/ +void +PlaylistTest :: eliminateGapsLastItemTest(void) + throw (CPPUNIT_NS::Exception) +{ + // the same thing as above, but now we remove the last item + Ptr::Ref secondElement(new UniqueId("103")); + try { + playlist->removePlaylistElement(secondElement); + } catch (std::invalid_argument &e) { + string eMsg = "removePlaylistElement() returned with error: "; + eMsg += e.what(); + CPPUNIT_FAIL(eMsg); + } + CPPUNIT_ASSERT(!playlist->valid()); // big gap in playlist + CPPUNIT_ASSERT(playlist->getPlaylength()); + CPPUNIT_ASSERT(*playlist->getPlaylength() == seconds(34)); + + bool result = playlist->eliminateGaps(); + CPPUNIT_ASSERT(result == true); + CPPUNIT_ASSERT(playlist->valid()); // the gap is gone + CPPUNIT_ASSERT(playlist->getPlaylength()); + CPPUNIT_ASSERT(*playlist->getPlaylength() == seconds(23)); + +} + diff --git a/campcaster/src/modules/core/src/PlaylistTest.h b/campcaster/src/modules/core/src/PlaylistTest.h new file mode 100644 index 000000000..bb696ea32 --- /dev/null +++ b/campcaster/src/modules/core/src/PlaylistTest.h @@ -0,0 +1,186 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef PlaylistTest_h +#define PlaylistTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the UploadPlaylistMetohd class. + * + * @author $Author$ + * @version $Revision$ + * @see Playlist + */ +class PlaylistTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(PlaylistTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(audioClipTest); + CPPUNIT_TEST(savedCopyTest); + CPPUNIT_TEST(fadeInfoTest); + CPPUNIT_TEST(conversionTest); + CPPUNIT_TEST(marshallingTest); + CPPUNIT_TEST(addPlayableTest); + CPPUNIT_TEST(eliminateGapsTest); + CPPUNIT_TEST(eliminateGapsLastItemTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * A playlist to play with. + */ + Ptr::Ref playlist; + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Trying to add a new audio clip. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + audioClipTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing the "save/revert to current state" mechanism. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + savedCopyTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Trying to add a new fade info. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + fadeInfoTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing conversion to and from Playable. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + conversionTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing conversion to and from XmlRpcValue. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + marshallingTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing the addPlayable() method. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + addPlayableTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing the eliminateGaps() method. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + eliminateGapsTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A second test of the eliminateGaps() method. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + eliminateGapsLastItemTest(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 Core +} // namespace LiveSupport + +#endif // PlaylistTest_h + diff --git a/campcaster/src/modules/core/src/ScheduleEntry.cxx b/campcaster/src/modules/core/src/ScheduleEntry.cxx new file mode 100644 index 000000000..adc8a3c09 --- /dev/null +++ b/campcaster/src/modules/core/src/ScheduleEntry.cxx @@ -0,0 +1,144 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/ScheduleEntry.h" + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the schedule entry element + *----------------------------------------------------------------------------*/ +const std::string ScheduleEntry::scheduleEntryElementName = "scheduleEntry"; + +/*------------------------------------------------------------------------------ + * The name of the id attribute in the schedule entry element + *----------------------------------------------------------------------------*/ +const std::string ScheduleEntry::idAttrName = "id"; + +/*------------------------------------------------------------------------------ + * The name of the playlist attribute in the schedule entry element + *----------------------------------------------------------------------------*/ +const std::string ScheduleEntry::playlistIdAttrName = "playlistId"; + +/*------------------------------------------------------------------------------ + * The name of the startTime attribute in the schedule entry element + *----------------------------------------------------------------------------*/ +const std::string ScheduleEntry::startTimeAttrName = "startTime"; + +/*------------------------------------------------------------------------------ + * The name of the endTime attribute in the schedule entry element + *----------------------------------------------------------------------------*/ +const std::string ScheduleEntry::endTimeAttrName = "endTime"; + +/*------------------------------------------------------------------------------ + * The name of the playlength attribute in the schedule entry element + *----------------------------------------------------------------------------*/ +const std::string ScheduleEntry::playlengthAttrName = "playlength"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Create a schedule entry based on a previously exported DOM element + *----------------------------------------------------------------------------*/ +ScheduleEntry :: ScheduleEntry(xmlpp::Element * element) + throw (std::invalid_argument) +{ + if (element->get_name() != scheduleEntryElementName) { + std::string eMsg = "bad configuration element "; + eMsg += element->get_name(); + throw std::invalid_argument(eMsg); + } + + const xmlpp::Attribute * attribute = 0; + + if (!(attribute = element->get_attribute(idAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + id = UniqueId::fromDecimalString(attribute->get_value()); + + if (!(attribute = element->get_attribute(playlistIdAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + playlistId = UniqueId::fromDecimalString(attribute->get_value().c_str()); + + if (!(attribute = element->get_attribute(startTimeAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + startTime.reset(new ptime(from_iso_string(attribute->get_value()))); + + if (!(attribute = element->get_attribute(endTimeAttrName))) { + std::string eMsg = "missing attribute "; + eMsg += idAttrName; + throw std::invalid_argument(eMsg); + } + endTime.reset(new ptime(from_iso_string(attribute->get_value()))); + + playlength.reset(new time_duration(*endTime - *startTime)); +} + + +/*------------------------------------------------------------------------------ + * Export a schedule entry into a DOM element. + *----------------------------------------------------------------------------*/ +void +ScheduleEntry :: toDom(xmlpp::Element * element) const throw () +{ + xmlpp::Element * node = element->add_child(scheduleEntryElementName); + + node->set_attribute(idAttrName, *(id->toDecimalString())); + node->set_attribute(playlistIdAttrName, *(playlistId->toDecimalString())); + node->set_attribute(startTimeAttrName, to_iso_string(*startTime)); + node->set_attribute(endTimeAttrName, to_iso_string(*endTime)); + node->set_attribute(playlengthAttrName, to_simple_string(*playlength)); +} + diff --git a/campcaster/src/modules/core/src/ScheduleEntryTest.cxx b/campcaster/src/modules/core/src/ScheduleEntryTest.cxx new file mode 100644 index 000000000..6043e1a56 --- /dev/null +++ b/campcaster/src/modules/core/src/ScheduleEntryTest.cxx @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/ScheduleEntry.h" +#include "ScheduleEntryTest.h" + + +using namespace std; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(ScheduleEntryTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +ScheduleEntryTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +ScheduleEntryTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +ScheduleEntryTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref id(new UniqueId(1)); + Ptr::Ref playlistId(new UniqueId(2)); + Ptr::Ref startTime(new ptime( + time_from_string("2006-05-10 10:00:00"))); + Ptr::Ref endTime(new ptime( + time_from_string("2006-05-10 11:00:00"))); + + Ptr::Ref se(new ScheduleEntry(id, + playlistId, + startTime, + endTime)); + + xmlpp::Document * document = new xmlpp::Document(); + document->create_root_node("root"); + + se->toDom(document->get_root_node()); + + xmlpp::Node::NodeList::iterator it = document->get_root_node() + ->get_children().begin(); + xmlpp::Node * node = *it; + xmlpp::Element * element = dynamic_cast (node); + Ptr::Ref see(new ScheduleEntry(element)); + + CPPUNIT_ASSERT(*se == *see); +} + diff --git a/campcaster/src/modules/core/src/ScheduleEntryTest.h b/campcaster/src/modules/core/src/ScheduleEntryTest.h new file mode 100644 index 000000000..9f43bf29a --- /dev/null +++ b/campcaster/src/modules/core/src/ScheduleEntryTest.h @@ -0,0 +1,111 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef ScheduleEntryTest_h +#define ScheduleEntryTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include "LiveSupport/Core/ScheduleEntry.h" + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the ScheduleEntry class. + * + * @author $Author$ + * @version $Revision$ + * @see ScheduleEntry + */ +class ScheduleEntryTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(ScheduleEntryTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 Core +} // namespace LiveSupport + +#endif // ScheduleEntryTest_h + diff --git a/campcaster/src/modules/core/src/SearchCriteria.cxx b/campcaster/src/modules/core/src/SearchCriteria.cxx new file mode 100644 index 000000000..18da9cf6c --- /dev/null +++ b/campcaster/src/modules/core/src/SearchCriteria.cxx @@ -0,0 +1,276 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/Core/SearchCriteria.h" + +using namespace LiveSupport::Core; +using namespace boost::posix_time; +using namespace XmlRpc; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Construct a SearchCriteria object with a single condition. + *----------------------------------------------------------------------------*/ +SearchCriteria :: SearchCriteria(const std::string & type, + const std::string & key, + const std::string & comparisonOperator, + const std::string & value) + throw(std::invalid_argument) + : logicalOperator("and"), limit(0), offset(0) +{ + setType(type); + addCondition(key, comparisonOperator, value); +} + + +/*------------------------------------------------------------------------------ + * Construct a SearchCriteria object from an XmlRpcValue. + *----------------------------------------------------------------------------*/ +SearchCriteria :: SearchCriteria(const XmlRpcValue & xmlRpcValue) + throw(std::invalid_argument) +{ + // make a non-const copy, because XmlRpcValue::operator[](const char *) + // does not work on const objects + XmlRpcValue value(xmlRpcValue); + + if (value.hasMember("filetype") + && value["filetype"].getType() == XmlRpcValue::TypeString) { + type = std::string(value["filetype"]); + } else { + throw std::invalid_argument("missing file type in search criteria"); + } + + if (value.hasMember("operator") + && value["operator"].getType() == XmlRpcValue::TypeString) { + logicalOperator = std::string(value["operator"]); + } else { + logicalOperator = std::string("and"); + } + + if (value.hasMember("limit") + && value["limit"].getType() == XmlRpcValue::TypeInt) { + limit = value["limit"]; + } + + if (value.hasMember("offset") + && value["offset"].getType() == XmlRpcValue::TypeInt) { + offset = value["offset"]; + } + + if (!value.hasMember("conditions") + || value["conditions"].getType() != XmlRpcValue::TypeArray) { + throw std::invalid_argument("missing conditions in search criteria"); + } + + for (int i = 0; i < value["conditions"].size(); ++i) { + addCondition(value["conditions"][i]); + } +} + + +/*------------------------------------------------------------------------------ + * Add a search condition. + *----------------------------------------------------------------------------*/ +void +SearchCriteria :: addCondition(const std::string & key, + const std::string & comparisonOperator, + const std::string & value) + throw(std::invalid_argument) +{ + std::string lowerCaseOp = lowerCase(comparisonOperator); + + if (lowerCaseOp == "=" + || lowerCaseOp == "partial" || lowerCaseOp == "prefix" + || lowerCaseOp == "<" || lowerCaseOp == "<=" + || lowerCaseOp == ">" || lowerCaseOp == ">=") { + SearchConditionType condition(key, lowerCaseOp, value); + searchConditions.push_back(condition); + } else { + throw std::invalid_argument("bad comparison operator argument"); + } +} + + +/*------------------------------------------------------------------------------ + * Add a search condition. + *----------------------------------------------------------------------------*/ +void +SearchCriteria :: addCondition(const XmlRpcValue & xmlRpcValue) + throw(std::invalid_argument) +{ + // make a non-const copy, because XmlRpcValue::operator[](const char *) + // does not work on const objects + XmlRpcValue value(xmlRpcValue); + + if (!value.hasMember("cat") + || value["cat"].getType() != XmlRpcValue::TypeString) { + throw std::invalid_argument("missing metadata name in search criteria"); + } + + if (!value.hasMember("op") + || value["op"].getType() != XmlRpcValue::TypeString) { + throw std::invalid_argument("missing operator name in search criteria"); + } + + if (!value.hasMember("val") + || value["val"].getType() != XmlRpcValue::TypeString) { + throw std::invalid_argument("missing value in search criteria"); + } + + addCondition(std::string(value["cat"]), + std::string(value["op"]), + std::string(value["val"])); +} + + +/*------------------------------------------------------------------------------ + * Add a search condition specifying the mtime (modified-at time). + *----------------------------------------------------------------------------*/ +void +SearchCriteria :: addMtimeCondition(const std::string & comparisonOperator, + Ptr::Ref value) + throw(std::invalid_argument) +{ + std::string lowerCaseOp = lowerCase(comparisonOperator); + + if (lowerCaseOp == "=" + || lowerCaseOp == "partial" || lowerCaseOp == "prefix" + || lowerCaseOp == "<" || lowerCaseOp == "<=" + || lowerCaseOp == ">" || lowerCaseOp == ">=") { + mtimeComparisonOperator = lowerCaseOp; + mtimeValue = value; + } else { + throw std::invalid_argument("bad comparison operator argument"); + } +} + + +/*------------------------------------------------------------------------------ + * Convert to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +SearchCriteria :: operator XmlRpcValue() const + throw() +{ + XmlRpcValue returnValue; + + returnValue["filetype"] = type; + if (searchConditions.size() != 1) { + returnValue["operator"] = logicalOperator; + } + + XmlRpcValue conditionList; + conditionList.setSize(searchConditions.size()); + SearchConditionListType::const_iterator it, end; + it = searchConditions.begin(); + end = searchConditions.end(); + for (int i = 0; it != end; ++i, ++it) { + XmlRpcValue condition; + condition["cat"] = it->key; + condition["op"] = it->comparisonOperator; + condition["val"] = it->value; + conditionList[i] = condition; + } + + if (mtimeValue) { + int i = conditionList.size(); + struct tm mtimeStructTm; + TimeConversion::ptimeToTm(mtimeValue, mtimeStructTm); + + XmlRpcValue condition; + condition["cat"] = "ls:mtime"; + condition["op"] = mtimeComparisonOperator; + condition["val"] = XmlRpcValue(&mtimeStructTm); + conditionList[i] = condition; + } + + returnValue["conditions"] = conditionList; + + if (limit) { + returnValue["limit"] = limit; + } + + if (offset) { + returnValue["offset"] = offset; + } + + return returnValue; +} + + +/*------------------------------------------------------------------------------ + * Check two SearchCriteria objects for equality. + *----------------------------------------------------------------------------*/ +bool +SearchCriteria :: operator ==(const SearchCriteria & other) const + throw() +{ + if (type != other.type + || limit != other.limit + || offset != other.offset + || searchConditions.size() != other.searchConditions.size()) { + return false; + } + + if (searchConditions.size() != 1 + && logicalOperator != other.logicalOperator) { + return false; + } + + SearchConditionListType::const_iterator it, otherIt; + it = searchConditions.begin(); + otherIt = other.searchConditions.begin(); + + for ( ; it != searchConditions.end(); ++it, ++otherIt) { + if (it->key != otherIt->key + || it->comparisonOperator != otherIt->comparisonOperator + || it->value != otherIt->value) { + return false; + } + } + + return true; +} + diff --git a/campcaster/src/modules/core/src/SearchCriteriaTest.cxx b/campcaster/src/modules/core/src/SearchCriteriaTest.cxx new file mode 100644 index 000000000..47e8f2e8d --- /dev/null +++ b/campcaster/src/modules/core/src/SearchCriteriaTest.cxx @@ -0,0 +1,195 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include + +#include "LiveSupport/Core/SearchCriteria.h" +#include "SearchCriteriaTest.h" + +using namespace LiveSupport::Core; + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(SearchCriteriaTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +SearchCriteriaTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +SearchCriteriaTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if we can do some simple operations + *----------------------------------------------------------------------------*/ +void +SearchCriteriaTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + XmlRpc::XmlRpcValue xmlRpcValue; + + try { + SearchCriteria firstCriteria; + xmlRpcValue = firstCriteria; + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(xmlRpcValue.hasMember("filetype")); + CPPUNIT_ASSERT(xmlRpcValue["filetype"] == "all"); + CPPUNIT_ASSERT(xmlRpcValue.hasMember("conditions")); + CPPUNIT_ASSERT(xmlRpcValue["conditions"].getType() + == XmlRpc::XmlRpcValue::TypeArray); + CPPUNIT_ASSERT(xmlRpcValue["conditions"].size() == 0); + + try { + SearchCriteria secondCriteria("playlist", "Or"); + secondCriteria.setLimit(50); + secondCriteria.setOffset(100); + secondCriteria.addCondition("dc:title", "PREFIX", "My "); + secondCriteria.addCondition("DcTerms:Extent", "<", "180"); + xmlRpcValue = secondCriteria; + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(xmlRpcValue.hasMember("filetype")); + CPPUNIT_ASSERT(xmlRpcValue["filetype"] == "playlist"); + CPPUNIT_ASSERT(xmlRpcValue.hasMember("operator")); + CPPUNIT_ASSERT(xmlRpcValue["operator"] == "or"); + CPPUNIT_ASSERT(xmlRpcValue.hasMember("conditions")); + XmlRpc::XmlRpcValue conditions = xmlRpcValue["conditions"]; + CPPUNIT_ASSERT(conditions.getType() == XmlRpc::XmlRpcValue::TypeArray); + CPPUNIT_ASSERT(conditions.size() == 2); + + XmlRpc::XmlRpcValue condition0 = conditions[0]; + CPPUNIT_ASSERT(condition0.hasMember("cat")); + CPPUNIT_ASSERT(condition0["cat"] == "dc:title"); + CPPUNIT_ASSERT(condition0.hasMember("op")); + CPPUNIT_ASSERT(condition0["op"] == "prefix"); + CPPUNIT_ASSERT(condition0.hasMember("val")); + CPPUNIT_ASSERT(condition0["val"] == "My "); + + XmlRpc::XmlRpcValue condition1 = conditions[1]; + CPPUNIT_ASSERT(condition1.hasMember("cat")); + CPPUNIT_ASSERT(condition1["cat"] == "DcTerms:Extent"); + CPPUNIT_ASSERT(condition1.hasMember("op")); + CPPUNIT_ASSERT(condition1["op"] == "<"); + CPPUNIT_ASSERT(condition1.hasMember("val")); + CPPUNIT_ASSERT(condition1["val"] == "180"); + + CPPUNIT_ASSERT(xmlRpcValue.hasMember("limit")); + CPPUNIT_ASSERT(xmlRpcValue["limit"].getType() + == XmlRpc::XmlRpcValue::TypeInt); + CPPUNIT_ASSERT(int(xmlRpcValue["limit"]) == 50); + CPPUNIT_ASSERT(xmlRpcValue.hasMember("offset")); + CPPUNIT_ASSERT(xmlRpcValue["offset"].getType() + == XmlRpc::XmlRpcValue::TypeInt); + CPPUNIT_ASSERT(int(xmlRpcValue["offset"]) == 100); + + try { + SearchCriteria thirdCriteria("all", "dc:creator", "partial", "X"); + xmlRpcValue = thirdCriteria; + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + CPPUNIT_ASSERT(xmlRpcValue.hasMember("filetype")); + CPPUNIT_ASSERT(xmlRpcValue["filetype"] == "all"); + CPPUNIT_ASSERT(xmlRpcValue.hasMember("conditions")); + conditions = xmlRpcValue["conditions"]; + CPPUNIT_ASSERT(conditions.getType() == XmlRpc::XmlRpcValue::TypeArray); + CPPUNIT_ASSERT(conditions.size() == 1); + + condition0 = conditions[0]; + CPPUNIT_ASSERT(condition0.hasMember("cat")); + CPPUNIT_ASSERT(condition0["cat"] == "dc:creator"); + CPPUNIT_ASSERT(condition0.hasMember("op")); + CPPUNIT_ASSERT(condition0["op"] == "partial"); + CPPUNIT_ASSERT(condition0.hasMember("val")); + CPPUNIT_ASSERT(condition0["val"] == "X"); +} + + +/*------------------------------------------------------------------------------ + * Test the conversion to/from an XmlRpcValue. + *----------------------------------------------------------------------------*/ +void +SearchCriteriaTest :: marshalingTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref criteria; + CPPUNIT_ASSERT_NO_THROW( + criteria.reset(new SearchCriteria("playlist", "Or")); + criteria->setLimit(50); + criteria->setOffset(100); + criteria->addCondition("dc:title", "PREFIX", "My "); + criteria->addCondition("DcTerms:Extent", "<", "180"); + ); + + XmlRpc::XmlRpcValue xmlRpcValue; + CPPUNIT_ASSERT_NO_THROW( + xmlRpcValue = *criteria; + ); + + Ptr::Ref copyCriteria; + CPPUNIT_ASSERT_NO_THROW( + copyCriteria.reset(new SearchCriteria(xmlRpcValue)); + ); + + CPPUNIT_ASSERT(*criteria == *copyCriteria); + + XmlRpc::XmlRpcValue copyXmlRpcValue; + CPPUNIT_ASSERT_NO_THROW( + copyXmlRpcValue = *copyCriteria; + ); + + CPPUNIT_ASSERT(xmlRpcValue == copyXmlRpcValue); +} + diff --git a/campcaster/src/modules/core/src/SearchCriteriaTest.h b/campcaster/src/modules/core/src/SearchCriteriaTest.h new file mode 100644 index 000000000..950aca95c --- /dev/null +++ b/campcaster/src/modules/core/src/SearchCriteriaTest.h @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SearchCriteriaTest_h +#define SearchCriteriaTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the SearchCriteria class. + * + * @author $Author$ + * @version $Revision$ + * @see SearchCriteria + */ +class SearchCriteriaTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(SearchCriteriaTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(marshalingTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the conversion to/from an XmlRpcValue. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + marshalingTest(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 Core +} // namespace LiveSupport + +#endif // SearchCriteriaTest_h + diff --git a/campcaster/src/modules/core/src/TestRunnable.cxx b/campcaster/src/modules/core/src/TestRunnable.cxx new file mode 100644 index 000000000..cc183a095 --- /dev/null +++ b/campcaster/src/modules/core/src/TestRunnable.cxx @@ -0,0 +1,81 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/TimeConversion.h" + +#include "TestRunnable.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +TestRunnable :: TestRunnable(Ptr::Ref loopTime) + throw () +{ + shouldRun = true; + state = created; + this->loopTime = loopTime; +} + + +/*------------------------------------------------------------------------------ + * The main execution body of the thread. + *----------------------------------------------------------------------------*/ +void +TestRunnable :: run(void) throw () +{ + state = running; + + while (shouldRun) { + // don't do anything in the main loop + TimeConversion::sleep(loopTime); + } + + state = stopped; +} + diff --git a/campcaster/src/modules/core/src/TestRunnable.h b/campcaster/src/modules/core/src/TestRunnable.h new file mode 100644 index 000000000..eaa058eca --- /dev/null +++ b/campcaster/src/modules/core/src/TestRunnable.h @@ -0,0 +1,164 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef TestRunnable_h +#define TestRunnable_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/RunnableInterface.h" + + +namespace LiveSupport { +namespace Core { + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A sample Runnable object, for testing purposes. + * + * @author $Author$ + * @version $Revision$ + */ +class TestRunnable : public virtual RunnableInterface +{ + public: + /** + * An enum signaling the states of the Runnable object. + */ + typedef enum { created, running, stopped } State; + + private: + /** + * The time interval the run() method will check if stop() + * has been called meanwhile. + */ + Ptr::Ref loopTime; + + /** + * Flag that marks if the main execution body should be + * running. + */ + bool shouldRun; + + /** + * The state of the object. + */ + State state; + + /** + * Default constructor. + */ + TestRunnable(void) throw () + { + } + + + public: + /** + * Constructor. + * + * @param loopTime the time at which the run() method checks + * if it still should run. + */ + TestRunnable(Ptr::Ref loopTime) throw (); + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~TestRunnable(void) throw () + { + } + + /** + * The main execution loop for the thread. + */ + virtual void + run(void) throw (); + + /** + * Signal the thread to stop, gracefully. + * This is just a call to signal the execution to stop, eventually. + */ + virtual void + stop(void) throw () + { + shouldRun = false; + } + + /** + * Send a signal to this object. + * This currently simply does nothing. + * + * @param userData the user data for the signal. + */ + virtual void + signal(int userData) throw () + { + } + + /** + * Get the state of the object. + */ + virtual State + getState(void) const throw () + { + return state; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Core +} // namespace LiveSupport + + +#endif // TestRunnable_h + diff --git a/campcaster/src/modules/core/src/TestRunner.cxx b/campcaster/src/modules/core/src/TestRunner.cxx new file mode 100644 index 000000000..0e0930e5b --- /dev/null +++ b/campcaster/src/modules/core/src/TestRunner.cxx @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + +#if HAVE_GETOPT_H +#include +#else +#error "Need getopt.h" +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +using namespace LiveSupport::Core; + +/* =================================================== 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[] = "ho:s:v"; + +/** + * Structure describing the long options + */ +static const struct option longOptions[] = { + { "help", no_argument, 0, 'h' }, + { "output", required_argument, 0, 'o' }, + { "stylesheet", required_argument, 0, 's' }, + { "version", no_argument, 0, 'v' }, + { 0, 0, 0, 0 } +}; + +/** + * The encoding to use for the output file. + */ +static const std::string encoding = "utf-8"; + +/** + * The output XML file name. + */ +static Ptr::Ref xmlOutFileName; + +/** + * The XSLT attached to the output file. + */ +static Ptr::Ref xsltFileName; + + +/* =============================================== 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 ); + +/** + * Process command line arguments. + * + * @param argc the number of arguments. + * @param argv the arguments themselves. + * @return true of all went well, false in case the program should exit + * after this call. + */ +static bool +processArguments(int argc, char *argv[]); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Run all tests + *----------------------------------------------------------------------------*/ +int +main( int argc, + char * argv[] ) throw () +{ + if (!processArguments(argc, argv)) { + return 0; + } + + // 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(); + + // also generate an XML document as an output + std::ofstream xmlOutFile(xmlOutFileName->c_str()); + CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); + xmlOutputter.setStandalone(false); + if (xsltFileName) { + xmlOutputter.setStyleSheet(*xsltFileName); + } + xmlOutputter.write(); + xmlOutFile.flush(); + xmlOutFile.close(); + + return result.wasSuccessful() ? 0 : 1; +} + + +/*------------------------------------------------------------------------------ + * Process command line arguments. + *----------------------------------------------------------------------------*/ +static bool +processArguments(int argc, char *argv[]) +{ + int i; + + while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { + switch (i) { + case 'h': + printUsage(argv[0], std::cout); + return false; + + case 'o': + xmlOutFileName.reset(new std::string(optarg)); + break; + + case 's': + xsltFileName.reset(new std::string(optarg)); + break; + + case 'v': + printVersion(std::cout); + return false; + + default: + printUsage(argv[0], std::cout); + return false; + } + } + + if (optind < argc) { + std::cerr << "error processing command line arguments" << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + if (!xmlOutFileName) { + std::cerr << "mandatory option output file name not specified" + << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; + if (xsltFileName) { + std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Print program version. + *----------------------------------------------------------------------------*/ +static void +printVersion ( std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << copyrightNotice << std::endl; +} + + +/*------------------------------------------------------------------------------ + * Print program usage. + *----------------------------------------------------------------------------*/ +static void +printUsage ( const char invocation[], + std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << std::endl + << "Usage: " << invocation << " [OPTION]" + << std::endl + << " mandatory options:" << std::endl + << " -o, --output=file.name write test results into this XML file" + << std::endl + << " optional options:" << std::endl + << " -s, --stylesheet specify this XSLT for the output file" + << std::endl + << " this is either an absolute URI, or a" + << std::endl + << " relative path for the output document" + << 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; +} + diff --git a/campcaster/src/modules/core/src/Thread.cxx b/campcaster/src/modules/core/src/Thread.cxx new file mode 100644 index 000000000..7e53551f5 --- /dev/null +++ b/campcaster/src/modules/core/src/Thread.cxx @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#error need unistd.h +#endif + + +#include "LiveSupport/Core/Thread.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +Thread :: Thread(Ptr::Ref runnable) throw () +{ + this->runnable = runnable; +} + + +/*------------------------------------------------------------------------------ + * The POSIX thread function for this thread. + *----------------------------------------------------------------------------*/ +void * +Thread :: posixThreadFunction(void * thread) throw () +{ + Thread * pThread = (Thread *) thread; + + pThread->runnable->run(); + + return 0; +} + + +/*------------------------------------------------------------------------------ + * Start the thread. + *----------------------------------------------------------------------------*/ +void +Thread :: start(void) throw (std::exception) +{ + int ret; + pthread_attr_t attr; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + ret = pthread_create(&thread, &attr, posixThreadFunction, this); + pthread_attr_destroy(&attr); + + yield(); + + if (ret) { + // TODO: signal return code + throw std::exception(); + } +} + + +/*------------------------------------------------------------------------------ + * Join the thread. + *----------------------------------------------------------------------------*/ +void +Thread :: join(void) throw () +{ + int ret; + if ((ret = pthread_join(thread, 0))) { + // TODO: signal return code + } +} + diff --git a/campcaster/src/modules/core/src/ThreadTest.cxx b/campcaster/src/modules/core/src/ThreadTest.cxx new file mode 100644 index 000000000..c41cd2223 --- /dev/null +++ b/campcaster/src/modules/core/src/ThreadTest.cxx @@ -0,0 +1,127 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/Core/Thread.h" +#include "TestRunnable.h" +#include "ThreadTest.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(ThreadTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +ThreadTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +ThreadTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple thread test. + *----------------------------------------------------------------------------*/ +void +ThreadTest :: simpleTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref cycle(new time_duration(seconds(1))); + Ptr::Ref runnable(new TestRunnable(cycle)); + Ptr::Ref thread(new Thread(runnable)); + Ptr::Ref sleepTime(new time_duration(seconds(1))); + + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::created); + thread->start(); + Thread::yield(); + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::running); + TimeConversion::sleep(sleepTime); + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::running); + thread->stop(); + TimeConversion::sleep(sleepTime); + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::stopped); + thread->join(); +} + + +/*------------------------------------------------------------------------------ + * A test to see if a thread respoding slowly for a stop() + * call is joined correctly. + *----------------------------------------------------------------------------*/ +void +ThreadTest :: slowThreadTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref cycle(new time_duration(seconds(10))); + Ptr::Ref runnable(new TestRunnable(cycle)); + Ptr::Ref thread(new Thread(runnable)); + Ptr::Ref sleepTime(new time_duration(seconds(1))); + + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::created); + thread->start(); + Thread::yield(); + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::running); + TimeConversion::sleep(sleepTime); + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::running); + thread->stop(); + TimeConversion::sleep(sleepTime); + thread->join(); + CPPUNIT_ASSERT(runnable->getState() == TestRunnable::stopped); +} + diff --git a/campcaster/src/modules/core/src/ThreadTest.h b/campcaster/src/modules/core/src/ThreadTest.h new file mode 100644 index 000000000..573b01e15 --- /dev/null +++ b/campcaster/src/modules/core/src/ThreadTest.h @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef ThreadTest_h +#define ThreadTest_H + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the Thread class. + * + * @author $Author$ + * @version $Revision$ + * @see Thread + */ +class ThreadTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(ThreadTest); + CPPUNIT_TEST(simpleTest); + CPPUNIT_TEST(slowThreadTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple thread test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + simpleTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to see if a thread respoding slowly for a stop() + * call is joined correctly. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + slowThreadTest(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 Core +} // namespace LiveSupport + +#endif // ThreadTest_h + diff --git a/campcaster/src/modules/core/src/TimeConversion.cxx b/campcaster/src/modules/core/src/TimeConversion.cxx new file mode 100644 index 000000000..6d32e1c57 --- /dev/null +++ b/campcaster/src/modules/core/src/TimeConversion.cxx @@ -0,0 +1,388 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/TimeConversion.h" + + +using namespace boost::posix_time; +using namespace boost::gregorian; + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/** + * The number of digits used for fractional seconds in time durations. + */ +static const int numberOfDigitsPrecision = 6; + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Convert a struct timeval to a boost::ptime + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: timevalToPtime(const struct timeval *timeval) + throw (std::out_of_range) +{ + // don't convert through the boost::posix_time::from_time_t() function + // as probably because of timezone settings it ruins the actual value + struct tm tm; + localtime_r(&timeval->tv_sec, &tm); + Ptr::Ref time(new ptime(date(1900 + tm.tm_year, + 1 + tm.tm_mon, + tm.tm_mday), + time_duration(tm.tm_hour, + tm.tm_min, + tm.tm_sec) + + microseconds(timeval->tv_usec))); + + return time; +} + + +/*------------------------------------------------------------------------------ + * Convert a struct tm to a boost::ptime + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: tmToPtime(const struct tm *time) + throw (std::out_of_range) +{ + // don't convert through the boost::posix_time::from_time_t() function + // as probably because of timezone settings it ruins the actual value + Ptr::Ref pTime(new ptime(date(1900 + time->tm_year, + 1 + time->tm_mon, + time->tm_mday), + time_duration(time->tm_hour, + time->tm_min, + time->tm_sec))); + + return pTime; +} + + +/*------------------------------------------------------------------------------ + * Convert a boost::ptime to a struct tm + *----------------------------------------------------------------------------*/ +void +TimeConversion :: ptimeToTm(Ptr::Ref convertFrom, + struct tm & convertTo) + throw () +{ + date date = convertFrom->date(); + time_duration time = convertFrom->time_of_day(); + + convertTo.tm_year = date.year() - 1900; + convertTo.tm_mon = date.month() - 1; + convertTo.tm_mday = date.day(); + convertTo.tm_hour = time.hours(); + convertTo.tm_min = time.minutes(); + convertTo.tm_sec = time.seconds(); +} + + +/*------------------------------------------------------------------------------ + * Return the current time. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: now(void) + throw () +{ + struct timeval timeval; + + // TODO: check for -1 return value, to see if there are errors + gettimeofday(&timeval, 0); + return timevalToPtime(&timeval); +} + + +/*------------------------------------------------------------------------------ + * Return the current time, as a string. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: nowString(void) + throw () +{ + ptime now = second_clock::local_time(); + Ptr::Ref timeString(new std::string(to_simple_string(now))); + + return timeString; +} + + +/*------------------------------------------------------------------------------ + * Sleep for the specified duration. + *----------------------------------------------------------------------------*/ +void +TimeConversion :: sleep(Ptr::Ref duration) + throw () +{ + int ret; + struct timespec tv; + + tv.tv_sec = duration->total_seconds(); + tv.tv_nsec = duration->fractional_seconds(); + + // if fractional digits is in microseconds, convert it to nanoseconds + if (time_duration::num_fractional_digits() == 6) { + tv.tv_nsec *= 1000L; + } + + if ((ret = nanosleep(&tv, 0))) { + // TODO: signal error + } +} + + +/*------------------------------------------------------------------------------ + * Convert a time_duration to a format used in SMILs. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: timeDurationToSmilString( + Ptr::Ref duration) + throw () +{ + std::stringstream stringStream; + stringStream << std::dec + << duration->total_seconds(); + + int microseconds = duration->fractional_seconds(); + stringStream << "." + << std::setw(3) + << std::setfill('0') + << (microseconds + 500) / 1000 + << 's'; + Ptr::Ref result(new std::string(stringStream.str())); + return result; +} + + +/*------------------------------------------------------------------------------ + * Convert a time_duration to a rounded format used on the screen. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: timeDurationToHhMmSsString( + Ptr::Ref duration) + throw () +{ + std::stringstream stringStream; + stringStream << std::dec + << std::setw(2) + << std::setfill('0') + << duration->hours() + << ":" + << std::setw(2) + << std::setfill('0') + << duration->minutes(); + + int seconds = duration->seconds(); + if (duration->fractional_seconds() >= 500000) { + ++seconds; + } + stringStream << ":" + << std::setw(2) + << std::setfill('0') + << seconds; + + Ptr::Ref result(new std::string(stringStream.str())); + return result; +} + + +/*------------------------------------------------------------------------------ + * Convert a time_duration to a format used for fade info. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: timeDurationToShortString( + Ptr::Ref duration) + throw () +{ + std::stringstream stringStream; + + if (duration->hours()) { + stringStream << duration->hours() + << ":" + << std::setw(2) + << std::setfill('0') + << duration->minutes() + << ":" + << std::setw(2) + << std::setfill('0'); + + } else if (duration->minutes()) { + stringStream << duration->minutes() + << ":" + << std::setw(2) + << std::setfill('0'); + } + + stringStream << duration->seconds(); + + std::stringstream fractionsStream; + fractionsStream << std::setw(getNumberOfDigitsPrecision()) + << std::setfill('0') + << duration->fractional_seconds(); + std::string fractionsString(fractionsStream.str()); + unsigned int lastNonZero = fractionsString.find_last_not_of('0'); + if (lastNonZero != std::string::npos) { + stringStream << "." + << fractionsString.substr(0, lastNonZero+1); + } + + Ptr::Ref result(new std::string(stringStream.str())); + return result; +} + + +/*------------------------------------------------------------------------------ + * Parse a string to a time_duration. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: parseTimeDuration(Ptr::Ref durationString) + throw () +{ + int micros = 0; + int seconds = 0; + int minutes = 0; + int hours = 0; + + Ptr::Ref temp(new std::string(*durationString)); + + if (temp->length() > 0) { + Ptr::Ref secondsString = nextNumberFromEnd(temp, ':'); + Ptr::Ref fractionsString = nextNumberFromStart( + secondsString, '.'); + if (fractionsString->length() > 0) { + std::stringstream fractionsStream; + fractionsStream << std::left + << std::setw( + TimeConversion::getNumberOfDigitsPrecision() ) + << std::setfill('0') + << *fractionsString; + fractionsStream >> micros; + } + if (secondsString->length() > 0) { + std::stringstream secondsStream(*secondsString); + secondsStream >> seconds; + } + } + + if (temp->length() > 0) { + Ptr::Ref minutesString = nextNumberFromEnd(temp, ':'); + std::stringstream minutesStream(*minutesString); + minutesStream >> minutes; + } + + if (temp->length() > 0) { + std::stringstream hoursStream(*temp); + hoursStream >> hours; + } + + Ptr::Ref result(new time_duration( + hours, minutes, seconds, micros )); + return result; +} + + +/*------------------------------------------------------------------------------ + * Parse a time string. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: nextNumberFromEnd(Ptr::Ref timeString, + char separator) + throw () +{ + Ptr::Ref result; + unsigned int pos = timeString->find_last_of(separator); + + if (pos != std::string::npos) { + if (pos != timeString->length()-1) { + result.reset(new std::string(*timeString, pos+1)); + } else { + result.reset(new std::string); + } + *timeString = timeString->substr(0, pos); + } else { + result.reset(new std::string(*timeString)); + *timeString = std::string(""); + } + + return result; +} + + +/*------------------------------------------------------------------------------ + * Parse a decimal string. + *----------------------------------------------------------------------------*/ +Ptr::Ref +TimeConversion :: nextNumberFromStart(Ptr::Ref timeString, + char separator) + throw () +{ + Ptr::Ref result; + unsigned int pos = timeString->find(separator); + + if (pos != std::string::npos) { + if (pos != timeString->length()-1) { + result.reset(new std::string(*timeString, pos+1)); + } else { + result.reset(new std::string); + } + *timeString = timeString->substr(0, pos); + } else { + result.reset(new std::string("")); + } + + return result; +} + + +/*------------------------------------------------------------------------------ + * Get the number of digits used for fractional seconds in time durations. + *----------------------------------------------------------------------------*/ +int +TimeConversion :: getNumberOfDigitsPrecision(void) throw () +{ + return numberOfDigitsPrecision; +} + diff --git a/campcaster/src/modules/core/src/TimeConversionTest.cxx b/campcaster/src/modules/core/src/TimeConversionTest.cxx new file mode 100644 index 000000000..75a89cae5 --- /dev/null +++ b/campcaster/src/modules/core/src/TimeConversionTest.cxx @@ -0,0 +1,306 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include "LiveSupport/Core/TimeConversion.h" +#include "TimeConversionTest.h" + + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(TimeConversionTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test the timevalToPtime function + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: timevalToPtimeTest(void) + throw (CPPUNIT_NS::Exception) +{ + struct tm tm; + time_t time; + struct timeval timeval; + Ptr::Ref pTime; + + // first create a time_t with the time for 2004-11-04 12:58:30 + tm.tm_year = 104; // number of years since 1900, 104 means 2004 + tm.tm_mon = 10; // number of months since January, 10 means November + tm.tm_mday = 4; + tm.tm_hour = 12; + tm.tm_min = 58; + tm.tm_sec = 30; + tm.tm_isdst = 0; + time = mktime(&tm); + + // now fill the timeval with timet, and 1234 useconds + timeval.tv_sec = time; + timeval.tv_usec = 1234; + + // and now convert, and see if it is correct + pTime = TimeConversion::timevalToPtime(&timeval); + CPPUNIT_ASSERT(pTime->date().year() == 2004); + CPPUNIT_ASSERT(pTime->date().month() == 11); + CPPUNIT_ASSERT(pTime->date().day() == 4); + CPPUNIT_ASSERT(pTime->time_of_day().hours() == 12); + CPPUNIT_ASSERT(pTime->time_of_day().minutes() == 58); + CPPUNIT_ASSERT(pTime->time_of_day().seconds() == 30); + CPPUNIT_ASSERT((pTime->time_of_day().total_microseconds() + - ((uint64_t) (pTime->time_of_day().total_seconds()) * 1000000UL)) + == 1234); +} + + +/*------------------------------------------------------------------------------ + * Test the tmToPtime function + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: tmToPtimeTest(void) + throw (CPPUNIT_NS::Exception) +{ + struct tm tm; + Ptr::Ref pTime; + + // first create a time_t with the time for 2004-11-04 12:58:30 + tm.tm_year = 104; // number of years since 1900, 104 means 2004 + tm.tm_mon = 10; // number of months since January, 10 means November + tm.tm_mday = 4; + tm.tm_hour = 12; + tm.tm_min = 58; + tm.tm_sec = 30; + tm.tm_isdst = 0; + + // and now convert, and see if it is correct + pTime = TimeConversion::tmToPtime(&tm); + CPPUNIT_ASSERT(pTime->date().year() == 2004); + CPPUNIT_ASSERT(pTime->date().month() == 11); + CPPUNIT_ASSERT(pTime->date().day() == 4); + CPPUNIT_ASSERT(pTime->time_of_day().hours() == 12); + CPPUNIT_ASSERT(pTime->time_of_day().minutes() == 58); + CPPUNIT_ASSERT(pTime->time_of_day().seconds() == 30); +} + + +/*------------------------------------------------------------------------------ + * Test the ptimeToTm function + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: ptimeToTmTest(void) + throw (CPPUNIT_NS::Exception) +{ + struct tm tm; + Ptr::Ref pTime(new ptime(time_from_string("1770-12-17 10:20:30"))); + + TimeConversion::ptimeToTm(pTime, tm); + CPPUNIT_ASSERT(tm.tm_year + 1900 == 1770); + CPPUNIT_ASSERT(tm.tm_mon + 1 == 12); + CPPUNIT_ASSERT(tm.tm_mday == 17); + CPPUNIT_ASSERT(tm.tm_hour == 10); + CPPUNIT_ASSERT(tm.tm_min == 20); + CPPUNIT_ASSERT(tm.tm_sec == 30); +} + + +/*------------------------------------------------------------------------------ + * Test the now function + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: nowTest(void) + throw (CPPUNIT_NS::Exception) +{ + struct tm tm; + time_t tTime; + Ptr::Ref pTime; + + tTime = time(0); + pTime = TimeConversion::now(); + + localtime_r(&tTime, &tm); + + // the below checking is a bit phone, what if the two times actually + // spill over the second barrier (or, for that instance, the year + // barrier?) + CPPUNIT_ASSERT(pTime->date().year() == (1900 + tm.tm_year)); + CPPUNIT_ASSERT(pTime->date().month() == (1 + tm.tm_mon)); + CPPUNIT_ASSERT(pTime->date().day() == tm.tm_mday); + CPPUNIT_ASSERT(pTime->time_of_day().hours() == tm.tm_hour); + CPPUNIT_ASSERT(pTime->time_of_day().minutes() == tm.tm_min); + CPPUNIT_ASSERT(pTime->time_of_day().seconds() == tm.tm_sec); +} + + +/*------------------------------------------------------------------------------ + * Test the sleep function + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: sleepTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref start; + Ptr::Ref end; + Ptr::Ref duration; + + duration.reset(new time_duration(seconds(2))); + + start = TimeConversion::now(); + TimeConversion::sleep(duration); + end = TimeConversion::now(); + + CPPUNIT_ASSERT((*end - *start) >= *duration); +} + + +/*------------------------------------------------------------------------------ + * Test the time_duration to string conversions + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: durationToStringTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref duration; + Ptr::Ref smilString; + Ptr::Ref hhMmSsString; + Ptr::Ref shortString; + + + duration.reset(new time_duration(duration_from_string("01:02:03.503700"))); + smilString = TimeConversion::timeDurationToSmilString(duration); + CPPUNIT_ASSERT_EQUAL(std::string("3723.504s"), *smilString); + + hhMmSsString = TimeConversion::timeDurationToHhMmSsString(duration); + CPPUNIT_ASSERT_EQUAL(std::string("01:02:04"), *hhMmSsString); + + shortString = TimeConversion::timeDurationToShortString(duration); + CPPUNIT_ASSERT_EQUAL(std::string("1:02:03.5037"), *shortString); + + duration.reset(new time_duration(duration_from_string("111:22:33"))); + hhMmSsString = TimeConversion::timeDurationToHhMmSsString(duration); + CPPUNIT_ASSERT_EQUAL(std::string("111:22:33"), *hhMmSsString); + shortString = TimeConversion::timeDurationToShortString(duration); + CPPUNIT_ASSERT_EQUAL(std::string("111:22:33"), *shortString); + + duration.reset(new time_duration(duration_from_string("00:01:02.500000"))); + shortString = TimeConversion::timeDurationToShortString(duration); + CPPUNIT_ASSERT_EQUAL(std::string("1:02.5"), *shortString); + + duration.reset(new time_duration(duration_from_string("00:00:02.001000"))); + shortString = TimeConversion::timeDurationToShortString(duration); + CPPUNIT_ASSERT_EQUAL(std::string("2.001"), *shortString); +} + + +/*------------------------------------------------------------------------------ + * Test the parseTimeDuration() function. + *----------------------------------------------------------------------------*/ +void +TimeConversionTest :: parseTimeDurationTest(void) + throw (CPPUNIT_NS::Exception) +{ + // legal arguments + Ptr::Ref timeString(new std::string("01:02:03.503700")); + Ptr::Ref duration; + CPPUNIT_ASSERT_NO_THROW( + duration = TimeConversion::parseTimeDuration(timeString) + ); + CPPUNIT_ASSERT(duration); + CPPUNIT_ASSERT_EQUAL(std::string("01:02:03.503700"), + to_simple_string(*duration)); + + timeString.reset(new std::string("02:03.5")); + CPPUNIT_ASSERT_NO_THROW( + duration = TimeConversion::parseTimeDuration(timeString) + ); + CPPUNIT_ASSERT(duration); + CPPUNIT_ASSERT_EQUAL(std::string("00:02:03.500000"), + to_simple_string(*duration)); + + timeString.reset(new std::string("77")); + CPPUNIT_ASSERT_NO_THROW( + duration = TimeConversion::parseTimeDuration(timeString) + ); + CPPUNIT_ASSERT(duration); + CPPUNIT_ASSERT_EQUAL(std::string("00:01:17"), + to_simple_string(*duration)); + + // illegal arguments + timeString.reset(new std::string("5 minutes and 2 seconds")); + CPPUNIT_ASSERT_NO_THROW( + duration = TimeConversion::parseTimeDuration(timeString) + ); + CPPUNIT_ASSERT(duration); + CPPUNIT_ASSERT_EQUAL(std::string("00:00:05"), // bad! + to_simple_string(*duration)); + + timeString.reset(new std::string("1.2.3")); + CPPUNIT_ASSERT_NO_THROW( + duration = TimeConversion::parseTimeDuration(timeString) + ); + CPPUNIT_ASSERT(duration); + CPPUNIT_ASSERT_EQUAL(std::string("00:00:01.000002"), // bad! + to_simple_string(*duration)); +} + diff --git a/campcaster/src/modules/core/src/TimeConversionTest.h b/campcaster/src/modules/core/src/TimeConversionTest.h new file mode 100644 index 000000000..9c83141b8 --- /dev/null +++ b/campcaster/src/modules/core/src/TimeConversionTest.h @@ -0,0 +1,162 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef TimeConversionTest_h +#define TimeConversionTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the TimeConversion class. + * + * @author $Author$ + * @version $Revision$ + * @see TimeConversion + */ +class TimeConversionTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(TimeConversionTest); + CPPUNIT_TEST(timevalToPtimeTest); + CPPUNIT_TEST(tmToPtimeTest); + CPPUNIT_TEST(ptimeToTmTest); + CPPUNIT_TEST(nowTest); + CPPUNIT_TEST(sleepTest); + CPPUNIT_TEST(durationToStringTest); + CPPUNIT_TEST(parseTimeDurationTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * Test conversion from struct timeval to ptime + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + timevalToPtimeTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test conversion from struct tm to ptime + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + tmToPtimeTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test conversion from ptime to struct tm + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + ptimeToTmTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the now function. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + nowTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the sleep function. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + sleepTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the time_duration to string conversions + * functions. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + durationToStringTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the parseTimeDuration() function. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + parseTimeDurationTest(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 Core +} // namespace LiveSupport + +#endif // TimeConversionTest_h + diff --git a/campcaster/src/modules/core/src/UniqueId.cxx b/campcaster/src/modules/core/src/UniqueId.cxx new file mode 100644 index 000000000..3e8fb2dff --- /dev/null +++ b/campcaster/src/modules/core/src/UniqueId.cxx @@ -0,0 +1,79 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Uuid.h" +#include "LiveSupport/Core/Md5.h" +#include "LiveSupport/Core/UniqueId.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Generate a globally unique id. + *----------------------------------------------------------------------------*/ +Ptr::Ref +UniqueId :: generateId(void) throw () +{ + Ptr::Ref uuid = Uuid::generateId(); + // as uuid is 128 bits, but we have only 63 bits, create an md5 hash + // (which is still 128 bits), and use its values to create a 63 value + // hopefully this is unique enough + Md5 md5((std::string)*uuid); + uint64_t idValue; + + idValue = md5.high64bits(); + idValue += md5.low64bits(); + // make sure it's 63 bits only, so that signed 64 bit containers can + // also accept it + idValue &= 0x7fffffffffffffffLL; + + Ptr::Ref id(new UniqueId(idValue)); + + return id; +} + diff --git a/campcaster/src/modules/core/src/UniqueIdTest.cxx b/campcaster/src/modules/core/src/UniqueIdTest.cxx new file mode 100644 index 000000000..5c99dc145 --- /dev/null +++ b/campcaster/src/modules/core/src/UniqueIdTest.cxx @@ -0,0 +1,135 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/UniqueId.h" +#include "UniqueIdTest.h" + + +using namespace std; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(UniqueIdTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +UniqueIdTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +UniqueIdTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +UniqueIdTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + UniqueId::IdType idNumeric = 51966; + std::string idAsString = "000000000000cafe"; + Ptr::Ref id; + + id.reset(new UniqueId(idNumeric)); + CPPUNIT_ASSERT(id->getId() == idNumeric); + CPPUNIT_ASSERT(UniqueId::IdType(*id) == idNumeric); + CPPUNIT_ASSERT(std::string(*id) == idAsString); + + id.reset(new UniqueId(idAsString)); + CPPUNIT_ASSERT(id->getId() == idNumeric); + CPPUNIT_ASSERT(UniqueId::IdType(*id) == idNumeric); + CPPUNIT_ASSERT(std::string(*id) == idAsString); + + id = UniqueId::generateId(); + idNumeric = UniqueId::IdType(*id); + idAsString = std::string(*id); + std::stringstream idReader(idAsString); + UniqueId::IdType idNumericCheck; + idReader >> std::hex >> idNumericCheck; + CPPUNIT_ASSERT(idNumeric == idNumericCheck); + + // OK if initialized with bad strings, but the integral value is bogus + std::string idAsVeryLongString = "123456789abcdef0123456789abcdef0"; + id.reset(new UniqueId(idAsVeryLongString)); + CPPUNIT_ASSERT(std::string(*id) == idAsVeryLongString); + + std::string idAsSillyString = "this is not a number"; + id.reset(new UniqueId(idAsSillyString)); + CPPUNIT_ASSERT(std::string(*id) == idAsSillyString); + +/* // this works fine, but please don't use + UniqueId::IdType idSillyNumeric = -3; + id.reset(new UniqueId(idSillyNumeric)); + CPPUNIT_ASSERT(UniqueId::IdType(*id) == idSillyNumeric); + CPPUNIT_ASSERT(std::string(*id) == "fffffffffffffffd"); */ + + // this is used in Postgresql classes, because Long does not get properly + // typedef'd to long long -- can be removed after this bug is fixed + std::string idAsDecimalString = "65546"; + id = UniqueId::fromDecimalString(idAsDecimalString); + CPPUNIT_ASSERT(id->getId() == 65546); + CPPUNIT_ASSERT(*id->toDecimalString() == idAsDecimalString); +} + diff --git a/campcaster/src/modules/core/src/UniqueIdTest.h b/campcaster/src/modules/core/src/UniqueIdTest.h new file mode 100644 index 000000000..0ac167ad3 --- /dev/null +++ b/campcaster/src/modules/core/src/UniqueIdTest.h @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef UniqueIdTest_h +#define UniqueIdTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the UniqueId class. + * + * @author $Author$ + * @version $Revision$ + * @see UniqueId + */ +class UniqueIdTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(UniqueIdTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 Core +} // namespace LiveSupport + +#endif // UniqueIdTest_h + diff --git a/campcaster/src/modules/core/src/Uuid.cxx b/campcaster/src/modules/core/src/Uuid.cxx new file mode 100644 index 000000000..18cda1a50 --- /dev/null +++ b/campcaster/src/modules/core/src/Uuid.cxx @@ -0,0 +1,318 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_SYS_TIME_H +#include +#else +#error need sys/time.h +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#error need unistd.h +#endif + + +#include +#include +#include + +#include "LiveSupport/Core/Uuid.h" + + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * Set the following to the number of 100ns ticks of the actual + * resolution of your system's clock + *----------------------------------------------------------------------------*/ +#define UUIDS_PER_TICK 1024 + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Generate a globally unique id. + *----------------------------------------------------------------------------*/ +Ptr::Ref +Uuid :: generateId(void) throw () +{ + Ptr::Ref id(new Uuid()); + + UuidTime timestamp; + UuidTime lastTime; + uint16_t clockseq; + UuidNode node; + UuidNode lastNode; + int f; + + /* acquire system wide lock so we're alone */ + //LOCK; + + /* get current time */ + getCurrentTime(×tamp); + + /* get node ID */ + getIeeeNodeIdentifier(&node); + + /* get saved state from NV storage */ + f = id->readState(&clockseq, &lastTime, &lastNode); + + /* if no NV state, or if clock went backwards, or node ID changed + (e.g., net card swap) change clockseq */ + if (!f || memcmp(&node, &lastNode, sizeof(UuidNode))) { + clockseq = trueRandom(); + } else if (timestamp < lastTime) { + clockseq++; + } + + /* stuff fields into the UUID */ + id->format(clockseq, timestamp, node); + id->representAsString(); + + /* save the state for next time */ + id->writeState(clockseq, timestamp, node); + + //UNLOCK; + + return id; +} + + +/*------------------------------------------------------------------------------ + * Format the UUID + *----------------------------------------------------------------------------*/ +void +Uuid :: format(uint16_t clockSeq, + UuidTime timestamp, + UuidNode node) throw () +{ + /* Construct a version 1 uuid with the information we've gathered + * plus a few constants. */ + timeLow = (unsigned long)(timestamp & 0xFFFFFFFF); + timeMid = (unsigned short)((timestamp >> 32) & 0xFFFF); + timeHiAndVersion = (unsigned short)((timestamp >> 48) & 0x0FFF); + timeHiAndVersion |= (1 << 12); + clockSeqLow = clockSeq & 0xFF; + clockSeqHiAndReserved = (clockSeq & 0x3F00) >> 8; + clockSeqHiAndReserved |= 0x80; + + for (int i = 0; i < 6; ++i) { + this->node[i] = node.nodeId[i]; + } +} + + +/*------------------------------------------------------------------------------ + * Create a string representation of the UUID + *----------------------------------------------------------------------------*/ +void +Uuid :: representAsString(void) throw () +{ + std::stringstream sstr; + + sstr << std::hex << std::setw(8) << std::setfill('0') << timeLow << '-' + << std::hex << std::setw(4) << std::setfill('0') << timeMid << '-' + << std::hex << std::setw(4) << std::setfill('0') + << timeHiAndVersion << '-' + << std::hex << std::setw(2) << std::setfill('0') + << (unsigned short) clockSeqHiAndReserved << '-' + << std::hex << std::setw(2) << std::setfill('0') + << (unsigned short) clockSeqLow << '-'; + for (int i = 0; i < 6; ++i) { + sstr << std::hex << std::setw(2) << std::setfill('0') + << (unsigned short) this->node[i]; + } + + idAsString = sstr.str(); +} + + +/*------------------------------------------------------------------------------ + * Read the current state from non-volatile storage + *----------------------------------------------------------------------------*/ +int +Uuid :: readState(uint16_t * clockSeq, + UuidTime * timestamp, + UuidNode * node) throw () +{ + // TODO: read the state from non-volatile storage + + return 0; +} + + +/*------------------------------------------------------------------------------ + * Write the current state to non-volatile storage + *----------------------------------------------------------------------------*/ +void +Uuid :: writeState(uint16_t clockSeq, + UuidTime timestamp, + UuidNode node) throw () +{ + // TODO: write the current state to non-volatile storage +} + + +/*------------------------------------------------------------------------------ + * Get the current time into a timestamp + *----------------------------------------------------------------------------*/ +void +Uuid :: getCurrentTime(UuidTime *timestamp) throw () +{ + UuidTime timeNow; + static UuidTime timeLast; + static uint16_t uuidsThisTick; + static bool inited = false; + + if (!inited) { + getSystemTime(&timeNow); + uuidsThisTick = UUIDS_PER_TICK; + inited = true; + }; + + while (true) { + getSystemTime(&timeNow); + + /* if clock reading changed since last UUID generated... */ + if (timeLast != timeNow) { + /* reset count of uuids gen'd with this clock reading */ + uuidsThisTick = 0; + break; + }; + if (uuidsThisTick < UUIDS_PER_TICK) { + uuidsThisTick++; + break; + }; + /* going too fast for our clock; spin */ + }; + + /* add the count of uuids to low order bits of the clock reading */ + *timestamp = timeNow + uuidsThisTick; +} + + +/*------------------------------------------------------------------------------ + * Get the system time in the UUID UTC base time, which is October 15, 1582 + *----------------------------------------------------------------------------*/ +void +Uuid :: getSystemTime(UuidTime * uuidTime) throw () +{ + struct timeval tp; + + gettimeofday(&tp, (struct timezone *)0); + + /* Offset between UUID formatted times and Unix formatted times. + UUID UTC base time is October 15, 1582. + Unix base time is January 1, 1970. + */ + *uuidTime = (tp.tv_sec * 10000000) + + (tp.tv_usec * 10) + + 0x01B21DD213814000LL; +} + + +/*------------------------------------------------------------------------------ + * Get the IEEE node identifier + *----------------------------------------------------------------------------*/ +void +Uuid :: getIeeeNodeIdentifier(UuidNode * node) throw () +{ + long hostId = gethostid(); + + node->nodeId[5] = (char) (hostId & 0x0000000000ffL); + node->nodeId[4] = (char) ((hostId & 0x00000000ff00L) >> 8); + node->nodeId[3] = (char) ((hostId & 0x000000ff0000L) >> 16); + node->nodeId[2] = (char) ((hostId & 0x0000ff000000L) >> 24); + // these will be 0, as the returned node is only 32 bits + node->nodeId[1] = 0; + node->nodeId[0] = 0; +} + + +/*------------------------------------------------------------------------------ + * Generate a random number + *----------------------------------------------------------------------------*/ +uint16_t +Uuid :: trueRandom(void) throw () +{ + static bool inited = false; + UuidTime timeNow; + + if (!inited) { + getSystemTime(&timeNow); + timeNow = timeNow/UUIDS_PER_TICK; + srand((unsigned int)(((timeNow >> 32) ^ timeNow)&0xffffffff)); + inited = true; + }; + + return rand(); +} + + +/*------------------------------------------------------------------------------ + * Compare two ids. + *----------------------------------------------------------------------------*/ +bool +Uuid :: compare(const Uuid & id1, + const Uuid & id2) throw () +{ + if (!(id1.timeLow == id2.timeLow + && id1.timeMid == id2.timeMid + && id1.timeHiAndVersion == id2.timeHiAndVersion + && id1.clockSeqHiAndReserved == id2.clockSeqHiAndReserved + && id1.clockSeqLow == id2.clockSeqLow)) { + + return false; + } + + for (int i = 0; i < 6; ++i) { + if (id1.node[i] != id2.node[i]) { + return false; + } + } + + return true; +} + diff --git a/campcaster/src/modules/core/src/UuidTest.cxx b/campcaster/src/modules/core/src/UuidTest.cxx new file mode 100644 index 000000000..6445b9f60 --- /dev/null +++ b/campcaster/src/modules/core/src/UuidTest.cxx @@ -0,0 +1,99 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/Uuid.h" +#include "UuidTest.h" + + +using namespace std; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(UuidTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +UuidTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +UuidTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +UuidTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref id1; + Ptr::Ref id2; + + id1 = Uuid::generateId(); + id2 = Uuid::generateId(); + + CPPUNIT_ASSERT(*id1 != *id2); +} + diff --git a/campcaster/src/modules/core/src/UuidTest.h b/campcaster/src/modules/core/src/UuidTest.h new file mode 100644 index 000000000..e1d10e8db --- /dev/null +++ b/campcaster/src/modules/core/src/UuidTest.h @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef UuidTest_h +#define UuidTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the Uuid class. + * + * @author $Author$ + * @version $Revision$ + * @see Uuid + */ +class UuidTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(UuidTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 Core +} // namespace LiveSupport + +#endif // UuidTest_h + diff --git a/campcaster/src/modules/core/src/XmlRpcException.cxx b/campcaster/src/modules/core/src/XmlRpcException.cxx new file mode 100644 index 000000000..83219e456 --- /dev/null +++ b/campcaster/src/modules/core/src/XmlRpcException.cxx @@ -0,0 +1,65 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/XmlRpcException.h" + +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +XmlRpcException :: XmlRpcException(const std::string & msg, + const std::exception & parent) + throw () + : parent(parent) +{ + message.reset(new std::string(msg)); + message->append("\nparent exception:\n"); + message->append(parent.what()); +} + diff --git a/campcaster/src/modules/core/src/XmlRpcTools.cxx b/campcaster/src/modules/core/src/XmlRpcTools.cxx new file mode 100644 index 000000000..68cc24fc4 --- /dev/null +++ b/campcaster/src/modules/core/src/XmlRpcTools.cxx @@ -0,0 +1,1099 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_TIME_H +#include +#else +#error need time.h +#endif + + +#include +#include "LiveSupport/Core/TimeConversion.h" + +#include "LiveSupport/Core/XmlRpcTools.h" + + +using namespace boost; +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* =================================================== local data structures */ + +namespace { + +/*------------------------------------------------------------------------------ + * The name of the generic ID member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string idName = "id"; + +/*------------------------------------------------------------------------------ + * The name of the playlist ID member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string playlistIdName = "playlistId"; + +/*------------------------------------------------------------------------------ + * The name of the audio clip ID member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string audioClipIdName = "audioClipId"; + +/*------------------------------------------------------------------------------ + * The name of the playlist element ID member in the XML-RPC param structure + *----------------------------------------------------------------------------*/ +const std::string playlistElementIdName = "playlistElementId"; + +/*------------------------------------------------------------------------------ + * The name of the relative offset member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string relativeOffsetName = "relativeOffset"; + +/*------------------------------------------------------------------------------ + * The name of the from member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string fromTimeName = "from"; + +/*------------------------------------------------------------------------------ + * The name of the to member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string toTimeName = "to"; + +/*------------------------------------------------------------------------------ + * The name of the start member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string startTimeName = "start"; + +/*------------------------------------------------------------------------------ + * The name of the end member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string endTimeName = "end"; + +/*------------------------------------------------------------------------------ + * The name of the schedule entry id member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string scheduleEntryIdName = "scheduleEntryId"; + +/*------------------------------------------------------------------------------ + * The name of the playtime member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string playtimeName = "playtime"; + +/*------------------------------------------------------------------------------ + * The name of the fade in member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string fadeInName = "fadeIn"; + +/*------------------------------------------------------------------------------ + * The name of the fade out member in the XML-RPC parameter structure. + *----------------------------------------------------------------------------*/ +const std::string fadeOutName = "fadeOut"; + +/*------------------------------------------------------------------------------ + * The name of the session ID member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string sessionIdName = "sessionId"; + +/*------------------------------------------------------------------------------ + * The name of the login name member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string loginName = "login"; + +/*------------------------------------------------------------------------------ + * The name of the password member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string passwordName = "password"; + +/*------------------------------------------------------------------------------ + * The name of the search criteria member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string searchCriteriaName = "criteria"; + +/*------------------------------------------------------------------------------ + * The name of the token member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string tokenName = "token"; + +/*------------------------------------------------------------------------------ + * The name of the backup status member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string backupStatusName = "status"; + +/*------------------------------------------------------------------------------ + * The name of the URL member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string urlName = "url"; + +/*------------------------------------------------------------------------------ + * The name of the path member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string pathName = "path"; + +/*------------------------------------------------------------------------------ + * The name of the fault string member in the XML-RPC parameter structure + *----------------------------------------------------------------------------*/ +const std::string faultStringName = "faultString"; + +} + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Extract the schedule entry ID from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractScheduleEntryId( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(scheduleEntryIdName) + || xmlRpcValue[scheduleEntryIdName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad schedule entry ID " + "argument"); + } + + Ptr::Ref id(new UniqueId(std::string( + xmlRpcValue[scheduleEntryIdName] ))); + return id; +} + + +/*------------------------------------------------------------------------------ + * Extract the generic ID from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(idName) + || xmlRpcValue[idName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad ID argument"); + } + + Ptr::Ref id(new UniqueId(std::string(xmlRpcValue[idName]))); + return id; +} + + +/*------------------------------------------------------------------------------ + * Extract the playlist ID from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractPlaylistId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(playlistIdName) + || xmlRpcValue[playlistIdName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad playlist ID argument"); + } + + Ptr::Ref id(new UniqueId(std::string( + xmlRpcValue[playlistIdName] ))); + return id; +} + + +/*------------------------------------------------------------------------------ + * Extract the playlist element ID from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractPlaylistElementId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(playlistElementIdName) + || xmlRpcValue[playlistElementIdName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad playlist element ID " + "argument"); + } + + Ptr::Ref id(new UniqueId(std::string( + xmlRpcValue[playlistElementIdName] ))); + return id; +} + + +/*------------------------------------------------------------------------------ + * Extract the audio clip ID from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractAudioClipId(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(audioClipIdName) + || xmlRpcValue[audioClipIdName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad audio clip ID argument"); + } + + Ptr::Ref id(new UniqueId(std::string( + xmlRpcValue[audioClipIdName] ))); + return id; +} + + +/*------------------------------------------------------------------------------ + * Extract the relative offset from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractRelativeOffset(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(relativeOffsetName) + || xmlRpcValue[relativeOffsetName].getType() + != XmlRpc::XmlRpcValue::TypeInt) { + throw std::invalid_argument("missing relative offset argument"); + } + + Ptr::Ref relativeOffset(new time_duration(0,0, + int(xmlRpcValue[relativeOffsetName]), 0)); + return relativeOffset; +} + + +/*------------------------------------------------------------------------------ + * Convert a Playlist to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: playlistToXmlRpcValue( + Ptr::Ref playlist, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw () +{ + xmlRpcValue["playlist"] = std::string(*playlist->getXmlDocumentString()); +} + + +/*------------------------------------------------------------------------------ + * Convert a vector of Playlists into an XML-RPC value. + * This function returns an XML-RPC array of XML-RPC structures. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: playlistVectorToXmlRpcValue( + const Ptr::Ref> >::Ref playlistVector, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue.setSize(playlistVector->size()); + // a call to setSize() makes sure it's an XML-RPC + // array + + std::vector::Ref>::const_iterator it = + playlistVector->begin(); + int arraySize = 0; + while (it != playlistVector->end()) { + Ptr::Ref playlist = *it; + XmlRpc::XmlRpcValue returnStruct; + playlistToXmlRpcValue(playlist, returnStruct); + returnValue[arraySize++] = returnStruct; + ++it; + } +} + + +/*------------------------------------------------------------------------------ + * Convert an AudioClip to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: audioClipToXmlRpcValue( + Ptr::Ref audioClip, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw () +{ + xmlRpcValue["audioClip"] = std::string(*audioClip->getXmlDocumentString()); +} + + +/*------------------------------------------------------------------------------ + * Convert a vector of AudioClips into an XML-RPC value. + * This function returns an XML-RPC array of XML-RPC structures. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: audioClipVectorToXmlRpcValue( + const Ptr::Ref> >::Ref audioClipVector, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue.setSize(audioClipVector->size()); + // a call to setSize() makes sure it's an XML-RPC + // array + + std::vector::Ref>::const_iterator it = + audioClipVector->begin(); + int arraySize = 0; + while (it != audioClipVector->end()) { + Ptr::Ref audioClip = *it; + XmlRpc::XmlRpcValue returnStruct; + audioClipToXmlRpcValue(audioClip, returnStruct); + returnValue[arraySize++] = returnStruct; + ++it; + } +} + + +/*------------------------------------------------------------------------------ + * Extract a Playlist from an XML-RPC parameter. + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractPlaylist(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + Ptr::Ref playlist(new Playlist(xmlRpcValue)); + // may throw std::invalid_argument + return playlist; +} + + +/*------------------------------------------------------------------------------ + * Extract a vector of Playlists from an XML-RPC parameter. + *----------------------------------------------------------------------------*/ +Ptr::Ref> >::Ref +XmlRpcTools :: extractPlaylistVector(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (xmlRpcValue.getType() != XmlRpc::XmlRpcValue::TypeArray) { + throw std::invalid_argument("argument to extractPlaylistVector " + "is not an array"); + } + + Ptr::Ref> >::Ref playlistVector; + for (int i=0; i < xmlRpcValue.size(); i++) { + Ptr::Ref playlist(new Playlist(xmlRpcValue[i])); + // may throw std::invalid_argument + playlistVector->push_back(playlist); + } + return playlistVector; +} + + +/*------------------------------------------------------------------------------ + * Extract an AudioClip from an XML-RPC parameter. + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractAudioClip(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + Ptr::Ref audioClip(new AudioClip(xmlRpcValue)); + // may throw std::invalid_argument + return audioClip; +} + + +/*------------------------------------------------------------------------------ + * Extract a vector of AudioClips from an XML-RPC parameter. + *----------------------------------------------------------------------------*/ +Ptr::Ref> >::Ref +XmlRpcTools :: extractAudioClipVector(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (xmlRpcValue.getType() != XmlRpc::XmlRpcValue::TypeArray) { + throw std::invalid_argument("argument to extractAudioClipVector " + "is not an array"); + } + + Ptr::Ref> >::Ref audioClipVector; + for (int i=0; i < xmlRpcValue.size(); i++) { + Ptr::Ref audioClip(new AudioClip(xmlRpcValue[i])); + // may throw std::invalid_argument + audioClipVector->push_back(audioClip); + } + return audioClipVector; +} + + +/*------------------------------------------------------------------------------ + * Convert an error code, error message pair to an XML-RPC fault response + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: markError(int errorCode, const std::string errorMessage, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (XmlRpc::XmlRpcException) +{ + throw XmlRpc::XmlRpcException(errorMessage, errorCode); +} + + +/*------------------------------------------------------------------------------ + * Convert the valid status of a playlist to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: validStatusToXmlRpcValue( + bool validStatus, + XmlRpc::XmlRpcValue & xmlRpcValue) + throw () +{ + xmlRpcValue["valid"] = XmlRpc::XmlRpcValue(validStatus); +} + + +/*------------------------------------------------------------------------------ + * Extract the 'from' time from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractFromTime( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(fromTimeName) + || xmlRpcValue[fromTimeName].getType() + != XmlRpc::XmlRpcValue::TypeDateTime) { + throw std::invalid_argument("missing or bad 'from' time in " + "parameter structure"); + } + + struct tm time = (struct tm) xmlRpcValue[fromTimeName]; + return TimeConversion::tmToPtime(&time); +} + + +/*------------------------------------------------------------------------------ + * Extract the 'to' time from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractToTime( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(toTimeName) + || xmlRpcValue[toTimeName].getType() + != XmlRpc::XmlRpcValue::TypeDateTime) { + throw std::invalid_argument("missing or bad 'to' time in " + "parameter structure"); + } + + struct tm time = (struct tm) xmlRpcValue[toTimeName]; + return TimeConversion::tmToPtime(&time); +} + + +/*------------------------------------------------------------------------------ + * Extract the 'start' time from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractStartTime( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(startTimeName) + || xmlRpcValue[startTimeName].getType() + != XmlRpc::XmlRpcValue::TypeDateTime) { + throw std::invalid_argument("missing or bad 'start' time in " + "parameter structure"); + } + + struct tm time = (struct tm) xmlRpcValue[startTimeName]; + return TimeConversion::tmToPtime(&time); +} + + +/*------------------------------------------------------------------------------ + * Extract the 'end' time from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractEndTime( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(endTimeName) + || xmlRpcValue[endTimeName].getType() + != XmlRpc::XmlRpcValue::TypeDateTime) { + throw std::invalid_argument("missing or bad 'end' time in " + "parameter structure"); + } + + struct tm time = (struct tm) xmlRpcValue[endTimeName]; + return TimeConversion::tmToPtime(&time); +} + + +/*------------------------------------------------------------------------------ + * Convert a boost::posix_time::ptime to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: ptimeToXmlRpcValue( + Ptr::Ref ptimeParam, + XmlRpc::XmlRpcValue& xmlRpcValue) + throw () +{ + struct tm time; + Ptr::Ref myPtime(new ptime(*ptimeParam)); // get rid of const + + TimeConversion::ptimeToTm(myPtime, time); + xmlRpcValue = XmlRpc::XmlRpcValue(&time); +} + + +/*------------------------------------------------------------------------------ + * Convert a vector of ScheduleEntries into an XML-RPC value. + * This function returns an XML-RPC array of XML-RPC structures. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: scheduleEntriesToXmlRpcValue( + Ptr::Ref> >::Ref scheduleEntries, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue.setSize(scheduleEntries->size()); + // a call to setSize() makes sure it's an XML-RPC + // array + + std::vector::Ref>::iterator it + = scheduleEntries->begin(); + int arraySize = 0; + while (it != scheduleEntries->end()) { + Ptr::Ref entry = *it; + XmlRpc::XmlRpcValue returnStruct; + returnStruct[idName] = std::string(*entry->getId()); + returnStruct[playlistIdName] = std::string(*entry->getPlaylistId()); + + XmlRpc::XmlRpcValue time; + ptimeToXmlRpcValue(entry->getStartTime(), time); + returnStruct[startTimeName] = time; + + ptimeToXmlRpcValue(entry->getEndTime(), time); + returnStruct[endTimeName] = time; + + returnValue[arraySize++] = returnStruct; + ++it; + } +} + + +/*------------------------------------------------------------------------------ + * Convert an XML-RPC value, holding an array of schedule entries + * to a vector holding the same ScheduleEntry object. + *----------------------------------------------------------------------------*/ +Ptr::Ref> >::Ref +XmlRpcTools :: extractScheduleEntries( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw () +{ + Ptr::Ref> >::Ref entries; + entries.reset(new std::vector::Ref>()); + + int nEntries = xmlRpcValue.size(); + for (int i = 0; i < nEntries; ++i) { + XmlRpc::XmlRpcValue & entryValue = xmlRpcValue[i]; + + Ptr::Ref entryId = extractId(entryValue); + Ptr::Ref playlistId = extractPlaylistId(entryValue); + Ptr::Ref start = extractStartTime(entryValue); + Ptr::Ref end = extractEndTime(entryValue); + + Ptr::Ref entry(new ScheduleEntry(entryId, + playlistId, + start, + end)); + + entries->push_back(entry); + } + + return entries; +} + + +/*------------------------------------------------------------------------------ + * Extract the playtime from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractPlayschedule( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(playtimeName) + || xmlRpcValue[playtimeName].getType() + != XmlRpc::XmlRpcValue::TypeDateTime) { + throw std::invalid_argument("missing or bad playtime in " + "parameter structure"); + } + + struct tm time = (struct tm) xmlRpcValue[playtimeName]; + return TimeConversion::tmToPtime(&time); +} + + +/*------------------------------------------------------------------------------ + * Extract the fade in time from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractFadeIn(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(fadeInName) + || xmlRpcValue[fadeInName].getType() + != XmlRpc::XmlRpcValue::TypeInt) { + throw std::invalid_argument("missing or bad 'fade in' argument"); + } + + Ptr::Ref fadeIn(new time_duration(0,0, + int(xmlRpcValue[fadeInName]), 0)); + return fadeIn; +} + + +/*------------------------------------------------------------------------------ + * Extract the fade out time from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractFadeOut(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(fadeOutName) + || xmlRpcValue[fadeOutName].getType() + != XmlRpc::XmlRpcValue::TypeInt) { + throw std::invalid_argument("missing or bad 'fade out' argument"); + } + + Ptr::Ref fadeOut(new time_duration(0,0, + int(xmlRpcValue[fadeOutName]), 0)); + return fadeOut; +} + + +/*------------------------------------------------------------------------------ + * Convert a schedule entry ID (a UniqueId) to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: scheduleEntryIdToXmlRpcValue( + Ptr::Ref scheduleEntryId, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[scheduleEntryIdName] = std::string(*scheduleEntryId); +} + + +/*------------------------------------------------------------------------------ + * Add a session ID to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: sessionIdToXmlRpcValue( + Ptr::Ref sessionId, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[sessionIdName] = sessionId->getId(); +} + + +/*------------------------------------------------------------------------------ + * Add a playlist ID to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: playlistIdToXmlRpcValue( + Ptr::Ref playlistId, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[playlistIdName] = std::string(*playlistId); +} + + +/*------------------------------------------------------------------------------ + * Add an audio clip ID to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: audioClipIdToXmlRpcValue( + Ptr::Ref audioClipId, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[audioClipIdName] = std::string(*audioClipId); +} + + +/*------------------------------------------------------------------------------ + * Add a playlist element ID to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: playlistElementIdToXmlRpcValue( + Ptr::Ref playlistElementId, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[playlistElementIdName] = std::string(*playlistElementId); +} + + +/*------------------------------------------------------------------------------ + * Add a playtime value to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: playtimeToXmlRpcValue( + Ptr::Ref playtime, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + XmlRpc::XmlRpcValue timestamp; + ptimeToXmlRpcValue(playtime, timestamp); + returnValue[playtimeName] = timestamp; +} + + +/*------------------------------------------------------------------------------ + * Add a 'from' time value to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: fromTimeToXmlRpcValue( + Ptr::Ref from, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + XmlRpc::XmlRpcValue timestamp; + ptimeToXmlRpcValue(from, timestamp); + returnValue[fromTimeName] = timestamp; +} + + +/*------------------------------------------------------------------------------ + * Add a 'to' time value to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: toTimeToXmlRpcValue( + Ptr::Ref to, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + XmlRpc::XmlRpcValue timestamp; + ptimeToXmlRpcValue(to, timestamp); + returnValue[toTimeName] = timestamp; +} + + +/*------------------------------------------------------------------------------ + * Convert a PlayLogEntry to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: playLogEntryToXmlRpcValue( + Ptr::Ref playLogEntry, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue["audioClipId"] = std::string(*playLogEntry->getAudioClipId()); + + XmlRpc::XmlRpcValue timestamp; + ptimeToXmlRpcValue(playLogEntry->getTimestamp(), timestamp); + returnValue["timestamp"] = timestamp; +} + + +/*------------------------------------------------------------------------------ + * Convert a vector of PlayLogEntries into an XML-RPC value. + * This function returns an XML-RPC array of XML-RPC structures. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: playLogVectorToXmlRpcValue( + Ptr::Ref> >::Ref playLogVector, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue.setSize(playLogVector->size()); + // a call to setSize() makes sure it's an XML-RPC + // array + + std::vector::Ref>::const_iterator it = + playLogVector->begin(); + int arraySize = 0; + while (it != playLogVector->end()) { + Ptr::Ref playLog = *it; + XmlRpc::XmlRpcValue returnStruct; + playLogEntryToXmlRpcValue(playLog, returnStruct); + returnValue[arraySize++] = returnStruct; + ++it; + } +} + + +/*------------------------------------------------------------------------------ + * Extract the session ID from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractSessionId( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(sessionIdName) + || xmlRpcValue[sessionIdName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad session ID argument"); + } + + Ptr::Ref id(new SessionId(std::string( + xmlRpcValue[sessionIdName] ))); + return id; +} + + +/*------------------------------------------------------------------------------ + * Extract the login name from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractLoginName( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(loginName) + || xmlRpcValue[loginName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad login name argument"); + } + + Ptr::Ref login(new std::string(xmlRpcValue[loginName])); + return login; +} + + +/*------------------------------------------------------------------------------ + * Extract the password from an XML-RPC function call parameter + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractPassword( + XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(passwordName) + || xmlRpcValue[passwordName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad password argument"); + } + + Ptr::Ref password(new std::string( + xmlRpcValue[passwordName] )); + return password; +} + + +/*------------------------------------------------------------------------------ + * Extract the search criteria from the XML-RPC parameters. + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractSearchCriteria(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(searchCriteriaName) + || xmlRpcValue[searchCriteriaName].getType() + != XmlRpc::XmlRpcValue::TypeStruct) { + throw std::invalid_argument("missing or bad criteria argument"); + } + XmlRpc::XmlRpcValue xmlCriteria = xmlRpcValue[searchCriteriaName]; + + Ptr::Ref criteria(new SearchCriteria(xmlCriteria)); + + return criteria; +} + + +/*------------------------------------------------------------------------------ + * Convert a SearchCriteria to an XmlRpcValue + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: searchCriteriaToXmlRpcValue( + Ptr::Ref criteria, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[searchCriteriaName] = *criteria; +} + + +/*------------------------------------------------------------------------------ + * Extract a token from the XML-RPC parameters. + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractToken(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(tokenName) + || xmlRpcValue[tokenName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad token argument"); + } + + Ptr::Ref token(new Glib::ustring( + xmlRpcValue[tokenName] )); + return token; +} + + +/*------------------------------------------------------------------------------ + * Convert a string token to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: tokenToXmlRpcValue( + Ptr::Ref token, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[tokenName] = std::string(*token); +} + + +/*------------------------------------------------------------------------------ + * Extract the backup status from the XML-RPC parameters. + *----------------------------------------------------------------------------*/ +AsyncState +XmlRpcTools :: extractBackupStatus(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(backupStatusName) + || xmlRpcValue[backupStatusName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad status argument"); + } + + AsyncState status = AsyncState::fromBackupString( + xmlRpcValue[backupStatusName]); + return status; +} + + +/*------------------------------------------------------------------------------ + * Convert a StorageClientInterface::AsyncState returned by one + * of the backup methods to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: backupStatusToXmlRpcValue(AsyncState status, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + Ptr::Ref stringValue = status.toBackupString(); + returnValue[backupStatusName] = *stringValue; +} + + +/*------------------------------------------------------------------------------ + * Extract a URL string from the XML-RPC parameters. + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractUrl(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(urlName) + || xmlRpcValue[urlName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad url argument"); + } + + Ptr::Ref url(new Glib::ustring( + xmlRpcValue[urlName] )); + return url; +} + + +/*------------------------------------------------------------------------------ + * Convert a string token to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: urlToXmlRpcValue( + Ptr::Ref url, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[urlName] = std::string(*url); +} + + +/*------------------------------------------------------------------------------ + * Extract a path string from the XML-RPC parameters. + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractPath(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(pathName) + || xmlRpcValue[pathName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad path argument"); + } + + Ptr::Ref path(new Glib::ustring( + xmlRpcValue[pathName] )); + return path; +} + + +/*------------------------------------------------------------------------------ + * Convert a string token to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: pathToXmlRpcValue( + Ptr::Ref path, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[pathName] = std::string(*path); +} + + +/*------------------------------------------------------------------------------ + * Extract a fault string from the XML-RPC parameters. + *----------------------------------------------------------------------------*/ +Ptr::Ref +XmlRpcTools :: extractFaultString(XmlRpc::XmlRpcValue & xmlRpcValue) + throw (std::invalid_argument) +{ + if (!xmlRpcValue.hasMember(faultStringName) + || xmlRpcValue[faultStringName].getType() + != XmlRpc::XmlRpcValue::TypeString) { + throw std::invalid_argument("missing or bad faultString argument"); + } + + Ptr::Ref faultString(new Glib::ustring( + xmlRpcValue[faultStringName] )); + return faultString; +} + + +/*------------------------------------------------------------------------------ + * Convert a fault string to an XmlRpcValue. + *----------------------------------------------------------------------------*/ +void +XmlRpcTools :: faultStringToXmlRpcValue( + Ptr::Ref faultString, + XmlRpc::XmlRpcValue & returnValue) + throw () +{ + returnValue[faultStringName] = std::string(*faultString); +} + diff --git a/campcaster/src/modules/core/src/XmlRpcToolsTest.cxx b/campcaster/src/modules/core/src/XmlRpcToolsTest.cxx new file mode 100644 index 000000000..53ac498d8 --- /dev/null +++ b/campcaster/src/modules/core/src/XmlRpcToolsTest.cxx @@ -0,0 +1,327 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include +#include + +#include "LiveSupport/Core/XmlRpcTools.h" +#include "XmlRpcToolsTest.h" + + +using namespace LiveSupport::Core; + +using namespace std; +using namespace XmlRpc; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(XmlRpcToolsTest); + +/** + * The name of the configuration file for the playlist. + */ +const std::string configFileName = "etc/playlist.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Configure a Configurable with an XML file. + *----------------------------------------------------------------------------*/ +void +XmlRpcToolsTest :: configure( + Ptr::Ref configurable, + const std::string fileName) + throw (CPPUNIT_NS::Exception) +{ + try { + Ptr::Ref parser( + new xmlpp::DomParser(configFileName, true)); + const xmlpp::Document * document = parser->get_document(); + const xmlpp::Element * root = document->get_root_node(); + + configurable->configure(*root); + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL("semantic error in configuration file"); + } catch (xmlpp::exception &e) { + CPPUNIT_FAIL("error parsing configuration file"); + } +} + + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +XmlRpcToolsTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +XmlRpcToolsTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Just a very simple smoke test + *----------------------------------------------------------------------------*/ +void +XmlRpcToolsTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + XmlRpcValue xmlRpcPlaylist; + XmlRpcValue xmlRpcAudioClip; + Ptr::Ref playlist = Ptr::Ref(new Playlist()); + Ptr::Ref audioClip; + + // set up a playlist instance + configure(playlist, configFileName); + audioClip = playlist->begin()->second->getAudioClip(); + + // run the packing methods + XmlRpcTools :: playlistToXmlRpcValue(playlist, xmlRpcPlaylist); + XmlRpcTools :: audioClipToXmlRpcValue(audioClip, xmlRpcAudioClip); + + CPPUNIT_ASSERT(xmlRpcPlaylist.hasMember("playlist")); + CPPUNIT_ASSERT(xmlRpcPlaylist["playlist"].getType() + == XmlRpcValue::TypeString); + + CPPUNIT_ASSERT(xmlRpcAudioClip.hasMember("audioClip")); + CPPUNIT_ASSERT(xmlRpcAudioClip["audioClip"].getType() + == XmlRpcValue::TypeString); + + XmlRpcValue xmlRpcPlaylistId; + Ptr::Ref playlistId(new UniqueId(rand())); + Ptr::Ref audioClipId(new UniqueId(rand())); + Ptr::Ref relativeOffset(new time_duration(0,0,rand(),0)); + + xmlRpcPlaylistId["playlistId"] = std::string(*playlistId); + xmlRpcPlaylistId["audioClipId"] = std::string(*audioClipId); + xmlRpcPlaylistId["relativeOffset"] = relativeOffset->total_seconds(); + + // run the unpacking methods + Ptr::Ref newPlaylistId; + Ptr::Ref newAudioClipId; + Ptr::Ref newRelativeOffset; + Ptr::Ref newPlaylist; + Ptr::Ref newAudioClip; + try { + newPlaylistId = XmlRpcTools::extractPlaylistId(xmlRpcPlaylistId); + newAudioClipId = XmlRpcTools::extractAudioClipId(xmlRpcPlaylistId); + newRelativeOffset + = XmlRpcTools::extractRelativeOffset(xmlRpcPlaylistId); + newPlaylist = XmlRpcTools::extractPlaylist(xmlRpcPlaylist); + newAudioClip = XmlRpcTools::extractAudioClip(xmlRpcAudioClip); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } + + CPPUNIT_ASSERT(*playlistId == *newPlaylistId); + CPPUNIT_ASSERT(*audioClipId == *newAudioClipId); + CPPUNIT_ASSERT(*relativeOffset == *newRelativeOffset); + + CPPUNIT_ASSERT(*playlist->getId() == *newPlaylist->getId()); + CPPUNIT_ASSERT(*playlist->getTitle() == *newPlaylist->getTitle()); + CPPUNIT_ASSERT(*playlist->getPlaylength() + == *newPlaylist->getPlaylength()); + + CPPUNIT_ASSERT(*audioClip->getId() == *newAudioClip->getId()); + CPPUNIT_ASSERT(*audioClip->getTitle() == *newAudioClip->getTitle()); + CPPUNIT_ASSERT(*audioClip->getPlaylength() + == *newAudioClip->getPlaylength()); +} + + +/*------------------------------------------------------------------------------ + * Testing the search criteria marshaling/demarshaling. + *----------------------------------------------------------------------------*/ +void +XmlRpcToolsTest :: secondTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref token(new Glib::ustring("this is a token")); + XmlRpcValue xmlRpcToken; + + CPPUNIT_ASSERT_NO_THROW( + XmlRpcTools::tokenToXmlRpcValue(token, xmlRpcToken) + ); + + Ptr::Ref otherToken; + CPPUNIT_ASSERT_NO_THROW( + otherToken = XmlRpcTools::extractToken(xmlRpcToken) + ); + CPPUNIT_ASSERT(otherToken); + + CPPUNIT_ASSERT(*token == *otherToken); + + XmlRpcValue otherXmlRpcToken; + CPPUNIT_ASSERT_NO_THROW( + XmlRpcTools::tokenToXmlRpcValue(otherToken, otherXmlRpcToken) + ); + + CPPUNIT_ASSERT(xmlRpcToken == otherXmlRpcToken); +} + + +/*------------------------------------------------------------------------------ + * Testing the search criteria marshaling/demarshaling. + *----------------------------------------------------------------------------*/ +void +XmlRpcToolsTest :: searchCriteriaTest(void) + throw (CPPUNIT_NS::Exception) +{ + std::string xmlStringCriteria = +"" +"" +"criteria" +"" +" " +" filetype" +" audioClip" +" " +" " +" operator" +" or" +" " +" " +" limit" +" 5" +" " +" " +" offset" +" 100" +" " +" " +" conditions" +" " +" " +" " +" cat" +" dc:title" +" " +" " +" op" +" partial" +" " +" " +" val" +" abcdef" +" " +" " +" " +" " +" cat" +" dc:creator" +" " +" " +" op" +" =" +" " +" " +" val" +" ABCDEF" +" " +" " +" " +" " +"" +"" +""; + + XmlRpcValue xmlRpcCriteria; + int offset = 0; + xmlRpcCriteria.fromXml(xmlStringCriteria, &offset); + + Ptr::Ref criteria; + CPPUNIT_ASSERT_NO_THROW( + criteria = XmlRpcTools::extractSearchCriteria(xmlRpcCriteria) + ); + CPPUNIT_ASSERT(criteria); + + XmlRpcValue otherXmlRpcCriteria; + CPPUNIT_ASSERT_NO_THROW( + XmlRpcTools::searchCriteriaToXmlRpcValue(criteria, otherXmlRpcCriteria) + ); + + CPPUNIT_ASSERT(xmlRpcCriteria == otherXmlRpcCriteria); + + Ptr::Ref otherCriteria; + CPPUNIT_ASSERT_NO_THROW( + otherCriteria = XmlRpcTools::extractSearchCriteria(otherXmlRpcCriteria) + ); + CPPUNIT_ASSERT(otherCriteria); + + CPPUNIT_ASSERT(*criteria == *otherCriteria); +} + + +/*------------------------------------------------------------------------------ + * Testing markError() + *----------------------------------------------------------------------------*/ +void +XmlRpcToolsTest :: errorTest(void) + throw (CPPUNIT_NS::Exception) +{ + XmlRpcValue xmlRpcValue; + + try { + XmlRpcTools :: markError(42, "this is an error", xmlRpcValue); + CPPUNIT_FAIL("did not throw exception in markError()"); + } catch (XmlRpc::XmlRpcException &e) { + CPPUNIT_ASSERT(e.getCode() == 42); + CPPUNIT_ASSERT(e.getMessage() == "this is an error"); + } +} + diff --git a/campcaster/src/modules/core/src/XmlRpcToolsTest.h b/campcaster/src/modules/core/src/XmlRpcToolsTest.h new file mode 100644 index 000000000..da6a4988b --- /dev/null +++ b/campcaster/src/modules/core/src/XmlRpcToolsTest.h @@ -0,0 +1,151 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef XmlRpcToolsTest_h +#define XmlRpcToolsTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace Core { + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the XmlRpcTools class. + * + * @author $Author$ + * @version $Revision$ + * @see XmlRpcTools + */ +class XmlRpcToolsTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(XmlRpcToolsTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(secondTest); + CPPUNIT_TEST(searchCriteriaTest); + CPPUNIT_TEST(errorTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Configure a configurable with an XML file. + * + * @param configurable configure this + * @param fileName the name of the XML file to configure with. + * @exception CPPUNIT_NS::Exception on XML parsing errors. + */ + void + configure(Ptr::Ref configurable, + std::string fileName) + throw (CPPUNIT_NS::Exception); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Another simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + secondTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing the search criteria marshaling/demarshaling. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + searchCriteriaTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Testing the method for error message packaging. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + errorTest(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 // XmlRpcToolsTest_h + diff --git a/campcaster/src/modules/core/tmp/.keepme b/campcaster/src/modules/core/tmp/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/core/tmp/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/core/var/.keepme b/campcaster/src/modules/core/var/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/core/var/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/core/var/en.txt b/campcaster/src/modules/core/var/en.txt new file mode 100644 index 000000000..a0b0a6d89 --- /dev/null +++ b/campcaster/src/modules/core/var/en.txt @@ -0,0 +1,7 @@ +en:table +{ + section1:table + { + foo:string { "fou" } + } +} diff --git a/campcaster/src/modules/core/var/hello.tar b/campcaster/src/modules/core/var/hello.tar new file mode 100644 index 000000000..0d2d65d0a Binary files /dev/null and b/campcaster/src/modules/core/var/hello.tar differ diff --git a/campcaster/src/modules/core/var/hu.txt b/campcaster/src/modules/core/var/hu.txt new file mode 100644 index 000000000..894de6442 --- /dev/null +++ b/campcaster/src/modules/core/var/hu.txt @@ -0,0 +1,14 @@ +hu:table +{ + section1:table + { + foo:string { "fú" } + bar:string { "bár" } + } + + metadata:table + { + creator:string { "Előadó" } + } +} + diff --git a/campcaster/src/modules/core/var/jp.txt b/campcaster/src/modules/core/var/jp.txt new file mode 100644 index 000000000..df95b8b0c --- /dev/null +++ b/campcaster/src/modules/core/var/jp.txt @@ -0,0 +1,14 @@ +jp:table +{ + section1:table + { + foo:string { "ふ" } + bar:string { "ばる" } + } + + metadata:table + { + creator:string { "クリエーター" } + } +} + diff --git a/campcaster/src/modules/core/var/md5test.data b/campcaster/src/modules/core/var/md5test.data new file mode 100644 index 000000000..8ad1499cd --- /dev/null +++ b/campcaster/src/modules/core/var/md5test.data @@ -0,0 +1 @@ +some sample data for an MD5 test diff --git a/campcaster/src/modules/core/var/root.txt b/campcaster/src/modules/core/var/root.txt new file mode 100644 index 000000000..c2a668faf --- /dev/null +++ b/campcaster/src/modules/core/var/root.txt @@ -0,0 +1,55 @@ +root:table +{ + section1:table + { + foo:string { "foo" } + bar:string { "bar" } + } + + messages:table + { + aMessage:string { "parameter 0: {0}, parameter 1: {1}" } + aMessage3Args:string { "p0: {0}, p2: {2}, p1: {1}" } + } + + metadata:table + { + title:string { "Title" } + creator:string { "Creator" } + album:string { "Album" } + year:string { "Year" } + genre:string { "Genre" } + description:string { "Description" } + format:string { "Format" } + length:string { "Length" } + bpm:string { "BPM" } + rating:string { "Rating" } + encoded_by:string { "Encoded by" } + track_number:string { "Track number" } + disc_number:string { "Disc number" } + mood:string { "Mood" } + publishing_label:string { "Publishing label" } + composer:string { "Composer" } + bitrate:string { "Bitrate" } + channels:string { "Channels" } + sample_rate:string { "Sample rate" } + encoding_software:string { "Encoding software" } + checksum:string { "Checksum" } + lyrics:string { "Lyrics" } + orchestra_or_band:string { "Orchestra or band" } + conductor:string { "Conductor" } + lyricist:string { "Lyricist" } + original_lyricist:string { "Original lyricist" } + radio_station_name:string { "Radio station name" } + audio_file_info_url:string { "File info web page" } + artist_url:string { "Artist web page" } + audio_source_url:string { "Source web page" } + radio_station_url:string { "Radio station web page" } + buy_cd_url:string { "Buy CD web page" } + isrc_number:string { "ISRC number" } + catalog_number:string { "Catalog number" } + original_artist:string { "Original artist" } + copyright:string { "Copyright" } + } +} + diff --git a/campcaster/src/modules/core/var/test10001.mp3 b/campcaster/src/modules/core/var/test10001.mp3 new file mode 100644 index 000000000..91f3dae0e Binary files /dev/null and b/campcaster/src/modules/core/var/test10001.mp3 differ diff --git a/campcaster/src/modules/db/bin/autogen.sh b/campcaster/src/modules/db/bin/autogen.sh new file mode 100755 index 000000000..3937249e8 --- /dev/null +++ b/campcaster/src/modules/db/bin/autogen.sh @@ -0,0 +1,95 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="Db" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. +usrdir=`cd $basedir/../../../usr; pwd;` + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +echo " aclocal $ACLOCAL_FLAGS" +cp -f ${configure_ac} ${tmpdir} +cp -f ${etcdir}/acinclude.m4 ${tmpdir} +aclocal $ACLOCAL_FLAGS + +echo " autoheader ${configure_ac}" +autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/db/bin/gen_coverage_data.sh b/campcaster/src/modules/db/bin/gen_coverage_data.sh new file mode 100755 index 000000000..1c645ab00 --- /dev/null +++ b/campcaster/src/modules/db/bin/gen_coverage_data.sh @@ -0,0 +1,80 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script generates code coverage data for the module +#------------------------------------------------------------------------------- +module="Campcaster Db" + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +docdir=$basedir/doc +tmpdir=$basedir/tmp + +usrdir=`cd $basedir/../../../usr; pwd;` + +coverage_report_dir=$docdir/coverage + +raw_coverage_file=$tmpdir/raw_coverage.info +coverage_file=$tmpdir/coverage.info + +lcov=$usrdir/bin/lcov +genhtml=$usrdir/bin/genhtml + + +cd $basedir + +#------------------------------------------------------------------------------- +# Re-configure with covarege collection enabled, compile and run the tests +#------------------------------------------------------------------------------- +$bindir/autogen.sh --enable-coverage +make clean +make check + +#------------------------------------------------------------------------------- +# Generate some symlinks so that the sources are visible from tmpdir +#------------------------------------------------------------------------------- +ln -s $basedir/include $tmpdir/include +ln -s $basedir/src $tmpdir/src + + +#------------------------------------------------------------------------------- +# Use lcov to generate an HTML report on the coverage data +#------------------------------------------------------------------------------- +$lcov -d $tmpdir -c > $raw_coverage_file +$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file +rm -rf $coverage_report_dir +mkdir -p $coverage_report_dir +$genhtml -t "$module" -o $coverage_report_dir $coverage_file + + +#------------------------------------------------------------------------------- +# Clean up +#------------------------------------------------------------------------------- +rm -f $tmpdir/include +rm -f $tmpdir/src diff --git a/campcaster/src/modules/db/configure b/campcaster/src/modules/db/configure new file mode 100755 index 000000000..47e6d5cd0 --- /dev/null +++ b/campcaster/src/modules/db/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen "$@") +fi + +(cd $tmpdir && $configure "$@") + diff --git a/campcaster/src/modules/db/doc/doxygen/.keepme b/campcaster/src/modules/db/doc/doxygen/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/db/doc/doxygen/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/db/etc/Makefile.in b/campcaster/src/modules/db/etc/Makefile.in new file mode 100644 index 000000000..c080d0376 --- /dev/null +++ b/campcaster/src/modules/db/etc/Makefile.in @@ -0,0 +1,182 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f + + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +BASE_DIR = @builddir@ +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +COVERAGE_DIR = ${DOC_DIR}/coverage +BIN_DIR = ${BASE_DIR}/bin +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_LIB_DIR = ${USR_DIR}/lib +BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 + +MODULES_DIR = ${BASE_DIR}/.. + +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 + +VPATH = ${SRC_DIR} + +LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ +LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ +LIBODBCXX_CFLAGS=@LIBODBCXX_CFLAGS@ +LIBODBCXX_LIBS=@LIBODBCXX_LIBS@ + +TEST_RESULTS = ${DOC_DIR}/testResults.xml +# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +TEST_XSLT = ../etc/testResultToHtml.xsl + +DB_LIB = livesupport_db +DB_LIB_FILE = ${LIB_DIR}/lib${DB_LIB}.a +TEST_RUNNER = ${TMP_DIR}/testRunner + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +export LD_LIBRARY_PATH:=${LD_LIBRARY_PATH}:${USR_LIB_DIR} + + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +CPPFLAGS = @CPPFLAGS@ +CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -pedantic -Wall -Wno-long-long \ + ${LIBXMLPP_CFLAGS} \ + ${LIBODBCXX_CFLAGS} \ + -I${USR_INCLUDE_DIR} \ + -I${BOOST_INCLUDE_DIR} \ + -I${CORE_INCLUDE_DIR} \ + -I${INCLUDE_DIR} -I${TMP_DIR} +LDFLAGS = @LDFLAGS@ -pthread \ + ${LIBXMLPP_LIBS} \ + ${LIBODBCXX_LIBS} \ + -L${USR_LIB_DIR} \ + -L${CORE_LIB_DIR} \ + -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +DB_LIB_OBJS = ${TMP_DIR}/SimpleConnectionManager.o \ + ${TMP_DIR}/ConnectionManagerFactory.o \ + ${TMP_DIR}/Conversion.o +TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ + ${TMP_DIR}/SimpleConnectionManagerTest.o \ + ${TMP_DIR}/ConnectionManagerFactoryTest.o +TEST_RUNNER_LIBS = -l${DB_LIB} -l${CORE_LIB} -lcppunit -ldl + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean check install + +all: dir_setup ${DB_LIB_FILE} + +dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: + ${RM} ${DB_LIB_OBJS} ${DB_LIB_FILE} + ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER} + ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + ${RMDIR} ${COVERAGE_DIR}/* + ${RM} ${TEST_RESULTS} + +depclean: clean + +distclean: clean docclean + ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 + +check: all ${TEST_RUNNER} + ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} + +install: all + ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/Db + ${CP} ${INCLUDE_DIR}/LiveSupport/Db/*.h \ + ${USR_INCLUDE_DIR}/LiveSupport/Db + ${CP} ${DB_LIB_FILE} ${USR_LIB_DIR} + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +${DB_LIB_FILE}: ${DB_LIB_OBJS} + ${AR} crus $@ $^ + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${TEST_RUNNER}: ${CORE_LIB_FILE} ${TEST_RUNNER_OBJS} ${DB_LIB_FILE} + ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} + +${CORE_LIB_FILE}: + ${MAKE} -C ${CORE_DIR} + + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx + ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/src/modules/db/etc/acinclude.m4 b/campcaster/src/modules/db/etc/acinclude.m4 new file mode 100644 index 000000000..9204e3ad8 --- /dev/null +++ b/campcaster/src/modules/db/etc/acinclude.m4 @@ -0,0 +1,92 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +dnl----------------------------------------------------------------------------- + +dnl----------------------------------------------------------------------------- +dnl Macro to check for available modules using pkg-conf +dnl +dnl usage: +dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) +dnl +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +dnl +dnl This function was taken from the glade-- project +dnl----------------------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + + diff --git a/campcaster/src/modules/db/etc/configure.ac b/campcaster/src/modules/db/etc/configure.ac new file mode 100644 index 000000000..bce0f4427 --- /dev/null +++ b/campcaster/src/modules/db/etc/configure.ac @@ -0,0 +1,109 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(Db, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../include/LiveSupport/Db/ConnectionManagerInterface.h) + +AC_CONFIG_HEADERS(configure.h) +AC_PROG_CXX() + +AC_CHECK_HEADERS(getopt.h) + + +dnl----------------------------------------------------------------------------- +dnl specify whether debug info should be compiled into the executable +dnl----------------------------------------------------------------------------- +AC_SUBST(CXXFLAGS) + +AC_ARG_ENABLE([debug], + AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), + [], + [enable_debug=no]) + +if test "x${enable_debug}" = "xyes"; then + CXXFLAGS="-g -O0" +else + CXXFLAGS="-O3" +fi + +AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the pkg-config path +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([pkg-config-path], + AC_HELP_STRING([--with-pkg-config-path], + [use the pkg-config path (prefix/lib/pkgconfig)]), + [PKG_CONFIG_PATH=${withval}], + [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig]) + +AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) + +export PKG_CONFIG_PATH + +export PATH=${prefix}/bin:${PATH} + + +PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) +AC_SUBST(LIBXMLPP_CFLAGS) +AC_SUBST(LIBXMLPP_LIBS) + +PKG_CHECK_MODULES(LIBODBCXX,[libodbc++]) + + +dnl----------------------------------------------------------------------------- +dnl enable compilaton for code coverage data +dnl----------------------------------------------------------------------------- +AC_SUBST(COVERAGE_CXXFLAGS) + +AC_ARG_ENABLE( coverage, +[ --enable-coverage enable code coverage data generaton (no) ], + ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) + +if test "x${ENABLE_COVERAGE}" == "xyes" ; then + COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" + AC_MSG_RESULT([compiling in code coverage mode]) +else + AC_MSG_RESULT([not compiling in code coverage mode]) +fi + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/db/etc/connectionManagerFactory.xml b/campcaster/src/modules/db/etc/connectionManagerFactory.xml new file mode 100644 index 000000000..9e7c74905 --- /dev/null +++ b/campcaster/src/modules/db/etc/connectionManagerFactory.xml @@ -0,0 +1,16 @@ + + + + + + + +]> + + + diff --git a/campcaster/src/modules/db/etc/connectionManagerFactory.xml.template b/campcaster/src/modules/db/etc/connectionManagerFactory.xml.template new file mode 100644 index 000000000..5c0df33ff --- /dev/null +++ b/campcaster/src/modules/db/etc/connectionManagerFactory.xml.template @@ -0,0 +1,16 @@ + + + + + + + +]> + + + diff --git a/campcaster/src/modules/db/etc/doxygen.config b/campcaster/src/modules/db/etc/doxygen.config new file mode 100644 index 000000000..78bf0f7e6 --- /dev/null +++ b/campcaster/src/modules/db/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Campcaster + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = include src + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/db/etc/simpleConnectionManager.xml b/campcaster/src/modules/db/etc/simpleConnectionManager.xml new file mode 100644 index 000000000..aa25afaab --- /dev/null +++ b/campcaster/src/modules/db/etc/simpleConnectionManager.xml @@ -0,0 +1,12 @@ + + + + + +]> + diff --git a/campcaster/src/modules/db/etc/simpleConnectionManager.xml.template b/campcaster/src/modules/db/etc/simpleConnectionManager.xml.template new file mode 100644 index 000000000..aaec38768 --- /dev/null +++ b/campcaster/src/modules/db/etc/simpleConnectionManager.xml.template @@ -0,0 +1,12 @@ + + + + + +]> + diff --git a/campcaster/src/modules/db/etc/testResultToHtml.xsl b/campcaster/src/modules/db/etc/testResultToHtml.xsl new file mode 100644 index 000000000..b70f32d45 --- /dev/null +++ b/campcaster/src/modules/db/etc/testResultToHtml.xsl @@ -0,0 +1,63 @@ + + + + + + + Campcaster unit test results + + +

    Preface

    +This document is part of the +Campcaster +project, Copyright © 2004 Media +Development Loan Fund, under the GNU +GPL. +
    +This is an automatically generated document. +

    Scope

    +This document contains the generated unit test results for the +Campcaster project. +

    Summary

    + + + + + + + + + + + + + + + + + + +
    Total number of tests:
    Tests passed:
    Tests failed:
    Test errors:
    +
    +

    Tests

    + + + + + + + + + + + + + +
    test nametest status
    failedpassed
    + + +
    + +
    + diff --git a/campcaster/src/modules/db/include/LiveSupport/Db/ConnectionManagerFactory.h b/campcaster/src/modules/db/include/LiveSupport/Db/ConnectionManagerFactory.h new file mode 100644 index 000000000..413de5e96 --- /dev/null +++ b/campcaster/src/modules/db/include/LiveSupport/Db/ConnectionManagerFactory.h @@ -0,0 +1,190 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Db_ConnectionManagerFactory_h +#define LiveSupport_Db_ConnectionManagerFactory_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Configurable.h" +#include "LiveSupport/Db/ConnectionManagerInterface.h" + + +namespace LiveSupport { +namespace Db { + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * The factory to create appropriate ConnectionManager objects. + * This singleton class has to be configured with an XML element, + * describing the ConnectionManagerInterface that it should build + * and maintain. This is done by including the configuration element + * for the desired type of connection manager inside the configuration + * element for the factory. + * + * Currently only the SimpleConnectionManager is supported, thus a + * configuration file may look like this: + * + *
    
    + *  <connectionManagerFactory>
    + *      
    + *  </connectionManagerFactory>
    + *  
    + * + * The DTD for the above XML structure is: + * + *
    
    + *  
    + *  
    + * + * For the DTD and details of the simpleConnectionManager configuration + * element, see the SimpleConnectionManager documentation. + * + * @author $Author$ + * @version $Revision$ + * @see SimpleConnectionManager + */ +class ConnectionManagerFactory : + 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::Ref singleton; + + /** + * The connection manager created by this factory. + */ + Ptr::Ref connectionManager; + + /** + * The default constructor. + */ + ConnectionManagerFactory(void) throw() + { + } + + + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~ConnectionManagerFactory(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; + } + + /** + * Returns the singleton instance of this object. + * + * @return the singleton instance of this object. + */ + static Ptr::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 connection manager. + * + * @return the appropriate connection manager, according to the + * configuration of this factory. + */ + Ptr::Ref + getConnectionManager(void) throw () + { + return connectionManager; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Db +} // namespace LiveSupport + +#endif // LiveSupport_Db_ConnectionManagerFactory_h + diff --git a/campcaster/src/modules/db/include/LiveSupport/Db/ConnectionManagerInterface.h b/campcaster/src/modules/db/include/LiveSupport/Db/ConnectionManagerInterface.h new file mode 100644 index 000000000..9c0be033a --- /dev/null +++ b/campcaster/src/modules/db/include/LiveSupport/Db/ConnectionManagerInterface.h @@ -0,0 +1,115 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Db_ConnectionManagerInterface_h +#define LiveSupport_Db_ConnectionManagerInterface_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +#include "LiveSupport/Core/Ptr.h" + +namespace LiveSupport { +namespace Db { + +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * The interface for handing out and managing database connections. + * + * @author $Author$ + * @version $Revision$ + */ +class ConnectionManagerInterface +{ + public: + /** + * Get a database connection from the manager. + * After use, the connection must be returned by calling + * returnConnection(). + * + * @return a database connection to the database this manager + * serves. + * @see #returnConnection + */ + virtual Ptr::Ref + getConnection(void) throw (std::runtime_error) + = 0; + + /** + * Return a database connection previously aquired by a call to + * getConnection(), after it is not needed anymore. + * + * @param connection the connection to return. + * @see #getConnection + */ + virtual void + returnConnection(Ptr::Ref connection) + throw (std::runtime_error) + = 0; + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~ConnectionManagerInterface(void) throw () + { + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Db +} // namespace LiveSupport + +#endif // LiveSupport_Db_ConnectionManagerInterface_h + diff --git a/campcaster/src/modules/db/include/LiveSupport/Db/Conversion.h b/campcaster/src/modules/db/include/LiveSupport/Db/Conversion.h new file mode 100644 index 000000000..26c415071 --- /dev/null +++ b/campcaster/src/modules/db/include/LiveSupport/Db/Conversion.h @@ -0,0 +1,115 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Db_Conversion_h +#define LiveSupport_Db_Conversion_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +namespace LiveSupport { +namespace Db { + +using namespace boost; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A helper object holding static conversion functions, that are + * helpful when accessing databases. + * + * @author $Author$ + * @version $Revision$ + */ +class Conversion +{ + private: + /** + * The default constructor. + */ + Conversion(void) throw () + { + } + + + public: + /** + * Convert a boost::ptime to a odbc::Timestamp. + * + * @param ptime the boost ptime to convert. + * @return an odbc::Timestamp, holding the same time. + */ + static Ptr::Ref + ptimeToTimestamp(Ptr::Ref ptime) throw (); + + /** + * Convert an odbc::Timestamp to a boost::ptime. + * + * @param timestamp an odbc::Timestamp to convert. + * @return a boost ptime, holding the same time. + */ + static Ptr::Ref + timestampToPtime(Ptr::Ref timestamp) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Db +} // namespace LiveSupport + +#endif // LiveSupport_Db_Conversion_h + diff --git a/campcaster/src/modules/db/lib/.keepme b/campcaster/src/modules/db/lib/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/db/lib/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/db/src/ConnectionManagerFactory.cxx b/campcaster/src/modules/db/src/ConnectionManagerFactory.cxx new file mode 100644 index 000000000..bdb7718cd --- /dev/null +++ b/campcaster/src/modules/db/src/ConnectionManagerFactory.cxx @@ -0,0 +1,111 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Db/ConnectionManagerFactory.h" +#include "SimpleConnectionManager.h" + + +using namespace LiveSupport::Core; +using namespace LiveSupport::Db; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string ConnectionManagerFactory::configElementNameStr = + "connectionManagerFactory"; + +/*------------------------------------------------------------------------------ + * The singleton instance of ConnectionManagerFactory + *----------------------------------------------------------------------------*/ +Ptr::Ref ConnectionManagerFactory::singleton; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Return the singleton instance to ConnectionManagerFactory + *----------------------------------------------------------------------------*/ +Ptr::Ref +ConnectionManagerFactory :: getInstance(void) throw () +{ + if (!singleton.get()) { + singleton.reset(new ConnectionManagerFactory()); + } + + return singleton; +} + + +/*------------------------------------------------------------------------------ + * Configure the connection manager factory. + *----------------------------------------------------------------------------*/ +void +ConnectionManagerFactory :: 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); + } + + connectionManager.reset(); + + // try to look for a SimpleConnectionManager configuration element + xmlpp::Node::NodeList nodes = element.get_children( + SimpleConnectionManager::getConfigElementName()); + if (nodes.size() >= 1) { + const xmlpp::Element * configElement = + dynamic_cast (*(nodes.begin())); + Ptr::Ref scm(new SimpleConnectionManager()); + scm->configure(*configElement); + connectionManager = scm; + } + + if (!connectionManager) { + throw std::invalid_argument("no storage client factories to configure"); + } +} + + diff --git a/campcaster/src/modules/db/src/ConnectionManagerFactoryTest.cxx b/campcaster/src/modules/db/src/ConnectionManagerFactoryTest.cxx new file mode 100644 index 000000000..37ab04bd7 --- /dev/null +++ b/campcaster/src/modules/db/src/ConnectionManagerFactoryTest.cxx @@ -0,0 +1,128 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include +#include + +#include "LiveSupport/Db/ConnectionManagerFactory.h" +#include "ConnectionManagerFactoryTest.h" + + +using namespace odbc; +using namespace LiveSupport::Db; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(ConnectionManagerFactoryTest); + +/** + * The name of the configuration file for the connection manager factory. + */ +static const std::string configFileName = "connectionManagerFactory.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +ConnectionManagerFactoryTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +ConnectionManagerFactoryTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +ConnectionManagerFactoryTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + try { + xmlpp::DomParser parser; + const xmlpp::Document * document = getConfigDocument(parser, + configFileName); + const xmlpp::Element * root = document->get_root_node(); + Ptr::Ref cmf = + ConnectionManagerFactory::getInstance(); + + cmf->configure(*root); + + Ptr::Ref cm = cmf->getConnectionManager(); + CPPUNIT_ASSERT(cm); + + Ptr::Ref connection = cm->getConnection(); + CPPUNIT_ASSERT(connection); + + // so far, so good. now simply execute "SELECT 1", and see if + // it works + Ptr::Ref stmt(connection->createStatement()); + Ptr::Ref rs(stmt->executeQuery("SELECT 1")); + CPPUNIT_ASSERT(rs->next()); + CPPUNIT_ASSERT(rs->getInt(1) == 1); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } catch (std::runtime_error &e) { + CPPUNIT_FAIL(e.what()); + } catch (xmlpp::exception &e) { + CPPUNIT_FAIL(e.what()); + } +} + diff --git a/campcaster/src/modules/db/src/ConnectionManagerFactoryTest.h b/campcaster/src/modules/db/src/ConnectionManagerFactoryTest.h new file mode 100644 index 000000000..1af20cc88 --- /dev/null +++ b/campcaster/src/modules/db/src/ConnectionManagerFactoryTest.h @@ -0,0 +1,111 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef ConnectionManagerFactoryTest_h +#define ConnectionManagerFactoryTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/BaseTestMethod.h" + + +namespace LiveSupport { +namespace Db { + +using namespace LiveSupport::Core; + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the ConnectionManagerFactory class. + * + * @author $Author$ + * @version $Revision$ + * @see ConnectionManagerFactory + */ +class ConnectionManagerFactoryTest : public BaseTestMethod +{ + CPPUNIT_TEST_SUITE(ConnectionManagerFactoryTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 Db +} // namespace LiveSupport + +#endif // ConnectionManagerFactoryTest_h + diff --git a/campcaster/src/modules/db/src/Conversion.cxx b/campcaster/src/modules/db/src/Conversion.cxx new file mode 100644 index 000000000..19d2c8410 --- /dev/null +++ b/campcaster/src/modules/db/src/Conversion.cxx @@ -0,0 +1,90 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Db/Conversion.h" + + +using namespace boost; + +using namespace LiveSupport::Core; +using namespace LiveSupport::Db; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Convert a boost::ptime to an odbc::Timestamp + *----------------------------------------------------------------------------*/ +Ptr::Ref +Conversion :: ptimeToTimestamp(Ptr::Ref ptime) + throw () +{ + gregorian::date date = ptime->date(); + posix_time::time_duration hours = ptime->time_of_day(); + + Ptr::Ref timestamp(new odbc::Timestamp(date.year(), + date.month(), + date.day(), + hours.hours(), + hours.minutes(), + hours.seconds())); + return timestamp; +} + + +/*------------------------------------------------------------------------------ + * Convert an odbc::Timestamp to a boost::ptime + *----------------------------------------------------------------------------*/ +Ptr::Ref +Conversion :: timestampToPtime(Ptr::Ref timestamp) + throw() +{ + // don't convert through the time_t format, as probably because of + // timezone settings, boost::posix_time::from_time_t() ruins the + // actual value + std::string timeStr = timestamp->toString(); + Ptr::Ref ptime(new posix_time::ptime( + posix_time::time_from_string(timeStr))); + return ptime; +} + diff --git a/campcaster/src/modules/db/src/SimpleConnectionManager.cxx b/campcaster/src/modules/db/src/SimpleConnectionManager.cxx new file mode 100644 index 000000000..e1bc9da2e --- /dev/null +++ b/campcaster/src/modules/db/src/SimpleConnectionManager.cxx @@ -0,0 +1,152 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "SimpleConnectionManager.h" + + +using namespace LiveSupport::Core; +using namespace LiveSupport::Db; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +/*------------------------------------------------------------------------------ + * The name of the config element for this class + *----------------------------------------------------------------------------*/ +const std::string SimpleConnectionManager::configElementNameStr = + "simpleConnectionManager"; + +/** + * The name of the attribute to get the dsn for the connection. + */ +static const std::string dsnAttrName = "dsn"; + +/** + * The name of the attribute to get the userName for the connection. + */ +static const std::string userNameAttrName = "userName"; + +/** + * The name of the attribute to get the password for the connection. + */ +static const std::string passwordAttrName = "password"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Configure the connection manager factory. + *----------------------------------------------------------------------------*/ +void +SimpleConnectionManager :: 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); + } + + const xmlpp::Attribute * attribute = 0; + + if (!(attribute = element.get_attribute(dsnAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += dsnAttrName; + throw std::invalid_argument(eMsg); + } + dsn = attribute->get_value(); + + if (!(attribute = element.get_attribute(userNameAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += userNameAttrName; + throw std::invalid_argument(eMsg); + } + userName = attribute->get_value(); + + if (!(attribute = element.get_attribute(passwordAttrName))) { + std::string eMsg = "Missing attribute "; + eMsg += passwordAttrName; + throw std::invalid_argument(eMsg); + } + password = attribute->get_value(); +} + + +/*------------------------------------------------------------------------------ + * Give out a connection. + *----------------------------------------------------------------------------*/ +Ptr::Ref +SimpleConnectionManager :: getConnection(void) + throw (std::runtime_error) +{ + odbc::Connection * conn; + try { + conn = odbc::DriverManager::getConnection(dsn, userName, password); + } catch (std::exception &e) { + throw std::runtime_error(e.what()); + } + + if (!conn) { + std::string eMsg = "unable to open ODBC connection for DSN "; + eMsg += dsn; + throw std::runtime_error(eMsg); + } + + Ptr::Ref connection(conn); + return connection; +} + + +/*------------------------------------------------------------------------------ + * Receive a connection back. + *----------------------------------------------------------------------------*/ +void +SimpleConnectionManager :: returnConnection( + Ptr::Ref connection) + throw (std::runtime_error) +{ + // nothing to do here... + // we could save the outgoing connections to a set in getConnection() + // and check here to see if the returned one is contained there +} + diff --git a/campcaster/src/modules/db/src/SimpleConnectionManager.h b/campcaster/src/modules/db/src/SimpleConnectionManager.h new file mode 100644 index 000000000..fe68c91b5 --- /dev/null +++ b/campcaster/src/modules/db/src/SimpleConnectionManager.h @@ -0,0 +1,193 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SimpleConnectionManager_h +#define SimpleConnectionManager_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include +#include + + +namespace LiveSupport { +namespace Db { + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A simple connection manager, basically a facade to the underlying + * odbc::DriverManager class. + * This class can be configured with the following XML element, containing + * the ODBC Data Source Name (DSN), ODBC user name and ODBC password + * the manager will connect with to the ODBC source. The XML element looks + * as follows: + * + *
    
    + *  
    + *  
    + * + * The DTD for the above XML structure is: + * + *
    
    + *  
    + *  
    + *  
    + *  
    + *  
    + * + * @author $Author$ + * @version $Revision$ + */ +class SimpleConnectionManager : + virtual public Configurable, + virtual public ConnectionManagerInterface +{ + private: + /** + * The name of the configuration XML elmenent used by this object. + */ + static const std::string configElementNameStr; + + /** + * The ODBC Data Source Name this manager connects to. + */ + std::string dsn; + + /** + * The user name to use when connecting to the ODBC DSN. + */ + std::string userName; + + /** + * The password to use when connecting to the ODBC DSN. + */ + std::string password; + + + public: + /** + * The default constructor. + */ + SimpleConnectionManager(void) throw () + { + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~SimpleConnectionManager(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. + * + * @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); + + /** + * Get a database connection from the manager. + * After use, the connection must be returned by calling + * returnConnection(). + * + * @return a database connection to the database this manager + * serves. + * @see #returnConnection + */ + virtual Ptr::Ref + getConnection(void) throw (std::runtime_error); + + /** + * Return a database connection previously aquired by a call to + * getConnection(), after it is not needed anymore. + * + * @param connection the connection to return. + * @see #getConnection + */ + virtual void + returnConnection(Ptr::Ref connection) + throw (std::runtime_error); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Db +} // namespace LiveSupport + +#endif // SimpleConnectionManager_h + diff --git a/campcaster/src/modules/db/src/SimpleConnectionManagerTest.cxx b/campcaster/src/modules/db/src/SimpleConnectionManagerTest.cxx new file mode 100644 index 000000000..26d6ea497 --- /dev/null +++ b/campcaster/src/modules/db/src/SimpleConnectionManagerTest.cxx @@ -0,0 +1,212 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include +#include +#include + +#include "SimpleConnectionManager.h" +#include "SimpleConnectionManagerTest.h" + + +using namespace odbc; +using namespace LiveSupport::Db; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(SimpleConnectionManagerTest); + +/** + * The name of the configuration file for the connection manager. + */ +static const std::string configFileName = "simpleConnectionManager.xml"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +SimpleConnectionManagerTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +SimpleConnectionManagerTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Test to see if the singleton Hello object is accessible + *----------------------------------------------------------------------------*/ +void +SimpleConnectionManagerTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + try { + xmlpp::DomParser parser; + const xmlpp::Document * document = getConfigDocument(parser, + configFileName); + const xmlpp::Element * root = document->get_root_node(); + Ptr::Ref scm(new SimpleConnectionManager()); + + scm->configure(*root); + + Ptr::Ref connection = scm->getConnection(); + CPPUNIT_ASSERT(connection); + + // so far, so good. now simply execute "SELECT 1", and see if + // it works + Ptr::Ref stmt(connection->createStatement()); + Ptr::Ref rs(stmt->executeQuery("SELECT 1")); + CPPUNIT_ASSERT(rs->next()); + CPPUNIT_ASSERT(rs->getInt(1) == 1); + + rs.reset(); + stmt->close(); + stmt.reset(); + scm->returnConnection(connection); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } catch (std::runtime_error &e) { + CPPUNIT_FAIL(e.what()); + } catch (xmlpp::exception &e) { + CPPUNIT_FAIL(e.what()); + } +} + + +/*------------------------------------------------------------------------------ + * Test to handle large integers. + *----------------------------------------------------------------------------*/ +void +SimpleConnectionManagerTest :: bigIntTest(void) + throw (CPPUNIT_NS::Exception) +{ + long long testValue = 0x7fffffffffffffffLL; + std::string createStmt = "CREATE TABLE testTable\n" + "(\n" + " id BIGINT NOT NULL\n" + ");"; + bool b; + + try { + xmlpp::DomParser parser; + const xmlpp::Document * document = getConfigDocument(parser, + configFileName); + const xmlpp::Element * root = document->get_root_node(); + Ptr::Ref scm(new SimpleConnectionManager()); + + scm->configure(*root); + + Ptr::Ref connection = scm->getConnection(); + CPPUNIT_ASSERT(connection); + + // simply see if selecting the highest 63 bit number works... + Ptr::Ref pstmt(connection->prepareStatement( + "SELECT ?")); + pstmt->setLong(1, testValue); + Ptr::Ref rs(pstmt->executeQuery()); + CPPUNIT_ASSERT(rs->next()); + CPPUNIT_ASSERT(rs->getLong(1) == testValue); + rs.reset(); + pstmt->close(); + pstmt.reset(); + + // so far, so good. now create a table with a BIGINT column + // and try the same + Ptr::Ref stmt(connection->createStatement()); + stmt->execute(createStmt); + stmt->close(); + stmt.reset(); + + pstmt.reset(connection->prepareStatement("INSERT INTO testTable " + " VALUES(?)")); + pstmt->setLong(1, testValue); + CPPUNIT_ASSERT(pstmt->executeUpdate() == 1); + pstmt->close(); + pstmt.reset(); + + stmt.reset(connection->createStatement()); + rs.reset(stmt->executeQuery("SELECT * FROM testTable")); + CPPUNIT_ASSERT(rs->next()); +//std::cerr << std::endl; +//std::cerr << "rs->getLong: " << rs->getLong(1) << std::endl; +//std::cerr << "testValue: " << testValue << std::endl; + b = rs->getLong(1) == testValue; + CPPUNIT_ASSERT(b); + rs.reset(); + stmt->close(); + stmt.reset(); + + stmt.reset(connection->createStatement()); + stmt->executeUpdate("DROP TABLE testTable"); + stmt->close(); + stmt.reset(); + + scm->returnConnection(connection); + + } catch (std::invalid_argument &e) { + CPPUNIT_FAIL(e.what()); + } catch (std::runtime_error &e) { + CPPUNIT_FAIL(e.what()); + } catch (xmlpp::exception &e) { + CPPUNIT_FAIL(e.what()); + } catch (SQLException &e) { + CPPUNIT_FAIL(e.what()); + } +} + diff --git a/campcaster/src/modules/db/src/SimpleConnectionManagerTest.h b/campcaster/src/modules/db/src/SimpleConnectionManagerTest.h new file mode 100644 index 000000000..bbce218b1 --- /dev/null +++ b/campcaster/src/modules/db/src/SimpleConnectionManagerTest.h @@ -0,0 +1,120 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SimpleConnectionManagerTest_h +#define SimpleConnectionManagerTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/BaseTestMethod.h" + + +namespace LiveSupport { +namespace Db { + +using namespace LiveSupport::Core; + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the SimpleConnectionManager class. + * + * @author $Author$ + * @version $Revision$ + * @see SimpleConnectionManager + */ +class SimpleConnectionManagerTest : public BaseTestMethod +{ + CPPUNIT_TEST_SUITE(SimpleConnectionManagerTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(bigIntTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to handle large integers. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + bigIntTest(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 Db +} // namespace LiveSupport + +#endif // SimpleConnectionManagerTest_h + diff --git a/campcaster/src/modules/db/src/TestRunner.cxx b/campcaster/src/modules/db/src/TestRunner.cxx new file mode 100644 index 000000000..0e0930e5b --- /dev/null +++ b/campcaster/src/modules/db/src/TestRunner.cxx @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + +#if HAVE_GETOPT_H +#include +#else +#error "Need getopt.h" +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +using namespace LiveSupport::Core; + +/* =================================================== 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[] = "ho:s:v"; + +/** + * Structure describing the long options + */ +static const struct option longOptions[] = { + { "help", no_argument, 0, 'h' }, + { "output", required_argument, 0, 'o' }, + { "stylesheet", required_argument, 0, 's' }, + { "version", no_argument, 0, 'v' }, + { 0, 0, 0, 0 } +}; + +/** + * The encoding to use for the output file. + */ +static const std::string encoding = "utf-8"; + +/** + * The output XML file name. + */ +static Ptr::Ref xmlOutFileName; + +/** + * The XSLT attached to the output file. + */ +static Ptr::Ref xsltFileName; + + +/* =============================================== 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 ); + +/** + * Process command line arguments. + * + * @param argc the number of arguments. + * @param argv the arguments themselves. + * @return true of all went well, false in case the program should exit + * after this call. + */ +static bool +processArguments(int argc, char *argv[]); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Run all tests + *----------------------------------------------------------------------------*/ +int +main( int argc, + char * argv[] ) throw () +{ + if (!processArguments(argc, argv)) { + return 0; + } + + // 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(); + + // also generate an XML document as an output + std::ofstream xmlOutFile(xmlOutFileName->c_str()); + CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); + xmlOutputter.setStandalone(false); + if (xsltFileName) { + xmlOutputter.setStyleSheet(*xsltFileName); + } + xmlOutputter.write(); + xmlOutFile.flush(); + xmlOutFile.close(); + + return result.wasSuccessful() ? 0 : 1; +} + + +/*------------------------------------------------------------------------------ + * Process command line arguments. + *----------------------------------------------------------------------------*/ +static bool +processArguments(int argc, char *argv[]) +{ + int i; + + while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { + switch (i) { + case 'h': + printUsage(argv[0], std::cout); + return false; + + case 'o': + xmlOutFileName.reset(new std::string(optarg)); + break; + + case 's': + xsltFileName.reset(new std::string(optarg)); + break; + + case 'v': + printVersion(std::cout); + return false; + + default: + printUsage(argv[0], std::cout); + return false; + } + } + + if (optind < argc) { + std::cerr << "error processing command line arguments" << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + if (!xmlOutFileName) { + std::cerr << "mandatory option output file name not specified" + << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; + if (xsltFileName) { + std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Print program version. + *----------------------------------------------------------------------------*/ +static void +printVersion ( std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << copyrightNotice << std::endl; +} + + +/*------------------------------------------------------------------------------ + * Print program usage. + *----------------------------------------------------------------------------*/ +static void +printUsage ( const char invocation[], + std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << std::endl + << "Usage: " << invocation << " [OPTION]" + << std::endl + << " mandatory options:" << std::endl + << " -o, --output=file.name write test results into this XML file" + << std::endl + << " optional options:" << std::endl + << " -s, --stylesheet specify this XSLT for the output file" + << std::endl + << " this is either an absolute URI, or a" + << std::endl + << " relative path for the output document" + << 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; +} + diff --git a/campcaster/src/modules/db/tmp/.keepme b/campcaster/src/modules/db/tmp/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/db/tmp/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/eventScheduler/bin/autogen.sh b/campcaster/src/modules/eventScheduler/bin/autogen.sh new file mode 100755 index 000000000..ef10772fb --- /dev/null +++ b/campcaster/src/modules/eventScheduler/bin/autogen.sh @@ -0,0 +1,95 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="EventScheduler" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. +usrdir=`cd $basedir/../../../usr; pwd;` + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +echo " aclocal $ACLOCAL_FLAGS" +cp -f ${configure_ac} ${tmpdir} +cp -f ${etcdir}/acinclude.m4 ${tmpdir} +aclocal $ACLOCAL_FLAGS + +echo " autoheader ${configure_ac}" +autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/eventScheduler/bin/gen_coverage_data.sh b/campcaster/src/modules/eventScheduler/bin/gen_coverage_data.sh new file mode 100755 index 000000000..b24cf8e22 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/bin/gen_coverage_data.sh @@ -0,0 +1,80 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script generates code coverage data for the module +#------------------------------------------------------------------------------- +module="Campcaster EventScheduler" + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +docdir=$basedir/doc +tmpdir=$basedir/tmp + +usrdir=`cd $basedir/../../../usr; pwd;` + +coverage_report_dir=$docdir/coverage + +raw_coverage_file=$tmpdir/raw_coverage.info +coverage_file=$tmpdir/coverage.info + +lcov=$usrdir/bin/lcov +genhtml=$usrdir/bin/genhtml + + +cd $basedir + +#------------------------------------------------------------------------------- +# Re-configure with covarege collection enabled, compile and run the tests +#------------------------------------------------------------------------------- +$bindir/autogen.sh --enable-coverage +make clean +make check + +#------------------------------------------------------------------------------- +# Generate some symlinks so that the sources are visible from tmpdir +#------------------------------------------------------------------------------- +ln -s $basedir/include $tmpdir/include +ln -s $basedir/src $tmpdir/src + + +#------------------------------------------------------------------------------- +# Use lcov to generate an HTML report on the coverage data +#------------------------------------------------------------------------------- +$lcov -d $tmpdir -c > $raw_coverage_file +$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file +rm -rf $coverage_report_dir +mkdir -p $coverage_report_dir +$genhtml -t "$module" -o $coverage_report_dir $coverage_file + + +#------------------------------------------------------------------------------- +# Clean up +#------------------------------------------------------------------------------- +rm -f $tmpdir/include +rm -f $tmpdir/src diff --git a/campcaster/src/modules/eventScheduler/configure b/campcaster/src/modules/eventScheduler/configure new file mode 100755 index 000000000..47e6d5cd0 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen "$@") +fi + +(cd $tmpdir && $configure "$@") + diff --git a/campcaster/src/modules/eventScheduler/doc/.keepme b/campcaster/src/modules/eventScheduler/doc/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/doc/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/eventScheduler/etc/Makefile.in b/campcaster/src/modules/eventScheduler/etc/Makefile.in new file mode 100644 index 000000000..2e3722322 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/etc/Makefile.in @@ -0,0 +1,182 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f + + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +BASE_DIR = @builddir@ +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +COVERAGE_DIR = ${DOC_DIR}/coverage +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_LIB_DIR = ${USR_DIR}/lib +BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 + +MODULES_DIR = ${BASE_DIR}/.. + +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 + +VPATH = ${SRC_DIR} + +BOOST_DATE_TIME_LIB=@BOOST_DATE_TIME_LIB@ + +LIBXMLPP_CFLAGS=@LIBXMLPP_CFLAGS@ +LIBXMLPP_LIBS=@LIBXMLPP_LIBS@ + +TEST_RESULTS = ${DOC_DIR}/testResults.xml +# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +TEST_XSLT = ../etc/testResultToHtml.xsl + +EVENT_SCHEDULER_LIB = livesupport_event_scheduler +EVENT_SCHEDULER_LIB_FILE = ${LIB_DIR}/lib${EVENT_SCHEDULER_LIB}.a +TEST_RUNNER = ${TMP_DIR}/testRunner + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +export LD_LIBRARY_PATH:=${USR_LIB_DIR}:${LD_LIBRARY_PATH} + + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +CPPFLAGS = @CPPFLAGS@ +CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -Wall -Wno-long-long \ + ${LIBXMLPP_CFLAGS} \ + -I${USR_INCLUDE_DIR} \ + -I${BOOST_INCLUDE_DIR} \ + -I${CORE_INCLUDE_DIR} \ + -I${INCLUDE_DIR} -I${TMP_DIR} +LDFLAGS = @LDFLAGS@ -pthread \ + ${LIBXMLPP_LIBS} \ + -L${USR_LIB_DIR} \ + -L${CORE_LIB_DIR} \ + -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +EVENT_SCHEDULER_LIB_OBJS = ${TMP_DIR}/SchedulerThread.o \ + ${TMP_DIR}/EventScheduler.o +TEST_RUNNER_OBJS = ${TMP_DIR}/TestScheduledEvent.o \ + ${TMP_DIR}/TestEventContainer.o \ + ${TMP_DIR}/SchedulerThreadTest.o \ + ${TMP_DIR}/EventSchedulerTest.o \ + ${TMP_DIR}/TestRunner.o +TEST_RUNNER_LIBS = -l${EVENT_SCHEDULER_LIB} -l${CORE_LIB} \ + -l${BOOST_DATE_TIME_LIB} \ + -lcppunit -ldl + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean check install + +all: dir_setup ${EVENT_SCHEDULER_LIB_FILE} + +dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: + ${RM} ${EVENT_SCHEDULER_LIB_OBJS} ${EVENT_SCHEDULER_LIB_FILE} + ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER} + ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + ${RMDIR} ${COVERAGE_DIR}/* + ${RM} ${TEST_RESULTS} + +depclean: clean + +distclean: clean docclean + ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 + +check: all ${TEST_RUNNER} + ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} + +install: all + ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/EventScheduler + ${CP} ${INCLUDE_DIR}/LiveSupport/EventScheduler/*.h \ + ${USR_INCLUDE_DIR}/LiveSupport/EventScheduler + ${CP} ${EVENT_SCHEDULER_LIB_FILE} ${USR_LIB_DIR} + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +${EVENT_SCHEDULER_LIB_FILE}: ${EVENT_SCHEDULER_LIB_OBJS} + ${AR} crus $@ $^ + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${TEST_RUNNER}: ${CORE_LIB_FILE} ${TEST_RUNNER_OBJS} ${EVENT_SCHEDULER_LIB_FILE} + ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} + +${CORE_LIB_FILE}: + ${MAKE} -C ${CORE_DIR} + + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx + ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/src/modules/eventScheduler/etc/acinclude.m4 b/campcaster/src/modules/eventScheduler/etc/acinclude.m4 new file mode 100644 index 000000000..f9726d9d5 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/etc/acinclude.m4 @@ -0,0 +1,161 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +dnl----------------------------------------------------------------------------- + +dnl----------------------------------------------------------------------------- +dnl Macro to check for available modules using pkg-conf +dnl +dnl usage: +dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) +dnl +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +dnl +dnl This function was taken from the glade-- project +dnl----------------------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for C++ namespaces +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +dnl +dnl usage: +dnl If the compiler can prevent names clashes using namespaces, +dnl define HAVE_NAMESPACES. +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CXX_NAMESPACES], +[AC_CACHE_CHECK(whether the compiler implements namespaces, +ac_cv_cxx_namespaces, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], + [using namespace Outer::Inner; return i;], + ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) + AC_LANG_RESTORE +]) +if test "$ac_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) +fi +]) + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for the boost datetime library. +dnl for more information on boost, see http://www.boost.org/ +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ax_boost_date-time.html +dnl +dnl usage: +dnl This macro checks to see if the Boost.DateTime library is installed. +dnl It also attempts to guess the currect library name using several attempts. +dnl It tries to build the library name using a user supplied name or suffix +dnl and then just the raw library. +dnl +dnl If the library is found, HAVE_BOOST_DATE_TIME is defined and +dnl BOOST_DATE_TIME_LIB is set to the name of the library. +dnl +dnl This macro calls AC_SUBST(BOOST_DATE_TIME_LIB). +dnl----------------------------------------------------------------------------- +AC_DEFUN([AX_BOOST_DATE_TIME], +[AC_REQUIRE([AC_CXX_NAMESPACES])dnl +AC_CACHE_CHECK(whether the Boost::DateTime library is available, +ax_cv_boost_date_time, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include ]], + [[using namespace boost::gregorian; date d(2002,Jan,10); return 0;]]), + ax_cv_boost_date_time=yes, ax_cv_boost_date_time=no) + AC_LANG_RESTORE +]) +if test "$ax_cv_boost_date_time" = yes; then + AC_DEFINE(HAVE_BOOST_DATE_TIME,,[define if the Boost::DateTime library is available]) + dnl Now determine the appropriate file names + AC_ARG_WITH([boost-date-time],AS_HELP_STRING([--with-boost-date-time], + [specify the boost date-time library or suffix to use]), + [if test "x$with_boost_date_time" != "xno"; then + ax_date_time_lib=$with_boost_date_time + ax_boost_date_time_lib=boost_date_time-$with_boost_date_time + fi]) + for ax_lib in $ax_date_time_lib $ax_boost_date_time_lib boost_date_time; do + AC_CHECK_LIB($ax_lib, main, [BOOST_DATE_TIME_LIB=$ax_lib break]) + done + AC_SUBST(BOOST_DATE_TIME_LIB) +fi +])dnl + diff --git a/campcaster/src/modules/eventScheduler/etc/configure.ac b/campcaster/src/modules/eventScheduler/etc/configure.ac new file mode 100644 index 000000000..c5e1674d7 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/etc/configure.ac @@ -0,0 +1,114 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(EventScheduler, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../src/SchedulerThread.cxx) + +AC_CONFIG_HEADERS(configure.h) +AC_PROG_CXX() + +AC_CHECK_HEADERS(getopt.h unistd.h sys/time.h) + + +dnl----------------------------------------------------------------------------- +dnl specify whether debug info should be compiled into the executable +dnl----------------------------------------------------------------------------- +AC_SUBST(CXXFLAGS) + +AC_ARG_ENABLE([debug], + AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), + [], + [enable_debug=no]) + +if test "x${enable_debug}" = "xyes"; then + CXXFLAGS="-g -O0" +else + CXXFLAGS="-O3" +fi + +AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the pkg-config path +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([pkg-config-path], + AC_HELP_STRING([--with-pkg-config-path], + [use the pkg-config path (prefix/lib/pkgconfig)]), + [PKG_CONFIG_PATH=${withval}], + [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig]) + +AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) + +export PKG_CONFIG_PATH + +export PATH=${prefix}/bin:${PATH} + + +AX_BOOST_DATE_TIME() +if test "$BOOST_DATE_TIME_LIB" = "" ; then + BOOST_DATE_TIME_LIB=boost_date_time-gcc + AC_SUBST(BOOST_DATE_TIME_LIB) +fi +AC_MSG_RESULT([checking BOOST_DATE_TIME_LIB... ${BOOST_DATE_TIME_LIB}]) + +PKG_CHECK_MODULES(LIBXMLPP,[libxml++-2.6 >= 2.8.1]) +AC_SUBST(LIBXMLPP_CFLAGS) +AC_SUBST(LIBXMLPP_LIBS) + + +dnl----------------------------------------------------------------------------- +dnl enable compilaton for code coverage data +dnl----------------------------------------------------------------------------- +AC_SUBST(COVERAGE_CXXFLAGS) + +AC_ARG_ENABLE( coverage, +[ --enable-coverage enable code coverage data generaton (no) ], + ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) + +if test "x${ENABLE_COVERAGE}" == "xyes" ; then + COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" + AC_MSG_RESULT([compiling in code coverage mode]) +else + AC_MSG_RESULT([not compiling in code coverage mode]) +fi + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/eventScheduler/etc/doxygen.config b/campcaster/src/modules/eventScheduler/etc/doxygen.config new file mode 100644 index 000000000..bb7b13cec --- /dev/null +++ b/campcaster/src/modules/eventScheduler/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Campcaster + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = include src + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/eventScheduler/etc/testResultToHtml.xsl b/campcaster/src/modules/eventScheduler/etc/testResultToHtml.xsl new file mode 100644 index 000000000..b70f32d45 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/etc/testResultToHtml.xsl @@ -0,0 +1,63 @@ + + + + + + + Campcaster unit test results + + +

    Preface

    +This document is part of the +Campcaster +project, Copyright © 2004 Media +Development Loan Fund, under the GNU +GPL. +
    +This is an automatically generated document. +

    Scope

    +This document contains the generated unit test results for the +Campcaster project. +

    Summary

    + + + + + + + + + + + + + + + + + + +
    Total number of tests:
    Tests passed:
    Tests failed:
    Test errors:
    +
    +

    Tests

    + + + + + + + + + + + + + +
    test nametest status
    failedpassed
    + + +
    + +
    + diff --git a/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/EventContainerInterface.h b/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/EventContainerInterface.h new file mode 100644 index 000000000..b70b28c87 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/EventContainerInterface.h @@ -0,0 +1,106 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_EventScheduler_EventContainerInterface_h +#define LiveSupport_EventScheduler_EventContainerInterface_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/EventScheduler/ScheduledEventInterface.h" + + +namespace LiveSupport { +namespace EventScheduler { + +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Base interface for providing the events to get schedulerd by the + * EventScheduler. + * + * @author $Author$ + * @version $Revision$ + */ +class EventContainerInterface +{ + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~EventContainerInterface(void) throw () + { + } + + /** + * Return the first event after the specified timepoint. + * + * @param when return the first event after this timepoint, + * @return the first event to schedule after the specified + * timepoint. may be a reference to 0, if currently + * there are no known events after the specified time. + */ + virtual Ptr::Ref + getNextEvent(Ptr::Ref when) throw () = 0; +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace EventScheduler +} // namespace LiveSupport + + +#endif // LiveSupport_EventScheduler_EventContainerInterface_h + diff --git a/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/EventScheduler.h b/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/EventScheduler.h new file mode 100644 index 000000000..202e6bedc --- /dev/null +++ b/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/EventScheduler.h @@ -0,0 +1,142 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_EventScheduler_EventScheduler_h +#define LiveSupport_EventScheduler_EventScheduler_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Thread.h" +#include "LiveSupport/Core/RunnableInterface.h" +#include "LiveSupport/EventScheduler/EventContainerInterface.h" + + +namespace LiveSupport { +namespace EventScheduler { + +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A generic event scheduler, for non-everlapping subsequent events. + * + * @author $Author$ + * @version $Revision$ + */ +class EventScheduler +{ + private: + /** + * The thread of the scheduler. + */ + Ptr::Ref thread; + + /** + * The scheduler thread runnable object. + */ + Ptr::Ref runnable; + + + public: + /** + * Constructor. + * + * @param eventContainer the container this thread will get its + * events to schedule from. + * @param granularity the granularity of the thread: the time the + * thread will sleep between checking up on things. + */ + EventScheduler(Ptr::Ref eventContainer, + Ptr::Ref granularity) + throw (); + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~EventScheduler(void) throw () + { + } + + /** + * Start the event scheduler. + * This function starts the event scheduler in the background, + * and returns immediately. + */ + virtual void + start(void) throw (); + + /** + * Forces the scheduler to re-read its event container. + * Call this if the events held in the event container have + * changed. + */ + virtual void + update(void) throw (); + + /** + * Stop the event scheduler. + */ + virtual void + stop(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace EventScheduler +} // namespace LiveSupport + + +#endif // LiveSupport_EventScheduler_EventScheduler_h + diff --git a/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/ScheduledEventInterface.h b/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/ScheduledEventInterface.h new file mode 100644 index 000000000..7595ac3ed --- /dev/null +++ b/campcaster/src/modules/eventScheduler/include/LiveSupport/EventScheduler/ScheduledEventInterface.h @@ -0,0 +1,171 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_EventScheduler_ScheduledEventInterface_h +#define LiveSupport_EventScheduler_ScheduledEventInterface_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/Ptr.h" + + +namespace LiveSupport { +namespace EventScheduler { + +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * The base class for all events scheduled by the EventScheduler. + * Subclass this one, and implement the necessary functions to have + * a class that can be scheduled. + * + * The lifetime of the scheduled event is as follows, if it is scheduled + * to start at time S and end at time E, where E = S + event.eventLength(): + *
      + *
    • latest at S - event.maxTimeToInitialize(): event.initialize()
    • + *
    • at S: event.start()
    • + *
    • at E: event.stop()
    • + *
    • after E: event.deInitialize()
    • + *
    + * + * @author $Author$ + * @version $Revision$ + */ +class ScheduledEventInterface +{ + public: + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~ScheduledEventInterface(void) throw () + { + } + + /** + * Tell the time this event is scheduled for. + * + * @return the time this event is scheduled for. + */ + virtual Ptr::Ref + getScheduledTime(void) throw () = 0; + + /** + * Initialize the event object. + * This should finishin at most maxTimeToInitialize() time. + * Use this call to allocate any resources that will be needed + * by the event itself. + * + * @exception std::exception on initialization problems. + * a raised exception will result in the cancellation + * of the event. + * @see #maxTimeToInitialize + */ + virtual void + initialize(void) throw (std::exception) = 0; + + /** + * The maximum time for the initalize() function to complete. + * It is the responsibility of the ScheduledEventInterface object to + * complete the initialization in that time. + * + * @return the maximum time for the initialize() function to complete. + * @see #initialize + */ + virtual Ptr::Ref + maxTimeToInitialize(void) throw () = 0; + + /** + * De-initialize the event object. + */ + virtual void + deInitialize(void) throw () = 0; + + /** + * Start the event. + * This function call should start the execution of the event in + * a separate thread, and return immediately. + */ + virtual void + start(void) throw () = 0; + + /** + * The length of the event. + * The scheduler will call stop() when this much time has passed + * after calling start(). + * + * @return the length of the event, in time. + */ + virtual Ptr::Ref + eventLength(void) throw () = 0; + + /** + * Stop the event. + * This function call should result in the event stopping, if + * this has not happened yet. The event execution should be stopped + * and ready to be de-initialized after this call returns. + */ + virtual void + stop(void) throw () = 0; +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace EventScheduler +} // namespace LiveSupport + + +#endif // LiveSupport_EventScheduler_ScheduledEventInterface_h + diff --git a/campcaster/src/modules/eventScheduler/lib/.keepme b/campcaster/src/modules/eventScheduler/lib/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/lib/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/eventScheduler/src/EventScheduler.cxx b/campcaster/src/modules/eventScheduler/src/EventScheduler.cxx new file mode 100644 index 000000000..4a92141b8 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/EventScheduler.cxx @@ -0,0 +1,98 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/EventScheduler/EventScheduler.h" + +#include "SchedulerThread.h" + + +using namespace LiveSupport::Core; +using namespace LiveSupport::EventScheduler; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +LiveSupport::EventScheduler::EventScheduler :: EventScheduler( + Ptr::Ref eventContainer, + Ptr::Ref granularity) + throw () +{ + runnable.reset(new SchedulerThread(eventContainer, granularity)); + thread.reset(new Thread(runnable)); +} + + +/*------------------------------------------------------------------------------ + * Start the event scheduler. + *----------------------------------------------------------------------------*/ +void +LiveSupport::EventScheduler::EventScheduler :: start(void) throw () +{ + thread->start(); +} + + +/*------------------------------------------------------------------------------ + * Update the events. + *----------------------------------------------------------------------------*/ +void +LiveSupport::EventScheduler::EventScheduler :: update(void) throw () +{ + thread->signal(SchedulerThread::UpdateSignal); +} + + +/*------------------------------------------------------------------------------ + * Stop the event scheduler. + *----------------------------------------------------------------------------*/ +void +LiveSupport::EventScheduler::EventScheduler :: stop(void) throw () +{ + thread->stop(); + thread->join(); +} + diff --git a/campcaster/src/modules/eventScheduler/src/EventSchedulerTest.cxx b/campcaster/src/modules/eventScheduler/src/EventSchedulerTest.cxx new file mode 100644 index 000000000..9f03c9ea6 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/EventSchedulerTest.cxx @@ -0,0 +1,236 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/TimeConversion.h" + +#include "LiveSupport/EventScheduler/EventScheduler.h" +#include "TestScheduledEvent.h" +#include "TestEventContainer.h" +#include "EventSchedulerTest.h" + + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; +using namespace LiveSupport::EventScheduler; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(EventSchedulerTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +EventSchedulerTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +EventSchedulerTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple test for the event scheduler thread + *----------------------------------------------------------------------------*/ +void +EventSchedulerTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref event; + Ptr::Ref container; + Ptr::Ref eventScheduler; + Ptr::Ref now; + Ptr::Ref when; + Ptr::Ref initTime; + Ptr::Ref eventLength; + Ptr::Ref granularity; + TestScheduledEvent::State state; + + /* time timeline for this test is: + initialize - 1sec, sometime before start + start - now + 5sec + stop - start + 3 sec + */ + + now = TimeConversion::now(); + when.reset(new ptime(*now + seconds(5))); + initTime.reset(new time_duration(seconds(1))); + eventLength.reset(new time_duration(seconds(3))); + granularity.reset(new time_duration(seconds(1))); + + event.reset(new TestScheduledEvent(when, initTime, eventLength)); + container.reset(new TestEventContainer(event)); + + eventScheduler.reset(new EventScheduler(container, granularity)); + + eventScheduler->start(); + + CPPUNIT_ASSERT(event->getState() == TestScheduledEvent::created); + state = event->getState(); + + for (bool running = true; running; ) { + // check for each state, and see if they are entered into in a correct + // order + now = TimeConversion::now(); + switch (event->getState()) { + case TestScheduledEvent::created: + CPPUNIT_ASSERT(state == TestScheduledEvent::created); + break; + + case TestScheduledEvent::initializing: + // as the init time is same as granularity, we will only + // see initializing once, and can assume that the previous + // state was 'created' + CPPUNIT_ASSERT(state == TestScheduledEvent::created); + break; + + case TestScheduledEvent::initialized: + CPPUNIT_ASSERT(state == TestScheduledEvent::initializing + || state == TestScheduledEvent::initialized); + break; + + case TestScheduledEvent::running: + CPPUNIT_ASSERT(state == TestScheduledEvent::initialized + || state == TestScheduledEvent::running); + // see if the state changed from initialized to running + // at the appropriate time + if (state == TestScheduledEvent::initialized) { + CPPUNIT_ASSERT(*when <= *now + && *now <= *when + *granularity); + } + break; + + case TestScheduledEvent::stopped: + CPPUNIT_ASSERT(state == TestScheduledEvent::running + || state == TestScheduledEvent::stopped); + break; + + case TestScheduledEvent::deInitialized: + // accept running as a possible previous state, as we might + // not catch the stopped state at all + CPPUNIT_ASSERT(state == TestScheduledEvent::running + || state == TestScheduledEvent::stopped); + running = false; + break; + + default: + CPPUNIT_FAIL("unrecognized event state"); + } + state = event->getState(); + TimeConversion::sleep(granularity); + } + + eventScheduler->stop(); +} + + +/*------------------------------------------------------------------------------ + * A test to see what happens, when an event is scheduled after it should + * have been initialized, but not to be started yet. + * See http://bugs.campware.org/view.php?id=757 for details. + *----------------------------------------------------------------------------*/ +void +EventSchedulerTest :: postInitTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref event; + Ptr::Ref container; + Ptr::Ref eventScheduler; + Ptr::Ref now; + Ptr::Ref when; + Ptr::Ref initTime; + Ptr::Ref eventLength; + Ptr::Ref granularity; + TestScheduledEvent::State state; + + /* time timeline for this test is: + initialize - 10 sec + start - now + 5sec + stop - start + 3 sec + */ + + now = TimeConversion::now(); + when.reset(new ptime(*now + seconds(5))); + initTime.reset(new time_duration(seconds(10))); + eventLength.reset(new time_duration(seconds(3))); + granularity.reset(new time_duration(seconds(1))); + + event.reset(new TestScheduledEvent(when, initTime, eventLength)); + container.reset(new TestEventContainer(event)); + + eventScheduler.reset(new EventScheduler(container, granularity)); + + eventScheduler->start(); + + CPPUNIT_ASSERT(event->getState() == TestScheduledEvent::created); + state = event->getState(); + + Ptr::Ref end(new ptime(*when + seconds(10))); + while (*TimeConversion::now() < *end) { + // nothing should happen here, just wait for some to see that + // indeed it doesn't + CPPUNIT_ASSERT(event->getState() == TestScheduledEvent::created); + TimeConversion::sleep(granularity); + } + + eventScheduler->stop(); +} + diff --git a/campcaster/src/modules/eventScheduler/src/EventSchedulerTest.h b/campcaster/src/modules/eventScheduler/src/EventSchedulerTest.h new file mode 100644 index 000000000..be7594edf --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/EventSchedulerTest.h @@ -0,0 +1,119 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef EventSchedulerTest_h +#define EventSchedulerTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace EventScheduler { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the EventScheduler class. + * + * @author $Author$ + * @version $Revision$ + * @see EventScheduler + */ +class EventSchedulerTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(EventSchedulerTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(postInitTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to see if an event is scheduled after it should have + * been initialized (see http://bugs.campware.org/view.php?id=757) + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + postInitTest(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 EventScheduler +} // namespace LiveSupport + +#endif // EventSchedulerTest_h + diff --git a/campcaster/src/modules/eventScheduler/src/SchedulerThread.cxx b/campcaster/src/modules/eventScheduler/src/SchedulerThread.cxx new file mode 100644 index 000000000..0476e24f4 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/SchedulerThread.cxx @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/Core/TimeConversion.h" + +#include "SchedulerThread.h" + + +using namespace LiveSupport::Core; +using namespace LiveSupport::EventScheduler; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +SchedulerThread :: SchedulerThread( + Ptr::Ref eventContainer, + Ptr::Ref granularity) + throw () +{ + this->eventContainer = eventContainer; + this->granularity = granularity; + this->shouldRun = false; +} + + +/*------------------------------------------------------------------------------ + * Get the next event from the eventContainer + *----------------------------------------------------------------------------*/ +void +SchedulerThread :: getNextEvent(Ptr::Ref when) throw () +{ + nextEvent = eventContainer->getNextEvent(when); + if (nextEvent.get()) { + nextEventTime = nextEvent->getScheduledTime(); + nextInitTime.reset(new ptime(*nextEventTime + - *granularity + - *nextEvent->maxTimeToInitialize())); + nextEventEnd.reset(new ptime(*nextEventTime + + *nextEvent->eventLength())); + } +} + + +/*------------------------------------------------------------------------------ + * The main execution body of the thread. + *----------------------------------------------------------------------------*/ +void +SchedulerThread :: nextStep(Ptr::Ref now) throw () +{ + if (!nextEvent.get()) { + return; + } + + if (imminent(now, nextInitTime)) { + try { + nextEvent->initialize(); + } catch (std::exception &e) { + // cancel event by getting the next event after this was + // supposed to finish + getNextEvent(nextEventEnd); + // TODO: log error + std::cerr << "event initialization error: " << e.what() + << std::endl; + } + } else if (imminent(now, nextEventTime)) { + Ptr::Ref timeLeft(new time_duration(*nextEventTime + - *now)); + TimeConversion::sleep(timeLeft); + nextEvent->start(); + } else if (imminent(now, nextEventEnd)) { + Ptr::Ref timeLeft(new time_duration(*nextEventEnd + - *now)); + TimeConversion::sleep(timeLeft); + nextEvent->stop(); + nextEvent->deInitialize(); + } +} + + +/*------------------------------------------------------------------------------ + * The main execution body of the thread. + *----------------------------------------------------------------------------*/ +void +SchedulerThread :: run(void) throw () +{ + shouldRun = true; + getNextEvent(TimeConversion::now()); + + while (shouldRun) { + Ptr::Ref start = TimeConversion::now(); + + nextStep(start); + + // sleep until the next granularity + Ptr::Ref end = TimeConversion::now(); + Ptr::Ref diff(new time_duration(*end - *start)); + if (*diff <= *granularity) { + Ptr::Ref sleepTime(new time_duration(*granularity + - *diff)); + TimeConversion::sleep(sleepTime); + } + } +} + + +/*------------------------------------------------------------------------------ + * Accept a signal. + *----------------------------------------------------------------------------*/ +void +SchedulerThread :: signal(int signalId) throw () +{ + switch (signalId) { + case UpdateSignal: + getNextEvent(TimeConversion::now()); + break; + + default: + break; + } +} + + diff --git a/campcaster/src/modules/eventScheduler/src/SchedulerThread.h b/campcaster/src/modules/eventScheduler/src/SchedulerThread.h new file mode 100644 index 000000000..eb6b8cfc8 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/SchedulerThread.h @@ -0,0 +1,224 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SchedulerThread_h +#define SchedulerThread_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "LiveSupport/Core/RunnableInterface.h" +#include "LiveSupport/EventScheduler/ScheduledEventInterface.h" +#include "LiveSupport/EventScheduler/EventContainerInterface.h" + + +namespace LiveSupport { +namespace EventScheduler { + +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * The main, executing thread of the scheduler. + * + * @author $Author$ + * @version $Revision$ + */ +class SchedulerThread : public virtual RunnableInterface +{ + public: + /** + * Enumerated type for the signals accepted by this object. + * + * @see #signal + */ + typedef enum { UpdateSignal } SignalTypes; + + private: + /** + * The event container, to get the events from. + */ + Ptr::Ref eventContainer; + + /** + * The next event to execute. + */ + Ptr::Ref nextEvent; + + /** + * The execution time of the next event. + */ + Ptr::Ref nextEventTime; + + /** + * The time to start the initialization of the next event. + */ + Ptr::Ref nextInitTime; + + /** + * The ending time of the next event. + */ + Ptr::Ref nextEventEnd; + + /** + * The granularity of the scheduler: the time it will sleep + * between checking up on the state of things. + */ + Ptr::Ref granularity; + + /** + * Flag indicating whether the thread should still run, or + * actually terminate. + */ + bool shouldRun; + + /** + * Default constructor. + */ + SchedulerThread(void) throw () + { + } + + /** + * Get the next event. + * + * @param when get the first event after this specified time. + */ + void + getNextEvent(Ptr::Ref when) throw (); + + /** + * Tell if the specified time falls within now and the next + * waking up. Basically tells if it is within now and + * now + granularity. + * + * @param now the current time. + * @param time check this time if it is imminent. + * @return true if the specified time falls within now and + * now + granularity, false otherwise. + */ + bool + imminent(Ptr::Ref now, + Ptr::Ref when) const throw () + { + return *when >= *now && (*now + *granularity) > *when; + } + + /** + * Execute the next step on the active event, if any is imminent. + * + * @param now the current time. + */ + void + nextStep(Ptr::Ref now) throw (); + + + public: + /** + * Constructor. + * + * @param eventContainer the container this thread will get its + * events to schedule from. + * @param granularity the granularity of the thread: the time the + * thread will sleep between checking up on things. + */ + SchedulerThread(Ptr::Ref eventContainer, + Ptr::Ref granularity) + throw (); + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~SchedulerThread(void) throw () + { + } + + /** + * The main execution loop for the thread. + */ + virtual void + run(void) throw (); + + /** + * Accept a signal. + * Currently supported signal values are: + *
      + *
    • UpdateSignal - re-read the event container
    • + *
    + * + * @param signalId a value from SignalTypes. + * @see #signalTypes + */ + virtual void + signal(int signalId) throw (); + + + /** + * Signal the thread to stop, gracefully. + */ + virtual void + stop(void) throw () + { + shouldRun = false; + } +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace EventScheduler +} // namespace LiveSupport + + +#endif // SchedulerThread_h + diff --git a/campcaster/src/modules/eventScheduler/src/SchedulerThreadTest.cxx b/campcaster/src/modules/eventScheduler/src/SchedulerThreadTest.cxx new file mode 100644 index 000000000..5223359c7 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/SchedulerThreadTest.cxx @@ -0,0 +1,187 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + + +#include +#include + +#include "LiveSupport/Core/TimeConversion.h" +#include "LiveSupport/Core/Thread.h" + +#include "SchedulerThread.h" +#include "TestScheduledEvent.h" +#include "TestEventContainer.h" +#include "SchedulerThreadTest.h" + + +using namespace boost::posix_time; + +using namespace LiveSupport::Core; +using namespace LiveSupport::EventScheduler; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(SchedulerThreadTest); + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +SchedulerThreadTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +SchedulerThreadTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple test for the event scheduler thread + *----------------------------------------------------------------------------*/ +void +SchedulerThreadTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref event; + Ptr::Ref container; + Ptr::Ref thread; + Ptr::Ref schedulerThread; + Ptr::Ref now; + Ptr::Ref when; + Ptr::Ref initTime; + Ptr::Ref eventLength; + Ptr::Ref granularity; + TestScheduledEvent::State state; + + /* time timeline for this test is: + initialize - 1sec, sometime before start + start - now + 5sec + stop - start + 3 sec + */ + + now = TimeConversion::now(); + when.reset(new ptime(*now + seconds(5))); + initTime.reset(new time_duration(seconds(1))); + eventLength.reset(new time_duration(seconds(3))); + granularity.reset(new time_duration(seconds(1))); + + event.reset(new TestScheduledEvent(when, initTime, eventLength)); + container.reset(new TestEventContainer(event)); + + schedulerThread.reset(new SchedulerThread(container, granularity)); + thread.reset(new Thread(schedulerThread)); + + thread->start(); + + CPPUNIT_ASSERT(event->getState() == TestScheduledEvent::created); + state = event->getState(); + + for (bool running = true; running; ) { + // check for each state, and see if they are entered into in a correct + // order + now = TimeConversion::now(); + switch (event->getState()) { + case TestScheduledEvent::created: + CPPUNIT_ASSERT(state == TestScheduledEvent::created); + break; + + case TestScheduledEvent::initializing: + // as the init time is same as granularity, we will only + // see initializing once, and can assume that the previous + // state was 'created' + CPPUNIT_ASSERT(state == TestScheduledEvent::created); + break; + + case TestScheduledEvent::initialized: + CPPUNIT_ASSERT(state == TestScheduledEvent::initializing + || state == TestScheduledEvent::initialized); + break; + + case TestScheduledEvent::running: + CPPUNIT_ASSERT(state == TestScheduledEvent::initialized + || state == TestScheduledEvent::running); + // see if the state changed from initialized to running + // at the appropriate time + if (state == TestScheduledEvent::initialized) { + CPPUNIT_ASSERT(*when <= *now + && *now <= *when + *granularity); + } + break; + + case TestScheduledEvent::stopped: + CPPUNIT_ASSERT(state == TestScheduledEvent::running + || state == TestScheduledEvent::stopped); + break; + + case TestScheduledEvent::deInitialized: + // accept running as a possible previous state, as we might + // not catch the stopped state at all + CPPUNIT_ASSERT(state == TestScheduledEvent::running + || state == TestScheduledEvent::stopped); + running = false; + break; + + default: + CPPUNIT_FAIL("unrecognized event state"); + } + state = event->getState(); + TimeConversion::sleep(granularity); + } + + thread->stop(); + thread->join(); +} + diff --git a/campcaster/src/modules/eventScheduler/src/SchedulerThreadTest.h b/campcaster/src/modules/eventScheduler/src/SchedulerThreadTest.h new file mode 100644 index 000000000..3c4ee5013 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/SchedulerThreadTest.h @@ -0,0 +1,109 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SchedulerThreadTest_h +#define SchedulerThreadTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace EventScheduler { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the SchedulerThread class. + * + * @author $Author$ + * @version $Revision$ + * @see EventScheduler + */ +class SchedulerThreadTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(SchedulerThreadTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + + protected: + + /** + * A simple test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 EventScheduler +} // namespace LiveSupport + +#endif // SchedulerThreadTest_h + diff --git a/campcaster/src/modules/eventScheduler/src/TestEventContainer.cxx b/campcaster/src/modules/eventScheduler/src/TestEventContainer.cxx new file mode 100644 index 000000000..714cf2b06 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/TestEventContainer.cxx @@ -0,0 +1,85 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#error need unistd.h +#endif + + +#include "TestEventContainer.h" + + +using namespace LiveSupport::Core; +using namespace LiveSupport::EventScheduler; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +TestEventContainer :: TestEventContainer( + Ptr::Ref event) + throw () +{ + this->event = event; +} + + +/*------------------------------------------------------------------------------ + * Return the first scheduled event after the specified timepoint + *----------------------------------------------------------------------------*/ +Ptr::Ref +TestEventContainer :: getNextEvent(Ptr::Ref when) throw () +{ + if (*when < (*event->getScheduledTime() - *event->maxTimeToInitialize())) { + return event; + } else { + // return an empty reference + Ptr::Ref empty; + return empty; + } +} + diff --git a/campcaster/src/modules/eventScheduler/src/TestEventContainer.h b/campcaster/src/modules/eventScheduler/src/TestEventContainer.h new file mode 100644 index 000000000..ec0781134 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/TestEventContainer.h @@ -0,0 +1,118 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef TestEventContainer_h +#define TestEventContainer_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/EventScheduler/EventContainerInterface.h" + + +namespace LiveSupport { +namespace EventScheduler { + +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * An event container for testing purposes. + * + * @author $Author$ + * @version $Revision$ + */ +class TestEventContainer : public virtual EventContainerInterface +{ + private: + /** + * The only event that this container holds. + */ + Ptr::Ref event; + + + public: + /** + * Constructor. + * + * @param event the only event this container will hold. + */ + TestEventContainer(Ptr::Ref event) + throw (); + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~TestEventContainer(void) throw () + { + } + + /** + * Return the first event after the specified timepoint. + * + * @param when return the first event after this timepoint, + * @return the first event to schedule after the specified + * timepoint. may be a reference to 0, if currently + * there are no known events after the specified time. + */ + virtual Ptr::Ref + getNextEvent(Ptr::Ref when) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace EventScheduler +} // namespace LiveSupport + + +#endif // TestEventContainer_h + diff --git a/campcaster/src/modules/eventScheduler/src/TestRunner.cxx b/campcaster/src/modules/eventScheduler/src/TestRunner.cxx new file mode 100644 index 000000000..0e0930e5b --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/TestRunner.cxx @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + +#if HAVE_GETOPT_H +#include +#else +#error "Need getopt.h" +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +using namespace LiveSupport::Core; + +/* =================================================== 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[] = "ho:s:v"; + +/** + * Structure describing the long options + */ +static const struct option longOptions[] = { + { "help", no_argument, 0, 'h' }, + { "output", required_argument, 0, 'o' }, + { "stylesheet", required_argument, 0, 's' }, + { "version", no_argument, 0, 'v' }, + { 0, 0, 0, 0 } +}; + +/** + * The encoding to use for the output file. + */ +static const std::string encoding = "utf-8"; + +/** + * The output XML file name. + */ +static Ptr::Ref xmlOutFileName; + +/** + * The XSLT attached to the output file. + */ +static Ptr::Ref xsltFileName; + + +/* =============================================== 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 ); + +/** + * Process command line arguments. + * + * @param argc the number of arguments. + * @param argv the arguments themselves. + * @return true of all went well, false in case the program should exit + * after this call. + */ +static bool +processArguments(int argc, char *argv[]); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Run all tests + *----------------------------------------------------------------------------*/ +int +main( int argc, + char * argv[] ) throw () +{ + if (!processArguments(argc, argv)) { + return 0; + } + + // 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(); + + // also generate an XML document as an output + std::ofstream xmlOutFile(xmlOutFileName->c_str()); + CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); + xmlOutputter.setStandalone(false); + if (xsltFileName) { + xmlOutputter.setStyleSheet(*xsltFileName); + } + xmlOutputter.write(); + xmlOutFile.flush(); + xmlOutFile.close(); + + return result.wasSuccessful() ? 0 : 1; +} + + +/*------------------------------------------------------------------------------ + * Process command line arguments. + *----------------------------------------------------------------------------*/ +static bool +processArguments(int argc, char *argv[]) +{ + int i; + + while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { + switch (i) { + case 'h': + printUsage(argv[0], std::cout); + return false; + + case 'o': + xmlOutFileName.reset(new std::string(optarg)); + break; + + case 's': + xsltFileName.reset(new std::string(optarg)); + break; + + case 'v': + printVersion(std::cout); + return false; + + default: + printUsage(argv[0], std::cout); + return false; + } + } + + if (optind < argc) { + std::cerr << "error processing command line arguments" << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + if (!xmlOutFileName) { + std::cerr << "mandatory option output file name not specified" + << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; + if (xsltFileName) { + std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Print program version. + *----------------------------------------------------------------------------*/ +static void +printVersion ( std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << copyrightNotice << std::endl; +} + + +/*------------------------------------------------------------------------------ + * Print program usage. + *----------------------------------------------------------------------------*/ +static void +printUsage ( const char invocation[], + std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << std::endl + << "Usage: " << invocation << " [OPTION]" + << std::endl + << " mandatory options:" << std::endl + << " -o, --output=file.name write test results into this XML file" + << std::endl + << " optional options:" << std::endl + << " -s, --stylesheet specify this XSLT for the output file" + << std::endl + << " this is either an absolute URI, or a" + << std::endl + << " relative path for the output document" + << 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; +} + diff --git a/campcaster/src/modules/eventScheduler/src/TestScheduledEvent.cxx b/campcaster/src/modules/eventScheduler/src/TestScheduledEvent.cxx new file mode 100644 index 000000000..d6a19e04b --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/TestScheduledEvent.cxx @@ -0,0 +1,117 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#error need unistd.h +#endif + +#include "LiveSupport/Core/TimeConversion.h" + +#include "TestScheduledEvent.h" + + +using namespace LiveSupport::Core; +using namespace LiveSupport::EventScheduler; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Constructor. + *----------------------------------------------------------------------------*/ +TestScheduledEvent :: TestScheduledEvent( + Ptr::Ref when, + Ptr::Ref maxTimeToInitialize, + Ptr::Ref eventLength) + throw () +{ + this->when = when; + this->initTime = maxTimeToInitialize; + this->length = eventLength; + state = created; +} + + +/*------------------------------------------------------------------------------ + * Initialize the event object. + *----------------------------------------------------------------------------*/ +void +TestScheduledEvent :: initialize(void) throw (std::exception) +{ + state = initializing; + TimeConversion::sleep(initTime); + state = initialized; +} + + +/*------------------------------------------------------------------------------ + * Initialize the event object. + *----------------------------------------------------------------------------*/ +void +TestScheduledEvent :: deInitialize(void) throw () +{ + state = deInitialized; +} + + +/*------------------------------------------------------------------------------ + * Initialize the event object. + *----------------------------------------------------------------------------*/ +void +TestScheduledEvent :: start(void) throw () +{ + state = running; +} + + +/*------------------------------------------------------------------------------ + * Initialize the event object. + *----------------------------------------------------------------------------*/ +void +TestScheduledEvent :: stop(void) throw () +{ + state = stopped; +} + diff --git a/campcaster/src/modules/eventScheduler/src/TestScheduledEvent.h b/campcaster/src/modules/eventScheduler/src/TestScheduledEvent.h new file mode 100644 index 000000000..05f15b05e --- /dev/null +++ b/campcaster/src/modules/eventScheduler/src/TestScheduledEvent.h @@ -0,0 +1,222 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef TestScheduledEvent_h +#define TestScheduledEvent_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include "LiveSupport/EventScheduler/ScheduledEventInterface.h" + + +namespace LiveSupport { +namespace EventScheduler { + +using namespace boost::posix_time; + +using namespace LiveSupport; +using namespace LiveSupport::Core; + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A scheduled event for testing purposes. + * + * @author $Author$ + * @version $Revision$ + */ +class TestScheduledEvent : public virtual ScheduledEventInterface +{ + public: + /** + * Enumeration describing the possible states of the event. + */ + typedef enum { created, + initializing, + initialized, + running, + stopped, + deInitialized } State; + + private: + /** + * The time this event is scheduled for. + */ + Ptr::Ref when; + + /** + * The maximum time this event should get initialized. + */ + Ptr::Ref initTime; + + /** + * The length of the event. + */ + Ptr::Ref length; + + /** + * The current state of the event. + */ + State state; + + public: + /** + * Constructor. + * + * @param when the time this event is scheduled for. + * @param maxTimeToInitialize the maximum time for this event + * to initialize. + * @param eventLength the length of the event. + */ + TestScheduledEvent(Ptr::Ref when, + Ptr::Ref maxTimeToInitialize, + Ptr::Ref eventLength) + throw (); + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~TestScheduledEvent(void) throw () + { + } + + /** + * Return the current state of the event. + */ + virtual State + getState(void) const throw () + { + return state; + } + + /** + * Tell the time this event is scheduled for. + * + * @return the time this event is scheduled for. + */ + virtual Ptr::Ref + getScheduledTime(void) throw () + { + return when; + } + + /** + * Initialize the event object. + * This should finishin at most maxTimeToInitialize() time. + * Use this call to allocate any resources that will be needed + * by the event itself. + * + * @exception std::exception on initialization problems. + * a raised exception will result in the cancellation + * of the event. + * @see #maxTimeToInitialize + */ + virtual void + initialize(void) throw (std::exception); + + /** + * The maximum time for the initalize() function to complete. + * It is the responsibility of the ScheduledEventInterface object to + * complete the initialization in that time. + * + * @return the maximum time for the initialize() function to complete. + * @see #initialize + */ + virtual Ptr::Ref + maxTimeToInitialize(void) throw () + { + return initTime; + } + + /** + * De-initialize the event object. + */ + virtual void + deInitialize(void) throw (); + + /** + * Start the event. + * This function call should start the execution of the event in + * a separate thread, and return immediately. + */ + virtual void + start(void) throw (); + + /** + * The length of the event. + * The scheduler will call stop() when this much time has passed + * after calling start(). + * + * @return the length of the event, in time. + */ + virtual Ptr::Ref + eventLength(void) throw () + { + return length; + } + + /** + * Stop the event. + * This function call should result in the event stopping, if + * this has not happened yet. The processing of this event should + * persue in a seperate thread, and the function itself should + * return immediately. + */ + virtual void + stop(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace EventScheduler +} // namespace LiveSupport + + +#endif // TestScheduledEvent_h + diff --git a/campcaster/src/modules/eventScheduler/tmp/.keepme b/campcaster/src/modules/eventScheduler/tmp/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/eventScheduler/tmp/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/getid3/bin/autogen.sh b/campcaster/src/modules/getid3/bin/autogen.sh new file mode 100755 index 000000000..6ce3ce0f2 --- /dev/null +++ b/campcaster/src/modules/getid3/bin/autogen.sh @@ -0,0 +1,94 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="GetId3" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +#ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +#echo " aclocal $ACLOCAL_FLAGS" +#cp -f ${configure_ac} ${tmpdir} +#cp -f ${etcdir}/acinclude.m4 ${tmpdir} +#aclocal $ACLOCAL_FLAGS + +#echo " autoheader ${configure_ac}" +#autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/getid3/configure b/campcaster/src/modules/getid3/configure new file mode 100755 index 000000000..47e6d5cd0 --- /dev/null +++ b/campcaster/src/modules/getid3/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen "$@") +fi + +(cd $tmpdir && $configure "$@") + diff --git a/campcaster/src/modules/getid3/etc/Makefile.in b/campcaster/src/modules/getid3/etc/Makefile.in new file mode 100644 index 000000000..8806a0f88 --- /dev/null +++ b/campcaster/src/modules/getid3/etc/Makefile.in @@ -0,0 +1,139 @@ +#------------------------------------------------------------------------------- +# getID3 - read and writes tags in media files - see getid3.readme.txt +# getID3 by James Heinrich +# +# This file is part of the Campcaster project. +# Copyright (c) 2004 Media Development Loan Fund +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f + + +#------------------------------------------------------------------------------- +# Misc +#------------------------------------------------------------------------------- + +MODULE_NAME = getid3 +TAR_C = tar -cj --exclude .svn --exclude '*~' -C ${BASE_DIR} -f +DIST_EXT = .tgz +DATE = `date +%y%m%d` + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +#BASE_DIR = @builddir@ +BASE_DIR = . +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp +VAR_DIR = ${BASE_DIR}/var + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_VAR_DIR = ${USR_DIR}/var + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +PHP_DIR = ${VAR_DIR} +#TEST_RUNNER = ${PHP_DIR}/tests/index.php + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +#CPPFLAGS = @CPPFLAGS@ +#CXXFLAGS = @CXXFLAGS@ @DEFS@ -I${USR_INCLUDE_DIR} -I${INCLUDE_DIR} -I${TMP_DIR}\ +# -pedantic -Wall +#LDFLAGS = @LDFLAGS@ -L${USR_LIB_DIR} -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +#HELLO_LIB_OBJS = ${TMP_DIR}/Hello.o +#TEST_RUNNER_OBJS = ${TMP_DIR}/HelloTest.o ${TMP_DIR}/TestRunner.o + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean dist install + +all: dir_setup + +#dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} +dir_setup: ${DOXYGEN_DIR} + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: +# ${RM} ... + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + +depclean: clean + +dist: all + ${TAR_C} ${MODULE_NAME}${DATE}${DIST_EXT} * + +distclean: clean docclean +# ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* + +#check: all ${TEST_RUNNER} +# ${TEST_RUNNER} +check: all + +install: + ${MKDIR} ${USR_VAR_DIR}/Campcaster/getid3/var + ${CP} ${VAR_DIR}/*.{php,txt} ${USR_VAR_DIR}/Campcaster/getid3/var + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +#${TEST_RUNNER}: + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +#${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx +# ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/src/modules/getid3/etc/configure.ac b/campcaster/src/modules/getid3/etc/configure.ac new file mode 100644 index 000000000..4eb212ed1 --- /dev/null +++ b/campcaster/src/modules/getid3/etc/configure.ac @@ -0,0 +1,45 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(GetId3, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../var/getid3.php) + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/getid3/etc/doxygen.config b/campcaster/src/modules/getid3/etc/doxygen.config new file mode 100644 index 000000000..bc2083c44 --- /dev/null +++ b/campcaster/src/modules/getid3/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# doxygen.config +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = LiveSupport + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +#EXTRACT_ALL = NO +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = var + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = *.php + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/getid3/tmp/.keepme b/campcaster/src/modules/getid3/tmp/.keepme new file mode 100644 index 000000000..e69de29bb diff --git a/campcaster/src/modules/getid3/var/extension.cache.dbm.php b/campcaster/src/modules/getid3/var/extension.cache.dbm.php new file mode 100644 index 000000000..051bb1f0d --- /dev/null +++ b/campcaster/src/modules/getid3/var/extension.cache.dbm.php @@ -0,0 +1,222 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// // +// extension.cache.dbm.php - part of getID3() // +// Please see readme.txt for more information // +// /// +///////////////////////////////////////////////////////////////// +// // +// This extension written by Allan Hansen // +// /// +///////////////////////////////////////////////////////////////// + + +/** +* This is a caching extension for getID3(). It works the exact same +* way as the getID3 class, but return cached information very fast +* +* Example: +* +* Normal getID3 usage (example): +* +* require_once 'getid3/getid3.php'; +* $getID3 = new getID3; +* $getID3->encoding = 'UTF-8'; +* $info1 = $getID3->analyze('file1.flac'); +* $info2 = $getID3->analyze('file2.wv'); +* +* getID3_cached usage: +* +* require_once 'getid3/getid3.php'; +* require_once 'getid3/getid3/extension.cache.dbm.php'; +* $getID3 = new getID3_cached('db3', '/tmp/getid3_cache.dbm', +* '/tmp/getid3_cache.lock'); +* $getID3->encoding = 'UTF-8'; +* $info1 = $getID3->analyze('file1.flac'); +* $info2 = $getID3->analyze('file2.wv'); +* +* +* Supported Cache Types +* +* SQL Databases: (use extension.cache.mysql) +* +* cache_type cache_options +* ------------------------------------------------------------------- +* mysql host, database, username, password +* +* +* DBM-Style Databases: (this extension) +* +* cache_type cache_options +* ------------------------------------------------------------------- +* gdbm dbm_filename, lock_filename +* ndbm dbm_filename, lock_filename +* db2 dbm_filename, lock_filename +* db3 dbm_filename, lock_filename +* db4 dbm_filename, lock_filename (PHP5 required) +* +* PHP must have write access to both dbm_filename and lock_filename. +* +* +* Recommended Cache Types +* +* Infrequent updates, many reads any DBM +* Frequent updates mysql +*/ + + +class getID3_cached_dbm extends getID3 +{ + + // public: constructor - see top of this file for cache type and cache_options + function getID3_cached_dbm($cache_type, $dbm_filename, $lock_filename) { + + // Check for dba extension + if (!extension_loaded('dba')) { + die('PHP is not compiled with dba support, required to use DBM style cache.'); + } + + // Check for specific dba driver + if (function_exists('dba_handlers')) { // PHP 4.3.0+ + if (!in_array('db3', dba_handlers())) { + die('PHP is not compiled --with '.$cache_type.' support, required to use DBM style cache.'); + } + } + else { // PHP <= 4.2.3 + ob_start(); // nasty, buy the only way to check... + phpinfo(); + $contents = ob_get_contents(); + ob_end_clean(); + if (!strstr($contents, $cache_type)) { + die('PHP is not compiled --with '.$cache_type.' support, required to use DBM style cache.'); + } + } + + // Create lock file if needed + if (!file_exists($lock_filename)) { + if (!touch($lock_filename)) { + die('failed to create lock file: ' . $lock_filename); + } + } + + // Open lock file for writing + if (!is_writeable($lock_filename)) { + die('lock file: ' . $lock_filename . ' is not writable'); + } + $this->lock = fopen($lock_filename, 'w'); + + // Acquire exclusive write lock to lock file + flock($this->lock, LOCK_EX); + + // Create dbm-file if needed + if (!file_exists($dbm_filename)) { + if (!touch($dbm_filename)) { + die('failed to create dbm file: ' . $dbm_filename); + } + } + + // Try to open dbm file for writing + $this->dba = @dba_open($dbm_filename, 'w', $cache_type); + if (!$this->dba) { + + // Failed - create new dbm file + $this->dba = dba_open($dbm_filename, 'n', $cache_type); + + if (!$this->dba) { + die('failed to create dbm file: ' . $dbm_filename); + } + + // Insert getID3 version number + dba_insert(GETID3_VERSION, GETID3_VERSION, $this->dba); + } + + // Init misc values + $this->cache_type = $cache_type; + $this->dbm_filename = $dbm_filename; + + // Register destructor + register_shutdown_function(array($this, '__destruct')); + + // Check version number and clear cache if changed + if (dba_fetch(GETID3_VERSION, $this->dba) != GETID3_VERSION) { + $this->clear_cache(); + } + + parent::getID3(); + } + + + + // public: destuctor + function __destruct() { + + // Close dbm file + @dba_close($this->dba); + + // Release exclusive lock + @flock($this->lock, LOCK_UN); + + // Close lock file + @fclose($this->lock); + } + + + + // public: clear cache + function clear_cache() { + + // Close dbm file + dba_close($this->dba); + + // Create new dbm file + $this->dba = dba_open($this->dbm_filename, 'n', $this->cache_type); + + if (!$this->dba) { + die('failed to clear cache/recreate dbm file: ' . $this->dbm_filename); + } + + // Insert getID3 version number + dba_insert(GETID3_VERSION, GETID3_VERSION, $this->dba); + + // Reregister shutdown function + register_shutdown_function(array($this, '__destruct')); + } + + + + // public: analyze file + function analyze($filename) { + + if (file_exists($filename)) { + + // Calc key filename::mod_time::size - should be unique + $key = $filename . '::' . filemtime($filename) . '::' . filesize($filename); + + // Loopup key + $result = dba_fetch($key, $this->dba); + + // Hit + if ($result !== false) { + return unserialize($result); + } + } + + // Miss + $result = parent::analyze($filename); + + // Save result + if (file_exists($filename)) { + dba_insert($key, serialize($result), $this->dba); + } + + return $result; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/extension.cache.mysql.php b/campcaster/src/modules/getid3/var/extension.cache.mysql.php new file mode 100644 index 000000000..40ea6883e --- /dev/null +++ b/campcaster/src/modules/getid3/var/extension.cache.mysql.php @@ -0,0 +1,171 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// // +// extension.cache.mysql.php - part of getID3() // +// Please see readme.txt for more information // +// /// +///////////////////////////////////////////////////////////////// +// // +// This extension written by Allan Hansen // +// /// +///////////////////////////////////////////////////////////////// + + +/** +* This is a caching extension for getID3(). It works the exact same +* way as the getID3 class, but return cached information very fast +* +* Example: (see also demo.cache.mysql.php in /demo/) +* +* Normal getID3 usage (example): +* +* require_once 'getid3/getid3.php'; +* $getID3 = new getID3; +* $getID3->encoding = 'UTF-8'; +* $info1 = $getID3->analyze('file1.flac'); +* $info2 = $getID3->analyze('file2.wv'); +* +* getID3_cached usage: +* +* require_once 'getid3/getid3.php'; +* require_once 'getid3/getid3/extension.cache.mysql.php'; +* $getID3 = new getID3_cached_mysql('localhost', 'database', +* 'username', 'password'); +* $getID3->encoding = 'UTF-8'; +* $info1 = $getID3->analyze('file1.flac'); +* $info2 = $getID3->analyze('file2.wv'); +* +* +* Supported Cache Types (this extension) +* +* SQL Databases: +* +* cache_type cache_options +* ------------------------------------------------------------------- +* mysql host, database, username, password +* +* +* DBM-Style Databases: (use extension.cache.dbm) +* +* cache_type cache_options +* ------------------------------------------------------------------- +* gdbm dbm_filename, lock_filename +* ndbm dbm_filename, lock_filename +* db2 dbm_filename, lock_filename +* db3 dbm_filename, lock_filename +* db4 dbm_filename, lock_filename (PHP5 required) +* +* PHP must have write access to both dbm_filename and lock_filename. +* +* +* Recommended Cache Types +* +* Infrequent updates, many reads any DBM +* Frequent updates mysql +*/ + + +class getID3_cached_mysql extends getID3 +{ + + // private vars + var $cursor; + var $connection; + + + // public: constructor - see top of this file for cache type and cache_options + function getID3_cached_mysql($host, $database, $username, $password) { + + // Check for mysql support + if (!function_exists('mysql_pconnect')) { + die('PHP not compiled with mysql support.'); + } + + // Connect to database + $this->connection = mysql_pconnect($host, $username, $password); + if (!$this->connection) { + die('mysql_pconnect() failed - check permissions and spelling.'); + } + + // Select database + if (!mysql_select_db($database, $this->connection)) { + die('Cannot use database '.$database); + } + + // Create cache table if not exists + $this->create_table(); + + // Check version number and clear cache if changed + $this->cursor = mysql_query("SELECT `value` FROM `getid3_cache` WHERE (`filename` = '".GETID3_VERSION."') AND (`filesize` = '-1') AND (`filetime` = '-1') AND (`analyzetime` = '-1')", $this->connection); + list($version) = @mysql_fetch_array($this->cursor); + if ($version != GETID3_VERSION) { + $this->clear_cache(); + } + + parent::getID3(); + } + + + + // public: clear cache + function clear_cache() { + + $this->cursor = mysql_query("DELETE FROM `getid3_cache`", $this->connection); + $this->cursor = mysql_query("INSERT INTO `getid3_cache` VALUES ('".GETID3_VERSION."', -1, -1, -1, '".GETID3_VERSION."')", $this->connection); + } + + + + // public: analyze file + function analyze($filename) { + + if (file_exists($filename)) { + + // Short-hands + $filetime = filemtime($filename); + $filesize = filesize($filename); + $filenam2 = mysql_escape_string($filename); + + // Loopup file + $this->cursor = mysql_query("SELECT `value` FROM `getid3_cache` WHERE (`filename`='".$filenam2."') AND (`filesize`='".$filesize."') AND (`filetime`='".$filetime."')", $this->connection); + list($result) = @mysql_fetch_array($this->cursor); + + // Hit + if ($result) { + return unserialize($result); + } + } + + // Miss + $result = parent::analyze($filename); + + // Save result + if (file_exists($filename)) { + $res2 = mysql_escape_string(serialize($result)); + $this->cursor = mysql_query("INSERT INTO `getid3_cache` (`filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES ('".$filenam2."', '".$filesize."', '".$filetime."', '".time()."', '".$res2."')", $this->connection); + } + return $result; + } + + + + // private: (re)create sql table + function create_table($drop = false) { + + $this->cursor = mysql_query("CREATE TABLE IF NOT EXISTS `getid3_cache` ( + `filename` VARCHAR(255) NOT NULL DEFAULT '', + `filesize` INT(11) NOT NULL DEFAULT '0', + `filetime` INT(11) NOT NULL DEFAULT '0', + `analyzetime` INT(11) NOT NULL DEFAULT '0', + `value` TEXT NOT NULL, + PRIMARY KEY (`filename`,`filesize`,`filetime`)) TYPE=MyISAM", $this->connection); + echo mysql_error($this->connection); + } +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/getid3.lib.php b/campcaster/src/modules/getid3/var/getid3.lib.php new file mode 100644 index 000000000..b5146b7e8 --- /dev/null +++ b/campcaster/src/modules/getid3/var/getid3.lib.php @@ -0,0 +1,1323 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// // +// getid3.lib.php - part of getID3() // +// See readme.txt for more details // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_lib +{ + + function PrintHexBytes($string, $hex=true, $spaces=true, $htmlsafe=true) { + $returnstring = ''; + for ($i = 0; $i < strlen($string); $i++) { + if ($hex) { + $returnstring .= str_pad(dechex(ord($string{$i})), 2, '0', STR_PAD_LEFT); + } else { + $returnstring .= ' '.(ereg("[\x20-\x7E]", $string{$i}) ? $string{$i} : ''); + } + if ($spaces) { + $returnstring .= ' '; + } + } + if ($htmlsafe) { + $returnstring = htmlentities($returnstring); + } + return $returnstring; + } + + function SafeStripSlashes($text) { + if (get_magic_quotes_gpc()) { + return stripslashes($text); + } + return $text; + } + + + function trunc($floatnumber) { + // truncates a floating-point number at the decimal point + // returns int (if possible, otherwise float) + if ($floatnumber >= 1) { + $truncatednumber = floor($floatnumber); + } elseif ($floatnumber <= -1) { + $truncatednumber = ceil($floatnumber); + } else { + $truncatednumber = 0; + } + if ($truncatednumber <= 1073741824) { // 2^30 + $truncatednumber = (int) $truncatednumber; + } + return $truncatednumber; + } + + + function CastAsInt($floatnum) { + // convert to float if not already + $floatnum = (float) $floatnum; + + // convert a float to type int, only if possible + if (getid3_lib::trunc($floatnum) == $floatnum) { + // it's not floating point + if ($floatnum <= 1073741824) { // 2^30 + // it's within int range + $floatnum = (int) $floatnum; + } + } + return $floatnum; + } + + + function DecimalBinary2Float($binarynumerator) { + $numerator = getid3_lib::Bin2Dec($binarynumerator); + $denominator = getid3_lib::Bin2Dec('1'.str_repeat('0', strlen($binarynumerator))); + return ($numerator / $denominator); + } + + + function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) { + // http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html + if (strpos($binarypointnumber, '.') === false) { + $binarypointnumber = '0.'.$binarypointnumber; + } elseif ($binarypointnumber{0} == '.') { + $binarypointnumber = '0'.$binarypointnumber; + } + $exponent = 0; + while (($binarypointnumber{0} != '1') || (substr($binarypointnumber, 1, 1) != '.')) { + if (substr($binarypointnumber, 1, 1) == '.') { + $exponent--; + $binarypointnumber = substr($binarypointnumber, 2, 1).'.'.substr($binarypointnumber, 3); + } else { + $pointpos = strpos($binarypointnumber, '.'); + $exponent += ($pointpos - 1); + $binarypointnumber = str_replace('.', '', $binarypointnumber); + $binarypointnumber = $binarypointnumber{0}.'.'.substr($binarypointnumber, 1); + } + } + $binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2, '0', STR_PAD_RIGHT); + return array('normalized'=>$binarypointnumber, 'exponent'=>(int) $exponent); + } + + + function Float2BinaryDecimal($floatvalue) { + // http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html + $maxbits = 128; // to how many bits of precision should the calculations be taken? + $intpart = getid3_lib::trunc($floatvalue); + $floatpart = abs($floatvalue - $intpart); + $pointbitstring = ''; + while (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) { + $floatpart *= 2; + $pointbitstring .= (string) getid3_lib::trunc($floatpart); + $floatpart -= getid3_lib::trunc($floatpart); + } + $binarypointnumber = decbin($intpart).'.'.$pointbitstring; + return $binarypointnumber; + } + + + function Float2String($floatvalue, $bits) { + // http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html + switch ($bits) { + case 32: + $exponentbits = 8; + $fractionbits = 23; + break; + + case 64: + $exponentbits = 11; + $fractionbits = 52; + break; + + default: + return false; + break; + } + if ($floatvalue >= 0) { + $signbit = '0'; + } else { + $signbit = '1'; + } + $normalizedbinary = getid3_lib::NormalizeBinaryPoint(getid3_lib::Float2BinaryDecimal($floatvalue), $fractionbits); + $biasedexponent = pow(2, $exponentbits - 1) - 1 + $normalizedbinary['exponent']; // (127 or 1023) +/- exponent + $exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits, '0', STR_PAD_LEFT); + $fractionbitstring = str_pad(substr($normalizedbinary['normalized'], 2), $fractionbits, '0', STR_PAD_RIGHT); + + return getid3_lib::BigEndian2String(getid3_lib::Bin2Dec($signbit.$exponentbitstring.$fractionbitstring), $bits % 8, false); + } + + + function LittleEndian2Float($byteword) { + return getid3_lib::BigEndian2Float(strrev($byteword)); + } + + + function BigEndian2Float($byteword) { + // ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic + // http://www.psc.edu/general/software/packages/ieee/ieee.html + // http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html + + $bitword = getid3_lib::BigEndian2Bin($byteword); + $signbit = $bitword{0}; + + switch (strlen($byteword) * 8) { + case 32: + $exponentbits = 8; + $fractionbits = 23; + break; + + case 64: + $exponentbits = 11; + $fractionbits = 52; + break; + + case 80: + // 80-bit Apple SANE format + // http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ + $exponentstring = substr($bitword, 1, 15); + $isnormalized = intval($bitword{16}); + $fractionstring = substr($bitword, 17, 63); + $exponent = pow(2, getid3_lib::Bin2Dec($exponentstring) - 16383); + $fraction = $isnormalized + getid3_lib::DecimalBinary2Float($fractionstring); + $floatvalue = $exponent * $fraction; + if ($signbit == '1') { + $floatvalue *= -1; + } + return $floatvalue; + break; + + default: + return false; + break; + } + $exponentstring = substr($bitword, 1, $exponentbits); + $fractionstring = substr($bitword, $exponentbits + 1, $fractionbits); + $exponent = getid3_lib::Bin2Dec($exponentstring); + $fraction = getid3_lib::Bin2Dec($fractionstring); + + if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) { + // Not a Number + $floatvalue = false; + } elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) { + if ($signbit == '1') { + $floatvalue = '-infinity'; + } else { + $floatvalue = '+infinity'; + } + } elseif (($exponent == 0) && ($fraction == 0)) { + if ($signbit == '1') { + $floatvalue = -0; + } else { + $floatvalue = 0; + } + $floatvalue = ($signbit ? 0 : -0); + } elseif (($exponent == 0) && ($fraction != 0)) { + // These are 'unnormalized' values + $floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * getid3_lib::DecimalBinary2Float($fractionstring); + if ($signbit == '1') { + $floatvalue *= -1; + } + } elseif ($exponent != 0) { + $floatvalue = pow(2, ($exponent - (pow(2, $exponentbits - 1) - 1))) * (1 + getid3_lib::DecimalBinary2Float($fractionstring)); + if ($signbit == '1') { + $floatvalue *= -1; + } + } + return (float) $floatvalue; + } + + + function BigEndian2Int($byteword, $synchsafe=false, $signed=false) { + $intvalue = 0; + $bytewordlen = strlen($byteword); + for ($i = 0; $i < $bytewordlen; $i++) { + if ($synchsafe) { // disregard MSB, effectively 7-bit bytes + $intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7); + } else { + $intvalue += ord($byteword{$i}) * pow(256, ($bytewordlen - 1 - $i)); + } + } + if ($signed && !$synchsafe) { + // synchsafe ints are not allowed to be signed + switch ($bytewordlen) { + case 1: + case 2: + case 3: + case 4: + $signmaskbit = 0x80 << (8 * ($bytewordlen - 1)); + if ($intvalue & $signmaskbit) { + $intvalue = 0 - ($intvalue & ($signmaskbit - 1)); + } + break; + + default: + die('ERROR: Cannot have signed integers larger than 32-bits in getid3_lib::BigEndian2Int()'); + break; + } + } + return getid3_lib::CastAsInt($intvalue); + } + + + function LittleEndian2Int($byteword, $signed=false) { + return getid3_lib::BigEndian2Int(strrev($byteword), false, $signed); + } + + + function BigEndian2Bin($byteword) { + $binvalue = ''; + $bytewordlen = strlen($byteword); + for ($i = 0; $i < $bytewordlen; $i++) { + $binvalue .= str_pad(decbin(ord($byteword{$i})), 8, '0', STR_PAD_LEFT); + } + return $binvalue; + } + + + function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) { + if ($number < 0) { + return false; + } + $maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF); + $intstring = ''; + if ($signed) { + if ($minbytes > 4) { + die('ERROR: Cannot have signed integers larger than 32-bits in getid3_lib::BigEndian2String()'); + } + $number = $number & (0x80 << (8 * ($minbytes - 1))); + } + while ($number != 0) { + $quotient = ($number / ($maskbyte + 1)); + $intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring; + $number = floor($quotient); + } + return str_pad($intstring, $minbytes, "\x00", STR_PAD_LEFT); + } + + + function Dec2Bin($number) { + while ($number >= 256) { + $bytes[] = (($number / 256) - (floor($number / 256))) * 256; + $number = floor($number / 256); + } + $bytes[] = $number; + $binstring = ''; + for ($i = 0; $i < count($bytes); $i++) { + $binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, '0', STR_PAD_LEFT)).$binstring; + } + return $binstring; + } + + + function Bin2Dec($binstring, $signed=false) { + $signmult = 1; + if ($signed) { + if ($binstring{0} == '1') { + $signmult = -1; + } + $binstring = substr($binstring, 1); + } + $decvalue = 0; + for ($i = 0; $i < strlen($binstring); $i++) { + $decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i); + } + return getid3_lib::CastAsInt($decvalue * $signmult); + } + + + function Bin2String($binstring) { + // return 'hi' for input of '0110100001101001' + $string = ''; + $binstringreversed = strrev($binstring); + for ($i = 0; $i < strlen($binstringreversed); $i += 8) { + $string = chr(getid3_lib::Bin2Dec(strrev(substr($binstringreversed, $i, 8)))).$string; + } + return $string; + } + + + function LittleEndian2String($number, $minbytes=1, $synchsafe=false) { + $intstring = ''; + while ($number > 0) { + if ($synchsafe) { + $intstring = $intstring.chr($number & 127); + $number >>= 7; + } else { + $intstring = $intstring.chr($number & 255); + $number >>= 8; + } + } + return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); + } + + + function array_merge_clobber($array1, $array2) { + // written by kchireability*com + // taken from http://www.php.net/manual/en/function.array-merge-recursive.php + if (!is_array($array1) || !is_array($array2)) { + return false; + } + $newarray = $array1; + foreach ($array2 as $key => $val) { + if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { + $newarray[$key] = getid3_lib::array_merge_clobber($newarray[$key], $val); + } else { + $newarray[$key] = $val; + } + } + return $newarray; + } + + + function array_merge_noclobber($array1, $array2) { + if (!is_array($array1) || !is_array($array2)) { + return false; + } + $newarray = $array1; + foreach ($array2 as $key => $val) { + if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { + $newarray[$key] = getid3_lib::array_merge_noclobber($newarray[$key], $val); + } elseif (!isset($newarray[$key])) { + $newarray[$key] = $val; + } + } + return $newarray; + } + + + function fileextension($filename, $numextensions=1) { + if (strstr($filename, '.')) { + $reversedfilename = strrev($filename); + $offset = 0; + for ($i = 0; $i < $numextensions; $i++) { + $offset = strpos($reversedfilename, '.', $offset + 1); + if ($offset === false) { + return ''; + } + } + return strrev(substr($reversedfilename, 0, $offset)); + } + return ''; + } + + + function PlaytimeString($playtimeseconds) { + $contentseconds = round((($playtimeseconds / 60) - floor($playtimeseconds / 60)) * 60); + $contentminutes = floor($playtimeseconds / 60); + if ($contentseconds >= 60) { + $contentseconds -= 60; + $contentminutes++; + } + return intval($contentminutes).':'.str_pad($contentseconds, 2, 0, STR_PAD_LEFT); + } + + + function image_type_to_mime_type($imagetypeid) { + // only available in PHP v4.3.0+ + static $image_type_to_mime_type = array(); + if (empty($image_type_to_mime_type)) { + $image_type_to_mime_type[1] = 'image/gif'; // GIF + $image_type_to_mime_type[2] = 'image/jpeg'; // JPEG + $image_type_to_mime_type[3] = 'image/png'; // PNG + $image_type_to_mime_type[4] = 'application/x-shockwave-flash'; // Flash + $image_type_to_mime_type[5] = 'image/psd'; // PSD + $image_type_to_mime_type[6] = 'image/bmp'; // BMP + $image_type_to_mime_type[7] = 'image/tiff'; // TIFF: little-endian (Intel) + $image_type_to_mime_type[8] = 'image/tiff'; // TIFF: big-endian (Motorola) + //$image_type_to_mime_type[9] = 'image/jpc'; // JPC + //$image_type_to_mime_type[10] = 'image/jp2'; // JPC + //$image_type_to_mime_type[11] = 'image/jpx'; // JPC + //$image_type_to_mime_type[12] = 'image/jb2'; // JPC + $image_type_to_mime_type[13] = 'application/x-shockwave-flash'; // Shockwave + $image_type_to_mime_type[14] = 'image/iff'; // IFF + } + return (isset($image_type_to_mime_type[$imagetypeid]) ? $image_type_to_mime_type[$imagetypeid] : 'application/octet-stream'); + } + + + function DateMac2Unix($macdate) { + // Macintosh timestamp: seconds since 00:00h January 1, 1904 + // UNIX timestamp: seconds since 00:00h January 1, 1970 + return getid3_lib::CastAsInt($macdate - 2082844800); + } + + + function FixedPoint8_8($rawdata) { + return getid3_lib::BigEndian2Int(substr($rawdata, 0, 1)) + (float) (getid3_lib::BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8)); + } + + + function FixedPoint16_16($rawdata) { + return getid3_lib::BigEndian2Int(substr($rawdata, 0, 2)) + (float) (getid3_lib::BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16)); + } + + + function FixedPoint2_30($rawdata) { + $binarystring = getid3_lib::BigEndian2Bin($rawdata); + return getid3_lib::Bin2Dec(substr($binarystring, 0, 2)) + (float) (getid3_lib::Bin2Dec(substr($binarystring, 2, 30)) / 1073741824); + } + + + function CreateDeepArray($ArrayPath, $Separator, $Value) { + // assigns $Value to a nested array path: + // $foo = getid3_lib::CreateDeepArray('/path/to/my', '/', 'file.txt') + // is the same as: + // $foo = array('path'=>array('to'=>'array('my'=>array('file.txt')))); + // or + // $foo['path']['to']['my'] = 'file.txt'; + while ($ArrayPath && ($ArrayPath{0} == $Separator)) { + $ArrayPath = substr($ArrayPath, 1); + } + if (($pos = strpos($ArrayPath, $Separator)) !== false) { + $ReturnedArray[substr($ArrayPath, 0, $pos)] = getid3_lib::CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value); + } else { + $ReturnedArray[$ArrayPath] = $Value; + } + return $ReturnedArray; + } + + function array_max($arraydata, $returnkey=false) { + $maxvalue = false; + $maxkey = false; + foreach ($arraydata as $key => $value) { + if (!is_array($value)) { + if ($value > $maxvalue) { + $maxvalue = $value; + $maxkey = $key; + } + } + } + return ($returnkey ? $maxkey : $maxvalue); + } + + function array_min($arraydata, $returnkey=false) { + $minvalue = false; + $minkey = false; + foreach ($arraydata as $key => $value) { + if (!is_array($value)) { + if ($value > $minvalue) { + $minvalue = $value; + $minkey = $key; + } + } + } + return ($returnkey ? $minkey : $minvalue); + } + + + function md5_file($file) { + + // md5_file() exists in PHP 4.2.0+. + if (function_exists('md5_file')) { + return md5_file($file); + } + + if (GETID3_OS_ISWINDOWS) { + + $RequiredFiles = array('cygwin1.dll', 'md5sum.exe'); + foreach ($RequiredFiles as $required_file) { + if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) { + die(implode(' and ', $RequiredFiles).' are required in '.GETID3_HELPERAPPSDIR.' for getid3_lib::md5_file() to function under Windows in PHP < v4.2.0'); + } + } + $commandline = GETID3_HELPERAPPSDIR.'md5sum.exe "'.str_replace('/', DIRECTORY_SEPARATOR, $file).'"'; + if (ereg("^[\\]?([0-9a-f]{32})", strtolower(`$commandline`), $r)) { + return $r[1]; + } + + } else { + + // The following works under UNIX only + $file = str_replace('`', '\\`', $file); + if (ereg("^([0-9a-f]{32})[ \t\n\r]", `md5sum "$file"`, $r)) { + return $r[1]; + } + + } + return false; + } + + + function sha1_file($file) { + + // sha1_file() exists in PHP 4.3.0+. + if (function_exists('sha1_file')) { + return sha1_file($file); + } + + $file = str_replace('`', '\\`', $file); + + if (GETID3_OS_ISWINDOWS) { + + $RequiredFiles = array('cygwin1.dll', 'sha1sum.exe'); + foreach ($RequiredFiles as $required_file) { + if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) { + die(implode(' and ', $RequiredFiles).' are required in '.GETID3_HELPERAPPSDIR.' for getid3_lib::sha1_file() to function under Windows in PHP < v4.3.0'); + } + } + $commandline = GETID3_HELPERAPPSDIR.'sha1sum.exe "'.str_replace('/', DIRECTORY_SEPARATOR, $file).'"'; + if (ereg("^sha1=([0-9a-f]{40})", strtolower(`$commandline`), $r)) { + return $r[1]; + } + + } else { + + $commandline = 'sha1sum '.escapeshellarg($file).''; + if (ereg("^([0-9a-f]{40})[ \t\n\r]", strtolower(`$commandline`), $r)) { + return $r[1]; + } + + } + + return false; + } + + + // Allan Hansen + // getid3_lib::md5_data() - returns md5sum for a file from startuing position to absolute end position + function hash_data($file, $offset, $end, $algorithm) { + + switch ($algorithm) { + case 'md5': + $hash_function = 'md5_file'; + $unix_call = 'md5sum'; + $windows_call = 'md5sum.exe'; + $hash_length = 32; + break; + + case 'sha1': + $hash_function = 'sha1_file'; + $unix_call = 'sha1sum'; + $windows_call = 'sha1sum.exe'; + $hash_length = 40; + break; + + default: + die('Invalid algorithm ('.$algorithm.') in getid3_lib::hash_data()'); + break; + } + $size = $end - $offset; + while (true) { + if (GETID3_OS_ISWINDOWS) { + + // It seems that sha1sum.exe for Windows only works on physical files, does not accept piped data + // Fall back to create-temp-file method: + if ($algorithm == 'sha1') { + break; + } + + $RequiredFiles = array('cygwin1.dll', 'head.exe', 'tail.exe', $windows_call); + foreach ($RequiredFiles as $required_file) { + if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) { + // helper apps not available - fall back to old method + break; + } + } + $commandline = GETID3_HELPERAPPSDIR.'head.exe -c '.$end.' "'.escapeshellarg(str_replace('/', DIRECTORY_SEPARATOR, $file)).'" | '; + $commandline .= GETID3_HELPERAPPSDIR.'tail.exe -c '.$size.' | '; + $commandline .= GETID3_HELPERAPPSDIR.$windows_call; + + } else { + + $commandline = 'head -c'.$end.' '.escapeshellarg($file).' | '; + $commandline .= 'tail -c'.$size.' | '; + $commandline .= $unix_call; + + } + if ((bool) ini_get('safe_mode')) { + $ThisFileInfo['warning'][] = 'PHP running in Safe Mode - backtick operator not available, using slower non-system-call '.$algorithm.' algorithm'; + break; + } + return substr(`$commandline`, 0, $hash_length); + } + + // try to create a temporary file in the system temp directory - invalid dirname should force to system temp dir + if (($data_filename = tempnam('*', 'getID3')) === false) { + // can't find anywhere to create a temp file, just die + return false; + } + + // Init + $result = false; + + // copy parts of file + if ($fp = @fopen($file, 'rb')) { + + if ($fp_data = @fopen($data_filename, 'wb')) { + + fseek($fp, $offset, SEEK_SET); + $byteslefttowrite = $end - $offset; + while (($byteslefttowrite > 0) && ($buffer = fread($fp, GETID3_FREAD_BUFFER_SIZE))) { + $byteswritten = fwrite($fp_data, $buffer, $byteslefttowrite); + $byteslefttowrite -= $byteswritten; + } + fclose($fp_data); + $result = getid3_lib::$hash_function($data_filename); + + } + fclose($fp); + } + unlink($data_filename); + return $result; + } + + + function iconv_fallback_int_utf8($charval) { + if ($charval < 128) { + // 0bbbbbbb + $newcharstring = chr($charval); + } elseif ($charval < 2048) { + // 110bbbbb 10bbbbbb + $newcharstring = chr(($charval >> 6) | 0xC0); + $newcharstring .= chr(($charval & 0x3F) | 0x80); + } elseif ($charval < 65536) { + // 1110bbbb 10bbbbbb 10bbbbbb + $newcharstring = chr(($charval >> 12) | 0xE0); + $newcharstring .= chr(($charval >> 6) | 0xC0); + $newcharstring .= chr(($charval & 0x3F) | 0x80); + } else { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $newcharstring = chr(($charval >> 18) | 0xF0); + $newcharstring .= chr(($charval >> 12) | 0xC0); + $newcharstring .= chr(($charval >> 6) | 0xC0); + $newcharstring .= chr(($charval & 0x3F) | 0x80); + } + return $newcharstring; + } + + // ISO-8859-1 => UTF-8 + function iconv_fallback_iso88591_utf8($string, $bom=false) { + if (function_exists('utf8_encode')) { + return utf8_encode($string); + } + // utf8_encode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support) + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xEF\xBB\xBF"; + } + for ($i = 0; $i < strlen($string); $i++) { + $charval = ord($string{$i}); + $newcharstring .= getid3_lib::iconv_fallback_int_utf8($charval); + } + return $newcharstring; + } + + // ISO-8859-1 => UTF-16BE + function iconv_fallback_iso88591_utf16be($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFE\xFF"; + } + for ($i = 0; $i < strlen($string); $i++) { + $newcharstring .= "\x00".$string{$i}; + } + return $newcharstring; + } + + // ISO-8859-1 => UTF-16LE + function iconv_fallback_iso88591_utf16le($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFF\xFE"; + } + for ($i = 0; $i < strlen($string); $i++) { + $newcharstring .= $string{$i}."\x00"; + } + return $newcharstring; + } + + // ISO-8859-1 => UTF-16LE (BOM) + function iconv_fallback_iso88591_utf16($string) { + return getid3_lib::iconv_fallback_iso88591_utf16le($string, true); + } + + // UTF-8 => ISO-8859-1 + function iconv_fallback_utf8_iso88591($string) { + if (function_exists('utf8_decode')) { + return utf8_decode($string); + } + // utf8_decode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support) + $newcharstring = ''; + $offset = 0; + $stringlength = strlen($string); + while ($offset < $stringlength) { + if ((ord($string{$offset}) | 0x07) == 0xF7) { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) & + ((ord($string{($offset + 1)}) & 0x3F) << 12) & + ((ord($string{($offset + 2)}) & 0x3F) << 6) & + (ord($string{($offset + 3)}) & 0x3F); + $offset += 4; + } elseif ((ord($string{$offset}) | 0x0F) == 0xEF) { + // 1110bbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) & + ((ord($string{($offset + 1)}) & 0x3F) << 6) & + (ord($string{($offset + 2)}) & 0x3F); + $offset += 3; + } elseif ((ord($string{$offset}) | 0x1F) == 0xDF) { + // 110bbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x1F) << 6) & + (ord($string{($offset + 1)}) & 0x3F); + $offset += 2; + } elseif ((ord($string{$offset}) | 0x7F) == 0x7F) { + // 0bbbbbbb + $charval = ord($string{$offset}); + $offset += 1; + } else { + // error? throw some kind of warning here? + $charval = false; + $offset += 1; + } + if ($charval !== false) { + $newcharstring .= (($charval < 256) ? chr($charval) : '?'); + } + } + return $newcharstring; + } + + // UTF-8 => UTF-16BE + function iconv_fallback_utf8_utf16be($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFE\xFF"; + } + $offset = 0; + $stringlength = strlen($string); + while ($offset < $stringlength) { + if ((ord($string{$offset}) | 0x07) == 0xF7) { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) & + ((ord($string{($offset + 1)}) & 0x3F) << 12) & + ((ord($string{($offset + 2)}) & 0x3F) << 6) & + (ord($string{($offset + 3)}) & 0x3F); + $offset += 4; + } elseif ((ord($string{$offset}) | 0x0F) == 0xEF) { + // 1110bbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) & + ((ord($string{($offset + 1)}) & 0x3F) << 6) & + (ord($string{($offset + 2)}) & 0x3F); + $offset += 3; + } elseif ((ord($string{$offset}) | 0x1F) == 0xDF) { + // 110bbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x1F) << 6) & + (ord($string{($offset + 1)}) & 0x3F); + $offset += 2; + } elseif ((ord($string{$offset}) | 0x7F) == 0x7F) { + // 0bbbbbbb + $charval = ord($string{$offset}); + $offset += 1; + } else { + // error? throw some kind of warning here? + $charval = false; + $offset += 1; + } + if ($charval !== false) { + $newcharstring .= (($charval < 65536) ? getid3_lib::BigEndian2String($charval, 2) : "\x00".'?'); + } + } + return $newcharstring; + } + + // UTF-8 => UTF-16LE + function iconv_fallback_utf8_utf16le($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFF\xFE"; + } + $offset = 0; + $stringlength = strlen($string); + while ($offset < $stringlength) { + if ((ord($string{$offset}) | 0x07) == 0xF7) { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) & + ((ord($string{($offset + 1)}) & 0x3F) << 12) & + ((ord($string{($offset + 2)}) & 0x3F) << 6) & + (ord($string{($offset + 3)}) & 0x3F); + $offset += 4; + } elseif ((ord($string{$offset}) | 0x0F) == 0xEF) { + // 1110bbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) & + ((ord($string{($offset + 1)}) & 0x3F) << 6) & + (ord($string{($offset + 2)}) & 0x3F); + $offset += 3; + } elseif ((ord($string{$offset}) | 0x1F) == 0xDF) { + // 110bbbbb 10bbbbbb + $charval = ((ord($string{($offset + 0)}) & 0x1F) << 6) & + (ord($string{($offset + 1)}) & 0x3F); + $offset += 2; + } elseif ((ord($string{$offset}) | 0x7F) == 0x7F) { + // 0bbbbbbb + $charval = ord($string{$offset}); + $offset += 1; + } else { + // error? maybe throw some warning here? + $charval = false; + $offset += 1; + } + if ($charval !== false) { + $newcharstring .= (($charval < 65536) ? getid3_lib::LittleEndian2String($charval, 2) : '?'."\x00"); + } + } + return $newcharstring; + } + + // UTF-8 => UTF-16LE (BOM) + function iconv_fallback_utf8_utf16($string) { + return getid3_lib::iconv_fallback_utf8_utf16le($string, true); + } + + // UTF-16BE => UTF-8 + function iconv_fallback_utf16be_utf8($string) { + if (substr($string, 0, 2) == "\xFE\xFF") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = getid3_lib::BigEndian2Int(substr($string, $i, 2)); + $newcharstring .= getid3_lib::iconv_fallback_int_utf8($charval); + } + return $newcharstring; + } + + // UTF-16LE => UTF-8 + function iconv_fallback_utf16le_utf8($string) { + if (substr($string, 0, 2) == "\xFF\xFE") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = getid3_lib::LittleEndian2Int(substr($string, $i, 2)); + $newcharstring .= getid3_lib::iconv_fallback_int_utf8($charval); + } + return $newcharstring; + } + + // UTF-16BE => ISO-8859-1 + function iconv_fallback_utf16be_iso88591($string) { + if (substr($string, 0, 2) == "\xFE\xFF") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = getid3_lib::BigEndian2Int(substr($string, $i, 2)); + $newcharstring .= (($charval < 256) ? chr($charval) : '?'); + } + return $newcharstring; + } + + // UTF-16LE => ISO-8859-1 + function iconv_fallback_utf16le_iso88591($string) { + if (substr($string, 0, 2) == "\xFF\xFE") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = getid3_lib::LittleEndian2Int(substr($string, $i, 2)); + $newcharstring .= (($charval < 256) ? chr($charval) : '?'); + } + return $newcharstring; + } + + // UTF-16 (BOM) => ISO-8859-1 + function iconv_fallback_utf16_iso88591($string) { + $bom = substr($string, 0, 2); + if ($bom == "\xFE\xFF") { + return getid3_lib::iconv_fallback_utf16be_iso88591(substr($string, 2)); + } elseif ($bom == "\xFF\xFE") { + return getid3_lib::iconv_fallback_utf16le_iso88591(substr($string, 2)); + } + return $string; + } + + // UTF-16 (BOM) => UTF-8 + function iconv_fallback_utf16_utf8($string) { + $bom = substr($string, 0, 2); + if ($bom == "\xFE\xFF") { + return getid3_lib::iconv_fallback_utf16be_utf8(substr($string, 2)); + } elseif ($bom == "\xFF\xFE") { + return getid3_lib::iconv_fallback_utf16le_utf8(substr($string, 2)); + } + return $string; + } + + function iconv_fallback($in_charset, $out_charset, $string) { + + if ($in_charset == $out_charset) { + return $string; + } + + static $iconv_broken_or_unavailable = array(); + if (is_null(@$iconv_broken_or_unavailable[$in_charset.'_'.$out_charset])) { + $GETID3_ICONV_TEST_STRING = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ '; + + // Check iconv() + if (function_exists('iconv')) { + if (@iconv($in_charset, 'ISO-8859-1', @iconv('ISO-8859-1', $in_charset, $GETID3_ICONV_TEST_STRING)) == $GETID3_ICONV_TEST_STRING) { + if (@iconv($out_charset, 'ISO-8859-1', @iconv('ISO-8859-1', $out_charset, $GETID3_ICONV_TEST_STRING)) == $GETID3_ICONV_TEST_STRING) { + // everything works, use iconv() + $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = false; + } else { + // iconv() available, but broken. Use getID3()'s iconv_fallback() conversions instead + // known issue in PHP v4.1.x + $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = true; + } + } else { + // iconv() available, but broken. Use getID3()'s iconv_fallback() conversions instead + // known issue in PHP v4.1.x + $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = true; + } + } else { + // iconv() unavailable, use getID3()'s iconv_fallback() conversions + $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = true; + } + } + + if ($iconv_broken_or_unavailable[$in_charset.'_'.$out_charset]) { + static $ConversionFunctionList = array(); + if (empty($ConversionFunctionList)) { + $ConversionFunctionList['ISO-8859-1']['UTF-8'] = 'iconv_fallback_iso88591_utf8'; + $ConversionFunctionList['ISO-8859-1']['UTF-16'] = 'iconv_fallback_iso88591_utf16'; + $ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be'; + $ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le'; + $ConversionFunctionList['UTF-8']['ISO-8859-1'] = 'iconv_fallback_utf8_iso88591'; + $ConversionFunctionList['UTF-8']['UTF-16'] = 'iconv_fallback_utf8_utf16'; + $ConversionFunctionList['UTF-8']['UTF-16BE'] = 'iconv_fallback_utf8_utf16be'; + $ConversionFunctionList['UTF-8']['UTF-16LE'] = 'iconv_fallback_utf8_utf16le'; + $ConversionFunctionList['UTF-16']['ISO-8859-1'] = 'iconv_fallback_utf16_iso88591'; + $ConversionFunctionList['UTF-16']['UTF-8'] = 'iconv_fallback_utf16_utf8'; + $ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591'; + $ConversionFunctionList['UTF-16LE']['UTF-8'] = 'iconv_fallback_utf16le_utf8'; + $ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591'; + $ConversionFunctionList['UTF-16BE']['UTF-8'] = 'iconv_fallback_utf16be_utf8'; + } + if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) { + $ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)]; + return getid3_lib::$ConversionFunction($string); + } + die('PHP does not have iconv() support - cannot convert from '.$in_charset.' to '.$out_charset); + } + + if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) { + switch ($out_charset) { + case 'ISO-8859-1': + $converted_string = rtrim($converted_string, "\x00"); + break; + } + return $converted_string; + } + + // iconv() may sometimes fail with "illegal character in input string" error message + // and return an empty string, but returning the unconverted string is more useful + return $string; + } + + + function MultiByteCharString2HTML($string, $charset='ISO-8859-1') { + $HTMLstring = ''; + + switch ($charset) { + case 'ISO-8859-1': + case 'ISO8859-1': + case 'ISO-8859-15': + case 'ISO8859-15': + case 'cp866': + case 'ibm866': + case '866': + case 'cp1251': + case 'Windows-1251': + case 'win-1251': + case '1251': + case 'cp1252': + case 'Windows-1252': + case '1252': + case 'KOI8-R': + case 'koi8-ru': + case 'koi8r': + case 'BIG5': + case '950': + case 'GB2312': + case '936': + case 'BIG5-HKSCS': + case 'Shift_JIS': + case 'SJIS': + case '932': + case 'EUC-JP': + case 'EUCJP': + $HTMLstring = htmlentities($string, ENT_COMPAT, $charset); + break; + + case 'UTF-8': + $strlen = strlen($string); + for ($i = 0; $i < $strlen; $i++) { + $char_ord_val = ord($string{$i}); + $charval = 0; + if ($char_ord_val < 0x80) { + $charval = $char_ord_val; + } elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F) { + $charval = (($char_ord_val & 0x07) << 18); + $charval += ((ord($string{++$i}) & 0x3F) << 12); + $charval += ((ord($string{++$i}) & 0x3F) << 6); + $charval += (ord($string{++$i}) & 0x3F); + } elseif ((($char_ord_val & 0xE0) >> 5) == 0x07) { + $charval = (($char_ord_val & 0x0F) << 12); + $charval += ((ord($string{++$i}) & 0x3F) << 6); + $charval += (ord($string{++$i}) & 0x3F); + } elseif ((($char_ord_val & 0xC0) >> 6) == 0x03) { + $charval = (($char_ord_val & 0x1F) << 6); + $charval += (ord($string{++$i}) & 0x3F); + } + if (($charval >= 32) && ($charval <= 127)) { + $HTMLstring .= chr($charval); + } else { + $HTMLstring .= '&#'.$charval.';'; + } + } + break; + + case 'UTF-16LE': + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = getid3_lib::LittleEndian2Int(substr($string, $i, 2)); + if (($charval >= 32) && ($charval <= 127)) { + $HTMLstring .= chr($charval); + } else { + $HTMLstring .= '&#'.$charval.';'; + } + } + break; + + case 'UTF-16BE': + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = getid3_lib::BigEndian2Int(substr($string, $i, 2)); + if (($charval >= 32) && ($charval <= 127)) { + $HTMLstring .= chr($charval); + } else { + $HTMLstring .= '&#'.$charval.';'; + } + } + break; + + default: + $HTMLstring = 'ERROR: Character set "'.$charset.'" not supported in MultiByteCharString2HTML()'; + break; + } + return $HTMLstring; + } + + + + function RGADnameLookup($namecode) { + static $RGADname = array(); + if (empty($RGADname)) { + $RGADname[0] = 'not set'; + $RGADname[1] = 'Track Gain Adjustment'; + $RGADname[2] = 'Album Gain Adjustment'; + } + + return (isset($RGADname[$namecode]) ? $RGADname[$namecode] : ''); + } + + + function RGADoriginatorLookup($originatorcode) { + static $RGADoriginator = array(); + if (empty($RGADoriginator)) { + $RGADoriginator[0] = 'unspecified'; + $RGADoriginator[1] = 'pre-set by artist/producer/mastering engineer'; + $RGADoriginator[2] = 'set by user'; + $RGADoriginator[3] = 'determined automatically'; + } + + return (isset($RGADoriginator[$originatorcode]) ? $RGADoriginator[$originatorcode] : ''); + } + + + function RGADadjustmentLookup($rawadjustment, $signbit) { + $adjustment = $rawadjustment / 10; + if ($signbit == 1) { + $adjustment *= -1; + } + return (float) $adjustment; + } + + + function RGADgainString($namecode, $originatorcode, $replaygain) { + if ($replaygain < 0) { + $signbit = '1'; + } else { + $signbit = '0'; + } + $storedreplaygain = intval(round($replaygain * 10)); + $gainstring = str_pad(decbin($namecode), 3, '0', STR_PAD_LEFT); + $gainstring .= str_pad(decbin($originatorcode), 3, '0', STR_PAD_LEFT); + $gainstring .= $signbit; + $gainstring .= str_pad(decbin($storedreplaygain), 9, '0', STR_PAD_LEFT); + + return $gainstring; + } + + function RGADamplitude2dB($amplitude) { + return 20 * log10($amplitude); + } + + + function GetDataImageSize($imgData) { + $GetDataImageSize = false; + if ($tempfilename = tempnam('*', 'getID3')) { + if ($tmp = @fopen($tempfilename, 'wb')) { + fwrite($tmp, $imgData); + fclose($tmp); + $GetDataImageSize = @GetImageSize($tempfilename); + } + unlink($tempfilename); + } + return $GetDataImageSize; + } + + function ImageTypesLookup($imagetypeid) { + static $ImageTypesLookup = array(); + if (empty($ImageTypesLookup)) { + $ImageTypesLookup[1] = 'gif'; + $ImageTypesLookup[2] = 'jpeg'; + $ImageTypesLookup[3] = 'png'; + $ImageTypesLookup[4] = 'swf'; + $ImageTypesLookup[5] = 'psd'; + $ImageTypesLookup[6] = 'bmp'; + $ImageTypesLookup[7] = 'tiff (little-endian)'; + $ImageTypesLookup[8] = 'tiff (big-endian)'; + $ImageTypesLookup[9] = 'jpc'; + $ImageTypesLookup[10] = 'jp2'; + $ImageTypesLookup[11] = 'jpx'; + $ImageTypesLookup[12] = 'jb2'; + $ImageTypesLookup[13] = 'swc'; + $ImageTypesLookup[14] = 'iff'; + } + return (isset($ImageTypesLookup[$imagetypeid]) ? $ImageTypesLookup[$imagetypeid] : ''); + } + + function CopyTagsToComments(&$ThisFileInfo) { + + // Copy all entries from ['tags'] into common ['comments'] + if (!empty($ThisFileInfo['tags'])) { + foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) { + foreach ($tagarray as $tagname => $tagdata) { + foreach ($tagdata as $key => $value) { + if (!empty($value)) { + if (empty($ThisFileInfo['comments'][$tagname])) { + + // fall through and append value + + } elseif ($tagtype == 'id3v1') { + + $newvaluelength = strlen(trim($value)); + foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { + $oldvaluelength = strlen(trim($existingvalue)); + if (($newvaluelength <= $oldvaluelength) && (substr($existingvalue, 0, $newvaluelength) == trim($value))) { + // new value is identical but shorter-than (or equal-length to) one already in comments - skip + break 2; + } + } + + } else { + + $newvaluelength = strlen(trim($value)); + foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { + $oldvaluelength = strlen(trim($existingvalue)); + if (($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) { + $ThisFileInfo['comments'][$tagname][$existingkey] = trim($value); + break 2; + } + } + + } + if (empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) { + $ThisFileInfo['comments'][$tagname][] = trim($value); + } + } + } + } + } + + // Copy to ['comments_html'] + foreach ($ThisFileInfo['comments'] as $field => $values) { + foreach ($values as $index => $value) { + $ThisFileInfo['comments_html'][$field][$index] = str_replace('�', '', getid3_lib::MultiByteCharString2HTML($value, $ThisFileInfo['encoding'])); + } + } + } + } + + + function EmbeddedLookup($key, $begin, $end, $file, $name) { + + // Cached + static $cache; + if (isset($cache[$file][$name])) { + return @$cache[$file][$name][$key]; + } + + // Init + $keylength = strlen($key); + $line_count = $end - $begin - 7; + + // Open php file + $fp = fopen($file, 'r'); + + // Discard $begin lines + for ($i = 0; $i < ($begin + 3); $i++) { + fgets($fp, 1024); + } + + // Loop thru line + while (0 < $line_count--) { + + // Read line + $line = ltrim(fgets($fp, 1024), "\t "); + + // METHOD A: only cache the matching key - less memory but slower on next lookup of not-previously-looked-up key + //$keycheck = substr($line, 0, $keylength); + //if ($key == $keycheck) { + // $cache[$file][$name][$keycheck] = substr($line, $keylength + 1); + // break; + //} + + // METHOD B: cache all keys in this lookup - more memory but faster on next lookup of not-previously-looked-up key + //$cache[$file][$name][substr($line, 0, $keylength)] = trim(substr($line, $keylength + 1)); + @list($ThisKey, $ThisValue) = explode("\t", $line, 2); + $cache[$file][$name][$ThisKey] = trim($ThisValue); + } + + // Close and return + fclose($fp); + return @$cache[$file][$name][$key]; + } + + function IncludeDependency($filename, $sourcefile, $DieOnFailure=false) { + global $GETID3_ERRORARRAY; + + if (file_exists($filename)) { + if (@include_once($filename)) { + return true; + } else { + $diemessage = basename($sourcefile).' depends on '.$filename.', which has errors'; + } + } else { + $diemessage = basename($sourcefile).' depends on '.$filename.', which is missing'; + } + if ($DieOnFailure) { + die($diemessage); + } else { + $GETID3_ERRORARRAY[] = $diemessage; + } + return false; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/getid3.php b/campcaster/src/modules/getid3/var/getid3.php new file mode 100644 index 000000000..c949cacc3 --- /dev/null +++ b/campcaster/src/modules/getid3/var/getid3.php @@ -0,0 +1,1305 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// // +// Please see readme.txt for more information // +// /// +///////////////////////////////////////////////////////////////// + +// Defines +define('GETID3_VERSION', '1.7.7'); +define('GETID3_FREAD_BUFFER_SIZE', 16384); // read buffer size in bytes + + + +class getID3 +{ + // public: Settings + var $encoding = 'ISO-8859-1'; // CASE SENSITIVE! - i.e. (must be supported by iconv()) + // Examples: ISO-8859-1 UTF-8 UTF-16 UTF-16BE + + var $encoding_id3v1 = 'ISO-8859-1'; // Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN' + + var $tempdir = '*'; // default '*' should use system temp dir + + // public: Optional tag checks - disable for speed. + var $option_tag_id3v1 = true; // Read and process ID3v1 tags + var $option_tag_id3v2 = true; // Read and process ID3v2 tags + var $option_tag_lyrics3 = true; // Read and process Lyrics3 tags + var $option_tag_apetag = true; // Read and process APE tags + var $option_tags_process = true; // Copy tags to root key 'tags' and encode to $this->encoding + var $option_tags_html = true; // Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities + + // public: Optional tag/comment calucations + var $option_extra_info = true; // Calculate additional info such as bitrate, channelmode etc + + // public: Optional calculations + var $option_md5_data = false; // Get MD5 sum of data part - slow + var $option_md5_data_source = false; // Use MD5 of source file if availble - only FLAC and OptimFROG + var $option_sha1_data = false; // Get SHA1 sum of data part - slow + var $option_max_2gb_check = true; // Check whether file is larger than 2 Gb and thus not supported by PHP + + // private + var $filename; + + + // public: constructor + function getID3() + { + + $this->startup_error = ''; + $this->startup_warning = ''; + + // Check for PHP version >= 4.1.0 + if (phpversion() < '4.1.0') { + $this->startup_error .= 'getID3() requires PHP v4.1.0 or higher - you are running v'.phpversion(); + } + + // Check memory + $memory_limit = ini_get('memory_limit'); + if (eregi('([0-9]+)M', $memory_limit, $matches)) { + // could be stored as "16M" rather than 16777216 for example + $memory_limit = $matches[1] * 1048576; + } + if ($memory_limit <= 0) { + // memory limits probably disabled + } elseif ($memory_limit <= 3145728) { + $this->startup_error .= 'PHP has less than 3MB available memory and will very likely run out. Increase memory_limit in php.ini'; + } elseif ($memory_limit <= 12582912) { + $this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini'; + } + + // Check safe_mode off + if ((bool) ini_get('safe_mode')) { + $this->warning('WARNING: Safe mode is on, shorten support disabled, md5data/sha1data for ogg vorbis disabled, ogg vorbos/flac tag writing disabled.'); + } + + + // define a constant rather than looking up every time it is needed + if (!defined('GETID3_OS_ISWINDOWS')) { + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { + define('GETID3_OS_ISWINDOWS', true); + } else { + define('GETID3_OS_ISWINDOWS', false); + } + } + + // Get base path of getID3() - ONCE + if (!defined('GETID3_INCLUDEPATH')) { + foreach (get_included_files() as $key => $val) { + if (basename($val) == 'getid3.php') { + define('GETID3_INCLUDEPATH', dirname($val).DIRECTORY_SEPARATOR); + break; + } + } + } + + // Load support library + if (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) { + $this->startup_error .= 'getid3.lib.php is missing or corrupt'; + } + + + // Needed for Windows only: + // Define locations of helper applications for Shorten, VorbisComment, MetaFLAC + // as well as other helper functions such as head, tail, md5sum, etc + // IMPORTANT: This path cannot have spaces in it. If neccesary, use the 8dot3 equivalent + // ie for "C:/Program Files/Apache/" put "C:/PROGRA~1/APACHE/" + // IMPORTANT: This path must include the trailing slash + if (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) { + $helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path + + if (!is_dir($helperappsdir)) { + + $this->startup_error .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist'; + + } elseif (strpos(realpath($helperappsdir), ' ') !== false) { + + $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir)); + $DirPieces8 = $DirPieces; + + $CLIdir = $DirPieces[0].' && cd \\'; + for ($i = 1; $i < count($DirPieces); $i++) { + if (strpos($DirPieces[$i], ' ') === false) { + $CLIdir .= ' && cd '.$DirPieces[$i]; + } else { + ob_start(); + system($CLIdir.' && dir /ad /x'); + $subdirsraw = explode("\n", ob_get_contents()); + ob_end_clean(); + foreach ($subdirsraw as $dummy => $line) { + if (eregi('^[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2} [AP]M ([^ ]{8}) '.preg_quote($DirPieces[$i]).'$', trim($line), $matches)) { + $CLIdir .= ' && cd '.$matches[1]; + break; + } + } + $DirPieces8[$i] = $matches[1]; + } + } + $helperappsdir = implode(DIRECTORY_SEPARATOR, $DirPieces8); + + } + define('GETID3_HELPERAPPSDIR', realpath($helperappsdir).DIRECTORY_SEPARATOR); + + } + + } + + + // public: setOption + function setOption($optArray) { + if (!is_array($optArray) || empty($optArray)) { + return false; + } + foreach ($optArray as $opt => $val) { + if (isset($this, $opt) === false) { + continue; + } + $this->$opt = $val; + } + return true; + } + + + // public: analyze file - replaces GetAllFileInfo() and GetTagOnly() + function analyze($filename) { + + if (!empty($this->startup_error)) { + return $this->error($this->startup_error); + } + if (!empty($this->startup_warning)) { + $this->warning($this->startup_warning); + } + + // init result array and set parameters + $this->info = array(); + $this->info['GETID3_VERSION'] = GETID3_VERSION; + + // Check encoding/iconv support + if (!function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) { + $errormessage = 'iconv() support is needed for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. '; + if (GETID3_OS_ISWINDOWS) { + $errormessage .= 'PHP does not have iconv() support. Please enable php_iconv.dll in php.ini, and copy iconv.dll from c:/php/dlls to c:/windows/system32'; + } else { + $errormessage .= 'PHP is not compiled with iconv() support. Please recompile with the --with-iconv switch'; + } + return $this->error($errormessage); + } + + // Disable magic_quotes_runtime, if neccesary + $old_magic_quotes_runtime = get_magic_quotes_runtime(); // store current setting of magic_quotes_runtime + if ($old_magic_quotes_runtime) { + set_magic_quotes_runtime(0); // turn off magic_quotes_runtime + if (get_magic_quotes_runtime()) { + return $this->error('Could not disable magic_quotes_runtime - getID3() cannot work properly with this setting enabled'); + } + } + + // remote files not supported + if (preg_match('/^(ht|f)tp:\/\//', $filename)) { + return $this->error('Remote files are not supported in this version of getID3() - please copy the file locally first'); + } + + // open local file + if (!$fp = @fopen($filename, 'rb')) { + return $this->error('Could not open file "'.$filename.'"'); + } + + // set parameters + $this->info['filesize'] = filesize($filename); + + // option_max_2gb_check + if ($this->option_max_2gb_check) { + // PHP doesn't support integers larger than 31-bit (~2GB) + // filesize() simply returns (filesize % (pow(2, 32)), no matter the actual filesize + // ftell() returns 0 if seeking to the end is beyond the range of unsigned integer + fseek($fp, 0, SEEK_END); + if ((($this->info['filesize'] != 0) && (ftell($fp) == 0)) || + ($this->info['filesize'] < 0) || + (ftell($fp) < 0)) { + unset($this->info['filesize']); + fclose($fp); + return $this->error('File is most likely larger than 2GB and is not supported by PHP'); + } + } + + // set more parameters + $this->info['avdataoffset'] = 0; + $this->info['avdataend'] = $this->info['filesize']; + $this->info['fileformat'] = ''; // filled in later + $this->info['audio']['dataformat'] = ''; // filled in later, unset if not used + $this->info['video']['dataformat'] = ''; // filled in later, unset if not used + $this->info['tags'] = array(); // filled in later, unset if not used + $this->info['error'] = array(); // filled in later, unset if not used + $this->info['warning'] = array(); // filled in later, unset if not used + $this->info['comments'] = array(); // filled in later, unset if not used + $this->info['encoding'] = $this->encoding; // required by id3v2 and iso modules - can be unset at the end if desired + + // set redundant parameters - might be needed in some include file + $this->info['filename'] = basename($filename); + $this->info['filepath'] = str_replace('\\', '/', realpath(dirname($filename))); + $this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename']; + + + // handle ID3v2 tag - done first - already at beginning of file + // ID3v2 detection (even if not parsing) is always done otherwise fileformat is much harder to detect + if ($this->option_tag_id3v2) { + + $GETID3_ERRORARRAY = &$this->info['warning']; + if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, false)) { + $tag = new getid3_id3v2($fp, $this->info); + } + + } else { + + fseek($fp, 0, SEEK_SET); + $header = fread($fp, 10); + if (substr($header, 0, 3) == 'ID3') { + $this->info['id3v2']['header'] = true; + $this->info['id3v2']['majorversion'] = ord($header{3}); + $this->info['id3v2']['minorversion'] = ord($header{4}); + $this->info['id3v2']['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length + + $this->info['id3v2']['tag_offset_start'] = 0; + $this->info['id3v2']['tag_offset_end'] = $this->info['id3v2']['tag_offset_start'] + $this->info['id3v2']['headerlength']; + $this->info['avdataoffset'] = $this->info['id3v2']['tag_offset_end']; + } + + } + + + // handle ID3v1 tag + if ($this->option_tag_id3v1) { + if (!@include_once(GETID3_INCLUDEPATH.'module.tag.id3v1.php')) { + return $this->error('module.tag.id3v1.php is missing - you may disable option_tag_id3v1.'); + } + $tag = new getid3_id3v1($fp, $this->info); + } + + // handle APE tag + if ($this->option_tag_apetag) { + if (!@include_once(GETID3_INCLUDEPATH.'module.tag.apetag.php')) { + return $this->error('module.tag.apetag.php is missing - you may disable option_tag_apetag.'); + } + $tag = new getid3_apetag($fp, $this->info); + } + + // handle lyrics3 tag + if ($this->option_tag_lyrics3) { + if (!@include_once(GETID3_INCLUDEPATH.'module.tag.lyrics3.php')) { + return $this->error('module.tag.lyrics3.php is missing - you may disable option_tag_lyrics3.'); + } + $tag = new getid3_lyrics3($fp, $this->info); + } + + // read 32 kb file data + fseek($fp, $this->info['avdataoffset'], SEEK_SET); + $formattest = fread($fp, 32774); + + // determine format + $determined_format = $this->GetFileFormat($formattest, $filename); + + // unable to determine file format + if (!$determined_format) { + fclose($fp); + return $this->error('unable to determine file format'); + } + + // check for illegal ID3 tags + if (isset($determined_format['fail_id3']) && (in_array('id3v1', $this->info['tags']) || in_array('id3v2', $this->info['tags']))) { + if ($determined_format['fail_id3'] === 'ERROR') { + fclose($fp); + return $this->error('ID3 tags not allowed on this file type.'); + } elseif ($determined_format['fail_id3'] === 'WARNING') { + $this->info['warning'][] = 'ID3 tags not allowed on this file type.'; + } + } + + // check for illegal APE tags + if (isset($determined_format['fail_ape']) && in_array('ape', $this->info['tags'])) { + if ($determined_format['fail_ape'] === 'ERROR') { + fclose($fp); + return $this->error('APE tags not allowed on this file type.'); + } elseif ($determined_format['fail_ape'] === 'WARNING') { + $this->info['warning'][] = 'APE tags not allowed on this file type.'; + } + } + + // set mime type + $this->info['mime_type'] = $determined_format['mime_type']; + + // supported format signature pattern detected, but module deleted + if (!file_exists(GETID3_INCLUDEPATH.$determined_format['include'])) { + fclose($fp); + return $this->error('Format not supported, module, '.$determined_format['include'].', was removed.'); + } + + // module requires iconv support + if (!function_exists('iconv') && @$determined_format['iconv_req']) { + return $this->error('iconv support is required for this module ('.$determined_format['include'].').'); + } + + // include module + include_once(GETID3_INCLUDEPATH.$determined_format['include']); + + // instantiate module class + $class_name = 'getid3_'.$determined_format['module']; + if (!class_exists($class_name)) { + return $this->error('Format not supported, module, '.$determined_format['include'].', is corrupt.'); + } + if (isset($determined_format['option'])) { + $class = new $class_name($fp, $this->info, $determined_format['option']); + } else { + $class = new $class_name($fp, $this->info); + } + + // close file + fclose($fp); + + // process all tags - copy to 'tags' and convert charsets + if ($this->option_tags_process) { + $this->HandleAllTags(); + } + + // perform more calculations + if ($this->option_extra_info) { + $this->ChannelsBitratePlaytimeCalculations(); + $this->CalculateCompressionRatioVideo(); + $this->CalculateCompressionRatioAudio(); + $this->CalculateReplayGain(); + $this->ProcessAudioStreams(); + } + + // get the MD5 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags + if ($this->option_md5_data) { + // do not cald md5_data if md5_data_source is present - set by flac only - future MPC/SV8 too + if (!$this->option_md5_data_source || empty($this->info['md5_data_source'])) { + $this->getHashdata('md5'); + } + } + + // get the SHA1 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags + if ($this->option_sha1_data) { + $this->getHashdata('sha1'); + } + + // remove undesired keys + $this->CleanUp(); + + // restore magic_quotes_runtime setting + set_magic_quotes_runtime($old_magic_quotes_runtime); + + // return info array + return $this->info; + } + + + // private: error handling + function error($message) { + + $this->CleanUp(); + + $this->info['error'][] = $message; + return $this->info; + } + + + // private: warning handling + function warning($message) { + $this->info['warning'][] = $message; + return true; + } + + + // private: CleanUp + function CleanUp() { + + // remove possible empty keys + $AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams'); + foreach ($AVpossibleEmptyKeys as $dummy => $key) { + if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) { + unset($this->info['audio'][$key]); + } + if (empty($this->info['video'][$key]) && isset($this->info['video'][$key])) { + unset($this->info['video'][$key]); + } + } + + // remove empty root keys + if (!empty($this->info)) { + foreach ($this->info as $key => $value) { + if (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !== '0')) { + unset($this->info[$key]); + } + } + } + + // remove meaningless entries from unknown-format files + if (empty($this->info['fileformat'])) { + if (isset($this->info['avdataoffset'])) { + unset($this->info['avdataoffset']); + } + if (isset($this->info['avdataend'])) { + unset($this->info['avdataend']); + } + } + } + + + // return array containing information about all supported formats + function GetFileFormatArray() { + static $format_info = array(); + if (empty($format_info)) { + $format_info = array( + + // Audio formats + + // AC-3 - audio - Dolby AC-3 / Dolby Digital + 'ac3' => array( + 'pattern' => '^\x0B\x77', + 'group' => 'audio', + 'module' => 'ac3', + 'mime_type' => 'audio/ac3', + ), + + // AAC - audio - Advanced Audio Coding (AAC) - ADIF format + 'adif' => array( + 'pattern' => '^ADIF', + 'group' => 'audio', + 'module' => 'aac', + 'option' => 'adif', + 'mime_type' => 'application/octet-stream', + 'fail_ape' => 'WARNING', + ), + + + // AAC - audio - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3) + 'adts' => array( + 'pattern' => '^\xFF[\xF0-\xF1\xF8-\xF9]', + 'group' => 'audio', + 'module' => 'aac', + 'option' => 'adts', + 'mime_type' => 'application/octet-stream', + 'fail_ape' => 'WARNING', + ), + + + // AU - audio - NeXT/Sun AUdio (AU) + 'au' => array( + 'pattern' => '^\.snd', + 'group' => 'audio', + 'module' => 'au', + 'mime_type' => 'audio/basic', + ), + + // AVR - audio - Audio Visual Research + 'avr' => array( + 'pattern' => '^2BIT', + 'group' => 'audio', + 'module' => 'avr', + 'mime_type' => 'application/octet-stream', + ), + + // BONK - audio - Bonk v0.9+ + 'bonk' => array( + 'pattern' => '^\x00(BONK|INFO|META| ID3)', + 'group' => 'audio', + 'module' => 'bonk', + 'mime_type' => 'audio/xmms-bonk', + ), + + // FLAC - audio - Free Lossless Audio Codec + 'flac' => array( + 'pattern' => '^fLaC', + 'group' => 'audio', + 'module' => 'flac', + 'mime_type' => 'audio/x-flac', + ), + + // LA - audio - Lossless Audio (LA) + 'la' => array( + 'pattern' => '^LA0[2-4]', + 'group' => 'audio', + 'module' => 'la', + 'mime_type' => 'application/octet-stream', + ), + + // LPAC - audio - Lossless Predictive Audio Compression (LPAC) + 'lpac' => array( + 'pattern' => '^LPAC', + 'group' => 'audio', + 'module' => 'lpac', + 'mime_type' => 'application/octet-stream', + ), + + // MIDI - audio - MIDI (Musical Instrument Digital Interface) + 'midi' => array( + 'pattern' => '^MThd', + 'group' => 'audio', + 'module' => 'midi', + 'mime_type' => 'audio/midi', + ), + + // MAC - audio - Monkey's Audio Compressor + 'mac' => array( + 'pattern' => '^MAC ', + 'group' => 'audio', + 'module' => 'monkey', + 'mime_type' => 'application/octet-stream', + ), + + // MOD - audio - MODule (assorted sub-formats) + 'mod' => array( + 'pattern' => '^.{1080}(M.K.|[5-9]CHN|[1-3][0-9]CH)', + 'group' => 'audio', + 'module' => 'mod', + 'option' => 'mod', + 'mime_type' => 'audio/mod', + ), + + // MOD - audio - MODule (Impulse Tracker) + 'it' => array( + 'pattern' => '^IMPM', + 'group' => 'audio', + 'module' => 'mod', + 'option' => 'it', + 'mime_type' => 'audio/it', + ), + + // MOD - audio - MODule (eXtended Module, various sub-formats) + 'xm' => array( + 'pattern' => '^Extended Module', + 'group' => 'audio', + 'module' => 'mod', + 'option' => 'xm', + 'mime_type' => 'audio/xm', + ), + + // MOD - audio - MODule (ScreamTracker) + 's3m' => array( + 'pattern' => '^.{44}SCRM', + 'group' => 'audio', + 'module' => 'mod', + 'option' => 's3m', + 'mime_type' => 'audio/s3m', + ), + + // MPC - audio - Musepack / MPEGplus + 'mpc' => array( + 'pattern' => '^(MP\+|[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0])', + 'group' => 'audio', + 'module' => 'mpc', + 'mime_type' => 'application/octet-stream', + ), + + // MP3 - audio - MPEG-audio Layer 3 (very similar to AAC-ADTS) + 'mp3' => array( + 'pattern' => '^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]', + 'group' => 'audio', + 'module' => 'mp3', + 'mime_type' => 'audio/mpeg', + ), + + // OFR - audio - OptimFROG + 'ofr' => array( + 'pattern' => '^(\*RIFF|OFR)', + 'group' => 'audio', + 'module' => 'optimfrog', + 'mime_type' => 'application/octet-stream', + ), + + // RKAU - audio - RKive AUdio compressor + 'rkau' => array( + 'pattern' => '^RKA', + 'group' => 'audio', + 'module' => 'rkau', + 'mime_type' => 'application/octet-stream', + ), + + // SHN - audio - Shorten + 'shn' => array( + 'pattern' => '^ajkg', + 'group' => 'audio', + 'module' => 'shorten', + 'mime_type' => 'audio/xmms-shn', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // TTA - audio - TTA Lossless Audio Compressor (http://tta.corecodec.org) + 'tta' => array( + 'pattern' => '^TTA', // could also be '^TTA(\x01|\x02|\x03|2|1)' + 'group' => 'audio', + 'module' => 'tta', + 'mime_type' => 'application/octet-stream', + ), + + // VOC - audio - Creative Voice (VOC) + 'voc' => array( + 'pattern' => '^Creative Voice File', + 'group' => 'audio', + 'module' => 'voc', + 'mime_type' => 'audio/voc', + ), + + // VQF - audio - transform-domain weighted interleave Vector Quantization Format (VQF) + 'vqf' => array( + 'pattern' => '^TWIN', + 'group' => 'audio', + 'module' => 'vqf', + 'mime_type' => 'application/octet-stream', + ), + + // WV - audio - WavPack (v4.0+) + 'wv' => array( + 'pattern' => '^wvpk', + 'group' => 'audio', + 'module' => 'wavpack', + 'mime_type' => 'application/octet-stream', + ), + + + // Audio-Video formats + + // ASF - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio + 'asf' => array( + 'pattern' => '^\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C', + 'group' => 'audio-video', + 'module' => 'asf', + 'mime_type' => 'video/x-ms-asf', + 'iconv_req' => false, + ), + + // BINK - audio/video - Bink / Smacker + 'bink' => array( + 'pattern' => '^(BIK|SMK)', + 'group' => 'audio-video', + 'module' => 'bink', + 'mime_type' => 'application/octet-stream', + ), + + // FLV - audio/video - FLash Video + 'flv' => array( + 'pattern' => '^FLV\x01', + 'group' => 'audio-video', + 'module' => 'flv', + 'mime_type' => 'video/x-flv', + ), + + // MKAV - audio/video - Mastroka + 'matroska' => array( + 'pattern' => '^\x1A\x45\xDF\xA3', + 'group' => 'audio-video', + 'module' => 'matroska', + 'mime_type' => 'application/octet-stream', + ), + + // MPEG - audio/video - MPEG (Moving Pictures Experts Group) + 'mpeg' => array( + 'pattern' => '^\x00\x00\x01(\xBA|\xB3)', + 'group' => 'audio-video', + 'module' => 'mpeg', + 'mime_type' => 'video/mpeg', + ), + + // NSV - audio/video - Nullsoft Streaming Video (NSV) + 'nsv' => array( + 'pattern' => '^NSV[sf]', + 'group' => 'audio-video', + 'module' => 'nsv', + 'mime_type' => 'application/octet-stream', + ), + + // Ogg - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*)) + 'ogg' => array( + 'pattern' => '^OggS', + 'group' => 'audio', + 'module' => 'ogg', + 'mime_type' => 'application/ogg', + 'fail_id3' => 'WARNING', + 'fail_ape' => 'WARNING', + ), + + // QT - audio/video - Quicktime + 'quicktime' => array( + 'pattern' => '^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)', + 'group' => 'audio-video', + 'module' => 'quicktime', + 'mime_type' => 'video/quicktime', + ), + + // RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF) + 'riff' => array( + 'pattern' => '^(RIFF|SDSS|FORM)', + 'group' => 'audio-video', + 'module' => 'riff', + 'mime_type' => 'audio/x-wave', + 'fail_ape' => 'WARNING', + ), + + // Real - audio/video - RealAudio, RealVideo + 'real' => array( + 'pattern' => '^(\.RMF|.ra)', + 'group' => 'audio-video', + 'module' => 'real', + 'mime_type' => 'audio/x-realaudio', + ), + + // SWF - audio/video - ShockWave Flash + 'swf' => array( + 'pattern' => '^(F|C)WS', + 'group' => 'audio-video', + 'module' => 'swf', + 'mime_type' => 'application/x-shockwave-flash', + ), + + + // Still-Image formats + + // BMP - still image - Bitmap (Windows, OS/2; uncompressed, RLE8, RLE4) + 'bmp' => array( + 'pattern' => '^BM', + 'group' => 'graphic', + 'module' => 'bmp', + 'mime_type' => 'image/bmp', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // GIF - still image - Graphics Interchange Format + 'gif' => array( + 'pattern' => '^GIF', + 'group' => 'graphic', + 'module' => 'gif', + 'mime_type' => 'image/gif', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // JPEG - still image - Joint Photographic Experts Group (JPEG) + 'jpg' => array( + 'pattern' => '^\xFF\xD8\xFF', + 'group' => 'graphic', + 'module' => 'jpg', + 'mime_type' => 'image/jpeg', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // PCD - still image - Kodak Photo CD + 'pcd' => array( + 'pattern' => '^.{2048}PCD_IPI\x00', + 'group' => 'graphic', + 'module' => 'pcd', + 'mime_type' => 'image/x-photo-cd', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // PNG - still image - Portable Network Graphics (PNG) + 'png' => array( + 'pattern' => '^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A', + 'group' => 'graphic', + 'module' => 'png', + 'mime_type' => 'image/png', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // TIFF - still image - Tagged Information File Format (TIFF) + 'tiff' => array( + 'pattern' => '^(II\x2A\x00|MM\x00\x2A)', + 'group' => 'graphic', + 'module' => 'tiff', + 'mime_type' => 'image/tiff', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // Data formats + + // ISO - data - International Standards Organization (ISO) CD-ROM Image + 'iso' => array( + 'pattern' => '^.{32769}CD001', + 'group' => 'misc', + 'module' => 'iso', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + 'iconv_req' => false, + ), + + // RAR - data - RAR compressed data + 'rar' => array( + 'pattern' => '^Rar\!', + 'group' => 'archive', + 'module' => 'rar', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // SZIP - audio/data - SZIP compressed data + 'szip' => array( + 'pattern' => '^SZ\x0A\x04', + 'group' => 'archive', + 'module' => 'szip', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // TAR - data - TAR compressed data + 'tar' => array( + 'pattern' => '^.{100}[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20\x00]{12}[0-9\x20\x00]{12}', + 'group' => 'archive', + 'module' => 'tar', + 'mime_type' => 'application/x-tar', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // GZIP - data - GZIP compressed data + 'gz' => array( + 'pattern' => '^\x1F\x8B\x08', + 'group' => 'archive', + 'module' => 'gzip', + 'mime_type' => 'application/x-gzip', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // ZIP - data - ZIP compressed data + 'zip' => array( + 'pattern' => '^PK\x03\x04', + 'group' => 'archive', + 'module' => 'zip', + 'mime_type' => 'application/zip', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // Misc other formats + + // PDF - data - ZIP compressed data + 'pdf' => array( + 'pattern' => '^\x25PDF', + 'group' => 'misc', + 'module' => 'pdf', + 'mime_type' => 'application/pdf', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // MSOFFICE - data - ZIP compressed data + 'msoffice' => array( + 'pattern' => '^\xD0\xCF\x11\xE0', // D0CF11E == DOCFILE == Microsoft Office Document + 'group' => 'misc', + 'module' => 'msoffice', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + ); + } + + return $format_info; + } + + + + function GetFileFormat(&$filedata, $filename='') { + // this function will determine the format of a file based on usually + // the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG, + // and in the case of ISO CD image, 6 bytes offset 32kb from the start + // of the file). + + // Identify file format - loop through $format_info and detect with reg expr + foreach ($this->GetFileFormatArray() as $format_name => $info) { + // Using preg_match() instead of ereg() - much faster + // The /s switch on preg_match() forces preg_match() NOT to treat + // newline (0x0A) characters as special chars but do a binary match + if (preg_match('/'.$info['pattern'].'/s', $filedata)) { + $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; + return $info; + } + } + + + if (preg_match('/\.mp[123a]$/i', $filename)) { + // Too many mp3 encoders on the market put gabage in front of mpeg files + // use assume format on these if format detection failed + $GetFileFormatArray = $this->GetFileFormatArray(); + $info = $GetFileFormatArray['mp3']; + $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; + return $info; + } + + return false; + } + + + // converts array to $encoding charset from $this->encoding + function CharConvert(&$array, $encoding) { + + // identical encoding - end here + if ($encoding == $this->encoding) { + return; + } + + // loop thru array + foreach ($array as $key => $value) { + + // go recursive + if (is_array($value)) { + $this->CharConvert($array[$key], $encoding); + } + + // convert string + elseif (is_string($value)) { + $array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value)); + } + } + } + + + function HandleAllTags() { + + // key name => array (tag name, character encoding) + static $tags; + if (empty($tags)) { + $tags = array( + 'asf' => array('asf' , 'UTF-16LE'), + 'midi' => array('midi' , 'ISO-8859-1'), + 'nsv' => array('nsv' , 'ISO-8859-1'), + 'ogg' => array('vorbiscomment' , 'UTF-8'), + 'png' => array('png' , 'UTF-8'), + 'tiff' => array('tiff' , 'ISO-8859-1'), + 'quicktime' => array('quicktime' , 'ISO-8859-1'), + 'real' => array('real' , 'ISO-8859-1'), + 'vqf' => array('vqf' , 'ISO-8859-1'), + 'zip' => array('zip' , 'ISO-8859-1'), + 'riff' => array('riff' , 'ISO-8859-1'), + 'lyrics3' => array('lyrics3' , 'ISO-8859-1'), + 'id3v1' => array('id3v1' , $this->encoding_id3v1), + 'id3v2' => array('id3v2' , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8 + 'ape' => array('ape' , 'UTF-8') + ); + } + + // loop thru comments array + foreach ($tags as $comment_name => $tagname_encoding_array) { + list($tag_name, $encoding) = $tagname_encoding_array; + + // fill in default encoding type if not already present + if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) { + $this->info[$comment_name]['encoding'] = $encoding; + } + + // copy comments if key name set + if (!empty($this->info[$comment_name]['comments'])) { + + foreach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) { + foreach ($valuearray as $key => $value) { + if (strlen(trim($value)) > 0) { + $this->info['tags'][trim($tag_name)][trim($tag_key)][] = $value; // do not trim!! Unicode characters will get mangled if trailing nulls are removed! + } + } + } + + if (!isset($this->info['tags'][$tag_name])) { + // comments are set but contain nothing but empty strings, so skip + continue; + } + + if ($this->option_tags_html) { + foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) { + foreach ($valuearray as $key => $value) { + if (is_string($value)) { + //$this->info['tags_html'][$tag_name][$tag_key][$key] = getid3_lib::MultiByteCharString2HTML($value, $encoding); + $this->info['tags_html'][$tag_name][$tag_key][$key] = str_replace('�', '', getid3_lib::MultiByteCharString2HTML($value, $encoding)); + } else { + $this->info['tags_html'][$tag_name][$tag_key][$key] = $value; + } + } + } + } + + $this->CharConvert($this->info['tags'][$tag_name], $encoding); // only copy gets converted! + } + + } + return true; + } + + + function getHashdata($algorithm) { + switch ($algorithm) { + case 'md5': + case 'sha1': + break; + + default: + return $this->error('bad algorithm "'.$algorithm.'" in getHashdata()'); + break; + } + + if ((@$this->info['fileformat'] == 'ogg') && (@$this->info['audio']['dataformat'] == 'vorbis')) { + + // We cannot get an identical md5_data value for Ogg files where the comments + // span more than 1 Ogg page (compared to the same audio data with smaller + // comments) using the normal getID3() method of MD5'ing the data between the + // end of the comments and the end of the file (minus any trailing tags), + // because the page sequence numbers of the pages that the audio data is on + // do not match. Under normal circumstances, where comments are smaller than + // the nominal 4-8kB page size, then this is not a problem, but if there are + // very large comments, the only way around it is to strip off the comment + // tags with vorbiscomment and MD5 that file. + // This procedure must be applied to ALL Ogg files, not just the ones with + // comments larger than 1 page, because the below method simply MD5's the + // whole file with the comments stripped, not just the portion after the + // comments block (which is the standard getID3() method. + + // The above-mentioned problem of comments spanning multiple pages and changing + // page sequence numbers likely happens for OggSpeex and OggFLAC as well, but + // currently vorbiscomment only works on OggVorbis files. + + if ((bool) ini_get('safe_mode')) { + + $this->info['warning'][] = 'Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)'; + $this->info[$algorithm.'_data'] = false; + + } else { + + // Prevent user from aborting script + $old_abort = ignore_user_abort(true); + + // Create empty file + $empty = tempnam('*', 'getID3'); + touch($empty); + + + // Use vorbiscomment to make temp file without comments + $temp = tempnam('*', 'getID3'); + $file = $this->info['filenamepath']; + + if (GETID3_OS_ISWINDOWS) { + + if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) { + + $commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w -c "'.$empty.'" "'.$file.'" "'.$temp.'"'; + $VorbisCommentError = `$commandline`; + + } else { + + $VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR; + + } + + } else { + + $commandline = 'vorbiscomment -w -c "'.$empty.'" "'.$file.'" "'.$temp.'" 2>&1'; + $commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1'; + $VorbisCommentError = `$commandline`; + + } + + if (!empty($VorbisCommentError)) { + + $this->info['warning'][] = 'Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError; + $this->info[$algorithm.'_data'] = false; + + } else { + + // Get hash of newly created file + switch ($algorithm) { + case 'md5': + $this->info[$algorithm.'_data'] = getid3_lib::md5_file($temp); + break; + + case 'sha1': + $this->info[$algorithm.'_data'] = getid3_lib::sha1_file($temp); + break; + } + } + + // Clean up + unlink($empty); + unlink($temp); + + // Reset abort setting + ignore_user_abort($old_abort); + + } + + } else { + + if (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) { + + // get hash from part of file + $this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm); + + } else { + + // get hash from whole file + switch ($algorithm) { + case 'md5': + $this->info[$algorithm.'_data'] = getid3_lib::md5_file($this->info['filenamepath']); + break; + + case 'sha1': + $this->info[$algorithm.'_data'] = getid3_lib::sha1_file($this->info['filenamepath']); + break; + } + } + + } + return true; + } + + + function ChannelsBitratePlaytimeCalculations() { + + // set channelmode on audio + if (@$this->info['audio']['channels'] == '1') { + $this->info['audio']['channelmode'] = 'mono'; + } elseif (@$this->info['audio']['channels'] == '2') { + $this->info['audio']['channelmode'] = 'stereo'; + } + + // Calculate combined bitrate - audio + video + $CombinedBitrate = 0; + $CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0); + $CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0); + if (($CombinedBitrate > 0) && empty($this->info['bitrate'])) { + $this->info['bitrate'] = $CombinedBitrate; + } + //if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) { + // // for example, VBR MPEG video files cannot determine video bitrate: + // // should not set overall bitrate and playtime from audio bitrate only + // unset($this->info['bitrate']); + //} + + if (!isset($this->info['playtime_seconds']) && !empty($this->info['bitrate'])) { + $this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate']; + } + + // Set playtime string + if (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) { + $this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']); + } + } + + + function CalculateCompressionRatioVideo() { + if (empty($this->info['video'])) { + return false; + } + if (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) { + return false; + } + if (empty($this->info['video']['bits_per_sample'])) { + return false; + } + + switch ($this->info['video']['dataformat']) { + case 'bmp': + case 'gif': + case 'jpeg': + case 'jpg': + case 'png': + case 'tiff': + $FrameRate = 1; + $PlaytimeSeconds = 1; + $BitrateCompressed = $this->info['filesize'] * 8; + break; + + default: + if (!empty($this->info['video']['frame_rate'])) { + $FrameRate = $this->info['video']['frame_rate']; + } else { + return false; + } + if (!empty($this->info['playtime_seconds'])) { + $PlaytimeSeconds = $this->info['playtime_seconds']; + } else { + return false; + } + if (!empty($this->info['video']['bitrate'])) { + $BitrateCompressed = $this->info['video']['bitrate']; + } else { + return false; + } + break; + } + $BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate; + + $this->info['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed; + return true; + } + + + function CalculateCompressionRatioAudio() { + if (empty($this->info['audio']['bitrate']) || empty($this->info['audio']['channels']) || empty($this->info['audio']['sample_rate'])) { + return false; + } + $this->info['audio']['compression_ratio'] = $this->info['audio']['bitrate'] / ($this->info['audio']['channels'] * $this->info['audio']['sample_rate'] * (!empty($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : 16)); + + if (!empty($this->info['audio']['streams'])) { + foreach ($this->info['audio']['streams'] as $streamnumber => $streamdata) { + if (!empty($streamdata['bitrate']) && !empty($streamdata['channels']) && !empty($streamdata['sample_rate'])) { + $this->info['audio']['streams'][$streamnumber]['compression_ratio'] = $streamdata['bitrate'] / ($streamdata['channels'] * $streamdata['sample_rate'] * (!empty($streamdata['bits_per_sample']) ? $streamdata['bits_per_sample'] : 16)); + } + } + } + return true; + } + + + function CalculateReplayGain() { + if (isset($this->info['replay_gain'])) { + $this->info['replay_gain']['reference_volume'] = 89; + if (isset($this->info['replay_gain']['track']['adjustment'])) { + $this->info['replay_gain']['track']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['track']['adjustment']; + } + if (isset($this->info['replay_gain']['album']['adjustment'])) { + $this->info['replay_gain']['album']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['album']['adjustment']; + } + + if (isset($this->info['replay_gain']['track']['peak'])) { + $this->info['replay_gain']['track']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['track']['peak']); + } + if (isset($this->info['replay_gain']['album']['peak'])) { + $this->info['replay_gain']['album']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['album']['peak']); + } + } + return true; + } + + function ProcessAudioStreams() { + if (!empty($this->info['audio']['bitrate']) || !empty($this->info['audio']['channels']) || !empty($this->info['audio']['sample_rate'])) { + if (!isset($this->info['audio']['streams'])) { + foreach ($this->info['audio'] as $key => $value) { + if ($key != 'streams') { + $this->info['audio']['streams'][0][$key] = $value; + } + } + } + } + return true; + } + + function getid3_tempnam() { + return tempnam($this->tempdir, 'gI3'); + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.archive.gzip.php b/campcaster/src/modules/getid3/var/module.archive.gzip.php new file mode 100644 index 000000000..34a44b134 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.archive.gzip.php @@ -0,0 +1,249 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.archive.gzip.php // +// written by Mike Mozolin // +// module for analyzing GZIP files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + +class getid3_gzip { + + // public: Optional file list - disable for speed. + var $option_gzip_parse_contents = false; // decode gzipped files, if possible, and parse recursively (.tar.gz for example) + + function getid3_gzip(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'gzip'; + + $start_length = 10; + $unpack_header = 'a1id1/a1id2/a1cmethod/a1flags/a4mtime/a1xflags/a1os'; + //+---+---+---+---+---+---+---+---+---+---+ + //|ID1|ID2|CM |FLG| MTIME |XFL|OS | + //+---+---+---+---+---+---+---+---+---+---+ + @fseek($fd, 0); + $buffer = @fread($fd, $ThisFileInfo['filesize']); + + $arr_members = explode("\x1F\x8B\x08", $buffer); + while (true) { + $is_wrong_members = false; + $num_members = intval(count($arr_members)); + for ($i = 0; $i < $num_members; $i++) { + if (strlen($arr_members[$i]) == 0) { + continue; + } + $buf = "\x1F\x8B\x08".$arr_members[$i]; + + $attr = unpack($unpack_header, substr($buf, 0, $start_length)); + if (!$this->get_os_type(ord($attr['os']))) { + // Merge member with previous if wrong OS type + $arr_members[$i - 1] .= $buf; + $arr_members[$i] = ''; + $is_wrong_members = true; + continue; + } + } + if (!$is_wrong_members) { + break; + } + } + + $ThisFileInfo['gzip']['files'] = array(); + + $fpointer = 0; + $idx = 0; + for ($i = 0; $i < $num_members; $i++) { + if (strlen($arr_members[$i]) == 0) { + continue; + } + $thisThisFileInfo = &$ThisFileInfo['gzip']['member_header'][++$idx]; + + $buff = "\x1F\x8B\x08".$arr_members[$i]; + + $attr = unpack($unpack_header, substr($buff, 0, $start_length)); + $thisThisFileInfo['filemtime'] = getid3_lib::LittleEndian2Int($attr['mtime']); + $thisThisFileInfo['raw']['id1'] = ord($attr['cmethod']); + $thisThisFileInfo['raw']['id2'] = ord($attr['cmethod']); + $thisThisFileInfo['raw']['cmethod'] = ord($attr['cmethod']); + $thisThisFileInfo['raw']['os'] = ord($attr['os']); + $thisThisFileInfo['raw']['xflags'] = ord($attr['xflags']); + $thisThisFileInfo['raw']['flags'] = ord($attr['flags']); + + $thisThisFileInfo['flags']['crc16'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x02); + $thisThisFileInfo['flags']['extra'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x04); + $thisThisFileInfo['flags']['filename'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x08); + $thisThisFileInfo['flags']['comment'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x10); + + $thisThisFileInfo['compression'] = $this->get_xflag_type($thisThisFileInfo['raw']['xflags']); + + $thisThisFileInfo['os'] = $this->get_os_type($thisThisFileInfo['raw']['os']); + if (!$thisThisFileInfo['os']) { + $ThisFileInfo['error'][] = 'Read error on gzip file'; + return false; + } + + $fpointer = 10; + $arr_xsubfield = array(); + // bit 2 - FLG.FEXTRA + //+---+---+=================================+ + //| XLEN |...XLEN bytes of "extra field"...| + //+---+---+=================================+ + if ($thisThisFileInfo['flags']['extra']) { + $w_xlen = substr($buff, $fpointer, 2); + $xlen = getid3_lib::LittleEndian2Int($w_xlen); + $fpointer += 2; + + $thisThisFileInfo['raw']['xfield'] = substr($buff, $fpointer, $xlen); + // Extra SubFields + //+---+---+---+---+==================================+ + //|SI1|SI2| LEN |... LEN bytes of subfield data ...| + //+---+---+---+---+==================================+ + $idx = 0; + while (true) { + if ($idx >= $xlen) { + break; + } + $si1 = ord(substr($buff, $fpointer + $idx++, 1)); + $si2 = ord(substr($buff, $fpointer + $idx++, 1)); + if (($si1 == 0x41) && ($si2 == 0x70)) { + $w_xsublen = substr($buff, $fpointer+$idx, 2); + $xsublen = getid3_lib::LittleEndian2Int($w_xsublen); + $idx += 2; + $arr_xsubfield[] = substr($buff, $fpointer+$idx, $xsublen); + $idx += $xsublen; + } else { + break; + } + } + $fpointer += $xlen; + } + // bit 3 - FLG.FNAME + //+=========================================+ + //|...original file name, zero-terminated...| + //+=========================================+ + // GZIP files may have only one file, with no filename, so assume original filename is current filename without .gz + $thisThisFileInfo['filename'] = eregi_replace('.gz$', '', $ThisFileInfo['filename']); + if ($thisThisFileInfo['flags']['filename']) { + while (true) { + if (ord($buff[$fpointer]) == 0) { + $fpointer++; + break; + } + $thisThisFileInfo['filename'] .= $buff[$fpointer]; + $fpointer++; + } + } + // bit 4 - FLG.FCOMMENT + //+===================================+ + //|...file comment, zero-terminated...| + //+===================================+ + if ($thisThisFileInfo['flags']['comment']) { + while (true) { + if (ord($buff[$fpointer]) == 0) { + $fpointer++; + break; + } + $thisThisFileInfo['comment'] .= $buff[$fpointer]; + $fpointer++; + } + } + // bit 1 - FLG.FHCRC + //+---+---+ + //| CRC16 | + //+---+---+ + if ($thisThisFileInfo['flags']['crc16']) { + $w_crc = substr($buff, $fpointer, 2); + $thisThisFileInfo['crc16'] = getid3_lib::LittleEndian2Int($w_crc); + $fpointer += 2; + } + // bit 0 - FLG.FTEXT + //if ($thisThisFileInfo['raw']['flags'] & 0x01) { + // Ignored... + //} + // bits 5, 6, 7 - reserved + + $thisThisFileInfo['crc32'] = getid3_lib::LittleEndian2Int(substr($buff, strlen($buff) - 8, 4)); + $thisThisFileInfo['filesize'] = getid3_lib::LittleEndian2Int(substr($buff, strlen($buff) - 4)); + + $ThisFileInfo['gzip']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['gzip']['files'], getid3_lib::CreateDeepArray($thisThisFileInfo['filename'], '/', $thisThisFileInfo['filesize'])); + + if ($this->option_gzip_parse_contents) { + // Try to inflate GZip + $csize = 0; + $inflated = ''; + $chkcrc32 = ''; + if (function_exists('gzinflate')) { + $cdata = substr($buff, $fpointer); + $cdata = substr($cdata, 0, strlen($cdata) - 8); + $csize = strlen($cdata); + $inflated = gzinflate($cdata); + + // Calculate CRC32 for inflated content + $thisThisFileInfo['crc32_valid'] = (bool) (sprintf('%u', crc32($inflated)) == $thisThisFileInfo['crc32']); + + // determine format + $formattest = substr($inflated, 0, 32774); + $newgetID3 = new getID3(); + $determined_format = $newgetID3->GetFileFormat($formattest); + unset($newgetID3); + + // file format is determined + switch (@$determined_format['module']) { + case 'tar': + // view TAR-file info + if (file_exists(GETID3_INCLUDEPATH.$determined_format['include']) && @include_once(GETID3_INCLUDEPATH.$determined_format['include'])) { + getid3_tar::read_tar($inflated, $ThisFileInfo['gzip']['member_header'][$idx]); + } + break; + + case '': + default: + // unknown or unhandled format + break; + } + } + } + } + return true; + } + + // Converts the OS type + function get_os_type($key) { + static $os_type = array( + '0' => 'FAT filesystem (MS-DOS, OS/2, NT/Win32)', + '1' => 'Amiga', + '2' => 'VMS (or OpenVMS)', + '3' => 'Unix', + '4' => 'VM/CMS', + '5' => 'Atari TOS', + '6' => 'HPFS filesystem (OS/2, NT)', + '7' => 'Macintosh', + '8' => 'Z-System', + '9' => 'CP/M', + '10' => 'TOPS-20', + '11' => 'NTFS filesystem (NT)', + '12' => 'QDOS', + '13' => 'Acorn RISCOS', + '255' => 'unknown' + ); + return @$os_type[$key]; + } + + // Converts the eXtra FLags + function get_xflag_type($key) { + static $xflag_type = array( + '0' => 'unknown', + '2' => 'maximum compression', + '4' => 'fastest algorithm' + ); + return @$xflag_type[$key]; + } +} + +?> diff --git a/campcaster/src/modules/getid3/var/module.archive.rar.php b/campcaster/src/modules/getid3/var/module.archive.rar.php new file mode 100644 index 000000000..f006ce437 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.archive.rar.php @@ -0,0 +1,32 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.archive.rar.php // +// module for analyzing RAR files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_rar +{ + + function getid3_rar(&$fd, &$ThisFileInfo) { + + $ThisFileInfo['fileformat'] = 'rar'; + + $ThisFileInfo['error'][] = 'RAR parsing not enabled in this version of getID3()'; + return false; + + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.archive.szip.php b/campcaster/src/modules/getid3/var/module.archive.szip.php new file mode 100644 index 000000000..2513c85c7 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.archive.szip.php @@ -0,0 +1,97 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.archive.szip.php // +// module for analyzing SZIP compressed files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_szip +{ + + function getid3_szip(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $SZIPHeader = fread($fd, 6); + if (substr($SZIPHeader, 0, 4) != 'SZ'."\x0A\x04") { + $ThisFileInfo['error'][] = 'Expecting "SZ[x0A][x04]" at offset '.$ThisFileInfo['avdataoffset'].', found "'.substr($SZIPHeader, 0, 4).'"'; + return false; + } + + $ThisFileInfo['fileformat'] = 'szip'; + + $ThisFileInfo['szip']['major_version'] = getid3_lib::BigEndian2Int(substr($SZIPHeader, 4, 1)); + $ThisFileInfo['szip']['minor_version'] = getid3_lib::BigEndian2Int(substr($SZIPHeader, 5, 1)); + + while (!feof($fd)) { + $NextBlockID = fread($fd, 2); + switch ($NextBlockID) { + case 'SZ': + // Note that szip files can be concatenated, this has the same effect as + // concatenating the files. this also means that global header blocks + // might be present between directory/data blocks. + fseek($fd, 4, SEEK_CUR); + break; + + case 'BH': + $BHheaderbytes = getid3_lib::BigEndian2Int(fread($fd, 3)); + $BHheaderdata = fread($fd, $BHheaderbytes); + $BHheaderoffset = 0; + while (strpos($BHheaderdata, "\x00", $BHheaderoffset) > 0) { + //filename as \0 terminated string (empty string indicates end) + //owner as \0 terminated string (empty is same as last file) + //group as \0 terminated string (empty is same as last file) + //3 byte filelength in this block + //2 byte access flags + //4 byte creation time (like in unix) + //4 byte modification time (like in unix) + //4 byte access time (like in unix) + + $BHdataArray['filename'] = substr($BHheaderdata, $BHheaderoffset, strcspn($BHheaderdata, "\x00")); + $BHheaderoffset += (strlen($BHdataArray['filename']) + 1); + + $BHdataArray['owner'] = substr($BHheaderdata, $BHheaderoffset, strcspn($BHheaderdata, "\x00")); + $BHheaderoffset += (strlen($BHdataArray['owner']) + 1); + + $BHdataArray['group'] = substr($BHheaderdata, $BHheaderoffset, strcspn($BHheaderdata, "\x00")); + $BHheaderoffset += (strlen($BHdataArray['group']) + 1); + + $BHdataArray['filelength'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 3)); + $BHheaderoffset += 3; + + $BHdataArray['access_flags'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 2)); + $BHheaderoffset += 2; + + $BHdataArray['creation_time'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 4)); + $BHheaderoffset += 4; + + $BHdataArray['modification_time'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 4)); + $BHheaderoffset += 4; + + $BHdataArray['access_time'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 4)); + $BHheaderoffset += 4; + + $ThisFileInfo['szip']['BH'][] = $BHdataArray; + } + break; + + default: + break 2; + } + } + + return true; + + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.archive.tar.php b/campcaster/src/modules/getid3/var/module.archive.tar.php new file mode 100644 index 000000000..61aff401e --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.archive.tar.php @@ -0,0 +1,167 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.archive.tar.php // +// written by Mike Mozolin // +// module for analyzing TAR files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + +class getid3_tar { + + function getid3_tar(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'tar'; + $ThisFileInfo['tar']['files'] = array(); + + $unpack_header = 'a100fname/a8mode/a8uid/a8gid/a12size/a12mtime/a8chksum/a1typflag/a100lnkname/a6magic/a2ver/a32uname/a32gname/a8devmaj/a8devmin/a155/prefix'; + $null_512k = str_repeat("\0", 512); // end-of-file marker + + @fseek($fd, 0); + while (!feof($fd)) { + $buffer = fread($fd, 512); + + // check the block + $checksum = 0; + for ($i = 0; $i < 148; $i++) { + $checksum += ord($buffer{$i}); + } + for ($i = 148; $i < 156; $i++) { + $checksum += ord(' '); + } + for ($i = 156; $i < 512; $i++) { + $checksum += ord($buffer{$i}); + } + $attr = unpack($unpack_header, $buffer); + $name = trim(@$attr['fname']); + $mode = octdec(trim(@$attr['mode'])); + $uid = octdec(trim(@$attr['uid'])); + $gid = octdec(trim(@$attr['gid'])); + $size = octdec(trim(@$attr['size'])); + $mtime = octdec(trim(@$attr['mtime'])); + $chksum = octdec(trim(@$attr['chksum'])); + $typflag = trim(@$attr['typflag']); + $lnkname = trim(@$attr['lnkname']); + $magic = trim(@$attr['magic']); + $ver = trim(@$attr['ver']); + $uname = trim(@$attr['uname']); + $gname = trim(@$attr['gname']); + $devmaj = octdec(trim(@$attr['devmaj'])); + $devmin = octdec(trim(@$attr['devmin'])); + $prefix = trim(@$attr['prefix']); + if (($checksum == 256) && ($chksum == 0)) { + // EOF Found + break; + } + if ($prefix) { + $name = $prefix.'/'.$name; + } + if ((preg_match('#/$#', $name)) && !$name) { + $typeflag = 5; + } + if ($buffer == $null_512k) { + // it's the end of the tar-file... + break; + } + + // Read to the next chunk + fseek($fd, $size, SEEK_CUR); + + $diff = $size % 512; + if ($diff != 0) { + // Padding, throw away + fseek($fd, (512 - $diff), SEEK_CUR); + } + // Protect against tar-files with garbage at the end + if ($name == '') { + break; + } + $ThisFileInfo['tar']['file_details'][$name] = array ( + 'name' => $name, + 'mode_raw' => $mode, + 'mode' => getid3_tar::display_perms($mode), + 'uid' => $uid, + 'gid' => $gid, + 'size' => $size, + 'mtime' => $mtime, + 'chksum' => $chksum, + 'typeflag' => getid3_tar::get_flag_type($typflag), + 'linkname' => $lnkname, + 'magic' => $magic, + 'version' => $ver, + 'uname' => $uname, + 'gname' => $gname, + 'devmajor' => $devmaj, + 'devminor' => $devmin + ); + $ThisFileInfo['tar']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['tar']['files'], getid3_lib::CreateDeepArray($ThisFileInfo['tar']['file_details'][$name]['name'], '/', $size)); + } + return true; + } + + // Parses the file mode to file permissions + function display_perms($mode) { + // Determine Type + if ($mode & 0x1000) $type='p'; // FIFO pipe + elseif ($mode & 0x2000) $type='c'; // Character special + elseif ($mode & 0x4000) $type='d'; // Directory + elseif ($mode & 0x6000) $type='b'; // Block special + elseif ($mode & 0x8000) $type='-'; // Regular + elseif ($mode & 0xA000) $type='l'; // Symbolic Link + elseif ($mode & 0xC000) $type='s'; // Socket + else $type='u'; // UNKNOWN + + // Determine permissions + $owner['read'] = (($mode & 00400) ? 'r' : '-'); + $owner['write'] = (($mode & 00200) ? 'w' : '-'); + $owner['execute'] = (($mode & 00100) ? 'x' : '-'); + $group['read'] = (($mode & 00040) ? 'r' : '-'); + $group['write'] = (($mode & 00020) ? 'w' : '-'); + $group['execute'] = (($mode & 00010) ? 'x' : '-'); + $world['read'] = (($mode & 00004) ? 'r' : '-'); + $world['write'] = (($mode & 00002) ? 'w' : '-'); + $world['execute'] = (($mode & 00001) ? 'x' : '-'); + + // Adjust for SUID, SGID and sticky bit + if ($mode & 0x800) $owner['execute'] = ($owner['execute'] == 'x') ? 's' : 'S'; + if ($mode & 0x400) $group['execute'] = ($group['execute'] == 'x') ? 's' : 'S'; + if ($mode & 0x200) $world['execute'] = ($world['execute'] == 'x') ? 't' : 'T'; + + $s = sprintf('%1s', $type); + $s .= sprintf('%1s%1s%1s', $owner['read'], $owner['write'], $owner['execute']); + $s .= sprintf('%1s%1s%1s', $group['read'], $group['write'], $group['execute']); + $s .= sprintf('%1s%1s%1s'."\n", $world['read'], $world['write'], $world['execute']); + return $s; + } + + // Converts the file type + function get_flag_type($typflag) { + static $flag_types = array( + '0' => 'LF_NORMAL', + '1' => 'LF_LINK', + '2' => 'LF_SYNLINK', + '3' => 'LF_CHR', + '4' => 'LF_BLK', + '5' => 'LF_DIR', + '6' => 'LF_FIFO', + '7' => 'LF_CONFIG', + 'D' => 'LF_DUMPDIR', + 'K' => 'LF_LONGLINK', + 'L' => 'LF_LONGNAME', + 'M' => 'LF_MULTIVOL', + 'N' => 'LF_NAMES', + 'S' => 'LF_SPARSE', + 'V' => 'LF_VOLHDR' + ); + return @$flag_types[$typflag]; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.archive.zip.php b/campcaster/src/modules/getid3/var/module.archive.zip.php new file mode 100644 index 000000000..da6fb72f0 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.archive.zip.php @@ -0,0 +1,415 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.archive.zip.php // +// module for analyzing pkZip files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_zip +{ + + function getid3_zip(&$fd, &$ThisFileInfo) { + + $ThisFileInfo['fileformat'] = 'zip'; + $ThisFileInfo['zip']['encoding'] = 'ISO-8859-1'; + $ThisFileInfo['zip']['files'] = array(); + + $ThisFileInfo['zip']['compressed_size'] = 0; + $ThisFileInfo['zip']['uncompressed_size'] = 0; + $ThisFileInfo['zip']['entries_count'] = 0; + + $EOCDsearchData = ''; + $EOCDsearchCounter = 0; + while ($EOCDsearchCounter++ < 512) { + + fseek($fd, -128 * $EOCDsearchCounter, SEEK_END); + $EOCDsearchData = fread($fd, 128).$EOCDsearchData; + + if (strstr($EOCDsearchData, 'PK'."\x05\x06")) { + + $EOCDposition = strpos($EOCDsearchData, 'PK'."\x05\x06"); + fseek($fd, (-128 * $EOCDsearchCounter) + $EOCDposition, SEEK_END); + $ThisFileInfo['zip']['end_central_directory'] = $this->ZIPparseEndOfCentralDirectory($fd); + + fseek($fd, $ThisFileInfo['zip']['end_central_directory']['directory_offset'], SEEK_SET); + $ThisFileInfo['zip']['entries_count'] = 0; + while ($centraldirectoryentry = $this->ZIPparseCentralDirectory($fd)) { + $ThisFileInfo['zip']['central_directory'][] = $centraldirectoryentry; + $ThisFileInfo['zip']['entries_count']++; + $ThisFileInfo['zip']['compressed_size'] += $centraldirectoryentry['compressed_size']; + $ThisFileInfo['zip']['uncompressed_size'] += $centraldirectoryentry['uncompressed_size']; + + if ($centraldirectoryentry['uncompressed_size'] > 0) { + $ThisFileInfo['zip']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['zip']['files'], getid3_lib::CreateDeepArray($centraldirectoryentry['filename'], '/', $centraldirectoryentry['uncompressed_size'])); + } + } + + if ($ThisFileInfo['zip']['entries_count'] == 0) { + $ThisFileInfo['error'][] = 'No Central Directory entries found (truncated file?)'; + return false; + } + + if (!empty($ThisFileInfo['zip']['end_central_directory']['comment'])) { + $ThisFileInfo['zip']['comments']['comment'][] = $ThisFileInfo['zip']['end_central_directory']['comment']; + } + + if (isset($ThisFileInfo['zip']['central_directory'][0]['compression_method'])) { + $ThisFileInfo['zip']['compression_method'] = $ThisFileInfo['zip']['central_directory'][0]['compression_method']; + } + if (isset($ThisFileInfo['zip']['central_directory'][0]['flags']['compression_speed'])) { + $ThisFileInfo['zip']['compression_speed'] = $ThisFileInfo['zip']['central_directory'][0]['flags']['compression_speed']; + } + if (isset($ThisFileInfo['zip']['compression_method']) && ($ThisFileInfo['zip']['compression_method'] == 'store') && !isset($ThisFileInfo['zip']['compression_speed'])) { + $ThisFileInfo['zip']['compression_speed'] = 'store'; + } + + return true; + + } + + } + + if ($this->getZIPentriesFilepointer($fd, $ThisFileInfo)) { + + // central directory couldn't be found and/or parsed + // scan through actual file data entries, recover as much as possible from probable trucated file + if ($ThisFileInfo['zip']['compressed_size'] > ($ThisFileInfo['filesize'] - 46 - 22)) { + $ThisFileInfo['error'][] = 'Warning: Truncated file! - Total compressed file sizes ('.$ThisFileInfo['zip']['compressed_size'].' bytes) is greater than filesize minus Central Directory and End Of Central Directory structures ('.($ThisFileInfo['filesize'] - 46 - 22).' bytes)'; + } + $ThisFileInfo['error'][] = 'Cannot find End Of Central Directory - returned list of files in [zip][entries] array may not be complete'; + foreach ($ThisFileInfo['zip']['entries'] as $key => $valuearray) { + $ThisFileInfo['zip']['files'][$valuearray['filename']] = $valuearray['uncompressed_size']; + } + return true; + + } else { + + unset($ThisFileInfo['zip']); + $ThisFileInfo['fileformat'] = ''; + $ThisFileInfo['error'][] = 'Cannot find End Of Central Directory (truncated file?)'; + return false; + + } + } + + + function getZIPHeaderFilepointerTopDown(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'zip'; + + $ThisFileInfo['zip']['compressed_size'] = 0; + $ThisFileInfo['zip']['uncompressed_size'] = 0; + $ThisFileInfo['zip']['entries_count'] = 0; + + rewind($fd); + while ($fileentry = $this->ZIPparseLocalFileHeader($fd)) { + $ThisFileInfo['zip']['entries'][] = $fileentry; + $ThisFileInfo['zip']['entries_count']++; + } + if ($ThisFileInfo['zip']['entries_count'] == 0) { + $ThisFileInfo['error'][] = 'No Local File Header entries found'; + return false; + } + + $ThisFileInfo['zip']['entries_count'] = 0; + while ($centraldirectoryentry = $this->ZIPparseCentralDirectory($fd)) { + $ThisFileInfo['zip']['central_directory'][] = $centraldirectoryentry; + $ThisFileInfo['zip']['entries_count']++; + $ThisFileInfo['zip']['compressed_size'] += $centraldirectoryentry['compressed_size']; + $ThisFileInfo['zip']['uncompressed_size'] += $centraldirectoryentry['uncompressed_size']; + } + if ($ThisFileInfo['zip']['entries_count'] == 0) { + $ThisFileInfo['error'][] = 'No Central Directory entries found (truncated file?)'; + return false; + } + + if ($EOCD = $this->ZIPparseEndOfCentralDirectory($fd)) { + $ThisFileInfo['zip']['end_central_directory'] = $EOCD; + } else { + $ThisFileInfo['error'][] = 'No End Of Central Directory entry found (truncated file?)'; + return false; + } + + if (!empty($ThisFileInfo['zip']['end_central_directory']['comment'])) { + $ThisFileInfo['zip']['comments']['comment'][] = $ThisFileInfo['zip']['end_central_directory']['comment']; + } + + return true; + } + + + function getZIPentriesFilepointer(&$fd, &$ThisFileInfo) { + $ThisFileInfo['zip']['compressed_size'] = 0; + $ThisFileInfo['zip']['uncompressed_size'] = 0; + $ThisFileInfo['zip']['entries_count'] = 0; + + rewind($fd); + while ($fileentry = $this->ZIPparseLocalFileHeader($fd)) { + $ThisFileInfo['zip']['entries'][] = $fileentry; + $ThisFileInfo['zip']['entries_count']++; + $ThisFileInfo['zip']['compressed_size'] += $fileentry['compressed_size']; + $ThisFileInfo['zip']['uncompressed_size'] += $fileentry['uncompressed_size']; + } + if ($ThisFileInfo['zip']['entries_count'] == 0) { + $ThisFileInfo['error'][] = 'No Local File Header entries found'; + return false; + } + + return true; + } + + + function ZIPparseLocalFileHeader(&$fd) { + $LocalFileHeader['offset'] = ftell($fd); + + $ZIPlocalFileHeader = fread($fd, 30); + + $LocalFileHeader['raw']['signature'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 0, 4)); + if ($LocalFileHeader['raw']['signature'] != 0x04034B50) { + // invalid Local File Header Signature + fseek($fd, $LocalFileHeader['offset'], SEEK_SET); // seek back to where filepointer originally was so it can be handled properly + return false; + } + $LocalFileHeader['raw']['extract_version'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 4, 2)); + $LocalFileHeader['raw']['general_flags'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 6, 2)); + $LocalFileHeader['raw']['compression_method'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 8, 2)); + $LocalFileHeader['raw']['last_mod_file_time'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 10, 2)); + $LocalFileHeader['raw']['last_mod_file_date'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 12, 2)); + $LocalFileHeader['raw']['crc_32'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 14, 4)); + $LocalFileHeader['raw']['compressed_size'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 18, 4)); + $LocalFileHeader['raw']['uncompressed_size'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 22, 4)); + $LocalFileHeader['raw']['filename_length'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 26, 2)); + $LocalFileHeader['raw']['extra_field_length'] = getid3_lib::LittleEndian2Int(substr($ZIPlocalFileHeader, 28, 2)); + + $LocalFileHeader['extract_version'] = sprintf('%1.1f', $LocalFileHeader['raw']['extract_version'] / 10); + $LocalFileHeader['host_os'] = $this->ZIPversionOSLookup(($LocalFileHeader['raw']['extract_version'] & 0xFF00) >> 8); + $LocalFileHeader['compression_method'] = $this->ZIPcompressionMethodLookup($LocalFileHeader['raw']['compression_method']); + $LocalFileHeader['compressed_size'] = $LocalFileHeader['raw']['compressed_size']; + $LocalFileHeader['uncompressed_size'] = $LocalFileHeader['raw']['uncompressed_size']; + $LocalFileHeader['flags'] = $this->ZIPparseGeneralPurposeFlags($LocalFileHeader['raw']['general_flags'], $LocalFileHeader['raw']['compression_method']); + $LocalFileHeader['last_modified_timestamp'] = $this->DOStime2UNIXtime($LocalFileHeader['raw']['last_mod_file_date'], $LocalFileHeader['raw']['last_mod_file_time']); + + $FilenameExtrafieldLength = $LocalFileHeader['raw']['filename_length'] + $LocalFileHeader['raw']['extra_field_length']; + if ($FilenameExtrafieldLength > 0) { + $ZIPlocalFileHeader .= fread($fd, $FilenameExtrafieldLength); + + if ($LocalFileHeader['raw']['filename_length'] > 0) { + $LocalFileHeader['filename'] = substr($ZIPlocalFileHeader, 30, $LocalFileHeader['raw']['filename_length']); + } + if ($LocalFileHeader['raw']['extra_field_length'] > 0) { + $LocalFileHeader['raw']['extra_field_data'] = substr($ZIPlocalFileHeader, 30 + $LocalFileHeader['raw']['filename_length'], $LocalFileHeader['raw']['extra_field_length']); + } + } + + $LocalFileHeader['data_offset'] = ftell($fd); + //$LocalFileHeader['compressed_data'] = fread($fd, $LocalFileHeader['raw']['compressed_size']); + fseek($fd, $LocalFileHeader['raw']['compressed_size'], SEEK_CUR); + + if ($LocalFileHeader['flags']['data_descriptor_used']) { + $DataDescriptor = fread($fd, 12); + $LocalFileHeader['data_descriptor']['crc_32'] = getid3_lib::LittleEndian2Int(substr($DataDescriptor, 0, 4)); + $LocalFileHeader['data_descriptor']['compressed_size'] = getid3_lib::LittleEndian2Int(substr($DataDescriptor, 4, 4)); + $LocalFileHeader['data_descriptor']['uncompressed_size'] = getid3_lib::LittleEndian2Int(substr($DataDescriptor, 8, 4)); + } + + return $LocalFileHeader; + } + + + function ZIPparseCentralDirectory(&$fd) { + $CentralDirectory['offset'] = ftell($fd); + + $ZIPcentralDirectory = fread($fd, 46); + + $CentralDirectory['raw']['signature'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 0, 4)); + if ($CentralDirectory['raw']['signature'] != 0x02014B50) { + // invalid Central Directory Signature + fseek($fd, $CentralDirectory['offset'], SEEK_SET); // seek back to where filepointer originally was so it can be handled properly + return false; + } + $CentralDirectory['raw']['create_version'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 4, 2)); + $CentralDirectory['raw']['extract_version'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 6, 2)); + $CentralDirectory['raw']['general_flags'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 8, 2)); + $CentralDirectory['raw']['compression_method'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 10, 2)); + $CentralDirectory['raw']['last_mod_file_time'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 12, 2)); + $CentralDirectory['raw']['last_mod_file_date'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 14, 2)); + $CentralDirectory['raw']['crc_32'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 16, 4)); + $CentralDirectory['raw']['compressed_size'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 20, 4)); + $CentralDirectory['raw']['uncompressed_size'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 24, 4)); + $CentralDirectory['raw']['filename_length'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 28, 2)); + $CentralDirectory['raw']['extra_field_length'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 30, 2)); + $CentralDirectory['raw']['file_comment_length'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 32, 2)); + $CentralDirectory['raw']['disk_number_start'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 34, 2)); + $CentralDirectory['raw']['internal_file_attrib'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 36, 2)); + $CentralDirectory['raw']['external_file_attrib'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 38, 4)); + $CentralDirectory['raw']['local_header_offset'] = getid3_lib::LittleEndian2Int(substr($ZIPcentralDirectory, 42, 4)); + + $CentralDirectory['entry_offset'] = $CentralDirectory['raw']['local_header_offset']; + $CentralDirectory['create_version'] = sprintf('%1.1f', $CentralDirectory['raw']['create_version'] / 10); + $CentralDirectory['extract_version'] = sprintf('%1.1f', $CentralDirectory['raw']['extract_version'] / 10); + $CentralDirectory['host_os'] = $this->ZIPversionOSLookup(($CentralDirectory['raw']['extract_version'] & 0xFF00) >> 8); + $CentralDirectory['compression_method'] = $this->ZIPcompressionMethodLookup($CentralDirectory['raw']['compression_method']); + $CentralDirectory['compressed_size'] = $CentralDirectory['raw']['compressed_size']; + $CentralDirectory['uncompressed_size'] = $CentralDirectory['raw']['uncompressed_size']; + $CentralDirectory['flags'] = $this->ZIPparseGeneralPurposeFlags($CentralDirectory['raw']['general_flags'], $CentralDirectory['raw']['compression_method']); + $CentralDirectory['last_modified_timestamp'] = $this->DOStime2UNIXtime($CentralDirectory['raw']['last_mod_file_date'], $CentralDirectory['raw']['last_mod_file_time']); + + $FilenameExtrafieldCommentLength = $CentralDirectory['raw']['filename_length'] + $CentralDirectory['raw']['extra_field_length'] + $CentralDirectory['raw']['file_comment_length']; + if ($FilenameExtrafieldCommentLength > 0) { + $FilenameExtrafieldComment = fread($fd, $FilenameExtrafieldCommentLength); + + if ($CentralDirectory['raw']['filename_length'] > 0) { + $CentralDirectory['filename'] = substr($FilenameExtrafieldComment, 0, $CentralDirectory['raw']['filename_length']); + } + if ($CentralDirectory['raw']['extra_field_length'] > 0) { + $CentralDirectory['raw']['extra_field_data'] = substr($FilenameExtrafieldComment, $CentralDirectory['raw']['filename_length'], $CentralDirectory['raw']['extra_field_length']); + } + if ($CentralDirectory['raw']['file_comment_length'] > 0) { + $CentralDirectory['file_comment'] = substr($FilenameExtrafieldComment, $CentralDirectory['raw']['filename_length'] + $CentralDirectory['raw']['extra_field_length'], $CentralDirectory['raw']['file_comment_length']); + } + } + + return $CentralDirectory; + } + + function ZIPparseEndOfCentralDirectory(&$fd) { + $EndOfCentralDirectory['offset'] = ftell($fd); + + $ZIPendOfCentralDirectory = fread($fd, 22); + + $EndOfCentralDirectory['signature'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 0, 4)); + if ($EndOfCentralDirectory['signature'] != 0x06054B50) { + // invalid End Of Central Directory Signature + fseek($fd, $EndOfCentralDirectory['offset'], SEEK_SET); // seek back to where filepointer originally was so it can be handled properly + return false; + } + $EndOfCentralDirectory['disk_number_current'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 4, 2)); + $EndOfCentralDirectory['disk_number_start_directory'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 6, 2)); + $EndOfCentralDirectory['directory_entries_this_disk'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 8, 2)); + $EndOfCentralDirectory['directory_entries_total'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 10, 2)); + $EndOfCentralDirectory['directory_size'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 12, 4)); + $EndOfCentralDirectory['directory_offset'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 16, 4)); + $EndOfCentralDirectory['comment_length'] = getid3_lib::LittleEndian2Int(substr($ZIPendOfCentralDirectory, 20, 2)); + + if ($EndOfCentralDirectory['comment_length'] > 0) { + $EndOfCentralDirectory['comment'] = fread($fd, $EndOfCentralDirectory['comment_length']); + } + + return $EndOfCentralDirectory; + } + + + function ZIPparseGeneralPurposeFlags($flagbytes, $compressionmethod) { + $ParsedFlags['encrypted'] = (bool) ($flagbytes & 0x0001); + + switch ($compressionmethod) { + case 6: + $ParsedFlags['dictionary_size'] = (($flagbytes & 0x0002) ? 8192 : 4096); + $ParsedFlags['shannon_fano_trees'] = (($flagbytes & 0x0004) ? 3 : 2); + break; + + case 8: + case 9: + switch (($flagbytes & 0x0006) >> 1) { + case 0: + $ParsedFlags['compression_speed'] = 'normal'; + break; + case 1: + $ParsedFlags['compression_speed'] = 'maximum'; + break; + case 2: + $ParsedFlags['compression_speed'] = 'fast'; + break; + case 3: + $ParsedFlags['compression_speed'] = 'superfast'; + break; + } + break; + } + $ParsedFlags['data_descriptor_used'] = (bool) ($flagbytes & 0x0008); + + return $ParsedFlags; + } + + + function ZIPversionOSLookup($index) { + static $ZIPversionOSLookup = array( + 0 => 'MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)', + 1 => 'Amiga', + 2 => 'OpenVMS', + 3 => 'Unix', + 4 => 'VM/CMS', + 5 => 'Atari ST', + 6 => 'OS/2 H.P.F.S.', + 7 => 'Macintosh', + 8 => 'Z-System', + 9 => 'CP/M', + 10 => 'Windows NTFS', + 11 => 'MVS', + 12 => 'VSE', + 13 => 'Acorn Risc', + 14 => 'VFAT', + 15 => 'Alternate MVS', + 16 => 'BeOS', + 17 => 'Tandem' + ); + + return (isset($ZIPversionOSLookup[$index]) ? $ZIPversionOSLookup[$index] : '[unknown]'); + } + + function ZIPcompressionMethodLookup($index) { + static $ZIPcompressionMethodLookup = array( + 0 => 'store', + 1 => 'shrink', + 2 => 'reduce-1', + 3 => 'reduce-2', + 4 => 'reduce-3', + 5 => 'reduce-4', + 6 => 'implode', + 7 => 'tokenize', + 8 => 'deflate', + 9 => 'deflate64', + 10 => 'PKWARE Date Compression Library Imploding' + ); + + return (isset($ZIPcompressionMethodLookup[$index]) ? $ZIPcompressionMethodLookup[$index] : '[unknown]'); + } + + function DOStime2UNIXtime($DOSdate, $DOStime) { + // wFatDate + // Specifies the MS-DOS date. The date is a packed 16-bit value with the following format: + // Bits Contents + // 0-4 Day of the month (1-31) + // 5-8 Month (1 = January, 2 = February, and so on) + // 9-15 Year offset from 1980 (add 1980 to get actual year) + + $UNIXday = ($DOSdate & 0x001F); + $UNIXmonth = (($DOSdate & 0x01E0) >> 5); + $UNIXyear = (($DOSdate & 0xFE00) >> 9) + 1980; + + // wFatTime + // Specifies the MS-DOS time. The time is a packed 16-bit value with the following format: + // Bits Contents + // 0-4 Second divided by 2 + // 5-10 Minute (0-59) + // 11-15 Hour (0-23 on a 24-hour clock) + + $UNIXsecond = ($DOStime & 0x001F) * 2; + $UNIXminute = (($DOStime & 0x07E0) >> 5); + $UNIXhour = (($DOStime & 0xF800) >> 11); + + return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.asf.php b/campcaster/src/modules/getid3/var/module.audio-video.asf.php new file mode 100644 index 000000000..b13db542d --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.asf.php @@ -0,0 +1,1635 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.asf.php // +// module for analyzing ASF, WMA and WMV files // +// dependencies: module.audio-video.riff.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + +$GUIDarray = getid3_asf::KnownGUIDs(); +foreach ($GUIDarray as $GUIDname => $hexstringvalue) { + // initialize all GUID constants + define($GUIDname, getid3_asf::GUIDtoBytestring($hexstringvalue)); +} + + + +class getid3_asf +{ + + function getid3_asf(&$fd, &$ThisFileInfo) { + + // Shortcuts + $thisfile_audio = &$ThisFileInfo['audio']; + $thisfile_video = &$ThisFileInfo['video']; + $ThisFileInfo['asf'] = array(); + $thisfile_asf = &$ThisFileInfo['asf']; + $thisfile_asf['comments'] = array(); + $thisfile_asf_comments = &$thisfile_asf['comments']; + $thisfile_asf['header_object'] = array(); + $thisfile_asf_headerobject = &$thisfile_asf['header_object']; + + + // ASF structure: + // * Header Object [required] + // * File Properties Object [required] (global file attributes) + // * Stream Properties Object [required] (defines media stream & characteristics) + // * Header Extension Object [required] (additional functionality) + // * Content Description Object (bibliographic information) + // * Script Command Object (commands for during playback) + // * Marker Object (named jumped points within the file) + // * Data Object [required] + // * Data Packets + // * Index Object + + // Header Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for header object - GETID3_ASF_Header_Object + // Object Size QWORD 64 // size of header object, including 30 bytes of Header Object header + // Number of Header Objects DWORD 32 // number of objects in header object + // Reserved1 BYTE 8 // hardcoded: 0x01 + // Reserved2 BYTE 8 // hardcoded: 0x02 + + $ThisFileInfo['fileformat'] = 'asf'; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $HeaderObjectData = fread($fd, 30); + + $thisfile_asf_headerobject['objectid'] = substr($HeaderObjectData, 0, 16); + $thisfile_asf_headerobject['objectid_guid'] = $this->BytestringToGUID($thisfile_asf_headerobject['objectid']); + if ($thisfile_asf_headerobject['objectid'] != GETID3_ASF_Header_Object) { + $ThisFileInfo['warning'][] = 'ASF header GUID {'.$this->BytestringToGUID($thisfile_asf_headerobject['objectid']).'} does not match expected "GETID3_ASF_Header_Object" GUID {'.$this->BytestringToGUID(GETID3_ASF_Header_Object).'}'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['asf']); + return false; + break; + } + $thisfile_asf_headerobject['objectsize'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 16, 8)); + $thisfile_asf_headerobject['headerobjects'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 24, 4)); + $thisfile_asf_headerobject['reserved1'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 28, 1)); + $thisfile_asf_headerobject['reserved2'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1)); + + //$ASFHeaderData = $HeaderObjectData; + $ASFHeaderData = fread($fd, $thisfile_asf_headerobject['objectsize'] - 30); + //$offset = 30; + $offset = 0; + + for ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) { + $NextObjectGUID = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); + $NextObjectSize = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + switch ($NextObjectGUID) { + + case GETID3_ASF_File_Properties_Object: + // File Properties Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for file properties object - GETID3_ASF_File_Properties_Object + // Object Size QWORD 64 // size of file properties object, including 104 bytes of File Properties Object header + // File ID GUID 128 // unique ID - identical to File ID in Data Object + // File Size QWORD 64 // entire file in bytes. Invalid if Broadcast Flag == 1 + // Creation Date QWORD 64 // date & time of file creation. Maybe invalid if Broadcast Flag == 1 + // Data Packets Count QWORD 64 // number of data packets in Data Object. Invalid if Broadcast Flag == 1 + // Play Duration QWORD 64 // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1 + // Send Duration QWORD 64 // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1 + // Preroll QWORD 64 // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount + // Flags DWORD 32 // + // * Broadcast Flag bits 1 (0x01) // file is currently being written, some header values are invalid + // * Seekable Flag bits 1 (0x02) // is file seekable + // * Reserved bits 30 (0xFFFFFFFC) // reserved - set to zero + // Minimum Data Packet Size DWORD 32 // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1 + // Maximum Data Packet Size DWORD 32 // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1 + // Maximum Bitrate DWORD 32 // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead + + // shortcut + $thisfile_asf['file_properties_object'] = array(); + $thisfile_asf_filepropertiesobject = &$thisfile_asf['file_properties_object']; + + $thisfile_asf_filepropertiesobject['objectid'] = $NextObjectGUID; + $thisfile_asf_filepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_filepropertiesobject['objectsize'] = $NextObjectSize; + $thisfile_asf_filepropertiesobject['fileid'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_filepropertiesobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_filepropertiesobject['fileid']); + $thisfile_asf_filepropertiesobject['filesize'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['creation_date'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $thisfile_asf_filepropertiesobject['creation_date_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_filepropertiesobject['creation_date']); + $offset += 8; + $thisfile_asf_filepropertiesobject['data_packets'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['play_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['send_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['preroll'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $ThisFileInfo['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000); + $thisfile_asf_filepropertiesobject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_filepropertiesobject['flags']['broadcast'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0001); + $thisfile_asf_filepropertiesobject['flags']['seekable'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0002); + + $thisfile_asf_filepropertiesobject['min_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_filepropertiesobject['max_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_filepropertiesobject['max_bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + //$ThisFileInfo['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate']; + $ThisFileInfo['bitrate'] = ($thisfile_asf_filepropertiesobject['filesize'] * 8) / $ThisFileInfo['playtime_seconds']; + break; + + case GETID3_ASF_Stream_Properties_Object: + // Stream Properties Object: (mandatory, one per media stream) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for stream properties object - GETID3_ASF_Stream_Properties_Object + // Object Size QWORD 64 // size of stream properties object, including 78 bytes of Stream Properties Object header + // Stream Type GUID 128 // GETID3_ASF_Audio_Media, GETID3_ASF_Video_Media or GETID3_ASF_Command_Media + // Error Correction Type GUID 128 // GETID3_ASF_Audio_Spread for audio-only streams, GETID3_ASF_No_Error_Correction for other stream types + // Time Offset QWORD 64 // 100-nanosecond units. typically zero. added to all timestamps of samples in the stream + // Type-Specific Data Length DWORD 32 // number of bytes for Type-Specific Data field + // Error Correction Data Length DWORD 32 // number of bytes for Error Correction Data field + // Flags WORD 16 // + // * Stream Number bits 7 (0x007F) // number of this stream. 1 <= valid <= 127 + // * Reserved bits 8 (0x7F80) // reserved - set to zero + // * Encrypted Content Flag bits 1 (0x8000) // stream contents encrypted if set + // Reserved DWORD 32 // reserved - set to zero + // Type-Specific Data BYTESTREAM variable // type-specific format data, depending on value of Stream Type + // Error Correction Data BYTESTREAM variable // error-correction-specific format data, depending on value of Error Correct Type + + // There is one GETID3_ASF_Stream_Properties_Object for each stream (audio, video) but the + // stream number isn't known until halfway through decoding the structure, hence it + // it is decoded to a temporary variable and then stuck in the appropriate index later + + $StreamPropertiesObjectData['objectid'] = $NextObjectGUID; + $StreamPropertiesObjectData['objectid_guid'] = $NextObjectGUIDtext; + $StreamPropertiesObjectData['objectsize'] = $NextObjectSize; + $StreamPropertiesObjectData['stream_type'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $StreamPropertiesObjectData['stream_type_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['stream_type']); + $StreamPropertiesObjectData['error_correct_type'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $StreamPropertiesObjectData['error_correct_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['error_correct_type']); + $StreamPropertiesObjectData['time_offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $StreamPropertiesObjectData['type_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $StreamPropertiesObjectData['error_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $StreamPropertiesObjectData['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $StreamPropertiesObjectStreamNumber = $StreamPropertiesObjectData['flags_raw'] & 0x007F; + $StreamPropertiesObjectData['flags']['encrypted'] = (bool) ($StreamPropertiesObjectData['flags_raw'] & 0x8000); + + $offset += 4; // reserved - DWORD + $StreamPropertiesObjectData['type_specific_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['type_data_length']); + $offset += $StreamPropertiesObjectData['type_data_length']; + $StreamPropertiesObjectData['error_correct_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['error_data_length']); + $offset += $StreamPropertiesObjectData['error_data_length']; + + switch ($StreamPropertiesObjectData['stream_type']) { + + case GETID3_ASF_Audio_Media: + $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); + $thisfile_audio['bitrate_mode'] = (!empty($thisfile_audio['bitrate_mode']) ? $thisfile_audio['bitrate_mode'] : 'cbr'); + + $audiodata = getid3_riff::RIFFparseWAVEFORMATex(substr($StreamPropertiesObjectData['type_specific_data'], 0, 16)); + unset($audiodata['raw']); + $thisfile_audio = getid3_lib::array_merge_noclobber($audiodata, $thisfile_audio); + break; + + case GETID3_ASF_Video_Media: + $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); + $thisfile_video['bitrate_mode'] = (!empty($thisfile_video['bitrate_mode']) ? $thisfile_video['bitrate_mode'] : 'cbr'); + break; + + case GETID3_ASF_Command_Media: + default: + // do nothing + break; + + } + + $thisfile_asf['stream_properties_object'][$StreamPropertiesObjectStreamNumber] = $StreamPropertiesObjectData; + unset($StreamPropertiesObjectData); // clear for next stream, if any + break; + + case GETID3_ASF_Header_Extension_Object: + // Header Extension Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object + // Object Size QWORD 64 // size of Header Extension object, including 46 bytes of Header Extension Object header + // Reserved Field 1 GUID 128 // hardcoded: GETID3_ASF_Reserved_1 + // Reserved Field 2 WORD 16 // hardcoded: 0x00000006 + // Header Extension Data Size DWORD 32 // in bytes. valid: 0, or > 24. equals object size minus 46 + // Header Extension Data BYTESTREAM variable // array of zero or more extended header objects + + // shortcut + $thisfile_asf['header_extension_object'] = array(); + $thisfile_asf_headerextensionobject = &$thisfile_asf['header_extension_object']; + + $thisfile_asf_headerextensionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_headerextensionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_headerextensionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_headerextensionobject['reserved_1'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_headerextensionobject['reserved_1_guid'] = $this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']); + if ($thisfile_asf_headerextensionobject['reserved_1'] != GETID3_ASF_Reserved_1) { + $ThisFileInfo['warning'][] = 'header_extension_object.reserved_1 GUID ('.$this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']).') does not match expected "GETID3_ASF_Reserved_1" GUID ('.$this->BytestringToGUID(GETID3_ASF_Reserved_1).')'; + //return false; + break; + } + $thisfile_asf_headerextensionobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + if ($thisfile_asf_headerextensionobject['reserved_2'] != 6) { + $ThisFileInfo['warning'][] = 'header_extension_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_headerextensionobject['reserved_2']).') does not match expected value of "6"'; + //return false; + break; + } + $thisfile_asf_headerextensionobject['extension_data_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_headerextensionobject['extension_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_headerextensionobject['extension_data_size']); + $offset += $thisfile_asf_headerextensionobject['extension_data_size']; + break; + + case GETID3_ASF_Codec_List_Object: + // Codec List Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Codec List object - GETID3_ASF_Codec_List_Object + // Object Size QWORD 64 // size of Codec List object, including 44 bytes of Codec List Object header + // Reserved GUID 128 // hardcoded: 86D15241-311D-11D0-A3A4-00A0C90348F6 + // Codec Entries Count DWORD 32 // number of entries in Codec Entries array + // Codec Entries array of: variable // + // * Type WORD 16 // 0x0001 = Video Codec, 0x0002 = Audio Codec, 0xFFFF = Unknown Codec + // * Codec Name Length WORD 16 // number of Unicode characters stored in the Codec Name field + // * Codec Name WCHAR variable // array of Unicode characters - name of codec used to create the content + // * Codec Description Length WORD 16 // number of Unicode characters stored in the Codec Description field + // * Codec Description WCHAR variable // array of Unicode characters - description of format used to create the content + // * Codec Information Length WORD 16 // number of Unicode characters stored in the Codec Information field + // * Codec Information BYTESTREAM variable // opaque array of information bytes about the codec used to create the content + + // shortcut + $thisfile_asf['codec_list_object'] = array(); + $thisfile_asf_codeclistobject = &$thisfile_asf['codec_list_object']; + + $thisfile_asf_codeclistobject['objectid'] = $NextObjectGUID; + $thisfile_asf_codeclistobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_codeclistobject['objectsize'] = $NextObjectSize; + $thisfile_asf_codeclistobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_codeclistobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']); + if ($thisfile_asf_codeclistobject['reserved'] != $this->GUIDtoBytestring('86D15241-311D-11D0-A3A4-00A0C90348F6')) { + $ThisFileInfo['warning'][] = 'codec_list_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {86D15241-311D-11D0-A3A4-00A0C90348F6}'; + //return false; + break; + } + $thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + for ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) { + // shortcut + $thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter] = array(); + $thisfile_asf_codeclistobject_codecentries_current = &$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter]; + + $thisfile_asf_codeclistobject_codecentries_current['type_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['type'] = $this->ASFCodecListObjectTypeLookup($thisfile_asf_codeclistobject_codecentries_current['type_raw']); + + $CodecNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['name'] = substr($ASFHeaderData, $offset, $CodecNameLength); + $offset += $CodecNameLength; + + $CodecDescriptionLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['description'] = substr($ASFHeaderData, $offset, $CodecDescriptionLength); + $offset += $CodecDescriptionLength; + + $CodecInformationLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['information'] = substr($ASFHeaderData, $offset, $CodecInformationLength); + $offset += $CodecInformationLength; + + if ($thisfile_asf_codeclistobject_codecentries_current['type_raw'] == 2) { + // audio codec + if (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) { + $ThisFileInfo['error'][] = '[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-seperated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"'; + return false; + } + list($AudioCodecBitrate, $AudioCodecFrequency, $AudioCodecChannels) = explode(',', $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description'])); + $thisfile_audio['codec'] = $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['name']); + + if (!isset($thisfile_audio['bitrate']) && strstr($AudioCodecBitrate, 'kbps')) { + $thisfile_audio['bitrate'] = (int) (trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000); + } + //if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) { + if (!@$thisfile_video['bitrate'] && @$thisfile_audio['bitrate'] && @$ThisFileInfo['bitrate']) { + //$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate']; + $thisfile_video['bitrate'] = $ThisFileInfo['bitrate'] - $thisfile_audio['bitrate']; + } + + $AudioCodecFrequency = (int) trim(str_replace('kHz', '', $AudioCodecFrequency)); + switch ($AudioCodecFrequency) { + case 8: + case 8000: + $thisfile_audio['sample_rate'] = 8000; + break; + + case 11: + case 11025: + $thisfile_audio['sample_rate'] = 11025; + break; + + case 12: + case 12000: + $thisfile_audio['sample_rate'] = 12000; + break; + + case 16: + case 16000: + $thisfile_audio['sample_rate'] = 16000; + break; + + case 22: + case 22050: + $thisfile_audio['sample_rate'] = 22050; + break; + + case 24: + case 24000: + $thisfile_audio['sample_rate'] = 24000; + break; + + case 32: + case 32000: + $thisfile_audio['sample_rate'] = 32000; + break; + + case 44: + case 441000: + $thisfile_audio['sample_rate'] = 44100; + break; + + case 48: + case 48000: + $thisfile_audio['sample_rate'] = 48000; + break; + + default: + $ThisFileInfo['warning'][] = 'unknown frequency: "'.$AudioCodecFrequency.'" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')'; + // return false; + break; + } + + if (!isset($thisfile_audio['channels'])) { + if (strstr($AudioCodecChannels, 'stereo')) { + $thisfile_audio['channels'] = 2; + } elseif (strstr($AudioCodecChannels, 'mono')) { + $thisfile_audio['channels'] = 1; + } + } + } + } + break; + + case GETID3_ASF_Script_Command_Object: + // Script Command Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Script Command object - GETID3_ASF_Script_Command_Object + // Object Size QWORD 64 // size of Script Command object, including 44 bytes of Script Command Object header + // Reserved GUID 128 // hardcoded: 4B1ACBE3-100B-11D0-A39B-00A0C90348F6 + // Commands Count WORD 16 // number of Commands structures in the Script Commands Objects + // Command Types Count WORD 16 // number of Command Types structures in the Script Commands Objects + // Command Types array of: variable // + // * Command Type Name Length WORD 16 // number of Unicode characters for Command Type Name + // * Command Type Name WCHAR variable // array of Unicode characters - name of a type of command + // Commands array of: variable // + // * Presentation Time DWORD 32 // presentation time of that command, in milliseconds + // * Type Index WORD 16 // type of this command, as a zero-based index into the array of Command Types of this object + // * Command Name Length WORD 16 // number of Unicode characters for Command Name + // * Command Name WCHAR variable // array of Unicode characters - name of this command + + // shortcut + $thisfile_asf['script_command_object'] = array(); + $thisfile_asf_scriptcommandobject = &$thisfile_asf['script_command_object']; + + $thisfile_asf_scriptcommandobject['objectid'] = $NextObjectGUID; + $thisfile_asf_scriptcommandobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_scriptcommandobject['objectsize'] = $NextObjectSize; + $thisfile_asf_scriptcommandobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_scriptcommandobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']); + if ($thisfile_asf_scriptcommandobject['reserved'] != $this->GUIDtoBytestring('4B1ACBE3-100B-11D0-A39B-00A0C90348F6')) { + $ThisFileInfo['warning'][] = 'script_command_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4B1ACBE3-100B-11D0-A39B-00A0C90348F6}'; + //return false; + break; + } + $thisfile_asf_scriptcommandobject['commands_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_scriptcommandobject['command_types_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($CommandTypesCounter = 0; $CommandTypesCounter < $thisfile_asf_scriptcommandobject['command_types_count']; $CommandTypesCounter++) { + $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_scriptcommandobject['command_types'][$CommandTypesCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); + $offset += $CommandTypeNameLength; + } + for ($CommandsCounter = 0; $CommandsCounter < $thisfile_asf_scriptcommandobject['commands_count']; $CommandsCounter++) { + $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['type_index'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + + $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); + $offset += $CommandTypeNameLength; + } + break; + + case GETID3_ASF_Marker_Object: + // Marker Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Marker object - GETID3_ASF_Marker_Object + // Object Size QWORD 64 // size of Marker object, including 48 bytes of Marker Object header + // Reserved GUID 128 // hardcoded: 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB + // Markers Count DWORD 32 // number of Marker structures in Marker Object + // Reserved WORD 16 // hardcoded: 0x0000 + // Name Length WORD 16 // number of bytes in the Name field + // Name WCHAR variable // name of the Marker Object + // Markers array of: variable // + // * Offset QWORD 64 // byte offset into Data Object + // * Presentation Time QWORD 64 // in 100-nanosecond units + // * Entry Length WORD 16 // length in bytes of (Send Time + Flags + Marker Description Length + Marker Description + Padding) + // * Send Time DWORD 32 // in milliseconds + // * Flags DWORD 32 // hardcoded: 0x00000000 + // * Marker Description Length DWORD 32 // number of bytes in Marker Description field + // * Marker Description WCHAR variable // array of Unicode characters - description of marker entry + // * Padding BYTESTREAM variable // optional padding bytes + + // shortcut + $thisfile_asf['marker_object'] = array(); + $thisfile_asf_markerobject = &$thisfile_asf['marker_object']; + + $thisfile_asf_markerobject['objectid'] = $NextObjectGUID; + $thisfile_asf_markerobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_markerobject['objectsize'] = $NextObjectSize; + $thisfile_asf_markerobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_markerobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']); + if ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) { + $ThisFileInfo['warning'][] = 'marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved_1']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}'; + break; + } + $thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + if ($thisfile_asf_markerobject['reserved_2'] != 0) { + $ThisFileInfo['warning'][] = 'marker_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_markerobject['reserved_2']).') does not match expected value of "0"'; + break; + } + $thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_markerobject['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['name_length']); + $offset += $thisfile_asf_markerobject['name_length']; + for ($MarkersCounter = 0; $MarkersCounter < $thisfile_asf_markerobject['markers_count']; $MarkersCounter++) { + $thisfile_asf_markerobject['markers'][$MarkersCounter]['offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['send_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['flags'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']); + $offset += $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; + $PaddingLength = $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] - 4 - 4 - 4 - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; + if ($PaddingLength > 0) { + $thisfile_asf_markerobject['markers'][$MarkersCounter]['padding'] = substr($ASFHeaderData, $offset, $PaddingLength); + $offset += $PaddingLength; + } + } + break; + + case GETID3_ASF_Bitrate_Mutual_Exclusion_Object: + // Bitrate Mutual Exclusion Object: (optional) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object + // Object Size QWORD 64 // size of Bitrate Mutual Exclusion object, including 42 bytes of Bitrate Mutual Exclusion Object header + // Exlusion Type GUID 128 // nature of mutual exclusion relationship. one of: (GETID3_ASF_Mutex_Bitrate, GETID3_ASF_Mutex_Unknown) + // Stream Numbers Count WORD 16 // number of video streams + // Stream Numbers WORD variable // array of mutually exclusive video stream numbers. 1 <= valid <= 127 + + // shortcut + $thisfile_asf['bitrate_mutual_exclusion_object'] = array(); + $thisfile_asf_bitratemutualexclusionobject = &$thisfile_asf['bitrate_mutual_exclusion_object']; + + $thisfile_asf_bitratemutualexclusionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_bitratemutualexclusionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_bitratemutualexclusionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_bitratemutualexclusionobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $thisfile_asf_bitratemutualexclusionobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']); + $offset += 16; + if (($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Bitrate) && ($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Unknown)) { + $ThisFileInfo['warning'][] = 'bitrate_mutual_exclusion_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']).'} does not match expected "GETID3_ASF_Mutex_Bitrate" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Bitrate).'} or "GETID3_ASF_Mutex_Unknown" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Unknown).'}'; + //return false; + break; + } + $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($StreamNumberCounter = 0; $StreamNumberCounter < $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count']; $StreamNumberCounter++) { + $thisfile_asf_bitratemutualexclusionobject['stream_numbers'][$StreamNumberCounter] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + } + break; + + case GETID3_ASF_Error_Correction_Object: + // Error Correction Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Error Correction object - GETID3_ASF_Error_Correction_Object + // Object Size QWORD 64 // size of Error Correction object, including 44 bytes of Error Correction Object header + // Error Correction Type GUID 128 // type of error correction. one of: (GETID3_ASF_No_Error_Correction, GETID3_ASF_Audio_Spread) + // Error Correction Data Length DWORD 32 // number of bytes in Error Correction Data field + // Error Correction Data BYTESTREAM variable // structure depends on value of Error Correction Type field + + // shortcut + $thisfile_asf['error_correction_object'] = array(); + $thisfile_asf_errorcorrectionobject = &$thisfile_asf['error_correction_object']; + + $thisfile_asf_errorcorrectionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_errorcorrectionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_errorcorrectionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_errorcorrectionobject['error_correction_type'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_errorcorrectionobject['error_correction_guid'] = $this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']); + $thisfile_asf_errorcorrectionobject['error_correction_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + switch ($thisfile_asf_errorcorrectionobject['error_correction_type']) { + case GETID3_ASF_No_Error_Correction: + // should be no data, but just in case there is, skip to the end of the field + $offset += $thisfile_asf_errorcorrectionobject['error_correction_data_length']; + break; + + case GETID3_ASF_Audio_Spread: + // Field Name Field Type Size (bits) + // Span BYTE 8 // number of packets over which audio will be spread. + // Virtual Packet Length WORD 16 // size of largest audio payload found in audio stream + // Virtual Chunk Length WORD 16 // size of largest audio payload found in audio stream + // Silence Data Length WORD 16 // number of bytes in Silence Data field + // Silence Data BYTESTREAM variable // hardcoded: 0x00 * (Silence Data Length) bytes + + $thisfile_asf_errorcorrectionobject['span'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 1)); + $offset += 1; + $thisfile_asf_errorcorrectionobject['virtual_packet_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_errorcorrectionobject['virtual_chunk_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_errorcorrectionobject['silence_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_errorcorrectionobject['silence_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_errorcorrectionobject['silence_data_length']); + $offset += $thisfile_asf_errorcorrectionobject['silence_data_length']; + break; + + default: + $ThisFileInfo['warning'][] = 'error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['reserved']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}'; + //return false; + break; + } + + break; + + case GETID3_ASF_Content_Description_Object: + // Content Description Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Content Description object - GETID3_ASF_Content_Description_Object + // Object Size QWORD 64 // size of Content Description object, including 34 bytes of Content Description Object header + // Title Length WORD 16 // number of bytes in Title field + // Author Length WORD 16 // number of bytes in Author field + // Copyright Length WORD 16 // number of bytes in Copyright field + // Description Length WORD 16 // number of bytes in Description field + // Rating Length WORD 16 // number of bytes in Rating field + // Title WCHAR 16 // array of Unicode characters - Title + // Author WCHAR 16 // array of Unicode characters - Author + // Copyright WCHAR 16 // array of Unicode characters - Copyright + // Description WCHAR 16 // array of Unicode characters - Description + // Rating WCHAR 16 // array of Unicode characters - Rating + + // shortcut + $thisfile_asf['content_description_object'] = array(); + $thisfile_asf_contentdescriptionobject = &$thisfile_asf['content_description_object']; + + $thisfile_asf_contentdescriptionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_contentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_contentdescriptionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_contentdescriptionobject['title_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['author_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['copyright_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['rating_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['title'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['title_length']); + $offset += $thisfile_asf_contentdescriptionobject['title_length']; + $thisfile_asf_contentdescriptionobject['author'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['author_length']); + $offset += $thisfile_asf_contentdescriptionobject['author_length']; + $thisfile_asf_contentdescriptionobject['copyright'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['copyright_length']); + $offset += $thisfile_asf_contentdescriptionobject['copyright_length']; + $thisfile_asf_contentdescriptionobject['description'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['description_length']); + $offset += $thisfile_asf_contentdescriptionobject['description_length']; + $thisfile_asf_contentdescriptionobject['rating'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['rating_length']); + $offset += $thisfile_asf_contentdescriptionobject['rating_length']; + + $ASFcommentKeysToCopy = array('title'=>'title', 'author'=>'artist', 'copyright'=>'copyright', 'description'=>'comment', 'rating'=>'rating'); + foreach ($ASFcommentKeysToCopy as $keytocopyfrom => $keytocopyto) { + if (!empty($thisfile_asf_contentdescriptionobject[$keytocopyfrom])) { + $thisfile_asf_comments[$keytocopyto][] = $this->TrimTerm($thisfile_asf_contentdescriptionobject[$keytocopyfrom]); + } + } + break; + + case GETID3_ASF_Extended_Content_Description_Object: + // Extended Content Description Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object + // Object Size QWORD 64 // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header + // Content Descriptors Count WORD 16 // number of entries in Content Descriptors list + // Content Descriptors array of: variable // + // * Descriptor Name Length WORD 16 // size in bytes of Descriptor Name field + // * Descriptor Name WCHAR variable // array of Unicode characters - Descriptor Name + // * Descriptor Value Data Type WORD 16 // Lookup array: + // 0x0000 = Unicode String (variable length) + // 0x0001 = BYTE array (variable length) + // 0x0002 = BOOL (DWORD, 32 bits) + // 0x0003 = DWORD (DWORD, 32 bits) + // 0x0004 = QWORD (QWORD, 64 bits) + // 0x0005 = WORD (WORD, 16 bits) + // * Descriptor Value Length WORD 16 // number of bytes stored in Descriptor Value field + // * Descriptor Value variable variable // value for Content Descriptor + + // shortcut + $thisfile_asf['extended_content_description_object'] = array(); + $thisfile_asf_extendedcontentdescriptionobject = &$thisfile_asf['extended_content_description_object']; + + $thisfile_asf_extendedcontentdescriptionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_extendedcontentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_extendedcontentdescriptionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($ExtendedContentDescriptorsCounter = 0; $ExtendedContentDescriptorsCounter < $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count']; $ExtendedContentDescriptorsCounter++) { + // shortcut + $thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter] = array(); + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current = &$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter]; + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['base_offset'] = $offset + 30; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']); + $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']); + $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']; + switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { + case 0x0000: // Unicode string + break; + + case 0x0001: // BYTE array + // do nothing + break; + + case 0x0002: // BOOL + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = (bool) getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + break; + + case 0x0003: // DWORD + case 0x0004: // QWORD + case 0x0005: // WORD + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + break; + + default: + $ThisFileInfo['warning'][] = 'extended_content_description.content_descriptors.'.$ExtendedContentDescriptorsCounter.'.value_type is invalid ('.$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'].')'; + //return false; + break; + } + switch ($this->TrimConvert(strtolower($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']))) { + + case 'wm/albumartist': + case 'artist': + $thisfile_asf_comments['artist'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/albumtitle': + case 'album': + $thisfile_asf_comments['album'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/genre': + case 'genre': + $thisfile_asf_comments['genre'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/tracknumber': + case 'tracknumber': + $thisfile_asf_comments['track'] = array(intval($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']))); + break; + + case 'wm/track': + if (empty($thisfile_asf_comments['track'])) { + $thisfile_asf_comments['track'] = array(1 + $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + } + break; + + case 'wm/year': + case 'year': + case 'date': + $thisfile_asf_comments['year'] = array( $this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/lyrics': + case 'lyrics': + $thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'isvbr': + if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) { + $thisfile_audio['bitrate_mode'] = 'vbr'; + $thisfile_video['bitrate_mode'] = 'vbr'; + } + break; + + case 'id3': + // id3v2 module might not be loaded + if (class_exists('getid3_id3v2')) { + $tempfile = tempnam('*', 'getID3'); + $tempfilehandle = fopen($tempfile, "wb"); + $tempThisfileInfo = array('encoding'=>$ThisFileInfo['encoding']); + fwrite($tempfilehandle, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + fclose($tempfilehandle); + + $tempfilehandle = fopen($tempfile, "rb"); + $id3 = new getid3_id3v2($tempfilehandle, $tempThisfileInfo); + fclose($tempfilehandle); + unlink($tempfile); + + $ThisFileInfo['id3v2'] = $tempThisfileInfo['id3v2']; + } + break; + + case 'wm/encodingtime': + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + $thisfile_asf_comments['encoding_time_unix'] = array($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix']); + break; + + case 'wm/picture': + //typedef struct _WMPicture{ + // LPWSTR pwszMIMEType; + // BYTE bPictureType; + // LPWSTR pwszDescription; + // DWORD dwDataLen; + // BYTE* pbData; + //} WM_PICTURE; + + $wm_picture_offset = 0; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 1)); + $wm_picture_offset += 1; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type'] = $this->WMpictureTypeLookup($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id']); + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 4)); + $wm_picture_offset += 4; + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; + do { + $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); + $wm_picture_offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] .= $next_byte_pair; + } while ($next_byte_pair !== "\x00\x00"); + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] = ''; + do { + $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); + $wm_picture_offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] .= $next_byte_pair; + } while ($next_byte_pair !== "\x00\x00"); + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['dataoffset'] = $wm_picture_offset; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'] = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset); + unset($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + + break; + + default: + switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { + case 0: // Unicode string + if (substr($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']), 0, 3) == 'WM/') { + $thisfile_asf_comments[str_replace('wm/', '', strtolower($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'])))] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + } + break; + + case 1: + break; + } + break; + } + + } + break; + + case GETID3_ASF_Stream_Bitrate_Properties_Object: + // Stream Bitrate Properties Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Stream Bitrate Properties object - GETID3_ASF_Stream_Bitrate_Properties_Object + // Object Size QWORD 64 // size of Extended Content Description object, including 26 bytes of Stream Bitrate Properties Object header + // Bitrate Records Count WORD 16 // number of records in Bitrate Records + // Bitrate Records array of: variable // + // * Flags WORD 16 // + // * * Stream Number bits 7 (0x007F) // number of this stream + // * * Reserved bits 9 (0xFF80) // hardcoded: 0 + // * Average Bitrate DWORD 32 // in bits per second + + // shortcut + $thisfile_asf['stream_bitrate_properties_object'] = array(); + $thisfile_asf_streambitratepropertiesobject = &$thisfile_asf['stream_bitrate_properties_object']; + + $thisfile_asf_streambitratepropertiesobject['objectid'] = $NextObjectGUID; + $thisfile_asf_streambitratepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_streambitratepropertiesobject['objectsize'] = $NextObjectSize; + $thisfile_asf_streambitratepropertiesobject['bitrate_records_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { + $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F; + $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + } + break; + + case GETID3_ASF_Padding_Object: + // Padding Object: (optional) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Padding object - GETID3_ASF_Padding_Object + // Object Size QWORD 64 // size of Padding object, including 24 bytes of ASF Padding Object header + // Padding Data BYTESTREAM variable // ignore + + // shortcut + $thisfile_asf['padding_object'] = array(); + $thisfile_asf_paddingobject = &$thisfile_asf['padding_object']; + + $thisfile_asf_paddingobject['objectid'] = $NextObjectGUID; + $thisfile_asf_paddingobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_paddingobject['objectsize'] = $NextObjectSize; + $thisfile_asf_paddingobject['padding_length'] = $thisfile_asf_paddingobject['objectsize'] - 16 - 8; + $thisfile_asf_paddingobject['padding'] = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']); + break; + + case GETID3_ASF_Extended_Content_Encryption_Object: + case GETID3_ASF_Content_Encryption_Object: + // WMA DRM - just ignore + $offset += ($NextObjectSize - 16 - 8); + break; + + default: + // Implementations shall ignore any standard or non-standard object that they do not know how to handle. + if ($this->GUIDname($NextObjectGUIDtext)) { + $ThisFileInfo['warning'][] = 'unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8); + } else { + $ThisFileInfo['warning'][] = 'unknown GUID {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8); + } + $offset += ($NextObjectSize - 16 - 8); + break; + } + } + if (isset($thisfile_asf_streambitrateproperties['bitrate_records_count'])) { + $ASFbitrateAudio = 0; + $ASFbitrateVideo = 0; + for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitrateproperties['bitrate_records_count']; $BitrateRecordsCounter++) { + if (isset($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter])) { + switch ($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter]['type_raw']) { + case 1: + $ASFbitrateVideo += $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['bitrate']; + break; + + case 2: + $ASFbitrateAudio += $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['bitrate']; + break; + + default: + // do nothing + break; + } + } + } + if ($ASFbitrateAudio > 0) { + $thisfile_audio['bitrate'] = $ASFbitrateAudio; + } + if ($ASFbitrateVideo > 0) { + $thisfile_video['bitrate'] = $ASFbitrateVideo; + } + } + if (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) { + + $thisfile_audio['bitrate'] = 0; + $thisfile_video['bitrate'] = 0; + + foreach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) { + + switch ($streamdata['stream_type']) { + case GETID3_ASF_Audio_Media: + // Field Name Field Type Size (bits) + // Codec ID / Format Tag WORD 16 // unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure + // Number of Channels WORD 16 // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure + // Samples Per Second DWORD 32 // in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure + // Average number of Bytes/sec DWORD 32 // bytes/sec of audio stream - defined as nAvgBytesPerSec field of WAVEFORMATEX structure + // Block Alignment WORD 16 // block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure + // Bits per sample WORD 16 // bits per sample of mono data. set to zero for variable bitrate codecs. defined as wBitsPerSample field of WAVEFORMATEX structure + // Codec Specific Data Size WORD 16 // size in bytes of Codec Specific Data buffer - defined as cbSize field of WAVEFORMATEX structure + // Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes + + // shortcut + $thisfile_asf['audio_media'][$streamnumber] = array(); + $thisfile_asf_audiomedia_currentstream = &$thisfile_asf['audio_media'][$streamnumber]; + + $audiomediaoffset = 0; + + $thisfile_asf_audiomedia_currentstream = getid3_riff::RIFFparseWAVEFORMATex(substr($streamdata['type_specific_data'], $audiomediaoffset, 16)); + $audiomediaoffset += 16; + + $thisfile_audio['lossless'] = false; + switch ($thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']) { + case 0x0001: // PCM + case 0x0163: // WMA9 Lossless + $thisfile_audio['lossless'] = true; + break; + } + + if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { + foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { + if (@$dataarray['flags']['stream_number'] == $streamnumber) { + $thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate']; + $thisfile_audio['bitrate'] += $dataarray['bitrate']; + break; + } + } + } else { + if (@$thisfile_asf_audiomedia_currentstream['bytes_sec']) { + $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8; + } elseif (@$thisfile_asf_audiomedia_currentstream['bitrate']) { + $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate']; + } + } + $thisfile_audio['streams'][$streamnumber] = $thisfile_asf_audiomedia_currentstream; + $thisfile_audio['streams'][$streamnumber]['wformattag'] = $thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']; + $thisfile_audio['streams'][$streamnumber]['lossless'] = $thisfile_audio['lossless']; + $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; + unset($thisfile_audio['streams'][$streamnumber]['raw']); + + $thisfile_asf_audiomedia_currentstream['codec_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $audiomediaoffset, 2)); + $audiomediaoffset += 2; + $thisfile_asf_audiomedia_currentstream['codec_data'] = substr($streamdata['type_specific_data'], $audiomediaoffset, $thisfile_asf_audiomedia_currentstream['codec_data_size']); + $audiomediaoffset += $thisfile_asf_audiomedia_currentstream['codec_data_size']; + + break; + + case GETID3_ASF_Video_Media: + // Field Name Field Type Size (bits) + // Encoded Image Width DWORD 32 // width of image in pixels + // Encoded Image Height DWORD 32 // height of image in pixels + // Reserved Flags BYTE 8 // hardcoded: 0x02 + // Format Data Size WORD 16 // size of Format Data field in bytes + // Format Data array of: variable // + // * Format Data Size DWORD 32 // number of bytes in Format Data field, in bytes - defined as biSize field of BITMAPINFOHEADER structure + // * Image Width LONG 32 // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure + // * Image Height LONG 32 // height of encoded image in pixels - defined as biHeight field of BITMAPINFOHEADER structure + // * Reserved WORD 16 // hardcoded: 0x0001 - defined as biPlanes field of BITMAPINFOHEADER structure + // * Bits Per Pixel Count WORD 16 // bits per pixel - defined as biBitCount field of BITMAPINFOHEADER structure + // * Compression ID FOURCC 32 // fourcc of video codec - defined as biCompression field of BITMAPINFOHEADER structure + // * Image Size DWORD 32 // image size in bytes - defined as biSizeImage field of BITMAPINFOHEADER structure + // * Horizontal Pixels / Meter DWORD 32 // horizontal resolution of target device in pixels per meter - defined as biXPelsPerMeter field of BITMAPINFOHEADER structure + // * Vertical Pixels / Meter DWORD 32 // vertical resolution of target device in pixels per meter - defined as biYPelsPerMeter field of BITMAPINFOHEADER structure + // * Colors Used Count DWORD 32 // number of color indexes in the color table that are actually used - defined as biClrUsed field of BITMAPINFOHEADER structure + // * Important Colors Count DWORD 32 // number of color index required for displaying bitmap. if zero, all colors are required. defined as biClrImportant field of BITMAPINFOHEADER structure + // * Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes + + // shortcut + $thisfile_asf['video_media'][$streamnumber] = array(); + $thisfile_asf_videomedia_currentstream = &$thisfile_asf['video_media'][$streamnumber]; + + $videomediaoffset = 0; + $thisfile_asf_videomedia_currentstream['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['flags'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 1)); + $videomediaoffset += 1; + $thisfile_asf_videomedia_currentstream['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); + $videomediaoffset += 2; + $thisfile_asf_videomedia_currentstream['format_data']['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['reserved'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); + $videomediaoffset += 2; + $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); + $videomediaoffset += 2; + $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'] = substr($streamdata['type_specific_data'], $videomediaoffset, 4); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['image_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['horizontal_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['vertical_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['colors_used'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['colors_important'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['codec_data'] = substr($streamdata['type_specific_data'], $videomediaoffset); + + if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { + foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { + if (@$dataarray['flags']['stream_number'] == $streamnumber) { + $thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate']; + $thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate']; + $thisfile_video['bitrate'] += $dataarray['bitrate']; + break; + } + } + } + + $thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::RIFFfourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']); + + $thisfile_video['streams'][$streamnumber]['fourcc'] = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']; + $thisfile_video['streams'][$streamnumber]['codec'] = $thisfile_asf_videomedia_currentstream['format_data']['codec']; + $thisfile_video['streams'][$streamnumber]['resolution_x'] = $thisfile_asf_videomedia_currentstream['image_width']; + $thisfile_video['streams'][$streamnumber]['resolution_y'] = $thisfile_asf_videomedia_currentstream['image_height']; + $thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel']; + break; + + default: + break; + } + } + } + + while (ftell($fd) < $ThisFileInfo['avdataend']) { + $NextObjectDataHeader = fread($fd, 24); + $offset = 0; + $NextObjectGUID = substr($NextObjectDataHeader, 0, 16); + $offset += 16; + $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); + $NextObjectSize = getid3_lib::LittleEndian2Int(substr($NextObjectDataHeader, $offset, 8)); + $offset += 8; + + switch ($NextObjectGUID) { + case GETID3_ASF_Data_Object: + // Data Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Data object - GETID3_ASF_Data_Object + // Object Size QWORD 64 // size of Data object, including 50 bytes of Data Object header. may be 0 if FilePropertiesObject.BroadcastFlag == 1 + // File ID GUID 128 // unique identifier. identical to File ID field in Header Object + // Total Data Packets QWORD 64 // number of Data Packet entries in Data Object. invalid if FilePropertiesObject.BroadcastFlag == 1 + // Reserved WORD 16 // hardcoded: 0x0101 + + // shortcut + $thisfile_asf['data_object'] = array(); + $thisfile_asf_dataobject = &$thisfile_asf['data_object']; + + $DataObjectData = $NextObjectDataHeader.fread($fd, 50 - 24); + $offset = 24; + + $thisfile_asf_dataobject['objectid'] = $NextObjectGUID; + $thisfile_asf_dataobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_dataobject['objectsize'] = $NextObjectSize; + + $thisfile_asf_dataobject['fileid'] = substr($DataObjectData, $offset, 16); + $offset += 16; + $thisfile_asf_dataobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_dataobject['fileid']); + $thisfile_asf_dataobject['total_data_packets'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 8)); + $offset += 8; + $thisfile_asf_dataobject['reserved'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2)); + $offset += 2; + if ($thisfile_asf_dataobject['reserved'] != 0x0101) { + $ThisFileInfo['warning'][] = 'data_object.reserved ('.getid3_lib::PrintHexBytes($thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"'; + //return false; + break; + } + + // Data Packets array of: variable // + // * Error Correction Flags BYTE 8 // + // * * Error Correction Data Length bits 4 // if Error Correction Length Type == 00, size of Error Correction Data in bytes, else hardcoded: 0000 + // * * Opaque Data Present bits 1 // + // * * Error Correction Length Type bits 2 // number of bits for size of the error correction data. hardcoded: 00 + // * * Error Correction Present bits 1 // If set, use Opaque Data Packet structure, else use Payload structure + // * Error Correction Data + + $ThisFileInfo['avdataoffset'] = ftell($fd); + fseek($fd, ($thisfile_asf_dataobject['objectsize'] - 50), SEEK_CUR); // skip actual audio/video data + $ThisFileInfo['avdataend'] = ftell($fd); + break; + + case GETID3_ASF_Simple_Index_Object: + // Simple Index Object: (optional, recommended, one per video stream) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Simple Index object - GETID3_ASF_Data_Object + // Object Size QWORD 64 // size of Simple Index object, including 56 bytes of Simple Index Object header + // File ID GUID 128 // unique identifier. may be zero or identical to File ID field in Data Object and Header Object + // Index Entry Time Interval QWORD 64 // interval between index entries in 100-nanosecond units + // Maximum Packet Count DWORD 32 // maximum packet count for all index entries + // Index Entries Count DWORD 32 // number of Index Entries structures + // Index Entries array of: variable // + // * Packet Number DWORD 32 // number of the Data Packet associated with this index entry + // * Packet Count WORD 16 // number of Data Packets to sent at this index entry + + // shortcut + $thisfile_asf['simple_index_object'] = array(); + $thisfile_asf_simpleindexobject = &$thisfile_asf['simple_index_object']; + + $SimpleIndexObjectData = $NextObjectDataHeader.fread($fd, 56 - 24); + $offset = 24; + + $thisfile_asf_simpleindexobject['objectid'] = $NextObjectGUID; + $thisfile_asf_simpleindexobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_simpleindexobject['objectsize'] = $NextObjectSize; + + $thisfile_asf_simpleindexobject['fileid'] = substr($SimpleIndexObjectData, $offset, 16); + $offset += 16; + $thisfile_asf_simpleindexobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_simpleindexobject['fileid']); + $thisfile_asf_simpleindexobject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 8)); + $offset += 8; + $thisfile_asf_simpleindexobject['maximum_packet_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); + $offset += 4; + $thisfile_asf_simpleindexobject['index_entries_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); + $offset += 4; + + $IndexEntriesData = $SimpleIndexObjectData.fread($fd, 6 * $thisfile_asf_simpleindexobject['index_entries_count']); + for ($IndexEntriesCounter = 0; $IndexEntriesCounter < $thisfile_asf_simpleindexobject['index_entries_count']; $IndexEntriesCounter++) { + $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_number'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); + $offset += 4; + $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_count'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); + $offset += 2; + } + + break; + + case GETID3_ASF_Index_Object: + // 6.2 ASF top-level Index Object (optional but recommended when appropriate, 0 or 1) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for the Index Object - GETID3_ASF_Index_Object + // Object Size QWORD 64 // Specifies the size, in bytes, of the Index Object, including at least 34 bytes of Index Object header + // Index Entry Time Interval DWORD 32 // Specifies the time interval between each index entry in ms. + // Index Specifiers Count WORD 16 // Specifies the number of Index Specifiers structures in this Index Object. + // Index Blocks Count DWORD 32 // Specifies the number of Index Blocks structures in this Index Object. + + // Index Entry Time Interval DWORD 32 // Specifies the time interval between index entries in milliseconds. This value cannot be 0. + // Index Specifiers Count WORD 16 // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater. + // Index Specifiers array of: varies // + // * Stream Number WORD 16 // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127. + // * Index Type WORD 16 // Specifies Index Type values as follows: + // 1 = Nearest Past Data Packet - indexes point to the data packet whose presentation time is closest to the index entry time. + // 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire object or first fragment of an object. + // 3 = Nearest Past Cleanpoint. - indexes point to the closest data packet containing an entire object (or first fragment of an object) that has the Cleanpoint Flag set. + // Nearest Past Cleanpoint is the most common type of index. + // Index Entry Count DWORD 32 // Specifies the number of Index Entries in the block. + // * Block Positions QWORD varies // Specifies a list of byte offsets of the beginnings of the blocks relative to the beginning of the first Data Packet (i.e., the beginning of the Data Object + 50 bytes). The number of entries in this list is specified by the value of the Index Specifiers Count field. The order of those byte offsets is tied to the order in which Index Specifiers are listed. + // * Index Entries array of: varies // + // * * Offsets DWORD varies // An offset value of 0xffffffff indicates an invalid offset value + + // shortcut + $thisfile_asf['asf_index_object'] = array(); + $thisfile_asf_asfindexobject = &$thisfile_asf['asf_index_object']; + + $ASFIndexObjectData = $NextObjectDataHeader.fread($fd, 34 - 24); + $offset = 24; + + $thisfile_asf_asfindexobject['objectid'] = $NextObjectGUID; + $thisfile_asf_asfindexobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_asfindexobject['objectsize'] = $NextObjectSize; + + $thisfile_asf_asfindexobject['entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + $thisfile_asf_asfindexobject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); + $offset += 2; + $thisfile_asf_asfindexobject['index_blocks_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + + $ASFIndexObjectData .= fread($fd, 4 * $thisfile_asf_asfindexobject['index_specifiers_count']); + for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { + $IndexSpecifierStreamNumber = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); + $offset += 2; + $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['stream_number'] = $IndexSpecifierStreamNumber; + $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); + $offset += 2; + $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type_text'] = $this->ASFIndexObjectIndexTypeLookup($thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']); + } + + $ASFIndexObjectData .= fread($fd, 4); + $thisfile_asf_asfindexobject['index_entry_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + + $ASFIndexObjectData .= fread($fd, 8 * $thisfile_asf_asfindexobject['index_specifiers_count']); + for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { + $thisfile_asf_asfindexobject['block_positions'][$IndexSpecifiersCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 8)); + $offset += 8; + } + + $ASFIndexObjectData .= fread($fd, 4 * $thisfile_asf_asfindexobject['index_specifiers_count'] * $thisfile_asf_asfindexobject['index_entry_count']); + for ($IndexEntryCounter = 0; $IndexEntryCounter < $thisfile_asf_asfindexobject['index_entry_count']; $IndexEntryCounter++) { + for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { + $thisfile_asf_asfindexobject['offsets'][$IndexSpecifiersCounter][$IndexEntryCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + } + } + break; + + + default: + // Implementations shall ignore any standard or non-standard object that they do not know how to handle. + if ($this->GUIDname($NextObjectGUIDtext)) { + $ThisFileInfo['warning'][] = 'unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF body at offset '.($offset - 16 - 8); + } else { + $ThisFileInfo['warning'][] = 'unknown GUID {'.$NextObjectGUIDtext.'} in ASF body at offset '.(ftell($fd) - 16 - 8); + } + fseek($fd, ($NextObjectSize - 16 - 8), SEEK_CUR); + break; + } + } + + if (isset($thisfile_asf_codeclistobject['codec_entries']) && is_array($thisfile_asf_codeclistobject['codec_entries'])) { + foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { + switch ($streamdata['information']) { + case 'WMV1': + case 'WMV2': + case 'WMV3': + $thisfile_video['dataformat'] = 'wmv'; + $ThisFileInfo['mime_type'] = 'video/x-ms-wmv'; + break; + + case 'MP42': + case 'MP43': + case 'MP4S': + case 'mp4s': + $thisfile_video['dataformat'] = 'asf'; + $ThisFileInfo['mime_type'] = 'video/x-ms-asf'; + break; + + default: + switch ($streamdata['type_raw']) { + case 1: + if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { + $thisfile_video['dataformat'] = 'wmv'; + if ($ThisFileInfo['mime_type'] == 'video/x-ms-asf') { + $ThisFileInfo['mime_type'] = 'video/x-ms-wmv'; + } + } + break; + + case 2: + if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { + $thisfile_audio['dataformat'] = 'wma'; + if ($ThisFileInfo['mime_type'] == 'video/x-ms-asf') { + $ThisFileInfo['mime_type'] = 'audio/x-ms-wma'; + } + } + break; + + } + break; + } + } + } + + switch (@$thisfile_audio['codec']) { + case 'MPEG Layer-3': + $thisfile_audio['dataformat'] = 'mp3'; + break; + + default: + break; + } + + if (isset($thisfile_asf_codeclistobject['codec_entries'])) { + foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { + switch ($streamdata['type_raw']) { + + case 1: // video + $thisfile_video['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); + break; + + case 2: // audio + $thisfile_audio['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); + + // AH 2003-10-01 + $thisfile_audio['encoder_options'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][0]['description']); + + $thisfile_audio['codec'] = $thisfile_audio['encoder']; + break; + + default: + $ThisFileInfo['warning'][] = 'Unknown streamtype: [codec_list_object][codec_entries]['.$streamnumber.'][type_raw] == '.$streamdata['type_raw']; + break; + + } + } + } + + if (isset($ThisFileInfo['audio'])) { + $thisfile_audio['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); + $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); + } + if (!empty($thisfile_video['dataformat'])) { + $thisfile_video['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); + $thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1); + $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); + } + $ThisFileInfo['bitrate'] = @$thisfile_audio['bitrate'] + @$thisfile_video['bitrate']; + return true; + } + + function ASFCodecListObjectTypeLookup($CodecListType) { + static $ASFCodecListObjectTypeLookup = array(); + if (empty($ASFCodecListObjectTypeLookup)) { + $ASFCodecListObjectTypeLookup[0x0001] = 'Video Codec'; + $ASFCodecListObjectTypeLookup[0x0002] = 'Audio Codec'; + $ASFCodecListObjectTypeLookup[0xFFFF] = 'Unknown Codec'; + } + + return (isset($ASFCodecListObjectTypeLookup[$CodecListType]) ? $ASFCodecListObjectTypeLookup[$CodecListType] : 'Invalid Codec Type'); + } + + function KnownGUIDs() { + static $GUIDarray = array(); + if (empty($GUIDarray)) { + $GUIDarray['GETID3_ASF_Extended_Stream_Properties_Object'] = '14E6A5CB-C672-4332-8399-A96952065B5A'; + $GUIDarray['GETID3_ASF_Padding_Object'] = '1806D474-CADF-4509-A4BA-9AABCB96AAE8'; + $GUIDarray['GETID3_ASF_Payload_Ext_Syst_Pixel_Aspect_Ratio'] = '1B1EE554-F9EA-4BC8-821A-376B74E4C4B8'; + $GUIDarray['GETID3_ASF_Script_Command_Object'] = '1EFB1A30-0B62-11D0-A39B-00A0C90348F6'; + $GUIDarray['GETID3_ASF_No_Error_Correction'] = '20FB5700-5B55-11CF-A8FD-00805F5C442B'; + $GUIDarray['GETID3_ASF_Content_Branding_Object'] = '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E'; + $GUIDarray['GETID3_ASF_Content_Encryption_Object'] = '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E'; + $GUIDarray['GETID3_ASF_Digital_Signature_Object'] = '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E'; + $GUIDarray['GETID3_ASF_Extended_Content_Encryption_Object'] = '298AE614-2622-4C17-B935-DAE07EE9289C'; + $GUIDarray['GETID3_ASF_Simple_Index_Object'] = '33000890-E5B1-11CF-89F4-00A0C90349CB'; + $GUIDarray['GETID3_ASF_Degradable_JPEG_Media'] = '35907DE0-E415-11CF-A917-00805F5C442B'; + $GUIDarray['GETID3_ASF_Payload_Extension_System_Timecode'] = '399595EC-8667-4E2D-8FDB-98814CE76C1E'; + $GUIDarray['GETID3_ASF_Binary_Media'] = '3AFB65E2-47EF-40F2-AC2C-70A90D71D343'; + $GUIDarray['GETID3_ASF_Timecode_Index_Object'] = '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C'; + $GUIDarray['GETID3_ASF_Metadata_Library_Object'] = '44231C94-9498-49D1-A141-1D134E457054'; + $GUIDarray['GETID3_ASF_Reserved_3'] = '4B1ACBE3-100B-11D0-A39B-00A0C90348F6'; + $GUIDarray['GETID3_ASF_Reserved_4'] = '4CFEDB20-75F6-11CF-9C0F-00A0C90349CB'; + $GUIDarray['GETID3_ASF_Command_Media'] = '59DACFC0-59E6-11D0-A3AC-00A0C90348F6'; + $GUIDarray['GETID3_ASF_Header_Extension_Object'] = '5FBF03B5-A92E-11CF-8EE3-00C00C205365'; + $GUIDarray['GETID3_ASF_Media_Object_Index_Parameters_Obj'] = '6B203BAD-3F11-4E84-ACA8-D7613DE2CFA7'; + $GUIDarray['GETID3_ASF_Header_Object'] = '75B22630-668E-11CF-A6D9-00AA0062CE6C'; + $GUIDarray['GETID3_ASF_Content_Description_Object'] = '75B22633-668E-11CF-A6D9-00AA0062CE6C'; + $GUIDarray['GETID3_ASF_Error_Correction_Object'] = '75B22635-668E-11CF-A6D9-00AA0062CE6C'; + $GUIDarray['GETID3_ASF_Data_Object'] = '75B22636-668E-11CF-A6D9-00AA0062CE6C'; + $GUIDarray['GETID3_ASF_Web_Stream_Media_Subtype'] = '776257D4-C627-41CB-8F81-7AC7FF1C40CC'; + $GUIDarray['GETID3_ASF_Stream_Bitrate_Properties_Object'] = '7BF875CE-468D-11D1-8D82-006097C9A2B2'; + $GUIDarray['GETID3_ASF_Language_List_Object'] = '7C4346A9-EFE0-4BFC-B229-393EDE415C85'; + $GUIDarray['GETID3_ASF_Codec_List_Object'] = '86D15240-311D-11D0-A3A4-00A0C90348F6'; + $GUIDarray['GETID3_ASF_Reserved_2'] = '86D15241-311D-11D0-A3A4-00A0C90348F6'; + $GUIDarray['GETID3_ASF_File_Properties_Object'] = '8CABDCA1-A947-11CF-8EE4-00C00C205365'; + $GUIDarray['GETID3_ASF_File_Transfer_Media'] = '91BD222C-F21C-497A-8B6D-5AA86BFC0185'; + $GUIDarray['GETID3_ASF_Old_RTP_Extension_Data'] = '96800C63-4C94-11D1-837B-0080C7A37F95'; + $GUIDarray['GETID3_ASF_Advanced_Mutual_Exclusion_Object'] = 'A08649CF-4775-4670-8A16-6E35357566CD'; + $GUIDarray['GETID3_ASF_Bandwidth_Sharing_Object'] = 'A69609E6-517B-11D2-B6AF-00C04FD908E9'; + $GUIDarray['GETID3_ASF_Reserved_1'] = 'ABD3D211-A9BA-11cf-8EE6-00C00C205365'; + $GUIDarray['GETID3_ASF_Bandwidth_Sharing_Exclusive'] = 'AF6060AA-5197-11D2-B6AF-00C04FD908E9'; + $GUIDarray['GETID3_ASF_Bandwidth_Sharing_Partial'] = 'AF6060AB-5197-11D2-B6AF-00C04FD908E9'; + $GUIDarray['GETID3_ASF_JFIF_Media'] = 'B61BE100-5B4E-11CF-A8FD-00805F5C442B'; + $GUIDarray['GETID3_ASF_Stream_Properties_Object'] = 'B7DC0791-A9B7-11CF-8EE6-00C00C205365'; + $GUIDarray['GETID3_ASF_Video_Media'] = 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B'; + $GUIDarray['GETID3_ASF_Audio_Spread'] = 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220'; + $GUIDarray['GETID3_ASF_Metadata_Object'] = 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA'; + $GUIDarray['GETID3_ASF_Payload_Ext_Syst_Sample_Duration'] = 'C6BD9450-867F-4907-83A3-C77921B733AD'; + $GUIDarray['GETID3_ASF_Group_Mutual_Exclusion_Object'] = 'D1465A40-5A79-4338-B71B-E36B8FD6C249'; + $GUIDarray['GETID3_ASF_Extended_Content_Description_Object'] = 'D2D0A440-E307-11D2-97F0-00A0C95EA850'; + $GUIDarray['GETID3_ASF_Stream_Prioritization_Object'] = 'D4FED15B-88D3-454F-81F0-ED5C45999E24'; + $GUIDarray['GETID3_ASF_Payload_Ext_System_Content_Type'] = 'D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC'; + $GUIDarray['GETID3_ASF_Old_File_Properties_Object'] = 'D6E229D0-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_ASF_Header_Object'] = 'D6E229D1-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_ASF_Data_Object'] = 'D6E229D2-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Index_Object'] = 'D6E229D3-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Stream_Properties_Object'] = 'D6E229D4-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Content_Description_Object'] = 'D6E229D5-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Script_Command_Object'] = 'D6E229D6-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Marker_Object'] = 'D6E229D7-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Component_Download_Object'] = 'D6E229D8-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Stream_Group_Object'] = 'D6E229D9-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Scalable_Object'] = 'D6E229DA-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Prioritization_Object'] = 'D6E229DB-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Bitrate_Mutual_Exclusion_Object'] = 'D6E229DC-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Inter_Media_Dependency_Object'] = 'D6E229DD-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Rating_Object'] = 'D6E229DE-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Index_Parameters_Object'] = 'D6E229DF-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Color_Table_Object'] = 'D6E229E0-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Language_List_Object'] = 'D6E229E1-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Audio_Media'] = 'D6E229E2-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Video_Media'] = 'D6E229E3-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Image_Media'] = 'D6E229E4-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Timecode_Media'] = 'D6E229E5-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Text_Media'] = 'D6E229E6-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_MIDI_Media'] = 'D6E229E7-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Command_Media'] = 'D6E229E8-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_No_Error_Concealment'] = 'D6E229EA-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Scrambled_Audio'] = 'D6E229EB-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_No_Color_Table'] = 'D6E229EC-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_SMPTE_Time'] = 'D6E229ED-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_ASCII_Text'] = 'D6E229EE-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Unicode_Text'] = 'D6E229EF-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_HTML_Text'] = 'D6E229F0-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_URL_Command'] = 'D6E229F1-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Filename_Command'] = 'D6E229F2-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_ACM_Codec'] = 'D6E229F3-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_VCM_Codec'] = 'D6E229F4-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_QuickTime_Codec'] = 'D6E229F5-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_DirectShow_Transform_Filter'] = 'D6E229F6-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_DirectShow_Rendering_Filter'] = 'D6E229F7-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_No_Enhancement'] = 'D6E229F8-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Unknown_Enhancement_Type'] = 'D6E229F9-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Temporal_Enhancement'] = 'D6E229FA-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Spatial_Enhancement'] = 'D6E229FB-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Quality_Enhancement'] = 'D6E229FC-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Number_of_Channels_Enhancement'] = 'D6E229FD-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Frequency_Response_Enhancement'] = 'D6E229FE-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Media_Object'] = 'D6E229FF-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Mutex_Language'] = 'D6E22A00-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Mutex_Bitrate'] = 'D6E22A01-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Mutex_Unknown'] = 'D6E22A02-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_ASF_Placeholder_Object'] = 'D6E22A0E-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Old_Data_Unit_Extension_Object'] = 'D6E22A0F-35DA-11D1-9034-00A0C90349BE'; + $GUIDarray['GETID3_ASF_Web_Stream_Format'] = 'DA1E6B13-8359-4050-B398-388E965BF00C'; + $GUIDarray['GETID3_ASF_Payload_Ext_System_File_Name'] = 'E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B'; + $GUIDarray['GETID3_ASF_Marker_Object'] = 'F487CD01-A951-11CF-8EE6-00C00C205365'; + $GUIDarray['GETID3_ASF_Timecode_Index_Parameters_Object'] = 'F55E496D-9797-4B5D-8C8B-604DFE9BFB24'; + $GUIDarray['GETID3_ASF_Audio_Media'] = 'F8699E40-5B4D-11CF-A8FD-00805F5C442B'; + $GUIDarray['GETID3_ASF_Media_Object_Index_Object'] = 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C'; + $GUIDarray['GETID3_ASF_Alt_Extended_Content_Encryption_Obj'] = 'FF889EF1-ADEE-40DA-9E71-98704BB928CE'; + } + return $GUIDarray; + } + + function GUIDname($GUIDstring) { + static $GUIDarray = array(); + if (empty($GUIDarray)) { + $GUIDarray = $this->KnownGUIDs(); + } + return array_search($GUIDstring, $GUIDarray); + } + + function ASFIndexObjectIndexTypeLookup($id) { + static $ASFIndexObjectIndexTypeLookup = array(); + if (empty($ASFIndexObjectIndexTypeLookup)) { + $ASFIndexObjectIndexTypeLookup[1] = 'Nearest Past Data Packet'; + $ASFIndexObjectIndexTypeLookup[2] = 'Nearest Past Media Object'; + $ASFIndexObjectIndexTypeLookup[3] = 'Nearest Past Cleanpoint'; + } + return (isset($ASFIndexObjectIndexTypeLookup[$id]) ? $ASFIndexObjectIndexTypeLookup[$id] : 'invalid'); + } + + function GUIDtoBytestring($GUIDstring) { + // Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way: + // first 4 bytes are in little-endian order + // next 2 bytes are appended in little-endian order + // next 2 bytes are appended in little-endian order + // next 2 bytes are appended in big-endian order + // next 6 bytes are appended in big-endian order + + // AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string: + // $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp + + $hexbytecharstring = chr(hexdec(substr($GUIDstring, 6, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 4, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 2, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 0, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 9, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2))); + + return $hexbytecharstring; + } + + function BytestringToGUID($Bytestring) { + $GUIDstring = str_pad(dechex(ord($Bytestring{3})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{2})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{1})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{0})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring{5})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{4})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring{7})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{6})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring{8})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{9})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring{10})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{11})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{12})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{13})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{14})), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring{15})), 2, '0', STR_PAD_LEFT); + + return strtoupper($GUIDstring); + } + + function FILETIMEtoUNIXtime($FILETIME, $round=true) { + // FILETIME is a 64-bit unsigned integer representing + // the number of 100-nanosecond intervals since January 1, 1601 + // UNIX timestamp is number of seconds since January 1, 1970 + // 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days + if ($round) { + return intval(round(($FILETIME - 116444736000000000) / 10000000)); + } + return ($FILETIME - 116444736000000000) / 10000000; + } + + function WMpictureTypeLookup($WMpictureType) { + static $WMpictureTypeLookup = array(); + if (empty($WMpictureTypeLookup)) { + $WMpictureTypeLookup[0x03] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Front Cover'); + $WMpictureTypeLookup[0x04] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Back Cover'); + $WMpictureTypeLookup[0x00] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'User Defined'); + $WMpictureTypeLookup[0x05] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Leaflet Page'); + $WMpictureTypeLookup[0x06] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Media Label'); + $WMpictureTypeLookup[0x07] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Lead Artist'); + $WMpictureTypeLookup[0x08] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Artist'); + $WMpictureTypeLookup[0x09] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Conductor'); + $WMpictureTypeLookup[0x0A] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Band'); + $WMpictureTypeLookup[0x0B] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Composer'); + $WMpictureTypeLookup[0x0C] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Lyricist'); + $WMpictureTypeLookup[0x0D] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Recording Location'); + $WMpictureTypeLookup[0x0E] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'During Recording'); + $WMpictureTypeLookup[0x0F] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'During Performance'); + $WMpictureTypeLookup[0x10] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Video Screen Capture'); + $WMpictureTypeLookup[0x12] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Illustration'); + $WMpictureTypeLookup[0x13] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Band Logotype'); + $WMpictureTypeLookup[0x14] = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-16LE', 'Publisher Logotype'); + } + return @$WMpictureTypeLookup[$WMpictureType]; + } + + + // Remove terminator 00 00 and convert UNICODE to Latin-1 + function TrimConvert($string) { + + // remove terminator, only if present (it should be, but...) + if (substr($string, strlen($string) - 2, 2) == "\x00\x00") { + $string = substr($string, 0, strlen($string) - 2); + } + + // convert + return trim(getid3_lib::iconv_fallback('UTF-16LE', 'ISO-8859-1', $string), ' '); + } + + + function TrimTerm($string) { + + // remove terminator, only if present (it should be, but...) + if (substr($string, -2) == "\x00\x00") { + $string = substr($string, 0, -2); + } + return $string; + } + + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.bink.php b/campcaster/src/modules/getid3/var/module.audio-video.bink.php new file mode 100644 index 000000000..2ebc6fe79 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.bink.php @@ -0,0 +1,70 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.bink.php // +// module for analyzing Bink or Smacker audio-video files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_bink +{ + + function getid3_bink(&$fd, &$ThisFileInfo) { + +$ThisFileInfo['error'][] = 'Bink / Smacker files not properly processed by this version of getID3()'; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $fileTypeID = fread($fd, 3); + switch ($fileTypeID) { + case 'BIK': + return $this->ParseBink($fd, $ThisFileInfo); + break; + + case 'SMK': + return $this->ParseSmacker($fd, $ThisFileInfo); + break; + + default: + $ThisFileInfo['error'][] = 'Expecting "BIK" or "SMK" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$fileTypeID.'"'; + return false; + break; + } + + return true; + + } + + function ParseBink(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'bink'; + $ThisFileInfo['video']['dataformat'] = 'bink'; + + $fileData = 'BIK'.fread($fd, 13); + + $ThisFileInfo['bink']['data_size'] = getid3_lib::LittleEndian2Int(substr($fileData, 4, 4)); + $ThisFileInfo['bink']['frame_count'] = getid3_lib::LittleEndian2Int(substr($fileData, 8, 2)); + + if (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) != ($ThisFileInfo['bink']['data_size'] + 8)) { + $ThisFileInfo['error'][] = 'Probably truncated file: expecting '.$ThisFileInfo['bink']['data_size'].' bytes, found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']); + } + + return true; + } + + function ParseSmacker(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'smacker'; + $ThisFileInfo['video']['dataformat'] = 'smacker'; + + return false; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.flv.php b/campcaster/src/modules/getid3/var/module.audio-video.flv.php new file mode 100644 index 000000000..d7ca5cf76 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.flv.php @@ -0,0 +1,497 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +// // +// FLV module by Seth Kaufman // +// // +// * version 0.1 (26 June 2005) // +// // +// minor modifications by James Heinrich // +// * version 0.1.1 (15 July 2005) // +// // +// Support for On2 VP6 codec and meta information by // +// Steve Webster // +// * version 0.2 (22 February 2006) // +// // +// Modified to not read entire file into memory // +// by James Heinrich // +// * version 0.3 (15 June 2006) // +// // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.flv.php // +// module for analyzing Shockwave Flash Video files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + +define('GETID3_FLV_TAG_AUDIO', 8); +define('GETID3_FLV_TAG_VIDEO', 9); +define('GETID3_FLV_TAG_META', 18); + +define('GETID3_FLV_VIDEO_H263', 2); +define('GETID3_FLV_VIDEO_SCREEN', 3); +define('GETID3_FLV_VIDEO_VP6', 4); + +class getid3_flv +{ + + function getid3_flv(&$fd, &$ThisFileInfo, $ReturnAllTagData=false) { + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + $FLVdataLength = $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']; + $FLVheader = fread($fd, 5); + + $ThisFileInfo['fileformat'] = 'flv'; + $ThisFileInfo['flv']['header']['signature'] = substr($FLVheader, 0, 3); + $ThisFileInfo['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1)); + $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1)); + + if ($ThisFileInfo['flv']['header']['signature'] != 'FLV') { + $ThisFileInfo['error'][] = 'Expecting "FLV" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$ThisFileInfo['flv']['header']['signature'].'"'; + unset($ThisFileInfo['flv']); + unset($ThisFileInfo['fileformat']); + return false; + } + + $ThisFileInfo['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04); + $ThisFileInfo['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01); + + $FrameSizeDataLength = getid3_lib::BigEndian2Int(fread($fd, 4)); + $FLVheaderFrameLength = 9; + if ($FrameSizeDataLength > $FLVheaderFrameLength) { + fseek($fd, $FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR); + } + + $Duration = 0; + while ((ftell($fd) + 1) < $ThisFileInfo['avdataend']) { + //if (!$ThisFileInfo['flv']['header']['hasAudio'] || isset($ThisFileInfo['flv']['audio']['audioFormat'])) { + // if (!$ThisFileInfo['flv']['header']['hasVideo'] || isset($ThisFileInfo['flv']['video']['videoCodec'])) { + // break; + // } + //} + + $ThisTagHeader = fread($fd, 16); + + $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4)); + $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1)); + $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3)); + $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3)); + $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1)); + $NextOffset = ftell($fd) - 1 + $DataLength; + + switch ($TagType) { + case GETID3_FLV_TAG_AUDIO: + if (!isset($ThisFileInfo['flv']['audio']['audioFormat'])) { + $ThisFileInfo['flv']['audio']['audioFormat'] = $LastHeaderByte & 0x07; + $ThisFileInfo['flv']['audio']['audioRate'] = ($LastHeaderByte & 0x30) / 0x10; + $ThisFileInfo['flv']['audio']['audioSampleSize'] = ($LastHeaderByte & 0x40) / 0x40; + $ThisFileInfo['flv']['audio']['audioType'] = ($LastHeaderByte & 0x80) / 0x80; + } + break; + + case GETID3_FLV_TAG_VIDEO: + if (!isset($ThisFileInfo['flv']['video']['videoCodec'])) { + $ThisFileInfo['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07; + + $FLVvideoHeader = fread($fd, 11); + + if ($ThisFileInfo['flv']['video']['videoCodec'] != GETID3_FLV_VIDEO_VP6) { + + $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7; + $PictureSizeType = $PictureSizeType & 0x0007; + $ThisFileInfo['flv']['header']['videoSizeType'] = $PictureSizeType; + switch ($PictureSizeType) { + case 0: + $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)); + $PictureSizeEnc <<= 1; + $ThisFileInfo['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8; + $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); + $PictureSizeEnc <<= 1; + $ThisFileInfo['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8; + break; + + case 1: + $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 4)); + $PictureSizeEnc <<= 1; + $ThisFileInfo['video']['resolution_x'] = ($PictureSizeEnc & 0xFFFF0000) >> 16; + + $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 4)); + $PictureSizeEnc <<= 1; + $ThisFileInfo['video']['resolution_y'] = ($PictureSizeEnc & 0xFFFF0000) >> 16; + break; + + case 2: + $ThisFileInfo['video']['resolution_x'] = 352; + $ThisFileInfo['video']['resolution_y'] = 288; + break; + + case 3: + $ThisFileInfo['video']['resolution_x'] = 176; + $ThisFileInfo['video']['resolution_y'] = 144; + break; + + case 4: + $ThisFileInfo['video']['resolution_x'] = 128; + $ThisFileInfo['video']['resolution_y'] = 96; + break; + + case 5: + $ThisFileInfo['video']['resolution_x'] = 320; + $ThisFileInfo['video']['resolution_y'] = 240; + break; + + case 6: + $ThisFileInfo['video']['resolution_x'] = 160; + $ThisFileInfo['video']['resolution_y'] = 120; + break; + + default: + $ThisFileInfo['video']['resolution_x'] = 0; + $ThisFileInfo['video']['resolution_y'] = 0; + break; + + } + } + } + break; + + // Meta tag + case GETID3_FLV_TAG_META: + + fseek($fd, -1, SEEK_CUR); + $reader = new AMFReader(new AMFStream(fread($fd, $DataLength))); + $eventName = $reader->readData(); + $ThisFileInfo['meta'][$eventName] = $reader->readData(); + unset($reader); + + $ThisFileInfo['video']['frame_rate'] = $ThisFileInfo['meta']['onMetaData']['framerate']; + $ThisFileInfo['video']['resolution_x'] = $ThisFileInfo['meta']['onMetaData']['width']; + $ThisFileInfo['video']['resolution_y'] = $ThisFileInfo['meta']['onMetaData']['height']; + break; + + default: + // noop + break; + } + + if ($Timestamp > $Duration) { + $Duration = $Timestamp; + } + + fseek($fd, $NextOffset, SEEK_SET); + } + + $ThisFileInfo['playtime_seconds'] = $Duration / 1000; + $ThisFileInfo['bitrate'] = ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) / $ThisFileInfo['playtime_seconds']; + + if ($ThisFileInfo['flv']['header']['hasAudio']) { + $ThisFileInfo['audio']['codec'] = $this->FLVaudioFormat($ThisFileInfo['flv']['audio']['audioFormat']); + $ThisFileInfo['audio']['sample_rate'] = $this->FLVaudioRate($ThisFileInfo['flv']['audio']['audioRate']); + $ThisFileInfo['audio']['bits_per_sample'] = $this->FLVaudioBitDepth($ThisFileInfo['flv']['audio']['audioSampleSize']); + + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo + $ThisFileInfo['audio']['lossless'] = ($ThisFileInfo['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed + $ThisFileInfo['audio']['dataformat'] = 'flv'; + } + if (@$ThisFileInfo['flv']['header']['hasVideo']) { + $ThisFileInfo['video']['codec'] = $this->FLVvideoCodec($ThisFileInfo['flv']['video']['videoCodec']); + $ThisFileInfo['video']['dataformat'] = 'flv'; + $ThisFileInfo['video']['lossless'] = false; + } + + return true; + } + + + function FLVaudioFormat($id) { + $FLVaudioFormat = array( + 0 => 'uncompressed', + 1 => 'ADPCM', + 2 => 'mp3', + 5 => 'Nellymoser 8kHz mono', + 6 => 'Nellymoser', + ); + return (@$FLVaudioFormat[$id] ? @$FLVaudioFormat[$id] : false); + } + + function FLVaudioRate($id) { + $FLVaudioRate = array( + 0 => 5500, + 1 => 11025, + 2 => 22050, + 3 => 44100, + ); + return (@$FLVaudioRate[$id] ? @$FLVaudioRate[$id] : false); + } + + function FLVaudioBitDepth($id) { + $FLVaudioBitDepth = array( + 0 => 8, + 1 => 16, + ); + return (@$FLVaudioBitDepth[$id] ? @$FLVaudioBitDepth[$id] : false); + } + + function FLVvideoCodec($id) { + $FLVvideoCodec = array( + GETID3_FLV_VIDEO_H263 => 'Sorenson H.263', + GETID3_FLV_VIDEO_SCREEN => 'Screen video', + GETID3_FLV_VIDEO_VP6 => 'On2 VP6', + ); + return (@$FLVvideoCodec[$id] ? @$FLVvideoCodec[$id] : false); + } +} + +class AMFStream { + var $bytes; + var $pos; + + function AMFStream(&$bytes) { + $this->bytes =& $bytes; + $this->pos = 0; + } + + function readByte() { + return getid3_lib::BigEndian2Int(substr($this->bytes, $this->pos++, 1)); + } + + function readInt() { + return ($this->readByte() << 8) + $this->readByte(); + } + + function readLong() { + return ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte(); + } + + function readDouble() { + return getid3_lib::BigEndian2Float($this->read(8)); + } + + function readUTF() { + $length = $this->readInt(); + return $this->read($length); + } + + function readLongUTF() { + $length = $this->readLong(); + return $this->read($length); + } + + function read($length) { + $val = substr($this->bytes, $this->pos, $length); + $this->pos += $length; + return $val; + } + + function peekByte() { + $pos = $this->pos; + $val = $this->readByte(); + $this->pos = $pos; + return $val; + } + + function peekInt() { + $pos = $this->pos; + $val = $this->readInt(); + $this->pos = $pos; + return $val; + } + + function peekLong() { + $pos = $this->pos; + $val = $this->readLong(); + $this->pos = $pos; + return $val; + } + + function peekDouble() { + $pos = $this->pos; + $val = $this->readDouble(); + $this->pos = $pos; + return $val; + } + + function peekUTF() { + $pos = $this->pos; + $val = $this->readUTF(); + $this->pos = $pos; + return $val; + } + + function peekLongUTF() { + $pos = $this->pos; + $val = $this->readLongUTF(); + $this->pos = $pos; + return $val; + } +} + +class AMFReader { + var $stream; + + function AMFReader(&$stream) { + $this->stream =& $stream; + } + + function readData() { + $value = null; + + $type = $this->stream->readByte(); + + switch($type) { + // Double + case 0: + $value = $this->readDouble(); + break; + + // Boolean + case 1: + $value = $this->readBoolean(); + break; + + // String + case 2: + $value = $this->readString(); + break; + + // Object + case 3: + $value = $this->readObject(); + break; + + // null + case 6: + return null; + break; + + // Mixed array + case 8: + $value = $this->readMixedArray(); + break; + + // Array + case 10: + $value = $this->readArray(); + break; + + // Date + case 11: + $value = $this->readDate(); + break; + + // Long string + case 13: + $value = $this->readLongString(); + break; + + // XML (handled as string) + case 15: + $value = $this->readXML(); + break; + + // Typed object (handled as object) + case 16: + $value = $this->readTypedObject(); + break; + + // Long string + default: + $value = '(unknown or unsupported data type)'; + break; + } + + return $value; + } + + function readDouble() { + return $this->stream->readDouble(); + } + + function readBoolean() { + return $this->stream->readByte() == 1; + } + + function readString() { + return $this->stream->readUTF(); + } + + function readObject() { + // Get highest numerical index - ignored + $highestIndex = $this->stream->readLong(); + + $data = array(); + + while ($key = $this->stream->readUTF()) { + // Mixed array record ends with empty string (0x00 0x00) and 0x09 + if (($key == '') && ($this->stream->peekByte() == 0x09)) { + // Consume byte + $this->stream->readByte(); + break; + } + + $data[$key] = $this->readData(); + } + + return $data; + } + + function readMixedArray() { + // Get highest numerical index - ignored + $highestIndex = $this->stream->readLong(); + + $data = array(); + + while ($key = $this->stream->readUTF()) { + // Mixed array record ends with empty string (0x00 0x00) and 0x09 + if (($key == '') && ($this->stream->peekByte() == 0x09)) { + // Consume byte + $this->stream->readByte(); + break; + } + + if (is_numeric($key)) { + $key = (float) $key; + } + + $data[$key] = $this->readData(); + } + + return $data; + } + + function readArray() { + $length = $this->stream->readLong(); + + $data = array(); + + for ($i = 0; $i < count($length); $i++) { + $data[] = $this->readData(); + } + + return $data; + } + + function readDate() { + $timestamp = $this->stream->readDouble(); + $timezone = $this->stream->readInt(); + return $timestamp; + } + + function readLongString() { + return $this->stream->readLongUTF(); + } + + function readXML() { + return $this->stream->readLongUTF(); + } + + function readTypedObject() { + $className = $this->stream->readUTF(); + return $this->readObject(); + } +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.matroska.php b/campcaster/src/modules/getid3/var/module.audio-video.matroska.php new file mode 100644 index 000000000..11ac92901 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.matroska.php @@ -0,0 +1,78 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.matriska.php // +// module for analyzing Matroska containers // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_matroska +{ + + function getid3_matroska(&$fd, &$ThisFileInfo) { + + $ThisFileInfo['fileformat'] = 'matroska'; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + //$ThisFileInfo['matroska']['raw']['a'] = $this->EBML2Int(fread($fd, 4)); + + $ThisFileInfo['error'][] = 'Mastroka parsing not enabled in this version of getID3()'; + return false; + + } + + + function EBML2Int($EBMLstring) { + // http://matroska.org/specs/ + + // Element ID coded with an UTF-8 like system: + // 1xxx xxxx - Class A IDs (2^7 -2 possible values) (base 0x8X) + // 01xx xxxx xxxx xxxx - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX) + // 001x xxxx xxxx xxxx xxxx xxxx - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX) + // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX) + // Values with all x at 0 and 1 are reserved (hence the -2). + + // Data size, in octets, is also coded with an UTF-8 like system : + // 1xxx xxxx - value 0 to 2^7-2 + // 01xx xxxx xxxx xxxx - value 0 to 2^14-2 + // 001x xxxx xxxx xxxx xxxx xxxx - value 0 to 2^21-2 + // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^28-2 + // 0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^35-2 + // 0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^42-2 + // 0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^49-2 + // 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^56-2 + + if (0x80 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x7F); + } elseif (0x40 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x3F); + } elseif (0x20 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x1F); + } elseif (0x10 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x0F); + } elseif (0x08 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x07); + } elseif (0x04 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x03); + } elseif (0x02 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x01); + } elseif (0x01 & ord($EBMLstring{0})) { + $EBMLstring{0} = chr(ord($EBMLstring{0}) & 0x00); + } else { + return false; + } + return getid3_lib::BigEndian2Int($EBMLstring); + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.mpeg.php b/campcaster/src/modules/getid3/var/module.audio-video.mpeg.php new file mode 100644 index 000000000..8f4878484 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.mpeg.php @@ -0,0 +1,292 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.mpeg.php // +// module for analyzing MPEG files // +// dependencies: module.audio.mp3.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); + +define('GETID3_MPEG_VIDEO_PICTURE_START', "\x00\x00\x01\x00"); +define('GETID3_MPEG_VIDEO_USER_DATA_START', "\x00\x00\x01\xB2"); +define('GETID3_MPEG_VIDEO_SEQUENCE_HEADER', "\x00\x00\x01\xB3"); +define('GETID3_MPEG_VIDEO_SEQUENCE_ERROR', "\x00\x00\x01\xB4"); +define('GETID3_MPEG_VIDEO_EXTENSION_START', "\x00\x00\x01\xB5"); +define('GETID3_MPEG_VIDEO_SEQUENCE_END', "\x00\x00\x01\xB7"); +define('GETID3_MPEG_VIDEO_GROUP_START', "\x00\x00\x01\xB8"); +define('GETID3_MPEG_AUDIO_START', "\x00\x00\x01\xC0"); + + +class getid3_mpeg +{ + + function getid3_mpeg(&$fd, &$ThisFileInfo) { + if ($ThisFileInfo['avdataend'] <= $ThisFileInfo['avdataoffset']) { + $ThisFileInfo['error'][] = '"avdataend" ('.$ThisFileInfo['avdataend'].') is unexpectedly less-than-or-equal-to "avdataoffset" ('.$ThisFileInfo['avdataoffset'].')'; + return false; + } + $ThisFileInfo['fileformat'] = 'mpeg'; + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $MPEGstreamData = fread($fd, min(100000, $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])); + $MPEGstreamDataLength = strlen($MPEGstreamData); + + $foundVideo = true; + $VideoChunkOffset = 0; + while (substr($MPEGstreamData, $VideoChunkOffset++, 4) !== GETID3_MPEG_VIDEO_SEQUENCE_HEADER) { + if ($VideoChunkOffset >= $MPEGstreamDataLength) { + $foundVideo = false; + break; + } + } + if ($foundVideo) { + + // Start code 32 bits + // horizontal frame size 12 bits + // vertical frame size 12 bits + // pixel aspect ratio 4 bits + // frame rate 4 bits + // bitrate 18 bits + // marker bit 1 bit + // VBV buffer size 10 bits + // constrained parameter flag 1 bit + // intra quant. matrix flag 1 bit + // intra quant. matrix values 512 bits (present if matrix flag == 1) + // non-intra quant. matrix flag 1 bit + // non-intra quant. matrix values 512 bits (present if matrix flag == 1) + + $ThisFileInfo['video']['dataformat'] = 'mpeg'; + + $VideoChunkOffset += (strlen(GETID3_MPEG_VIDEO_SEQUENCE_HEADER) - 1); + + $FrameSizeDWORD = getid3_lib::BigEndian2Int(substr($MPEGstreamData, $VideoChunkOffset, 3)); + $VideoChunkOffset += 3; + + $AspectRatioFrameRateDWORD = getid3_lib::BigEndian2Int(substr($MPEGstreamData, $VideoChunkOffset, 1)); + $VideoChunkOffset += 1; + + $assortedinformation = getid3_lib::BigEndian2Bin(substr($MPEGstreamData, $VideoChunkOffset, 4)); + $VideoChunkOffset += 4; + + $ThisFileInfo['mpeg']['video']['raw']['framesize_horizontal'] = ($FrameSizeDWORD & 0xFFF000) >> 12; // 12 bits for horizontal frame size + $ThisFileInfo['mpeg']['video']['raw']['framesize_vertical'] = ($FrameSizeDWORD & 0x000FFF); // 12 bits for vertical frame size + $ThisFileInfo['mpeg']['video']['raw']['pixel_aspect_ratio'] = ($AspectRatioFrameRateDWORD & 0xF0) >> 4; + $ThisFileInfo['mpeg']['video']['raw']['frame_rate'] = ($AspectRatioFrameRateDWORD & 0x0F); + + $ThisFileInfo['mpeg']['video']['framesize_horizontal'] = $ThisFileInfo['mpeg']['video']['raw']['framesize_horizontal']; + $ThisFileInfo['mpeg']['video']['framesize_vertical'] = $ThisFileInfo['mpeg']['video']['raw']['framesize_vertical']; + + $ThisFileInfo['mpeg']['video']['pixel_aspect_ratio'] = $this->MPEGvideoAspectRatioLookup($ThisFileInfo['mpeg']['video']['raw']['pixel_aspect_ratio']); + $ThisFileInfo['mpeg']['video']['pixel_aspect_ratio_text'] = $this->MPEGvideoAspectRatioTextLookup($ThisFileInfo['mpeg']['video']['raw']['pixel_aspect_ratio']); + $ThisFileInfo['mpeg']['video']['frame_rate'] = $this->MPEGvideoFramerateLookup($ThisFileInfo['mpeg']['video']['raw']['frame_rate']); + + $ThisFileInfo['mpeg']['video']['raw']['bitrate'] = getid3_lib::Bin2Dec(substr($assortedinformation, 0, 18)); + $ThisFileInfo['mpeg']['video']['raw']['marker_bit'] = (bool) getid3_lib::Bin2Dec(substr($assortedinformation, 18, 1)); + $ThisFileInfo['mpeg']['video']['raw']['vbv_buffer_size'] = getid3_lib::Bin2Dec(substr($assortedinformation, 19, 10)); + $ThisFileInfo['mpeg']['video']['raw']['constrained_param_flag'] = (bool) getid3_lib::Bin2Dec(substr($assortedinformation, 29, 1)); + $ThisFileInfo['mpeg']['video']['raw']['intra_quant_flag'] = (bool) getid3_lib::Bin2Dec(substr($assortedinformation, 30, 1)); + if ($ThisFileInfo['mpeg']['video']['raw']['intra_quant_flag']) { + + // read 512 bits + $ThisFileInfo['mpeg']['video']['raw']['intra_quant'] = getid3_lib::BigEndian2Bin(substr($MPEGstreamData, $VideoChunkOffset, 64)); + $VideoChunkOffset += 64; + + $ThisFileInfo['mpeg']['video']['raw']['non_intra_quant_flag'] = (bool) getid3_lib::Bin2Dec(substr($ThisFileInfo['mpeg']['video']['raw']['intra_quant'], 511, 1)); + $ThisFileInfo['mpeg']['video']['raw']['intra_quant'] = getid3_lib::Bin2Dec(substr($assortedinformation, 31, 1)).substr(getid3_lib::BigEndian2Bin(substr($MPEGstreamData, $VideoChunkOffset, 64)), 0, 511); + + if ($ThisFileInfo['mpeg']['video']['raw']['non_intra_quant_flag']) { + $ThisFileInfo['mpeg']['video']['raw']['non_intra_quant'] = substr($MPEGstreamData, $VideoChunkOffset, 64); + $VideoChunkOffset += 64; + } + + } else { + + $ThisFileInfo['mpeg']['video']['raw']['non_intra_quant_flag'] = (bool) getid3_lib::Bin2Dec(substr($assortedinformation, 31, 1)); + if ($ThisFileInfo['mpeg']['video']['raw']['non_intra_quant_flag']) { + $ThisFileInfo['mpeg']['video']['raw']['non_intra_quant'] = substr($MPEGstreamData, $VideoChunkOffset, 64); + $VideoChunkOffset += 64; + } + + } + + if ($ThisFileInfo['mpeg']['video']['raw']['bitrate'] == 0x3FFFF) { // 18 set bits + + $ThisFileInfo['warning'][] = 'This version of getID3() ['.GETID3_VERSION.'] cannot determine average bitrate of VBR MPEG video files'; + $ThisFileInfo['mpeg']['video']['bitrate_mode'] = 'vbr'; + + } else { + + $ThisFileInfo['mpeg']['video']['bitrate'] = $ThisFileInfo['mpeg']['video']['raw']['bitrate'] * 400; + $ThisFileInfo['mpeg']['video']['bitrate_mode'] = 'cbr'; + $ThisFileInfo['video']['bitrate'] = $ThisFileInfo['mpeg']['video']['bitrate']; + + } + + $ThisFileInfo['video']['resolution_x'] = $ThisFileInfo['mpeg']['video']['framesize_horizontal']; + $ThisFileInfo['video']['resolution_y'] = $ThisFileInfo['mpeg']['video']['framesize_vertical']; + $ThisFileInfo['video']['frame_rate'] = $ThisFileInfo['mpeg']['video']['frame_rate']; + $ThisFileInfo['video']['bitrate_mode'] = $ThisFileInfo['mpeg']['video']['bitrate_mode']; + $ThisFileInfo['video']['pixel_aspect_ratio'] = $ThisFileInfo['mpeg']['video']['pixel_aspect_ratio']; + $ThisFileInfo['video']['lossless'] = false; + $ThisFileInfo['video']['bits_per_sample'] = 24; + + } else { + + $ThisFileInfo['error'][] = 'Could not find start of video block in the first 100,000 bytes (or before end of file) - this might not be an MPEG-video file?'; + + } + + //0x000001B3 begins the sequence_header of every MPEG video stream. + //But in MPEG-2, this header must immediately be followed by an + //extension_start_code (0x000001B5) with a sequence_extension ID (1). + //(This extension contains all the additional MPEG-2 stuff.) + //MPEG-1 doesn't have this extension, so that's a sure way to tell the + //difference between MPEG-1 and MPEG-2 video streams. + + if (substr($MPEGstreamData, $VideoChunkOffset, 4) == GETID3_MPEG_VIDEO_EXTENSION_START) { + $ThisFileInfo['video']['codec'] = 'MPEG-2'; + } else { + $ThisFileInfo['video']['codec'] = 'MPEG-1'; + } + + + $AudioChunkOffset = 0; + while (true) { + while (substr($MPEGstreamData, $AudioChunkOffset++, 4) !== GETID3_MPEG_AUDIO_START) { + if ($AudioChunkOffset >= $MPEGstreamDataLength) { + break 2; + } + } + + for ($i = 0; $i <= 7; $i++) { + // some files have the MPEG-audio header 8 bytes after the end of the $00 $00 $01 $C0 signature, some have it up to 13 bytes (or more?) after + // I have no idea why or what the difference is, so this is a stupid hack. + // If anybody has any better idea of what's going on, please let me know - info@getid3.org + + $dummy = $ThisFileInfo; + if (getid3_mp3::decodeMPEGaudioHeader($fd, ($AudioChunkOffset + 3) + 8 + $i, $dummy, false)) { + $ThisFileInfo = $dummy; + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + $ThisFileInfo['audio']['lossless'] = false; + break 2; + + } + } + } + + // Temporary hack to account for interleaving overhead: + if (!empty($ThisFileInfo['video']['bitrate']) && !empty($ThisFileInfo['audio']['bitrate'])) { + $ThisFileInfo['playtime_seconds'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / ($ThisFileInfo['video']['bitrate'] + $ThisFileInfo['audio']['bitrate']); + + // Interleaved MPEG audio/video files have a certain amount of overhead that varies + // by both video and audio bitrates, and not in any sensible, linear/logarithmic patter + // Use interpolated lookup tables to approximately guess how much is overhead, because + // playtime is calculated as filesize / total-bitrate + $ThisFileInfo['playtime_seconds'] *= $this->MPEGsystemNonOverheadPercentage($ThisFileInfo['video']['bitrate'], $ThisFileInfo['audio']['bitrate']); + + //switch ($ThisFileInfo['video']['bitrate']) { + // case('5000000'): + // $multiplier = 0.93292642112380355828048824319889; + // break; + // case('5500000'): + // $multiplier = 0.93582895375200989965359777343219; + // break; + // case('6000000'): + // $multiplier = 0.93796247714820932532911373859139; + // break; + // case('7000000'): + // $multiplier = 0.9413264083635103463010117778776; + // break; + // default: + // $multiplier = 1; + // break; + //} + //$ThisFileInfo['playtime_seconds'] *= $multiplier; + //$ThisFileInfo['warning'][] = 'Interleaved MPEG audio/video playtime may be inaccurate. With current hack should be within a few seconds of accurate. Report to info@getid3.org if off by more than 10 seconds.'; + if ($ThisFileInfo['video']['bitrate'] < 50000) { + $ThisFileInfo['warning'][] = 'Interleaved MPEG audio/video playtime may be slightly inaccurate for video bitrates below 100kbps. Except in extreme low-bitrate situations, error should be less than 1%. Report to info@getid3.org if greater than this.'; + } + } + + return true; + } + + + function MPEGsystemNonOverheadPercentage($VideoBitrate, $AudioBitrate) { + $OverheadPercentage = 0; + + $AudioBitrate = max(min($AudioBitrate / 1000, 384), 32); // limit to range of 32kbps - 384kbps (should be only legal bitrates, but maybe VBR?) + $VideoBitrate = max(min($VideoBitrate / 1000, 10000), 10); // limit to range of 10kbps - 10Mbps (beyond that curves flatten anyways, no big loss) + + + //OMBB[audiobitrate] = array(video-10kbps, video-100kbps, video-1000kbps, video-10000kbps) + $OverheadMultiplierByBitrate[32] = array(0, 0.9676287944368530, 0.9802276264360310, 0.9844916183244460, 0.9852821845179940); + $OverheadMultiplierByBitrate[48] = array(0, 0.9779100089209830, 0.9787770035359320, 0.9846738664076130, 0.9852683013799960); + $OverheadMultiplierByBitrate[56] = array(0, 0.9731249855367600, 0.9776624308938040, 0.9832606361852130, 0.9843922606633340); + $OverheadMultiplierByBitrate[64] = array(0, 0.9755642683275760, 0.9795256705493390, 0.9836573009193170, 0.9851122539404470); + $OverheadMultiplierByBitrate[96] = array(0, 0.9788025247497290, 0.9798553314148700, 0.9822956869792560, 0.9834815119124690); + $OverheadMultiplierByBitrate[128] = array(0, 0.9816940050925480, 0.9821675936072120, 0.9829756927470870, 0.9839763420152050); + $OverheadMultiplierByBitrate[160] = array(0, 0.9825894094561180, 0.9820913399073960, 0.9823907143253970, 0.9832821783651570); + $OverheadMultiplierByBitrate[192] = array(0, 0.9832038474336260, 0.9825731694317960, 0.9821028622712400, 0.9828262076447620); + $OverheadMultiplierByBitrate[224] = array(0, 0.9836516298538770, 0.9824718601823890, 0.9818302180625380, 0.9823735101626480); + $OverheadMultiplierByBitrate[256] = array(0, 0.9845863022094920, 0.9837229411967540, 0.9824521662210830, 0.9828645172100790); + $OverheadMultiplierByBitrate[320] = array(0, 0.9849565280263180, 0.9837683142805110, 0.9822885275960400, 0.9824424382727190); + $OverheadMultiplierByBitrate[384] = array(0, 0.9856094774357600, 0.9844573394432720, 0.9825970399837330, 0.9824673808303890); + + $BitrateToUseMin = 32; + $BitrateToUseMax = 32; + $previousBitrate = 32; + foreach ($OverheadMultiplierByBitrate as $key => $value) { + if ($AudioBitrate >= $previousBitrate) { + $BitrateToUseMin = $previousBitrate; + } + if ($AudioBitrate < $key) { + $BitrateToUseMax = $key; + break; + } + $previousBitrate = $key; + } + $FactorA = ($BitrateToUseMax - $AudioBitrate) / ($BitrateToUseMax - $BitrateToUseMin); + + $VideoBitrateLog10 = log10($VideoBitrate); + $VideoFactorMin1 = $OverheadMultiplierByBitrate[$BitrateToUseMin][floor($VideoBitrateLog10)]; + $VideoFactorMin2 = $OverheadMultiplierByBitrate[$BitrateToUseMax][floor($VideoBitrateLog10)]; + $VideoFactorMax1 = $OverheadMultiplierByBitrate[$BitrateToUseMin][ceil($VideoBitrateLog10)]; + $VideoFactorMax2 = $OverheadMultiplierByBitrate[$BitrateToUseMax][ceil($VideoBitrateLog10)]; + $FactorV = $VideoBitrateLog10 - floor($VideoBitrateLog10); + + $OverheadPercentage = $VideoFactorMin1 * $FactorA * $FactorV; + $OverheadPercentage += $VideoFactorMin2 * (1 - $FactorA) * $FactorV; + $OverheadPercentage += $VideoFactorMax1 * $FactorA * (1 - $FactorV); + $OverheadPercentage += $VideoFactorMax2 * (1 - $FactorA) * (1 - $FactorV); + + return $OverheadPercentage; + } + + + function MPEGvideoFramerateLookup($rawframerate) { + $MPEGvideoFramerateLookup = array(0, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60); + return (isset($MPEGvideoFramerateLookup[$rawframerate]) ? (float) $MPEGvideoFramerateLookup[$rawframerate] : (float) 0); + } + + function MPEGvideoAspectRatioLookup($rawaspectratio) { + $MPEGvideoAspectRatioLookup = array(0, 1, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, 0.8935, 0.9157, 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, 1.2015, 0); + return (isset($MPEGvideoAspectRatioLookup[$rawaspectratio]) ? (float) $MPEGvideoAspectRatioLookup[$rawaspectratio] : (float) 0); + } + + function MPEGvideoAspectRatioTextLookup($rawaspectratio) { + $MPEGvideoAspectRatioTextLookup = array('forbidden', 'square pixels', '0.6735', '16:9, 625 line, PAL', '0.7615', '0.8055', '16:9, 525 line, NTSC', '0.8935', '4:3, 625 line, PAL, CCIR601', '0.9815', '1.0255', '1.0695', '4:3, 525 line, NTSC, CCIR601', '1.1575', '1.2015', 'reserved'); + return (isset($MPEGvideoAspectRatioTextLookup[$rawaspectratio]) ? $MPEGvideoAspectRatioTextLookup[$rawaspectratio] : ''); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.nsv.php b/campcaster/src/modules/getid3/var/module.audio-video.nsv.php new file mode 100644 index 000000000..dab03389b --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.nsv.php @@ -0,0 +1,224 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.nsv.php // +// module for analyzing Nullsoft NSV files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_nsv +{ + + function getid3_nsv(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $NSVheader = fread($fd, 4); + + switch ($NSVheader) { + case 'NSVs': + if ($this->getNSVsHeaderFilepointer($fd, $ThisFileInfo, 0)) { + $ThisFileInfo['fileformat'] = 'nsv'; + $ThisFileInfo['audio']['dataformat'] = 'nsv'; + $ThisFileInfo['video']['dataformat'] = 'nsv'; + $ThisFileInfo['audio']['lossless'] = false; + $ThisFileInfo['video']['lossless'] = false; + } + break; + + case 'NSVf': + if ($this->getNSVfHeaderFilepointer($fd, $ThisFileInfo, 0)) { + $ThisFileInfo['fileformat'] = 'nsv'; + $ThisFileInfo['audio']['dataformat'] = 'nsv'; + $ThisFileInfo['video']['dataformat'] = 'nsv'; + $ThisFileInfo['audio']['lossless'] = false; + $ThisFileInfo['video']['lossless'] = false; + $this->getNSVsHeaderFilepointer($fd, $ThisFileInfo, $ThisFileInfo['nsv']['NSVf']['header_length']); + } + break; + + default: + $ThisFileInfo['error'][] = 'Expecting "NSVs" or "NSVf" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$NSVheader.'"'; + return false; + break; + } + + if (!isset($ThisFileInfo['nsv']['NSVf'])) { + $ThisFileInfo['warning'][] = 'NSVf header not present - cannot calculate playtime or bitrate'; + } + + return true; + } + + function getNSVsHeaderFilepointer(&$fd, &$ThisFileInfo, $fileoffset) { + fseek($fd, $fileoffset, SEEK_SET); + $NSVsheader = fread($fd, 28); + $offset = 0; + + $ThisFileInfo['nsv']['NSVs']['identifier'] = substr($NSVsheader, $offset, 4); + $offset += 4; + + if ($ThisFileInfo['nsv']['NSVs']['identifier'] != 'NSVs') { + $ThisFileInfo['error'][] = 'expected "NSVs" at offset ('.$fileoffset.'), found "'.$ThisFileInfo['nsv']['NSVs']['identifier'].'" instead'; + unset($ThisFileInfo['nsv']['NSVs']); + return false; + } + + $ThisFileInfo['nsv']['NSVs']['offset'] = $fileoffset; + + $ThisFileInfo['nsv']['NSVs']['video_codec'] = substr($NSVsheader, $offset, 4); + $offset += 4; + $ThisFileInfo['nsv']['NSVs']['audio_codec'] = substr($NSVsheader, $offset, 4); + $offset += 4; + $ThisFileInfo['nsv']['NSVs']['resolution_x'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 2)); + $offset += 2; + $ThisFileInfo['nsv']['NSVs']['resolution_y'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 2)); + $offset += 2; + + $ThisFileInfo['nsv']['NSVs']['framerate_index'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + //$ThisFileInfo['nsv']['NSVs']['unknown1b'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + //$ThisFileInfo['nsv']['NSVs']['unknown1c'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + //$ThisFileInfo['nsv']['NSVs']['unknown1d'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + //$ThisFileInfo['nsv']['NSVs']['unknown2a'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + //$ThisFileInfo['nsv']['NSVs']['unknown2b'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + //$ThisFileInfo['nsv']['NSVs']['unknown2c'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + //$ThisFileInfo['nsv']['NSVs']['unknown2d'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + + switch ($ThisFileInfo['nsv']['NSVs']['audio_codec']) { + case 'PCM ': + $ThisFileInfo['nsv']['NSVs']['bits_channel'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + $ThisFileInfo['nsv']['NSVs']['channels'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 1)); + $offset += 1; + $ThisFileInfo['nsv']['NSVs']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 2)); + $offset += 2; + + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['nsv']['NSVs']['sample_rate']; + break; + + case 'MP3 ': + case 'NONE': + default: + //$ThisFileInfo['nsv']['NSVs']['unknown3'] = getid3_lib::LittleEndian2Int(substr($NSVsheader, $offset, 4)); + $offset += 4; + break; + } + + $ThisFileInfo['video']['resolution_x'] = $ThisFileInfo['nsv']['NSVs']['resolution_x']; + $ThisFileInfo['video']['resolution_y'] = $ThisFileInfo['nsv']['NSVs']['resolution_y']; + $ThisFileInfo['nsv']['NSVs']['frame_rate'] = $this->NSVframerateLookup($ThisFileInfo['nsv']['NSVs']['framerate_index']); + $ThisFileInfo['video']['frame_rate'] = $ThisFileInfo['nsv']['NSVs']['frame_rate']; + $ThisFileInfo['video']['bits_per_sample'] = 24; + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + + return true; + } + + function getNSVfHeaderFilepointer(&$fd, &$ThisFileInfo, $fileoffset, $getTOCoffsets=false) { + fseek($fd, $fileoffset, SEEK_SET); + $NSVfheader = fread($fd, 28); + $offset = 0; + + $ThisFileInfo['nsv']['NSVf']['identifier'] = substr($NSVfheader, $offset, 4); + $offset += 4; + + if ($ThisFileInfo['nsv']['NSVf']['identifier'] != 'NSVf') { + $ThisFileInfo['error'][] = 'expected "NSVf" at offset ('.$fileoffset.'), found "'.$ThisFileInfo['nsv']['NSVf']['identifier'].'" instead'; + unset($ThisFileInfo['nsv']['NSVf']); + return false; + } + + $ThisFileInfo['nsv']['NSVs']['offset'] = $fileoffset; + + $ThisFileInfo['nsv']['NSVf']['header_length'] = getid3_lib::LittleEndian2Int(substr($NSVfheader, $offset, 4)); + $offset += 4; + $ThisFileInfo['nsv']['NSVf']['file_size'] = getid3_lib::LittleEndian2Int(substr($NSVfheader, $offset, 4)); + $offset += 4; + + if ($ThisFileInfo['nsv']['NSVf']['file_size'] > $ThisFileInfo['avdataend']) { + $ThisFileInfo['warning'][] = 'truncated file - NSVf header indicates '.$ThisFileInfo['nsv']['NSVf']['file_size'].' bytes, file actually '.$ThisFileInfo['avdataend'].' bytes'; + } + + $ThisFileInfo['nsv']['NSVf']['playtime_ms'] = getid3_lib::LittleEndian2Int(substr($NSVfheader, $offset, 4)); + $offset += 4; + $ThisFileInfo['nsv']['NSVf']['meta_size'] = getid3_lib::LittleEndian2Int(substr($NSVfheader, $offset, 4)); + $offset += 4; + $ThisFileInfo['nsv']['NSVf']['TOC_entries_1'] = getid3_lib::LittleEndian2Int(substr($NSVfheader, $offset, 4)); + $offset += 4; + $ThisFileInfo['nsv']['NSVf']['TOC_entries_2'] = getid3_lib::LittleEndian2Int(substr($NSVfheader, $offset, 4)); + $offset += 4; + + if ($ThisFileInfo['nsv']['NSVf']['playtime_ms'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt NSV file: NSVf.playtime_ms == zero'; + return false; + } + + $NSVfheader .= fread($fd, $ThisFileInfo['nsv']['NSVf']['meta_size'] + (4 * $ThisFileInfo['nsv']['NSVf']['TOC_entries_1']) + (4 * $ThisFileInfo['nsv']['NSVf']['TOC_entries_2'])); + $NSVfheaderlength = strlen($NSVfheader); + $ThisFileInfo['nsv']['NSVf']['metadata'] = substr($NSVfheader, $offset, $ThisFileInfo['nsv']['NSVf']['meta_size']); + $offset += $ThisFileInfo['nsv']['NSVf']['meta_size']; + + if ($getTOCoffsets) { + $TOCcounter = 0; + while ($TOCcounter < $ThisFileInfo['nsv']['NSVf']['TOC_entries_1']) { + if ($TOCcounter < $ThisFileInfo['nsv']['NSVf']['TOC_entries_1']) { + $ThisFileInfo['nsv']['NSVf']['TOC_1'][$TOCcounter] = getid3_lib::LittleEndian2Int(substr($NSVfheader, $offset, 4)); + $offset += 4; + $TOCcounter++; + } + } + } + + if (trim($ThisFileInfo['nsv']['NSVf']['metadata']) != '') { + $ThisFileInfo['nsv']['NSVf']['metadata'] = str_replace('`', "\x01", $ThisFileInfo['nsv']['NSVf']['metadata']); + $CommentPairArray = explode("\x01".' ', $ThisFileInfo['nsv']['NSVf']['metadata']); + foreach ($CommentPairArray as $CommentPair) { + if (strstr($CommentPair, '='."\x01")) { + list($key, $value) = explode('='."\x01", $CommentPair, 2); + $ThisFileInfo['nsv']['comments'][strtolower($key)][] = trim(str_replace("\x01", '', $value)); + } + } + } + + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['nsv']['NSVf']['playtime_ms'] / 1000; + $ThisFileInfo['bitrate'] = ($ThisFileInfo['nsv']['NSVf']['file_size'] * 8) / $ThisFileInfo['playtime_seconds']; + + return true; + } + + + function NSVframerateLookup($framerateindex) { + if ($framerateindex <= 127) { + return (float) $framerateindex; + } + + static $NSVframerateLookup = array(); + if (empty($NSVframerateLookup)) { + $NSVframerateLookup[129] = (float) 29.970; + $NSVframerateLookup[131] = (float) 23.976; + $NSVframerateLookup[133] = (float) 14.985; + $NSVframerateLookup[197] = (float) 59.940; + $NSVframerateLookup[199] = (float) 47.952; + } + return (isset($NSVframerateLookup[$framerateindex]) ? $NSVframerateLookup[$framerateindex] : false); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.quicktime.php b/campcaster/src/modules/getid3/var/module.audio-video.quicktime.php new file mode 100644 index 000000000..e08b9b29c --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.quicktime.php @@ -0,0 +1,1302 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.quicktime.php // +// module for analyzing Quicktime and MP3-in-MP4 files // +// dependencies: module.audio.mp3.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); + +class getid3_quicktime +{ + + function getid3_quicktime(&$fd, &$ThisFileInfo, $ReturnAtomData=true, $ParseAllPossibleAtoms=false) { + + $ThisFileInfo['fileformat'] = 'quicktime'; + $ThisFileInfo['quicktime']['hinting'] = false; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + $offset = 0; + $atomcounter = 0; + + while ($offset < $ThisFileInfo['avdataend']) { + fseek($fd, $offset, SEEK_SET); + $AtomHeader = fread($fd, 8); + + $atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4)); + $atomname = substr($AtomHeader, 4, 4); + $ThisFileInfo['quicktime'][$atomname]['name'] = $atomname; + $ThisFileInfo['quicktime'][$atomname]['size'] = $atomsize; + $ThisFileInfo['quicktime'][$atomname]['offset'] = $offset; + + if (($offset + $atomsize) > $ThisFileInfo['avdataend']) { + $ThisFileInfo['error'][] = 'Atom at offset '.$offset.' claims to go beyond end-of-file (length: '.$atomsize.' bytes)'; + return false; + } + + if ($atomsize == 0) { + // Furthermore, for historical reasons the list of atoms is optionally + // terminated by a 32-bit integer set to 0. If you are writing a program + // to read user data atoms, you should allow for the terminating 0. + break; + } + switch ($atomname) { + case 'mdat': // Media DATa atom + // 'mdat' contains the actual data for the audio/video + if (($atomsize > 8) && (!isset($ThisFileInfo['avdataend_tmp']) || ($ThisFileInfo['quicktime'][$atomname]['size'] > ($ThisFileInfo['avdataend_tmp'] - $ThisFileInfo['avdataoffset'])))) { + + $ThisFileInfo['avdataoffset'] = $ThisFileInfo['quicktime'][$atomname]['offset'] + 8; + $OldAVDataEnd = $ThisFileInfo['avdataend']; + $ThisFileInfo['avdataend'] = $ThisFileInfo['quicktime'][$atomname]['offset'] + $ThisFileInfo['quicktime'][$atomname]['size']; + + if (getid3_mp3::MPEGaudioHeaderValid(getid3_mp3::MPEGaudioHeaderDecode(fread($fd, 4)))) { + getid3_mp3::getOnlyMPEGaudioInfo($fd, $ThisFileInfo, $ThisFileInfo['avdataoffset'], false); + if (isset($ThisFileInfo['mpeg']['audio'])) { + $ThisFileInfo['audio']['dataformat'] = 'mp3'; + $ThisFileInfo['audio']['codec'] = (!empty($ThisFileInfo['mpeg']['audio']['encoder']) ? $ThisFileInfo['mpeg']['audio']['encoder'] : (!empty($ThisFileInfo['mpeg']['audio']['codec']) ? $ThisFileInfo['mpeg']['audio']['codec'] : (!empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' :'mp3'))); + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['mpeg']['audio']['channels']; + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['bitrate']; + $ThisFileInfo['audio']['bitrate_mode'] = strtolower($ThisFileInfo['mpeg']['audio']['bitrate_mode']); + $ThisFileInfo['bitrate'] = $ThisFileInfo['audio']['bitrate']; + } + } + $ThisFileInfo['avdataend'] = $OldAVDataEnd; + unset($OldAVDataEnd); + + } + break; + + case 'free': // FREE space atom + case 'skip': // SKIP atom + case 'wide': // 64-bit expansion placeholder atom + // 'free', 'skip' and 'wide' are just padding, contains no useful data at all + break; + + default: + $atomHierarchy = array(); + $ThisFileInfo['quicktime'][$atomname] = $this->QuicktimeParseAtom($atomname, $atomsize, fread($fd, $atomsize), $ThisFileInfo, $offset, $atomHierarchy, $ParseAllPossibleAtoms); + break; + } + + $offset += $atomsize; + $atomcounter++; + } + + if (!empty($ThisFileInfo['avdataend_tmp'])) { + // this value is assigned to a temp value and then erased because + // otherwise any atoms beyond the 'mdat' atom would not get parsed + $ThisFileInfo['avdataend'] = $ThisFileInfo['avdataend_tmp']; + unset($ThisFileInfo['avdataend_tmp']); + } + + if (!isset($ThisFileInfo['bitrate']) && isset($ThisFileInfo['playtime_seconds'])) { + $ThisFileInfo['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + } + if (isset($ThisFileInfo['bitrate']) && !isset($ThisFileInfo['audio']['bitrate']) && !isset($ThisFileInfo['quicktime']['video'])) { + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['bitrate']; + } + + if (($ThisFileInfo['audio']['dataformat'] == 'mp4') && empty($ThisFileInfo['video']['resolution_x'])) { + $ThisFileInfo['fileformat'] = 'mp4'; + $ThisFileInfo['mime_type'] = 'audio/mp4'; + unset($ThisFileInfo['video']['dataformat']); + } + + if (!$ReturnAtomData) { + unset($ThisFileInfo['quicktime']['moov']); + } + + if (empty($ThisFileInfo['audio']['dataformat']) && !empty($ThisFileInfo['quicktime']['audio'])) { + $ThisFileInfo['audio']['dataformat'] = 'quicktime'; + } + if (empty($ThisFileInfo['video']['dataformat']) && !empty($ThisFileInfo['quicktime']['video'])) { + $ThisFileInfo['video']['dataformat'] = 'quicktime'; + } + + return true; + } + + function QuicktimeParseAtom($atomname, $atomsize, $atomdata, &$ThisFileInfo, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { + // http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/INDEX/atomalphaindex.htm + + array_push($atomHierarchy, $atomname); + $atomstructure['hierarchy'] = implode(' ', $atomHierarchy); + $atomstructure['name'] = $atomname; + $atomstructure['size'] = $atomsize; + $atomstructure['offset'] = $baseoffset; + + switch ($atomname) { + case 'moov': // MOVie container atom + case 'trak': // TRAcK container atom + case 'clip': // CLIPping container atom + case 'matt': // track MATTe container atom + case 'edts': // EDiTS container atom + case 'tref': // Track REFerence container atom + case 'mdia': // MeDIA container atom + case 'minf': // Media INFormation container atom + case 'dinf': // Data INFormation container atom + case 'udta': // User DaTA container atom + case 'stbl': // Sample TaBLe container atom + case 'cmov': // Compressed MOVie container atom + case 'rmra': // Reference Movie Record Atom + case 'rmda': // Reference Movie Descriptor Atom + case 'gmhd': // Generic Media info HeaDer atom (seen on QTVR) + $atomstructure['subatoms'] = $this->QuicktimeParseContainerAtom($atomdata, $ThisFileInfo, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); + break; + + + case 'cpy': + case 'day': + case 'dir': + case 'ed1': + case 'ed2': + case 'ed3': + case 'ed4': + case 'ed5': + case 'ed6': + case 'ed7': + case 'ed8': + case 'ed9': + case 'fmt': + case 'inf': + case 'prd': + case 'prf': + case 'req': + case 'src': + case 'wrt': + case 'nam': + case 'cmt': + case 'wrn': + case 'hst': + case 'mak': + case 'mod': + case 'PRD': + case 'swr': + case 'aut': + case 'ART': + case 'trk': + case 'alb': + case 'com': + case 'gen': + case 'ope': + case 'url': + case 'enc': + $atomstructure['data_length'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 2)); + $atomstructure['language_id'] = getid3_lib::BigEndian2Int(substr($atomdata, 2, 2)); + $atomstructure['data'] = substr($atomdata, 4); + + $atomstructure['language'] = $this->QuicktimeLanguageLookup($atomstructure['language_id']); + if (empty($ThisFileInfo['comments']['language']) || (!in_array($atomstructure['language'], $ThisFileInfo['comments']['language']))) { + $ThisFileInfo['comments']['language'][] = $atomstructure['language']; + } + $this->CopyToAppropriateCommentsSection($atomname, $atomstructure['data'], $ThisFileInfo); + break; + + + case 'play': // auto-PLAY atom + $atomstructure['autoplay'] = (bool) getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + + $ThisFileInfo['quicktime']['autoplay'] = $atomstructure['autoplay']; + break; + + + case 'WLOC': // Window LOCation atom + $atomstructure['location_x'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 2)); + $atomstructure['location_y'] = getid3_lib::BigEndian2Int(substr($atomdata, 2, 2)); + break; + + + case 'LOOP': // LOOPing atom + case 'SelO': // play SELection Only atom + case 'AllF': // play ALL Frames atom + $atomstructure['data'] = getid3_lib::BigEndian2Int($atomdata); + break; + + + case 'name': // + case 'MCPS': // Media Cleaner PRo + case '@PRM': // adobe PReMiere version + case '@PRQ': // adobe PRemiere Quicktime version + $atomstructure['data'] = $atomdata; + break; + + + case 'cmvd': // Compressed MooV Data atom + // Code by ubergeekubergeek*tv based on information from + // http://developer.apple.com/quicktime/icefloe/dispatch012.html + $atomstructure['unCompressedSize'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 4)); + + $CompressedFileData = substr($atomdata, 4); + if ($UncompressedHeader = @gzuncompress($CompressedFileData)) { + $atomstructure['subatoms'] = $this->QuicktimeParseContainerAtom($UncompressedHeader, $ThisFileInfo, 0, $atomHierarchy, $ParseAllPossibleAtoms); + } else { + $ThisFileInfo['warning'][] = 'Error decompressing compressed MOV atom at offset '.$atomstructure['offset']; + } + break; + + + case 'dcom': // Data COMpression atom + $atomstructure['compression_id'] = $atomdata; + $atomstructure['compression_text'] = $this->QuicktimeDCOMLookup($atomdata); + break; + + + case 'rdrf': // Reference movie Data ReFerence atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); + $atomstructure['flags']['internal_data'] = (bool) ($atomstructure['flags_raw'] & 0x000001); + + $atomstructure['reference_type_name'] = substr($atomdata, 4, 4); + $atomstructure['reference_length'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 4)); + switch ($atomstructure['reference_type_name']) { + case 'url ': + $atomstructure['url'] = $this->NoNullString(substr($atomdata, 12)); + break; + + case 'alis': + $atomstructure['file_alias'] = substr($atomdata, 12); + break; + + case 'rsrc': + $atomstructure['resource_alias'] = substr($atomdata, 12); + break; + + default: + $atomstructure['data'] = substr($atomdata, 12); + break; + } + break; + + + case 'rmqu': // Reference Movie QUality atom + $atomstructure['movie_quality'] = getid3_lib::BigEndian2Int($atomdata); + break; + + + case 'rmcs': // Reference Movie Cpu Speed atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['cpu_speed_rating'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); + break; + + + case 'rmvc': // Reference Movie Version Check atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['gestalt_selector'] = substr($atomdata, 4, 4); + $atomstructure['gestalt_value_mask'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 4)); + $atomstructure['gestalt_value'] = getid3_lib::BigEndian2Int(substr($atomdata, 12, 4)); + $atomstructure['gestalt_check_type'] = getid3_lib::BigEndian2Int(substr($atomdata, 14, 2)); + break; + + + case 'rmcd': // Reference Movie Component check atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['component_type'] = substr($atomdata, 4, 4); + $atomstructure['component_subtype'] = substr($atomdata, 8, 4); + $atomstructure['component_manufacturer'] = substr($atomdata, 12, 4); + $atomstructure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 16, 4)); + $atomstructure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atomdata, 20, 4)); + $atomstructure['component_min_version'] = getid3_lib::BigEndian2Int(substr($atomdata, 24, 4)); + break; + + + case 'rmdr': // Reference Movie Data Rate atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['data_rate'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + + $atomstructure['data_rate_bps'] = $atomstructure['data_rate'] * 10; + break; + + + case 'rmla': // Reference Movie Language Atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['language_id'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); + + $atomstructure['language'] = $this->QuicktimeLanguageLookup($atomstructure['language_id']); + if (empty($ThisFileInfo['comments']['language']) || (!in_array($atomstructure['language'], $ThisFileInfo['comments']['language']))) { + $ThisFileInfo['comments']['language'][] = $atomstructure['language']; + } + break; + + + case 'rmla': // Reference Movie Language Atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['track_id'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); + break; + + + case 'ptv ': // Print To Video - defines a movie's full screen mode + // http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIV/at_ptv-_pg.htm + $atomstructure['display_size_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 2)); + $atomstructure['reserved_1'] = getid3_lib::BigEndian2Int(substr($atomdata, 2, 2)); // hardcoded: 0x0000 + $atomstructure['reserved_2'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); // hardcoded: 0x0000 + $atomstructure['slide_show_flag'] = getid3_lib::BigEndian2Int(substr($atomdata, 6, 1)); + $atomstructure['play_on_open_flag'] = getid3_lib::BigEndian2Int(substr($atomdata, 7, 1)); + + $atomstructure['flags']['play_on_open'] = (bool) $atomstructure['play_on_open_flag']; + $atomstructure['flags']['slide_show'] = (bool) $atomstructure['slide_show_flag']; + + $ptv_lookup[0] = 'normal'; + $ptv_lookup[1] = 'double'; + $ptv_lookup[2] = 'half'; + $ptv_lookup[3] = 'full'; + $ptv_lookup[4] = 'current'; + if (isset($ptv_lookup[$atomstructure['display_size_raw']])) { + $atomstructure['display_size'] = $ptv_lookup[$atomstructure['display_size_raw']]; + } else { + $ThisFileInfo['warning'][] = 'unknown "ptv " display constant ('.$atomstructure['display_size_raw'].')'; + } + break; + + + case 'stsd': // Sample Table Sample Description atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $stsdEntriesDataOffset = 8; + for ($i = 0; $i < $atomstructure['number_entries']; $i++) { + $atomstructure['sample_description_table'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atomdata, $stsdEntriesDataOffset, 4)); + $stsdEntriesDataOffset += 4; + $atomstructure['sample_description_table'][$i]['data_format'] = substr($atomdata, $stsdEntriesDataOffset, 4); + $stsdEntriesDataOffset += 4; + $atomstructure['sample_description_table'][$i]['reserved'] = getid3_lib::BigEndian2Int(substr($atomdata, $stsdEntriesDataOffset, 6)); + $stsdEntriesDataOffset += 6; + $atomstructure['sample_description_table'][$i]['reference_index'] = getid3_lib::BigEndian2Int(substr($atomdata, $stsdEntriesDataOffset, 2)); + $stsdEntriesDataOffset += 2; + $atomstructure['sample_description_table'][$i]['data'] = substr($atomdata, $stsdEntriesDataOffset, ($atomstructure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2)); + $stsdEntriesDataOffset += ($atomstructure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2); + + $atomstructure['sample_description_table'][$i]['encoder_version'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 0, 2)); + $atomstructure['sample_description_table'][$i]['encoder_revision'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 2, 2)); + $atomstructure['sample_description_table'][$i]['encoder_vendor'] = substr($atomstructure['sample_description_table'][$i]['data'], 4, 4); + + switch ($atomstructure['sample_description_table'][$i]['encoder_vendor']) { + + case "\x00\x00\x00\x00": + // audio atom + $atomstructure['sample_description_table'][$i]['audio_channels'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 8, 2)); + $atomstructure['sample_description_table'][$i]['audio_bit_depth'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 10, 2)); + $atomstructure['sample_description_table'][$i]['audio_compression_id'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 12, 2)); + $atomstructure['sample_description_table'][$i]['audio_packet_size'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 14, 2)); + $atomstructure['sample_description_table'][$i]['audio_sample_rate'] = getid3_lib::FixedPoint16_16(substr($atomstructure['sample_description_table'][$i]['data'], 16, 4)); + + switch ($atomstructure['sample_description_table'][$i]['data_format']) { + case 'mp4v': + $ThisFileInfo['fileformat'] = 'mp4'; + $ThisFileInfo['error'][] = 'This version ('.GETID3_VERSION.') of getID3() does not fully support MPEG-4 audio/video streams'; + break; + + case 'qtvr': + $ThisFileInfo['video']['dataformat'] = 'quicktimevr'; + break; + + case 'mp4a': + default: + $ThisFileInfo['quicktime']['audio']['codec'] = $this->QuicktimeAudioCodecLookup($atomstructure['sample_description_table'][$i]['data_format']); + $ThisFileInfo['quicktime']['audio']['sample_rate'] = $atomstructure['sample_description_table'][$i]['audio_sample_rate']; + $ThisFileInfo['quicktime']['audio']['channels'] = $atomstructure['sample_description_table'][$i]['audio_channels']; + $ThisFileInfo['quicktime']['audio']['bit_depth'] = $atomstructure['sample_description_table'][$i]['audio_bit_depth']; + $ThisFileInfo['audio']['codec'] = $ThisFileInfo['quicktime']['audio']['codec']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['quicktime']['audio']['sample_rate']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['quicktime']['audio']['channels']; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['quicktime']['audio']['bit_depth']; + switch ($atomstructure['sample_description_table'][$i]['data_format']) { + case 'raw ': // PCM + case 'alac': // Apple Lossless Audio Codec + $ThisFileInfo['audio']['lossless'] = true; + break; + default: + $ThisFileInfo['audio']['lossless'] = false; + break; + } + break; + } + break; + + default: + switch ($atomstructure['sample_description_table'][$i]['data_format']) { + case 'mp4s': + $ThisFileInfo['fileformat'] = 'mp4'; + break; + + default: + // video atom + $atomstructure['sample_description_table'][$i]['video_temporal_quality'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 8, 4)); + $atomstructure['sample_description_table'][$i]['video_spatial_quality'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 12, 4)); + $atomstructure['sample_description_table'][$i]['video_frame_width'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 16, 2)); + $atomstructure['sample_description_table'][$i]['video_frame_height'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 18, 2)); + $atomstructure['sample_description_table'][$i]['video_resolution_x'] = getid3_lib::FixedPoint16_16(substr($atomstructure['sample_description_table'][$i]['data'], 20, 4)); + $atomstructure['sample_description_table'][$i]['video_resolution_y'] = getid3_lib::FixedPoint16_16(substr($atomstructure['sample_description_table'][$i]['data'], 24, 4)); + $atomstructure['sample_description_table'][$i]['video_data_size'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 28, 4)); + $atomstructure['sample_description_table'][$i]['video_frame_count'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 32, 2)); + $atomstructure['sample_description_table'][$i]['video_encoder_name_len'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 34, 1)); + $atomstructure['sample_description_table'][$i]['video_encoder_name'] = substr($atomstructure['sample_description_table'][$i]['data'], 35, $atomstructure['sample_description_table'][$i]['video_encoder_name_len']); + $atomstructure['sample_description_table'][$i]['video_pixel_color_depth'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 66, 2)); + $atomstructure['sample_description_table'][$i]['video_color_table_id'] = getid3_lib::BigEndian2Int(substr($atomstructure['sample_description_table'][$i]['data'], 68, 2)); + + $atomstructure['sample_description_table'][$i]['video_pixel_color_type'] = (($atomstructure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color'); + $atomstructure['sample_description_table'][$i]['video_pixel_color_name'] = $this->QuicktimeColorNameLookup($atomstructure['sample_description_table'][$i]['video_pixel_color_depth']); + + if ($atomstructure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') { + $ThisFileInfo['quicktime']['video']['codec_fourcc'] = $atomstructure['sample_description_table'][$i]['data_format']; + $ThisFileInfo['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atomstructure['sample_description_table'][$i]['data_format']); + $ThisFileInfo['quicktime']['video']['codec'] = $atomstructure['sample_description_table'][$i]['video_encoder_name']; + $ThisFileInfo['quicktime']['video']['color_depth'] = $atomstructure['sample_description_table'][$i]['video_pixel_color_depth']; + $ThisFileInfo['quicktime']['video']['color_depth_name'] = $atomstructure['sample_description_table'][$i]['video_pixel_color_name']; + + $ThisFileInfo['video']['codec'] = $ThisFileInfo['quicktime']['video']['codec']; + $ThisFileInfo['video']['bits_per_sample'] = $ThisFileInfo['quicktime']['video']['color_depth']; + } + $ThisFileInfo['video']['lossless'] = false; + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + break; + } + break; + } + switch (strtolower($atomstructure['sample_description_table'][$i]['data_format'])) { + case 'mp4a': + $ThisFileInfo['audio']['dataformat'] = 'mp4'; + $ThisFileInfo['quicktime']['audio']['codec'] = 'mp4'; + break; + + case '3ivx': + case '3iv1': + case '3iv2': + $ThisFileInfo['video']['dataformat'] = '3ivx'; + break; + + case 'xvid': + $ThisFileInfo['video']['dataformat'] = 'xvid'; + break; + + case 'mp4v': + $ThisFileInfo['video']['dataformat'] = 'mpeg4'; + break; + + case 'divx': + case 'div1': + case 'div2': + case 'div3': + case 'div4': + case 'div5': + case 'div6': + $TDIVXileInfo['video']['dataformat'] = 'divx'; + break; + + default: + // do nothing + break; + } + unset($atomstructure['sample_description_table'][$i]['data']); + } + break; + + + case 'stts': // Sample Table Time-to-Sample atom + //if ($ParseAllPossibleAtoms) { + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $sttsEntriesDataOffset = 8; + $FrameRateCalculatorArray = array(); + for ($i = 0; $i < $atomstructure['number_entries']; $i++) { + $atomstructure['time_to_sample_table'][$i]['sample_count'] = getid3_lib::BigEndian2Int(substr($atomdata, $sttsEntriesDataOffset, 4)); + $sttsEntriesDataOffset += 4; + $atomstructure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atomdata, $sttsEntriesDataOffset, 4)); + $sttsEntriesDataOffset += 4; + + if (!empty($ThisFileInfo['quicktime']['time_scale']) && (@$atomstructure['time_to_sample_table'][$i]['sample_duration'] > 0)) { + $stts_new_framerate = $ThisFileInfo['quicktime']['time_scale'] / $atomstructure['time_to_sample_table'][$i]['sample_duration']; + if ($stts_new_framerate <= 60) { + // some atoms have durations of "1" giving a very large framerate, which probably is not right + $ThisFileInfo['video']['frame_rate'] = max(@$ThisFileInfo['video']['frame_rate'], $stts_new_framerate); + } + } + //@$FrameRateCalculatorArray[($ThisFileInfo['quicktime']['time_scale'] / $atomstructure['time_to_sample_table'][$i]['sample_duration'])] += $atomstructure['time_to_sample_table'][$i]['sample_count']; + } + //$sttsFramesTotal = 0; + //$sttsSecondsTotal = 0; + //foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) { + // if (($frames_per_second > 60) || ($frames_per_second < 1)) { + // // not video FPS information, probably audio information + // $sttsFramesTotal = 0; + // $sttsSecondsTotal = 0; + // break; + // } + // $sttsFramesTotal += $frame_count; + // $sttsSecondsTotal += $frame_count / $frames_per_second; + //} + //if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) { + // if (($sttsFramesTotal / $sttsSecondsTotal) > @$ThisFileInfo['video']['frame_rate']) { + // $ThisFileInfo['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal; + // } + //} + //} + break; + + + case 'stss': // Sample Table Sync Sample (key frames) atom + if ($ParseAllPossibleAtoms) { + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $stssEntriesDataOffset = 8; + for ($i = 0; $i < $atomstructure['number_entries']; $i++) { + $atomstructure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atomdata, $stssEntriesDataOffset, 4)); + $stssEntriesDataOffset += 4; + } + } + break; + + + case 'stsc': // Sample Table Sample-to-Chunk atom + if ($ParseAllPossibleAtoms) { + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $stscEntriesDataOffset = 8; + for ($i = 0; $i < $atomstructure['number_entries']; $i++) { + $atomstructure['sample_to_chunk_table'][$i]['first_chunk'] = getid3_lib::BigEndian2Int(substr($atomdata, $stscEntriesDataOffset, 4)); + $stscEntriesDataOffset += 4; + $atomstructure['sample_to_chunk_table'][$i]['samples_per_chunk'] = getid3_lib::BigEndian2Int(substr($atomdata, $stscEntriesDataOffset, 4)); + $stscEntriesDataOffset += 4; + $atomstructure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atomdata, $stscEntriesDataOffset, 4)); + $stscEntriesDataOffset += 4; + } + } + break; + + + case 'stsz': // Sample Table SiZe atom + if ($ParseAllPossibleAtoms) { + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['sample_size'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 4)); + $stszEntriesDataOffset = 12; + if ($atomstructure['sample_size'] == 0) { + for ($i = 0; $i < $atomstructure['number_entries']; $i++) { + $atomstructure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atomdata, $stszEntriesDataOffset, 4)); + $stszEntriesDataOffset += 4; + } + } + } + break; + + + case 'stco': // Sample Table Chunk Offset atom + if ($ParseAllPossibleAtoms) { + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $stcoEntriesDataOffset = 8; + for ($i = 0; $i < $atomstructure['number_entries']; $i++) { + $atomstructure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atomdata, $stcoEntriesDataOffset, 4)); + $stcoEntriesDataOffset += 4; + } + } + break; + + + case 'dref': // Data REFerence atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $drefDataOffset = 8; + for ($i = 0; $i < $atomstructure['number_entries']; $i++) { + $atomstructure['data_references'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atomdata, $drefDataOffset, 4)); + $drefDataOffset += 4; + $atomstructure['data_references'][$i]['type'] = substr($atomdata, $drefDataOffset, 4); + $drefDataOffset += 4; + $atomstructure['data_references'][$i]['version'] = getid3_lib::BigEndian2Int(substr($atomdata, $drefDataOffset, 1)); + $drefDataOffset += 1; + $atomstructure['data_references'][$i]['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, $drefDataOffset, 3)); // hardcoded: 0x0000 + $drefDataOffset += 3; + $atomstructure['data_references'][$i]['data'] = substr($atomdata, $drefDataOffset, ($atomstructure['data_references'][$i]['size'] - 4 - 4 - 1 - 3)); + $drefDataOffset += ($atomstructure['data_references'][$i]['size'] - 4 - 4 - 1 - 3); + + $atomstructure['data_references'][$i]['flags']['self_reference'] = (bool) ($atomstructure['data_references'][$i]['flags_raw'] & 0x001); + } + break; + + + case 'gmin': // base Media INformation atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); + $atomstructure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atomdata, 6, 2)); + $atomstructure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 2)); + $atomstructure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atomdata, 10, 2)); + $atomstructure['balance'] = getid3_lib::BigEndian2Int(substr($atomdata, 12, 2)); + $atomstructure['reserved'] = getid3_lib::BigEndian2Int(substr($atomdata, 14, 2)); + break; + + + case 'smhd': // Sound Media information HeaDer atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['balance'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); + $atomstructure['reserved'] = getid3_lib::BigEndian2Int(substr($atomdata, 6, 2)); + break; + + + case 'vmhd': // Video Media information HeaDer atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); + $atomstructure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); + $atomstructure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atomdata, 6, 2)); + $atomstructure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 2)); + $atomstructure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atomdata, 10, 2)); + + $atomstructure['flags']['no_lean_ahead'] = (bool) ($atomstructure['flags_raw'] & 0x001); + break; + + + case 'hdlr': // HanDLeR reference atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['component_type'] = substr($atomdata, 4, 4); + $atomstructure['component_subtype'] = substr($atomdata, 8, 4); + $atomstructure['component_manufacturer'] = substr($atomdata, 12, 4); + $atomstructure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 16, 4)); + $atomstructure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atomdata, 20, 4)); + $atomstructure['component_name'] = $this->Pascal2String(substr($atomdata, 24)); + + if (($atomstructure['component_subtype'] == 'STpn') && ($atomstructure['component_manufacturer'] == 'zzzz')) { + $ThisFileInfo['video']['dataformat'] = 'quicktimevr'; + } + break; + + + case 'mdhd': // MeDia HeaDer atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['creation_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $atomstructure['modify_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 4)); + $atomstructure['time_scale'] = getid3_lib::BigEndian2Int(substr($atomdata, 12, 4)); + $atomstructure['duration'] = getid3_lib::BigEndian2Int(substr($atomdata, 16, 4)); + $atomstructure['language_id'] = getid3_lib::BigEndian2Int(substr($atomdata, 20, 2)); + $atomstructure['quality'] = getid3_lib::BigEndian2Int(substr($atomdata, 22, 2)); + + if ($atomstructure['time_scale'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt Quicktime file: mdhd.time_scale == zero'; + return false; + } + $atomstructure['creation_time_unix'] = getid3_lib::DateMac2Unix($atomstructure['creation_time']); + $atomstructure['modify_time_unix'] = getid3_lib::DateMac2Unix($atomstructure['modify_time']); + $atomstructure['playtime_seconds'] = $atomstructure['duration'] / $atomstructure['time_scale']; + $atomstructure['language'] = $this->QuicktimeLanguageLookup($atomstructure['language_id']); + if (empty($ThisFileInfo['comments']['language']) || (!in_array($atomstructure['language'], $ThisFileInfo['comments']['language']))) { + $ThisFileInfo['comments']['language'][] = $atomstructure['language']; + } + break; + + + case 'pnot': // Preview atom + $atomstructure['modification_date'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 4)); // "standard Macintosh format" + $atomstructure['version_number'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); // hardcoded: 0x00 + $atomstructure['atom_type'] = substr($atomdata, 6, 4); // usually: 'PICT' + $atomstructure['atom_index'] = getid3_lib::BigEndian2Int(substr($atomdata, 10, 2)); // usually: 0x01 + + $atomstructure['modification_date_unix'] = getid3_lib::DateMac2Unix($atomstructure['modification_date']); + break; + + + case 'crgn': // Clipping ReGioN atom + $atomstructure['region_size'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 2)); // The Region size, Region boundary box, + $atomstructure['boundary_box'] = getid3_lib::BigEndian2Int(substr($atomdata, 2, 8)); // and Clipping region data fields + $atomstructure['clipping_data'] = substr($atomdata, 10); // constitute a QuickDraw region. + break; + + + case 'load': // track LOAD settings atom + $atomstructure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 4)); + $atomstructure['preload_duration'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $atomstructure['preload_flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 4)); + $atomstructure['default_hints_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 12, 4)); + + $atomstructure['default_hints']['double_buffer'] = (bool) ($atomstructure['default_hints_raw'] & 0x0020); + $atomstructure['default_hints']['high_quality'] = (bool) ($atomstructure['default_hints_raw'] & 0x0100); + break; + + + case 'tmcd': // TiMe CoDe atom + case 'chap': // CHAPter list atom + case 'sync': // SYNChronization atom + case 'scpt': // tranSCriPT atom + case 'ssrc': // non-primary SouRCe atom + for ($i = 0; $i < (strlen($atomdata) % 4); $i++) { + $atomstructure['track_id'][$i] = getid3_lib::BigEndian2Int(substr($atomdata, $i * 4, 4)); + } + break; + + + case 'elst': // Edit LiST atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['number_entries'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + for ($i = 0; $i < $atomstructure['number_entries']; $i++ ) { + $atomstructure['edit_list'][$i]['track_duration'] = getid3_lib::BigEndian2Int(substr($atomdata, 8 + ($i * 12) + 0, 4)); + $atomstructure['edit_list'][$i]['media_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 8 + ($i * 12) + 4, 4)); + $atomstructure['edit_list'][$i]['media_rate'] = getid3_lib::FixedPoint16_16(substr($atomdata, 8 + ($i * 12) + 8, 4)); + } + break; + + + case 'kmat': // compressed MATte atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); // hardcoded: 0x0000 + $atomstructure['matte_data_raw'] = substr($atomdata, 4); + break; + + + case 'ctab': // Color TABle atom + $atomstructure['color_table_seed'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 4)); // hardcoded: 0x00000000 + $atomstructure['color_table_flags'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 2)); // hardcoded: 0x8000 + $atomstructure['color_table_size'] = getid3_lib::BigEndian2Int(substr($atomdata, 6, 2)) + 1; + for ($colortableentry = 0; $colortableentry < $atomstructure['color_table_size']; $colortableentry++) { + $atomstructure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atomdata, 8 + ($colortableentry * 8) + 0, 2)); + $atomstructure['color_table'][$colortableentry]['red'] = getid3_lib::BigEndian2Int(substr($atomdata, 8 + ($colortableentry * 8) + 2, 2)); + $atomstructure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atomdata, 8 + ($colortableentry * 8) + 4, 2)); + $atomstructure['color_table'][$colortableentry]['blue'] = getid3_lib::BigEndian2Int(substr($atomdata, 8 + ($colortableentry * 8) + 6, 2)); + } + break; + + + case 'mvhd': // MoVie HeaDer atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); + $atomstructure['creation_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $atomstructure['modify_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 4)); + $atomstructure['time_scale'] = getid3_lib::BigEndian2Int(substr($atomdata, 12, 4)); + $atomstructure['duration'] = getid3_lib::BigEndian2Int(substr($atomdata, 16, 4)); + $atomstructure['preferred_rate'] = getid3_lib::FixedPoint16_16(substr($atomdata, 20, 4)); + $atomstructure['preferred_volume'] = getid3_lib::FixedPoint8_8(substr($atomdata, 24, 2)); + $atomstructure['reserved'] = substr($atomdata, 26, 10); + $atomstructure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atomdata, 36, 4)); + $atomstructure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atomdata, 40, 4)); + $atomstructure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atomdata, 44, 4)); + $atomstructure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atomdata, 48, 4)); + $atomstructure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atomdata, 52, 4)); + $atomstructure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atomdata, 56, 4)); + $atomstructure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atomdata, 60, 4)); + $atomstructure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atomdata, 64, 4)); + $atomstructure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atomdata, 68, 4)); + $atomstructure['preview_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 72, 4)); + $atomstructure['preview_duration'] = getid3_lib::BigEndian2Int(substr($atomdata, 76, 4)); + $atomstructure['poster_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 80, 4)); + $atomstructure['selection_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 84, 4)); + $atomstructure['selection_duration'] = getid3_lib::BigEndian2Int(substr($atomdata, 88, 4)); + $atomstructure['current_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 92, 4)); + $atomstructure['next_track_id'] = getid3_lib::BigEndian2Int(substr($atomdata, 96, 4)); + + if ($atomstructure['time_scale'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt Quicktime file: mvhd.time_scale == zero'; + return false; + } + $atomstructure['creation_time_unix'] = getid3_lib::DateMac2Unix($atomstructure['creation_time']); + $atomstructure['modify_time_unix'] = getid3_lib::DateMac2Unix($atomstructure['modify_time']); + $ThisFileInfo['quicktime']['time_scale'] = $atomstructure['time_scale']; + $ThisFileInfo['quicktime']['display_scale'] = $atomstructure['matrix_a']; + $ThisFileInfo['playtime_seconds'] = $atomstructure['duration'] / $atomstructure['time_scale']; + break; + + + case 'tkhd': // TracK HeaDer atom + $atomstructure['version'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 1)); + $atomstructure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atomdata, 1, 3)); + $atomstructure['creation_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $atomstructure['modify_time'] = getid3_lib::BigEndian2Int(substr($atomdata, 8, 4)); + $atomstructure['trackid'] = getid3_lib::BigEndian2Int(substr($atomdata, 12, 4)); + $atomstructure['reserved1'] = getid3_lib::BigEndian2Int(substr($atomdata, 16, 4)); + $atomstructure['duration'] = getid3_lib::BigEndian2Int(substr($atomdata, 20, 4)); + $atomstructure['reserved2'] = getid3_lib::BigEndian2Int(substr($atomdata, 24, 8)); + $atomstructure['layer'] = getid3_lib::BigEndian2Int(substr($atomdata, 32, 2)); + $atomstructure['alternate_group'] = getid3_lib::BigEndian2Int(substr($atomdata, 34, 2)); + $atomstructure['volume'] = getid3_lib::FixedPoint8_8(substr($atomdata, 36, 2)); + $atomstructure['reserved3'] = getid3_lib::BigEndian2Int(substr($atomdata, 38, 2)); + $atomstructure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atomdata, 40, 4)); + $atomstructure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atomdata, 44, 4)); + $atomstructure['matrix_u'] = getid3_lib::FixedPoint16_16(substr($atomdata, 48, 4)); + $atomstructure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atomdata, 52, 4)); + $atomstructure['matrix_v'] = getid3_lib::FixedPoint16_16(substr($atomdata, 56, 4)); + $atomstructure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atomdata, 60, 4)); + $atomstructure['matrix_x'] = getid3_lib::FixedPoint2_30(substr($atomdata, 64, 4)); + $atomstructure['matrix_y'] = getid3_lib::FixedPoint2_30(substr($atomdata, 68, 4)); + $atomstructure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atomdata, 72, 4)); + $atomstructure['width'] = getid3_lib::FixedPoint16_16(substr($atomdata, 76, 4)); + $atomstructure['height'] = getid3_lib::FixedPoint16_16(substr($atomdata, 80, 4)); + + $atomstructure['flags']['enabled'] = (bool) ($atomstructure['flags_raw'] & 0x0001); + $atomstructure['flags']['in_movie'] = (bool) ($atomstructure['flags_raw'] & 0x0002); + $atomstructure['flags']['in_preview'] = (bool) ($atomstructure['flags_raw'] & 0x0004); + $atomstructure['flags']['in_poster'] = (bool) ($atomstructure['flags_raw'] & 0x0008); + $atomstructure['creation_time_unix'] = getid3_lib::DateMac2Unix($atomstructure['creation_time']); + $atomstructure['modify_time_unix'] = getid3_lib::DateMac2Unix($atomstructure['modify_time']); + + if (!isset($ThisFileInfo['video']['resolution_x']) || !isset($ThisFileInfo['video']['resolution_y'])) { + $ThisFileInfo['video']['resolution_x'] = $atomstructure['width']; + $ThisFileInfo['video']['resolution_y'] = $atomstructure['height']; + } + if ($atomstructure['flags']['enabled'] == 1) { + $ThisFileInfo['video']['resolution_x'] = max($ThisFileInfo['video']['resolution_x'], $atomstructure['width']); + $ThisFileInfo['video']['resolution_y'] = max($ThisFileInfo['video']['resolution_y'], $atomstructure['height']); + } + if (!empty($ThisFileInfo['video']['resolution_x']) && !empty($ThisFileInfo['video']['resolution_y'])) { + $ThisFileInfo['quicktime']['video']['resolution_x'] = $ThisFileInfo['video']['resolution_x']; + $ThisFileInfo['quicktime']['video']['resolution_y'] = $ThisFileInfo['video']['resolution_y']; + } else { + unset($ThisFileInfo['video']['resolution_x']); + unset($ThisFileInfo['video']['resolution_y']); + unset($ThisFileInfo['quicktime']['video']); + } + break; + + + case 'meta': // METAdata atom + // http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt + $NextTagPosition = strpos($atomdata, ''); + while ($NextTagPosition < strlen($atomdata)) { + $metaItemSize = getid3_lib::BigEndian2Int(substr($atomdata, $NextTagPosition - 4, 4)) - 4; + if ($metaItemSize == -4) { + break; + } + $metaItemRaw = substr($atomdata, $NextTagPosition, $metaItemSize); + $metaItemKey = substr($metaItemRaw, 0, 4); + $metaItemData = substr($metaItemRaw, 20); + $NextTagPosition += $metaItemSize + 4; + + $this->CopyToAppropriateCommentsSection($metaItemKey, $metaItemData, $ThisFileInfo); + } + break; + + case 'ftyp': // FileTYPe (?) atom (for MP4 it seems) + $atomstructure['signature'] = substr($atomdata, 0, 4); + $atomstructure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atomdata, 4, 4)); + $atomstructure['fourcc'] = substr($atomdata, 8, 4); + break; + + case 'mdat': // Media DATa atom + case 'free': // FREE space atom + case 'skip': // SKIP atom + case 'wide': // 64-bit expansion placeholder atom + // 'mdat' data is too big to deal with, contains no useful metadata + // 'free', 'skip' and 'wide' are just padding, contains no useful data at all + + // When writing QuickTime files, it is sometimes necessary to update an atom's size. + // It is impossible to update a 32-bit atom to a 64-bit atom since the 32-bit atom + // is only 8 bytes in size, and the 64-bit atom requires 16 bytes. Therefore, QuickTime + // puts an 8-byte placeholder atom before any atoms it may have to update the size of. + // In this way, if the atom needs to be converted from a 32-bit to a 64-bit atom, the + // placeholder atom can be overwritten to obtain the necessary 8 extra bytes. + // The placeholder atom has a type of kWideAtomPlaceholderType ( 'wide' ). + break; + + + case 'nsav': // NoSAVe atom + // http://developer.apple.com/technotes/tn/tn2038.html + $atomstructure['data'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 4)); + break; + + case 'ctyp': // Controller TYPe atom (seen on QTVR) + // http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt + // some controller names are: + // 0x00 + 'std' for linear movie + // 'none' for no controls + $atomstructure['ctyp'] = substr($atomdata, 0, 4); + switch ($atomstructure['ctyp']) { + case 'qtvr': + $ThisFileInfo['video']['dataformat'] = 'quicktimevr'; + break; + } + break; + + case 'pano': // PANOrama track (seen on QTVR) + $atomstructure['pano'] = getid3_lib::BigEndian2Int(substr($atomdata, 0, 4)); + break; + + case 'hint': // HINT track + case 'hinf': // + case 'hinv': // + case 'hnti': // + $ThisFileInfo['quicktime']['hinting'] = true; + break; + + case 'imgt': // IMaGe Track reference (kQTVRImageTrackRefType) (seen on QTVR) + for ($i = 0; $i < ($atomstructure['size'] - 8); $i += 4) { + $atomstructure['imgt'][] = getid3_lib::BigEndian2Int(substr($atomdata, $i, 4)); + } + break; + + case 'FXTC': // Something to do with Adobe After Effects (?) + case 'PrmA': + case 'code': + case 'FIEL': // this is NOT "fiel" (Field Ordering) as describe here: http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html + // Observed-but-not-handled atom types are just listed here + // to prevent warnings being generated + $atomstructure['data'] = $atomdata; + break; + + default: + $ThisFileInfo['warning'][] = 'Unknown QuickTime atom type: "'.$atomname.'" at offset '.$baseoffset; + $atomstructure['data'] = $atomdata; + break; + } + array_pop($atomHierarchy); + return $atomstructure; + } + + function QuicktimeParseContainerAtom($atomdata, &$ThisFileInfo, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { + $atomstructure = false; + $subatomoffset = 0; + $subatomcounter = 0; + if ((strlen($atomdata) == 4) && (getid3_lib::BigEndian2Int($atomdata) == 0x00000000)) { + return false; + } + while ($subatomoffset < strlen($atomdata)) { + $subatomsize = getid3_lib::BigEndian2Int(substr($atomdata, $subatomoffset + 0, 4)); + $subatomname = substr($atomdata, $subatomoffset + 4, 4); + $subatomdata = substr($atomdata, $subatomoffset + 8, $subatomsize - 8); + if ($subatomsize == 0) { + // Furthermore, for historical reasons the list of atoms is optionally + // terminated by a 32-bit integer set to 0. If you are writing a program + // to read user data atoms, you should allow for the terminating 0. + return $atomstructure; + } + + $atomstructure[$subatomcounter] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $ThisFileInfo, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms); + + $subatomoffset += $subatomsize; + $subatomcounter++; + } + return $atomstructure; + } + + + function QuicktimeLanguageLookup($languageid) { + static $QuicktimeLanguageLookup = array(); + if (empty($QuicktimeLanguageLookup)) { + $QuicktimeLanguageLookup[0] = 'English'; + $QuicktimeLanguageLookup[1] = 'French'; + $QuicktimeLanguageLookup[2] = 'German'; + $QuicktimeLanguageLookup[3] = 'Italian'; + $QuicktimeLanguageLookup[4] = 'Dutch'; + $QuicktimeLanguageLookup[5] = 'Swedish'; + $QuicktimeLanguageLookup[6] = 'Spanish'; + $QuicktimeLanguageLookup[7] = 'Danish'; + $QuicktimeLanguageLookup[8] = 'Portuguese'; + $QuicktimeLanguageLookup[9] = 'Norwegian'; + $QuicktimeLanguageLookup[10] = 'Hebrew'; + $QuicktimeLanguageLookup[11] = 'Japanese'; + $QuicktimeLanguageLookup[12] = 'Arabic'; + $QuicktimeLanguageLookup[13] = 'Finnish'; + $QuicktimeLanguageLookup[14] = 'Greek'; + $QuicktimeLanguageLookup[15] = 'Icelandic'; + $QuicktimeLanguageLookup[16] = 'Maltese'; + $QuicktimeLanguageLookup[17] = 'Turkish'; + $QuicktimeLanguageLookup[18] = 'Croatian'; + $QuicktimeLanguageLookup[19] = 'Chinese (Traditional)'; + $QuicktimeLanguageLookup[20] = 'Urdu'; + $QuicktimeLanguageLookup[21] = 'Hindi'; + $QuicktimeLanguageLookup[22] = 'Thai'; + $QuicktimeLanguageLookup[23] = 'Korean'; + $QuicktimeLanguageLookup[24] = 'Lithuanian'; + $QuicktimeLanguageLookup[25] = 'Polish'; + $QuicktimeLanguageLookup[26] = 'Hungarian'; + $QuicktimeLanguageLookup[27] = 'Estonian'; + $QuicktimeLanguageLookup[28] = 'Lettish'; + $QuicktimeLanguageLookup[28] = 'Latvian'; + $QuicktimeLanguageLookup[29] = 'Saamisk'; + $QuicktimeLanguageLookup[29] = 'Lappish'; + $QuicktimeLanguageLookup[30] = 'Faeroese'; + $QuicktimeLanguageLookup[31] = 'Farsi'; + $QuicktimeLanguageLookup[31] = 'Persian'; + $QuicktimeLanguageLookup[32] = 'Russian'; + $QuicktimeLanguageLookup[33] = 'Chinese (Simplified)'; + $QuicktimeLanguageLookup[34] = 'Flemish'; + $QuicktimeLanguageLookup[35] = 'Irish'; + $QuicktimeLanguageLookup[36] = 'Albanian'; + $QuicktimeLanguageLookup[37] = 'Romanian'; + $QuicktimeLanguageLookup[38] = 'Czech'; + $QuicktimeLanguageLookup[39] = 'Slovak'; + $QuicktimeLanguageLookup[40] = 'Slovenian'; + $QuicktimeLanguageLookup[41] = 'Yiddish'; + $QuicktimeLanguageLookup[42] = 'Serbian'; + $QuicktimeLanguageLookup[43] = 'Macedonian'; + $QuicktimeLanguageLookup[44] = 'Bulgarian'; + $QuicktimeLanguageLookup[45] = 'Ukrainian'; + $QuicktimeLanguageLookup[46] = 'Byelorussian'; + $QuicktimeLanguageLookup[47] = 'Uzbek'; + $QuicktimeLanguageLookup[48] = 'Kazakh'; + $QuicktimeLanguageLookup[49] = 'Azerbaijani'; + $QuicktimeLanguageLookup[50] = 'AzerbaijanAr'; + $QuicktimeLanguageLookup[51] = 'Armenian'; + $QuicktimeLanguageLookup[52] = 'Georgian'; + $QuicktimeLanguageLookup[53] = 'Moldavian'; + $QuicktimeLanguageLookup[54] = 'Kirghiz'; + $QuicktimeLanguageLookup[55] = 'Tajiki'; + $QuicktimeLanguageLookup[56] = 'Turkmen'; + $QuicktimeLanguageLookup[57] = 'Mongolian'; + $QuicktimeLanguageLookup[58] = 'MongolianCyr'; + $QuicktimeLanguageLookup[59] = 'Pashto'; + $QuicktimeLanguageLookup[60] = 'Kurdish'; + $QuicktimeLanguageLookup[61] = 'Kashmiri'; + $QuicktimeLanguageLookup[62] = 'Sindhi'; + $QuicktimeLanguageLookup[63] = 'Tibetan'; + $QuicktimeLanguageLookup[64] = 'Nepali'; + $QuicktimeLanguageLookup[65] = 'Sanskrit'; + $QuicktimeLanguageLookup[66] = 'Marathi'; + $QuicktimeLanguageLookup[67] = 'Bengali'; + $QuicktimeLanguageLookup[68] = 'Assamese'; + $QuicktimeLanguageLookup[69] = 'Gujarati'; + $QuicktimeLanguageLookup[70] = 'Punjabi'; + $QuicktimeLanguageLookup[71] = 'Oriya'; + $QuicktimeLanguageLookup[72] = 'Malayalam'; + $QuicktimeLanguageLookup[73] = 'Kannada'; + $QuicktimeLanguageLookup[74] = 'Tamil'; + $QuicktimeLanguageLookup[75] = 'Telugu'; + $QuicktimeLanguageLookup[76] = 'Sinhalese'; + $QuicktimeLanguageLookup[77] = 'Burmese'; + $QuicktimeLanguageLookup[78] = 'Khmer'; + $QuicktimeLanguageLookup[79] = 'Lao'; + $QuicktimeLanguageLookup[80] = 'Vietnamese'; + $QuicktimeLanguageLookup[81] = 'Indonesian'; + $QuicktimeLanguageLookup[82] = 'Tagalog'; + $QuicktimeLanguageLookup[83] = 'MalayRoman'; + $QuicktimeLanguageLookup[84] = 'MalayArabic'; + $QuicktimeLanguageLookup[85] = 'Amharic'; + $QuicktimeLanguageLookup[86] = 'Tigrinya'; + $QuicktimeLanguageLookup[87] = 'Galla'; + $QuicktimeLanguageLookup[87] = 'Oromo'; + $QuicktimeLanguageLookup[88] = 'Somali'; + $QuicktimeLanguageLookup[89] = 'Swahili'; + $QuicktimeLanguageLookup[90] = 'Ruanda'; + $QuicktimeLanguageLookup[91] = 'Rundi'; + $QuicktimeLanguageLookup[92] = 'Chewa'; + $QuicktimeLanguageLookup[93] = 'Malagasy'; + $QuicktimeLanguageLookup[94] = 'Esperanto'; + $QuicktimeLanguageLookup[128] = 'Welsh'; + $QuicktimeLanguageLookup[129] = 'Basque'; + $QuicktimeLanguageLookup[130] = 'Catalan'; + $QuicktimeLanguageLookup[131] = 'Latin'; + $QuicktimeLanguageLookup[132] = 'Quechua'; + $QuicktimeLanguageLookup[133] = 'Guarani'; + $QuicktimeLanguageLookup[134] = 'Aymara'; + $QuicktimeLanguageLookup[135] = 'Tatar'; + $QuicktimeLanguageLookup[136] = 'Uighur'; + $QuicktimeLanguageLookup[137] = 'Dzongkha'; + $QuicktimeLanguageLookup[138] = 'JavaneseRom'; + } + return (isset($QuicktimeLanguageLookup[$languageid]) ? $QuicktimeLanguageLookup[$languageid] : 'invalid'); + } + + function QuicktimeVideoCodecLookup($codecid) { + static $QuicktimeVideoCodecLookup = array(); + if (empty($QuicktimeVideoCodecLookup)) { + $QuicktimeVideoCodecLookup['3IVX'] = '3ivx MPEG-4'; + $QuicktimeVideoCodecLookup['3IV1'] = '3ivx MPEG-4 v1'; + $QuicktimeVideoCodecLookup['3IV2'] = '3ivx MPEG-4 v2'; + $QuicktimeVideoCodecLookup['avr '] = 'AVR-JPEG'; + $QuicktimeVideoCodecLookup['base'] = 'Base'; + $QuicktimeVideoCodecLookup['WRLE'] = 'BMP'; + $QuicktimeVideoCodecLookup['cvid'] = 'Cinepak'; + $QuicktimeVideoCodecLookup['clou'] = 'Cloud'; + $QuicktimeVideoCodecLookup['cmyk'] = 'CMYK'; + $QuicktimeVideoCodecLookup['yuv2'] = 'ComponentVideo'; + $QuicktimeVideoCodecLookup['yuvu'] = 'ComponentVideoSigned'; + $QuicktimeVideoCodecLookup['yuvs'] = 'ComponentVideoUnsigned'; + $QuicktimeVideoCodecLookup['dvc '] = 'DVC-NTSC'; + $QuicktimeVideoCodecLookup['dvcp'] = 'DVC-PAL'; + $QuicktimeVideoCodecLookup['dvpn'] = 'DVCPro-NTSC'; + $QuicktimeVideoCodecLookup['dvpp'] = 'DVCPro-PAL'; + $QuicktimeVideoCodecLookup['fire'] = 'Fire'; + $QuicktimeVideoCodecLookup['flic'] = 'FLC'; + $QuicktimeVideoCodecLookup['b48r'] = '48RGB'; + $QuicktimeVideoCodecLookup['gif '] = 'GIF'; + $QuicktimeVideoCodecLookup['smc '] = 'Graphics'; + $QuicktimeVideoCodecLookup['h261'] = 'H261'; + $QuicktimeVideoCodecLookup['h263'] = 'H263'; + $QuicktimeVideoCodecLookup['IV41'] = 'Indeo4'; + $QuicktimeVideoCodecLookup['jpeg'] = 'JPEG'; + $QuicktimeVideoCodecLookup['PNTG'] = 'MacPaint'; + $QuicktimeVideoCodecLookup['msvc'] = 'Microsoft Video1'; + $QuicktimeVideoCodecLookup['mjpa'] = 'Motion JPEG-A'; + $QuicktimeVideoCodecLookup['mjpb'] = 'Motion JPEG-B'; + $QuicktimeVideoCodecLookup['myuv'] = 'MPEG YUV420'; + $QuicktimeVideoCodecLookup['dmb1'] = 'OpenDML JPEG'; + $QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD'; + $QuicktimeVideoCodecLookup['8BPS'] = 'Planar RGB'; + $QuicktimeVideoCodecLookup['png '] = 'PNG'; + $QuicktimeVideoCodecLookup['qdrw'] = 'QuickDraw'; + $QuicktimeVideoCodecLookup['qdgx'] = 'QuickDrawGX'; + $QuicktimeVideoCodecLookup['raw '] = 'RAW'; + $QuicktimeVideoCodecLookup['.SGI'] = 'SGI'; + $QuicktimeVideoCodecLookup['b16g'] = '16Gray'; + $QuicktimeVideoCodecLookup['b64a'] = '64ARGB'; + $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 1'; + $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 3'; + $QuicktimeVideoCodecLookup['syv9'] = 'Sorenson YUV9'; + $QuicktimeVideoCodecLookup['tga '] = 'Targa'; + $QuicktimeVideoCodecLookup['b32a'] = '32AlphaGray'; + $QuicktimeVideoCodecLookup['tiff'] = 'TIFF'; + $QuicktimeVideoCodecLookup['path'] = 'Vector'; + $QuicktimeVideoCodecLookup['rpza'] = 'Video'; + $QuicktimeVideoCodecLookup['ripl'] = 'WaterRipple'; + $QuicktimeVideoCodecLookup['WRAW'] = 'Windows RAW'; + $QuicktimeVideoCodecLookup['y420'] = 'YUV420'; + } + return (isset($QuicktimeVideoCodecLookup[$codecid]) ? $QuicktimeVideoCodecLookup[$codecid] : ''); + } + + function QuicktimeAudioCodecLookup($codecid) { + static $QuicktimeAudioCodecLookup = array(); + if (empty($QuicktimeAudioCodecLookup)) { + $QuicktimeAudioCodecLookup['.mp3'] = 'Fraunhofer MPEG Layer-III alias'; + $QuicktimeAudioCodecLookup['aac '] = 'ISO/IEC 14496-3 AAC'; + $QuicktimeAudioCodecLookup['agsm'] = 'Apple GSM 10:1'; + $QuicktimeAudioCodecLookup['alac'] = 'Apple Lossless Audio Codec'; + $QuicktimeAudioCodecLookup['alaw'] = 'A-law 2:1'; + $QuicktimeAudioCodecLookup['conv'] = 'Sample Format'; + $QuicktimeAudioCodecLookup['dvca'] = 'DV'; + $QuicktimeAudioCodecLookup['dvi '] = 'DV 4:1'; + $QuicktimeAudioCodecLookup['eqal'] = 'Frequency Equalizer'; + $QuicktimeAudioCodecLookup['fl32'] = '32-bit Floating Point'; + $QuicktimeAudioCodecLookup['fl64'] = '64-bit Floating Point'; + $QuicktimeAudioCodecLookup['ima4'] = 'Interactive Multimedia Association 4:1'; + $QuicktimeAudioCodecLookup['in24'] = '24-bit Integer'; + $QuicktimeAudioCodecLookup['in32'] = '32-bit Integer'; + $QuicktimeAudioCodecLookup['lpc '] = 'LPC 23:1'; + $QuicktimeAudioCodecLookup['MAC3'] = 'Macintosh Audio Compression/Expansion (MACE) 3:1'; + $QuicktimeAudioCodecLookup['MAC6'] = 'Macintosh Audio Compression/Expansion (MACE) 6:1'; + $QuicktimeAudioCodecLookup['mixb'] = '8-bit Mixer'; + $QuicktimeAudioCodecLookup['mixw'] = '16-bit Mixer'; + $QuicktimeAudioCodecLookup['mp4a'] = 'ISO/IEC 14496-3 AAC'; + $QuicktimeAudioCodecLookup['MS'."\x00\x02"] = 'Microsoft ADPCM'; + $QuicktimeAudioCodecLookup['MS'."\x00\x11"] = 'DV IMA'; + $QuicktimeAudioCodecLookup['MS'."\x00\x55"] = 'Fraunhofer MPEG Layer III'; + $QuicktimeAudioCodecLookup['NONE'] = 'No Encoding'; + $QuicktimeAudioCodecLookup['Qclp'] = 'Qualcomm PureVoice'; + $QuicktimeAudioCodecLookup['QDM2'] = 'QDesign Music 2'; + $QuicktimeAudioCodecLookup['QDMC'] = 'QDesign Music 1'; + $QuicktimeAudioCodecLookup['ratb'] = '8-bit Rate'; + $QuicktimeAudioCodecLookup['ratw'] = '16-bit Rate'; + $QuicktimeAudioCodecLookup['raw '] = 'raw PCM'; + $QuicktimeAudioCodecLookup['sour'] = 'Sound Source'; + $QuicktimeAudioCodecLookup['sowt'] = 'signed/two\'s complement (Little Endian)'; + $QuicktimeAudioCodecLookup['str1'] = 'Iomega MPEG layer II'; + $QuicktimeAudioCodecLookup['str2'] = 'Iomega MPEG *layer II'; + $QuicktimeAudioCodecLookup['str3'] = 'Iomega MPEG **layer II'; + $QuicktimeAudioCodecLookup['str4'] = 'Iomega MPEG ***layer II'; + $QuicktimeAudioCodecLookup['twos'] = 'signed/two\'s complement (Big Endian)'; + $QuicktimeAudioCodecLookup['ulaw'] = 'mu-law 2:1'; + } + return (isset($QuicktimeAudioCodecLookup[$codecid]) ? $QuicktimeAudioCodecLookup[$codecid] : ''); + } + + function QuicktimeDCOMLookup($compressionid) { + static $QuicktimeDCOMLookup = array(); + if (empty($QuicktimeDCOMLookup)) { + $QuicktimeDCOMLookup['zlib'] = 'ZLib Deflate'; + $QuicktimeDCOMLookup['adec'] = 'Apple Compression'; + } + return (isset($QuicktimeDCOMLookup[$compressionid]) ? $QuicktimeDCOMLookup[$compressionid] : ''); + } + + function QuicktimeColorNameLookup($colordepthid) { + static $QuicktimeColorNameLookup = array(); + if (empty($QuicktimeColorNameLookup)) { + $QuicktimeColorNameLookup[1] = '2-color (monochrome)'; + $QuicktimeColorNameLookup[2] = '4-color'; + $QuicktimeColorNameLookup[4] = '16-color'; + $QuicktimeColorNameLookup[8] = '256-color'; + $QuicktimeColorNameLookup[16] = 'thousands (16-bit color)'; + $QuicktimeColorNameLookup[24] = 'millions (24-bit color)'; + $QuicktimeColorNameLookup[32] = 'millions+ (32-bit color)'; + $QuicktimeColorNameLookup[33] = 'black & white'; + $QuicktimeColorNameLookup[34] = '4-gray'; + $QuicktimeColorNameLookup[36] = '16-gray'; + $QuicktimeColorNameLookup[40] = '256-gray'; + } + return (isset($QuicktimeColorNameLookup[$colordepthid]) ? $QuicktimeColorNameLookup[$colordepthid] : 'invalid'); + } + + function CopyToAppropriateCommentsSection($keyname, $data, &$ThisFileInfo) { + static $handyatomtranslatorarray = array(); + if (empty($handyatomtranslatorarray)) { + $handyatomtranslatorarray['cpy'] = 'copyright'; + $handyatomtranslatorarray['day'] = 'creation_date'; + $handyatomtranslatorarray['dir'] = 'director'; + $handyatomtranslatorarray['ed1'] = 'edit1'; + $handyatomtranslatorarray['ed2'] = 'edit2'; + $handyatomtranslatorarray['ed3'] = 'edit3'; + $handyatomtranslatorarray['ed4'] = 'edit4'; + $handyatomtranslatorarray['ed5'] = 'edit5'; + $handyatomtranslatorarray['ed6'] = 'edit6'; + $handyatomtranslatorarray['ed7'] = 'edit7'; + $handyatomtranslatorarray['ed8'] = 'edit8'; + $handyatomtranslatorarray['ed9'] = 'edit9'; + $handyatomtranslatorarray['fmt'] = 'format'; + $handyatomtranslatorarray['inf'] = 'information'; + $handyatomtranslatorarray['prd'] = 'producer'; + $handyatomtranslatorarray['prf'] = 'performers'; + $handyatomtranslatorarray['req'] = 'system_requirements'; + $handyatomtranslatorarray['src'] = 'source_credit'; + $handyatomtranslatorarray['wrt'] = 'writer'; + + // http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt + $handyatomtranslatorarray['nam'] = 'title'; + $handyatomtranslatorarray['cmt'] = 'comment'; + $handyatomtranslatorarray['wrn'] = 'warning'; + $handyatomtranslatorarray['hst'] = 'host_computer'; + $handyatomtranslatorarray['mak'] = 'make'; + $handyatomtranslatorarray['mod'] = 'model'; + $handyatomtranslatorarray['PRD'] = 'product'; + $handyatomtranslatorarray['swr'] = 'software'; + $handyatomtranslatorarray['aut'] = 'author'; + $handyatomtranslatorarray['ART'] = 'artist'; + $handyatomtranslatorarray['trk'] = 'track'; + $handyatomtranslatorarray['alb'] = 'album'; + $handyatomtranslatorarray['com'] = 'comment'; + $handyatomtranslatorarray['gen'] = 'genre'; + $handyatomtranslatorarray['ope'] = 'composer'; + $handyatomtranslatorarray['url'] = 'url'; + $handyatomtranslatorarray['enc'] = 'encoder'; + } + if (isset($handyatomtranslatorarray[$keyname])) { + $ThisFileInfo['quicktime']['comments'][$handyatomtranslatorarray[$keyname]][] = $data; + } + + return true; + } + + function NoNullString($nullterminatedstring) { + // remove the single null terminator on null terminated strings + if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === "\x00") { + return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1); + } + return $nullterminatedstring; + } + + function Pascal2String($pascalstring) { + // Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string + return substr($pascalstring, 1); + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.real.php b/campcaster/src/modules/getid3/var/module.audio-video.real.php new file mode 100644 index 000000000..23c8fefc8 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.real.php @@ -0,0 +1,528 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.real.php // +// module for analyzing Real Audio/Video files // +// dependencies: module.audio-video.riff.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + +class getid3_real +{ + + function getid3_real(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'real'; + $ThisFileInfo['bitrate'] = 0; + $ThisFileInfo['playtime_seconds'] = 0; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $ChunkCounter = 0; + while (ftell($fd) < $ThisFileInfo['avdataend']) { + $ChunkData = fread($fd, 8); + $ChunkName = substr($ChunkData, 0, 4); + $ChunkSize = getid3_lib::BigEndian2Int(substr($ChunkData, 4, 4)); + + if ($ChunkName == '.ra'."\xFD") { + $ChunkData .= fread($fd, $ChunkSize - 8); + if ($this->ParseOldRAheader(substr($ChunkData, 0, 128), $ThisFileInfo['real']['old_ra_header'])) { + $ThisFileInfo['audio']['dataformat'] = 'real'; + $ThisFileInfo['audio']['lossless'] = false; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['real']['old_ra_header']['sample_rate']; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['real']['old_ra_header']['bits_per_sample']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['real']['old_ra_header']['channels']; + + $ThisFileInfo['playtime_seconds'] = 60 * ($ThisFileInfo['real']['old_ra_header']['audio_bytes'] / $ThisFileInfo['real']['old_ra_header']['bytes_per_minute']); + $ThisFileInfo['audio']['bitrate'] = 8 * ($ThisFileInfo['real']['old_ra_header']['audio_bytes'] / $ThisFileInfo['playtime_seconds']); + $ThisFileInfo['audio']['codec'] = $this->RealAudioCodecFourCClookup($ThisFileInfo['real']['old_ra_header']['fourcc'], $ThisFileInfo['audio']['bitrate']); + + foreach ($ThisFileInfo['real']['old_ra_header']['comments'] as $key => $valuearray) { + if (strlen(trim($valuearray[0])) > 0) { + $ThisFileInfo['real']['comments'][$key][] = trim($valuearray[0]); + } + } + return true; + } + $ThisFileInfo['error'][] = 'There was a problem parsing this RealAudio file. Please submit it for analysis to http://www.getid3.org/upload/ or info@getid3.org'; + unset($ThisFileInfo['bitrate']); + unset($ThisFileInfo['playtime_seconds']); + return false; + } + + // shortcut + $ThisFileInfo['real']['chunks'][$ChunkCounter] = array(); + $thisfile_real_chunks_currentchunk = &$ThisFileInfo['real']['chunks'][$ChunkCounter]; + + $thisfile_real_chunks_currentchunk['name'] = $ChunkName; + $thisfile_real_chunks_currentchunk['offset'] = ftell($fd) - 8; + $thisfile_real_chunks_currentchunk['length'] = $ChunkSize; + if (($thisfile_real_chunks_currentchunk['offset'] + $thisfile_real_chunks_currentchunk['length']) > $ThisFileInfo['avdataend']) { + $ThisFileInfo['warning'][] = 'Chunk "'.$thisfile_real_chunks_currentchunk['name'].'" at offset '.$thisfile_real_chunks_currentchunk['offset'].' claims to be '.$thisfile_real_chunks_currentchunk['length'].' bytes long, which is beyond end of file'; + return false; + } + + if ($ChunkSize > (GETID3_FREAD_BUFFER_SIZE + 8)) { + + $ChunkData .= fread($fd, GETID3_FREAD_BUFFER_SIZE - 8); + fseek($fd, $thisfile_real_chunks_currentchunk['offset'] + $ChunkSize, SEEK_SET); + + } else { + + $ChunkData .= fread($fd, $ChunkSize - 8); + + } + $offset = 8; + + switch ($ChunkName) { + + case '.RMF': // RealMedia File Header + $thisfile_real_chunks_currentchunk['object_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + switch ($thisfile_real_chunks_currentchunk['object_version']) { + + case 0: + $thisfile_real_chunks_currentchunk['file_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['headers_count'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + break; + + default: + //$ThisFileInfo['warning'][] = 'Expected .RMF-object_version to be "0", actual value is "'.$thisfile_real_chunks_currentchunk['object_version'].'" (should not be a problem)'; + break; + + } + break; + + + case 'PROP': // Properties Header + $thisfile_real_chunks_currentchunk['object_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + if ($thisfile_real_chunks_currentchunk['object_version'] == 0) { + $thisfile_real_chunks_currentchunk['max_bit_rate'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['avg_bit_rate'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['max_packet_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['avg_packet_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['num_packets'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['duration'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['preroll'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['index_offset'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['data_offset'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['num_streams'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $thisfile_real_chunks_currentchunk['flags_raw'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $ThisFileInfo['playtime_seconds'] = $thisfile_real_chunks_currentchunk['duration'] / 1000; + if ($thisfile_real_chunks_currentchunk['duration'] > 0) { + $ThisFileInfo['bitrate'] += $thisfile_real_chunks_currentchunk['avg_bit_rate']; + } + $thisfile_real_chunks_currentchunk['flags']['save_enabled'] = (bool) ($thisfile_real_chunks_currentchunk['flags_raw'] & 0x0001); + $thisfile_real_chunks_currentchunk['flags']['perfect_play'] = (bool) ($thisfile_real_chunks_currentchunk['flags_raw'] & 0x0002); + $thisfile_real_chunks_currentchunk['flags']['live_broadcast'] = (bool) ($thisfile_real_chunks_currentchunk['flags_raw'] & 0x0004); + } + break; + + case 'MDPR': // Media Properties Header + $thisfile_real_chunks_currentchunk['object_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + if ($thisfile_real_chunks_currentchunk['object_version'] == 0) { + $thisfile_real_chunks_currentchunk['stream_number'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $thisfile_real_chunks_currentchunk['max_bit_rate'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['avg_bit_rate'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['max_packet_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['avg_packet_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['start_time'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['preroll'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['duration'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['stream_name_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 1)); + $offset += 1; + $thisfile_real_chunks_currentchunk['stream_name'] = substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['stream_name_size']); + $offset += $thisfile_real_chunks_currentchunk['stream_name_size']; + $thisfile_real_chunks_currentchunk['mime_type_size'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 1)); + $offset += 1; + $thisfile_real_chunks_currentchunk['mime_type'] = substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['mime_type_size']); + $offset += $thisfile_real_chunks_currentchunk['mime_type_size']; + $thisfile_real_chunks_currentchunk['type_specific_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['type_specific_data'] = substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['type_specific_len']); + $offset += $thisfile_real_chunks_currentchunk['type_specific_len']; + + // shortcut + $thisfile_real_chunks_currentchunk_typespecificdata = &$thisfile_real_chunks_currentchunk['type_specific_data']; + + switch ($thisfile_real_chunks_currentchunk['mime_type']) { + case 'video/x-pn-realvideo': + case 'video/x-pn-multirate-realvideo': + // http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html + + // shortcut + $thisfile_real_chunks_currentchunk['video_info'] = array(); + $thisfile_real_chunks_currentchunk_videoinfo = &$thisfile_real_chunks_currentchunk['video_info']; + + $thisfile_real_chunks_currentchunk_videoinfo['dwSize'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 0, 4)); + $thisfile_real_chunks_currentchunk_videoinfo['fourcc1'] = substr($thisfile_real_chunks_currentchunk_typespecificdata, 4, 4); + $thisfile_real_chunks_currentchunk_videoinfo['fourcc2'] = substr($thisfile_real_chunks_currentchunk_typespecificdata, 8, 4); + $thisfile_real_chunks_currentchunk_videoinfo['width'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 12, 2)); + $thisfile_real_chunks_currentchunk_videoinfo['height'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 14, 2)); + $thisfile_real_chunks_currentchunk_videoinfo['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 16, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown1'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 18, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown2'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 20, 2)); + $thisfile_real_chunks_currentchunk_videoinfo['frames_per_second'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 22, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown3'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 24, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown4'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 26, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown5'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 28, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown6'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 30, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown7'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 32, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown8'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 34, 2)); + //$thisfile_real_chunks_currentchunk_videoinfo['unknown9'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 36, 2)); + + $thisfile_real_chunks_currentchunk_videoinfo['codec'] = getid3_riff::RIFFfourccLookup($thisfile_real_chunks_currentchunk_videoinfo['fourcc2']); + + $ThisFileInfo['video']['resolution_x'] = $thisfile_real_chunks_currentchunk_videoinfo['width']; + $ThisFileInfo['video']['resolution_y'] = $thisfile_real_chunks_currentchunk_videoinfo['height']; + $ThisFileInfo['video']['frame_rate'] = (float) $thisfile_real_chunks_currentchunk_videoinfo['frames_per_second']; + $ThisFileInfo['video']['codec'] = $thisfile_real_chunks_currentchunk_videoinfo['codec']; + $ThisFileInfo['video']['bits_per_sample'] = $thisfile_real_chunks_currentchunk_videoinfo['bits_per_sample']; + break; + + case 'audio/x-pn-realaudio': + case 'audio/x-pn-multirate-realaudio': + $this->ParseOldRAheader($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk['parsed_audio_data']); + + $ThisFileInfo['audio']['sample_rate'] = $thisfile_real_chunks_currentchunk['parsed_audio_data']['sample_rate']; + $ThisFileInfo['audio']['bits_per_sample'] = $thisfile_real_chunks_currentchunk['parsed_audio_data']['bits_per_sample']; + $ThisFileInfo['audio']['channels'] = $thisfile_real_chunks_currentchunk['parsed_audio_data']['channels']; + if (!empty($ThisFileInfo['audio']['dataformat'])) { + foreach ($ThisFileInfo['audio'] as $key => $value) { + if ($key != 'streams') { + $ThisFileInfo['audio']['streams'][$thisfile_real_chunks_currentchunk['stream_number']][$key] = $value; + } + } + } + break; + + case 'logical-fileinfo': + // shortcut + $thisfile_real_chunks_currentchunk['logical_fileinfo'] = array(); + $thisfile_real_chunks_currentchunk_logicalfileinfo = &$thisfile_real_chunks_currentchunk['logical_fileinfo']; + + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset = 0; + $thisfile_real_chunks_currentchunk_logicalfileinfo['logical_fileinfo_length'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4)); + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4; + + //$thisfile_real_chunks_currentchunk_logicalfileinfo['unknown1'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4)); + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4; + + $thisfile_real_chunks_currentchunk_logicalfileinfo['num_tags'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4)); + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4; + + //$thisfile_real_chunks_currentchunk_logicalfileinfo['unknown2'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4)); + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset += 4; + + //$thisfile_real_chunks_currentchunk_logicalfileinfo['d'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 1)); + + //$thisfile_real_chunks_currentchunk_logicalfileinfo['one_type'] = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 4)); + //$thisfile_real_chunks_currentchunk_logicalfileinfo_thislength = getid3_lib::BigEndian2Int(substr($thisfile_real_chunks_currentchunk_typespecificdata, 4 + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, 2)); + //$thisfile_real_chunks_currentchunk_logicalfileinfo['one'] = substr($thisfile_real_chunks_currentchunk_typespecificdata, 6 + $thisfile_real_chunks_currentchunk_logicalfileinfo_offset, $thisfile_real_chunks_currentchunk_logicalfileinfo_thislength); + //$thisfile_real_chunks_currentchunk_logicalfileinfo_offset += (6 + $thisfile_real_chunks_currentchunk_logicalfileinfo_thislength); + + break; + + } + + + if (empty($ThisFileInfo['playtime_seconds'])) { + $ThisFileInfo['playtime_seconds'] = max($ThisFileInfo['playtime_seconds'], ($thisfile_real_chunks_currentchunk['duration'] + $thisfile_real_chunks_currentchunk['start_time']) / 1000); + } + if ($thisfile_real_chunks_currentchunk['duration'] > 0) { + switch ($thisfile_real_chunks_currentchunk['mime_type']) { + case 'audio/x-pn-realaudio': + case 'audio/x-pn-multirate-realaudio': + $ThisFileInfo['audio']['bitrate'] = (isset($ThisFileInfo['audio']['bitrate']) ? $ThisFileInfo['audio']['bitrate'] : 0) + $thisfile_real_chunks_currentchunk['avg_bit_rate']; + $ThisFileInfo['audio']['codec'] = $this->RealAudioCodecFourCClookup($thisfile_real_chunks_currentchunk['parsed_audio_data']['fourcc'], $ThisFileInfo['audio']['bitrate']); + $ThisFileInfo['audio']['dataformat'] = 'real'; + $ThisFileInfo['audio']['lossless'] = false; + break; + + case 'video/x-pn-realvideo': + case 'video/x-pn-multirate-realvideo': + $ThisFileInfo['video']['bitrate'] = (isset($ThisFileInfo['video']['bitrate']) ? $ThisFileInfo['video']['bitrate'] : 0) + $thisfile_real_chunks_currentchunk['avg_bit_rate']; + $ThisFileInfo['video']['bitrate_mode'] = 'cbr'; + $ThisFileInfo['video']['dataformat'] = 'real'; + $ThisFileInfo['video']['lossless'] = false; + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + break; + + case 'audio/x-ralf-mpeg4-generic': + $ThisFileInfo['audio']['bitrate'] = (isset($ThisFileInfo['audio']['bitrate']) ? $ThisFileInfo['audio']['bitrate'] : 0) + $thisfile_real_chunks_currentchunk['avg_bit_rate']; + $ThisFileInfo['audio']['codec'] = 'RealAudio Lossless'; + $ThisFileInfo['audio']['dataformat'] = 'real'; + $ThisFileInfo['audio']['lossless'] = true; + break; + } + $ThisFileInfo['bitrate'] = (isset($ThisFileInfo['video']['bitrate']) ? $ThisFileInfo['video']['bitrate'] : 0) + (isset($ThisFileInfo['audio']['bitrate']) ? $ThisFileInfo['audio']['bitrate'] : 0); + } + } + break; + + case 'CONT': // Content Description Header (text comments) + $thisfile_real_chunks_currentchunk['object_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + if ($thisfile_real_chunks_currentchunk['object_version'] == 0) { + $thisfile_real_chunks_currentchunk['title_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $thisfile_real_chunks_currentchunk['title'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['title_len']); + $offset += $thisfile_real_chunks_currentchunk['title_len']; + + $thisfile_real_chunks_currentchunk['artist_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $thisfile_real_chunks_currentchunk['artist'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['artist_len']); + $offset += $thisfile_real_chunks_currentchunk['artist_len']; + + $thisfile_real_chunks_currentchunk['copyright_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $thisfile_real_chunks_currentchunk['copyright'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['copyright_len']); + $offset += $thisfile_real_chunks_currentchunk['copyright_len']; + + $thisfile_real_chunks_currentchunk['comment_len'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $thisfile_real_chunks_currentchunk['comment'] = (string) substr($ChunkData, $offset, $thisfile_real_chunks_currentchunk['comment_len']); + $offset += $thisfile_real_chunks_currentchunk['comment_len']; + + + $commentkeystocopy = array('title'=>'title', 'artist'=>'artist', 'copyright'=>'copyright', 'comment'=>'comment'); + foreach ($commentkeystocopy as $key => $val) { + if ($thisfile_real_chunks_currentchunk[$key]) { + $ThisFileInfo['real']['comments'][$val][] = trim($thisfile_real_chunks_currentchunk[$key]); + } + } + + } + break; + + + case 'DATA': // Data Chunk Header + // do nothing + break; + + case 'INDX': // Index Section Header + $thisfile_real_chunks_currentchunk['object_version'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + if ($thisfile_real_chunks_currentchunk['object_version'] == 0) { + $thisfile_real_chunks_currentchunk['num_indices'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + $thisfile_real_chunks_currentchunk['stream_number'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 2)); + $offset += 2; + $thisfile_real_chunks_currentchunk['next_index_header'] = getid3_lib::BigEndian2Int(substr($ChunkData, $offset, 4)); + $offset += 4; + + if ($thisfile_real_chunks_currentchunk['next_index_header'] == 0) { + // last index chunk found, ignore rest of file + break 2; + } else { + // non-last index chunk, seek to next index chunk (skipping actual index data) + fseek($fd, $thisfile_real_chunks_currentchunk['next_index_header'], SEEK_SET); + } + } + break; + + default: + $ThisFileInfo['warning'][] = 'Unhandled RealMedia chunk "'.$ChunkName.'" at offset '.$thisfile_real_chunks_currentchunk['offset']; + break; + } + $ChunkCounter++; + } + + if (!empty($ThisFileInfo['audio']['streams'])) { + $ThisFileInfo['audio']['bitrate'] = 0; + foreach ($ThisFileInfo['audio']['streams'] as $key => $valuearray) { + $ThisFileInfo['audio']['bitrate'] += $valuearray['bitrate']; + } + } + + return true; + } + + + function ParseOldRAheader($OldRAheaderData, &$ParsedArray) { + // http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html + + $ParsedArray = array(); + $ParsedArray['magic'] = substr($OldRAheaderData, 0, 4); + if ($ParsedArray['magic'] != '.ra'."\xFD") { + return false; + } + $ParsedArray['version1'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 4, 2)); + + if ($ParsedArray['version1'] < 3) { + + return false; + + } elseif ($ParsedArray['version1'] == 3) { + + $ParsedArray['fourcc1'] = '.ra3'; + $ParsedArray['bits_per_sample'] = 16; // hard-coded for old versions? + $ParsedArray['sample_rate'] = 8000; // hard-coded for old versions? + + $ParsedArray['header_size'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 6, 2)); + $ParsedArray['channels'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 8, 2)); // always 1 (?) + //$ParsedArray['unknown1'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 10, 2)); + //$ParsedArray['unknown2'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 12, 2)); + //$ParsedArray['unknown3'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 14, 2)); + $ParsedArray['bytes_per_minute'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 16, 2)); + $ParsedArray['audio_bytes'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 18, 4)); + $ParsedArray['comments_raw'] = substr($OldRAheaderData, 22, $ParsedArray['header_size'] - 22 + 1); // not including null terminator + + $commentoffset = 0; + $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1)); + $ParsedArray['comments']['title'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength); + $commentoffset += $commentlength; + + $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1)); + $ParsedArray['comments']['artist'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength); + $commentoffset += $commentlength; + + $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1)); + $ParsedArray['comments']['copyright'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength); + $commentoffset += $commentlength; + + $commentoffset++; // final null terminator (?) + $commentoffset++; // fourcc length (?) should be 4 + $ParsedArray['fourcc'] = substr($OldRAheaderData, 23 + $commentoffset, 4); + + } elseif ($ParsedArray['version1'] <= 5) { + + //$ParsedArray['unknown1'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 6, 2)); + $ParsedArray['fourcc1'] = substr($OldRAheaderData, 8, 4); + $ParsedArray['file_size'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 12, 4)); + $ParsedArray['version2'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 16, 2)); + $ParsedArray['header_size'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 18, 4)); + $ParsedArray['codec_flavor_id'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 22, 2)); + $ParsedArray['coded_frame_size'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 24, 4)); + $ParsedArray['audio_bytes'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 28, 4)); + $ParsedArray['bytes_per_minute'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 32, 4)); + //$ParsedArray['unknown5'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 36, 4)); + $ParsedArray['sub_packet_h'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 40, 2)); + $ParsedArray['frame_size'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 42, 2)); + $ParsedArray['sub_packet_size'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 44, 2)); + //$ParsedArray['unknown6'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 46, 2)); + + switch ($ParsedArray['version1']) { + + case 4: + $ParsedArray['sample_rate'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 48, 2)); + //$ParsedArray['unknown8'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 50, 2)); + $ParsedArray['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 52, 2)); + $ParsedArray['channels'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 54, 2)); + $ParsedArray['length_fourcc2'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 56, 1)); + $ParsedArray['fourcc2'] = substr($OldRAheaderData, 57, 4); + $ParsedArray['length_fourcc3'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 61, 1)); + $ParsedArray['fourcc3'] = substr($OldRAheaderData, 62, 4); + //$ParsedArray['unknown9'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 66, 1)); + //$ParsedArray['unknown10'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 67, 2)); + $ParsedArray['comments_raw'] = substr($OldRAheaderData, 69, $ParsedArray['header_size'] - 69 + 16); + + $commentoffset = 0; + $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1)); + $ParsedArray['comments']['title'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength); + $commentoffset += $commentlength; + + $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1)); + $ParsedArray['comments']['artist'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength); + $commentoffset += $commentlength; + + $commentlength = getid3_lib::BigEndian2Int(substr($ParsedArray['comments_raw'], $commentoffset++, 1)); + $ParsedArray['comments']['copyright'][] = substr($ParsedArray['comments_raw'], $commentoffset, $commentlength); + $commentoffset += $commentlength; + break; + + case 5: + $ParsedArray['sample_rate'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 48, 4)); + $ParsedArray['sample_rate2'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 52, 4)); + $ParsedArray['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 56, 4)); + $ParsedArray['channels'] = getid3_lib::BigEndian2Int(substr($OldRAheaderData, 60, 2)); + $ParsedArray['genr'] = substr($OldRAheaderData, 62, 4); + $ParsedArray['fourcc3'] = substr($OldRAheaderData, 66, 4); + $ParsedArray['comments'] = array(); + break; + } + $ParsedArray['fourcc'] = $ParsedArray['fourcc3']; + + } + foreach ($ParsedArray['comments'] as $key => $value) { + if ($ParsedArray['comments'][$key][0] === false) { + $ParsedArray['comments'][$key][0] = ''; + } + } + + return true; + } + + function RealAudioCodecFourCClookup($fourcc, $bitrate) { + static $RealAudioCodecFourCClookup = array(); + if (empty($RealAudioCodecFourCClookup)) { + // http://www.its.msstate.edu/net/real/reports/config/tags.stats + // http://www.freelists.org/archives/matroska-devel/06-2003/fullthread18.html + + $RealAudioCodecFourCClookup['14_4'][8000] = 'RealAudio v2 (14.4kbps)'; + $RealAudioCodecFourCClookup['14.4'][8000] = 'RealAudio v2 (14.4kbps)'; + $RealAudioCodecFourCClookup['lpcJ'][8000] = 'RealAudio v2 (14.4kbps)'; + $RealAudioCodecFourCClookup['28_8'][15200] = 'RealAudio v2 (28.8kbps)'; + $RealAudioCodecFourCClookup['28.8'][15200] = 'RealAudio v2 (28.8kbps)'; + $RealAudioCodecFourCClookup['sipr'][4933] = 'RealAudio v4 (5kbps Voice)'; + $RealAudioCodecFourCClookup['sipr'][6444] = 'RealAudio v4 (6.5kbps Voice)'; + $RealAudioCodecFourCClookup['sipr'][8444] = 'RealAudio v4 (8.5kbps Voice)'; + $RealAudioCodecFourCClookup['sipr'][16000] = 'RealAudio v4 (16kbps Wideband)'; + $RealAudioCodecFourCClookup['dnet'][8000] = 'RealAudio v3 (8kbps Music)'; + $RealAudioCodecFourCClookup['dnet'][16000] = 'RealAudio v3 (16kbps Music Low Response)'; + $RealAudioCodecFourCClookup['dnet'][15963] = 'RealAudio v3 (16kbps Music Mid/High Response)'; + $RealAudioCodecFourCClookup['dnet'][20000] = 'RealAudio v3 (20kbps Music Stereo)'; + $RealAudioCodecFourCClookup['dnet'][32000] = 'RealAudio v3 (32kbps Music Mono)'; + $RealAudioCodecFourCClookup['dnet'][31951] = 'RealAudio v3 (32kbps Music Stereo)'; + $RealAudioCodecFourCClookup['dnet'][39965] = 'RealAudio v3 (40kbps Music Mono)'; + $RealAudioCodecFourCClookup['dnet'][40000] = 'RealAudio v3 (40kbps Music Stereo)'; + $RealAudioCodecFourCClookup['dnet'][79947] = 'RealAudio v3 (80kbps Music Mono)'; + $RealAudioCodecFourCClookup['dnet'][80000] = 'RealAudio v3 (80kbps Music Stereo)'; + + $RealAudioCodecFourCClookup['dnet'][0] = 'RealAudio v3'; + $RealAudioCodecFourCClookup['sipr'][0] = 'RealAudio v4'; + $RealAudioCodecFourCClookup['cook'][0] = 'RealAudio G2'; + $RealAudioCodecFourCClookup['atrc'][0] = 'RealAudio 8'; + } + $roundbitrate = intval(round($bitrate)); + if (isset($RealAudioCodecFourCClookup[$fourcc][$roundbitrate])) { + return $RealAudioCodecFourCClookup[$fourcc][$roundbitrate]; + } elseif (isset($RealAudioCodecFourCClookup[$fourcc][0])) { + return $RealAudioCodecFourCClookup[$fourcc][0]; + } + return $fourcc; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.riff.php b/campcaster/src/modules/getid3/var/module.audio-video.riff.php new file mode 100644 index 000000000..f32dab4ea --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.riff.php @@ -0,0 +1,1995 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.riff.php // +// module for analyzing RIFF files // +// multiple formats supported by this module: // +// Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX // +// dependencies: module.audio.mp3.php // +// module.audio.ac3.php (optional) // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); + +class getid3_riff +{ + + function getid3_riff(&$fd, &$ThisFileInfo) { + + // initialize these values to an empty array, otherwise they default to NULL + // and you can't append array values to a NULL value + $ThisFileInfo['riff'] = array('raw'=>array()); + + // Shortcuts + $thisfile_riff = &$ThisFileInfo['riff']; + $thisfile_riff_raw = &$thisfile_riff['raw']; + $thisfile_audio = &$ThisFileInfo['audio']; + $thisfile_video = &$ThisFileInfo['video']; + $thisfile_avdataoffset = &$ThisFileInfo['avdataoffset']; + $thisfile_avdataend = &$ThisFileInfo['avdataend']; + $thisfile_audio_dataformat = &$thisfile_audio['dataformat']; + $thisfile_riff_audio = &$thisfile_riff['audio']; + $thisfile_riff_video = &$thisfile_riff['video']; + + + $Original['avdataoffset'] = $thisfile_avdataoffset; + $Original['avdataend'] = $thisfile_avdataend; + + fseek($fd, $thisfile_avdataoffset, SEEK_SET); + $RIFFheader = fread($fd, 12); + $RIFFsubtype = substr($RIFFheader, 8, 4); + switch (substr($RIFFheader, 0, 4)) { + case 'FORM': + $ThisFileInfo['fileformat'] = 'aiff'; + $RIFFheaderSize = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($RIFFheader, 4, 4)); + $thisfile_riff[$RIFFsubtype] = getid3_riff::ParseRIFF($fd, $thisfile_avdataoffset + 12, $thisfile_avdataoffset + $RIFFheaderSize, $ThisFileInfo); + $thisfile_riff['header_size'] = $RIFFheaderSize; + break; + + case 'RIFF': + case 'SDSS': // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com) + case 'RMP3': // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s + if ($RIFFsubtype == 'RMP3') { + // RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s + $RIFFsubtype = 'WAVE'; + } + + $ThisFileInfo['fileformat'] = 'riff'; + $RIFFheaderSize = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($RIFFheader, 4, 4)); + $thisfile_riff[$RIFFsubtype] = getid3_riff::ParseRIFF($fd, $thisfile_avdataoffset + 12, $thisfile_avdataoffset + $RIFFheaderSize, $ThisFileInfo); + $thisfile_riff['header_size'] = $RIFFheaderSize; + if ($RIFFsubtype == 'WAVE') { + $thisfile_riff_WAVE = &$thisfile_riff['WAVE']; + } + break; + + default: + $ThisFileInfo['error'][] = 'Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead'; + unset($ThisFileInfo['fileformat']); + return false; + break; + } + + $streamindex = 0; + switch ($RIFFsubtype) { + case 'WAVE': + if (empty($thisfile_audio['bitrate_mode'])) { + $thisfile_audio['bitrate_mode'] = 'cbr'; + } + if (empty($thisfile_audio_dataformat)) { + $thisfile_audio_dataformat = 'wav'; + } + + if (isset($thisfile_riff_WAVE['data'][0]['offset'])) { + $thisfile_avdataoffset = $thisfile_riff_WAVE['data'][0]['offset'] + 8; + $thisfile_avdataend = $thisfile_avdataoffset + $thisfile_riff_WAVE['data'][0]['size']; + } + if (isset($thisfile_riff_WAVE['fmt '][0]['data'])) { + + $thisfile_riff_audio[$streamindex] = getid3_riff::RIFFparseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']); + $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; + if (@$thisfile_riff_audio[$streamindex]['bitrate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt RIFF file: bitrate_audio == zero'; + return false; + } + $thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw']; + unset($thisfile_riff_audio[$streamindex]['raw']); + $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; + + $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); + if (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') { + $ThisFileInfo['warning'][] = 'Audio codec = '.$thisfile_audio['codec']; + } + $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; + + $ThisFileInfo['playtime_seconds'] = (float) ((($thisfile_avdataend - $thisfile_avdataoffset) * 8) / $thisfile_audio['bitrate']); + + $thisfile_audio['lossless'] = false; + if (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { + switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { + + case 0x0001: // PCM + $thisfile_audio['lossless'] = true; + break; + + case 0x2000: // AC-3 + $thisfile_audio_dataformat = 'ac3'; + break; + + default: + // do nothing + break; + + } + } + $thisfile_audio['streams'][$streamindex]['wformattag'] = $thisfile_audio['wformattag']; + $thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; + $thisfile_audio['streams'][$streamindex]['lossless'] = $thisfile_audio['lossless']; + $thisfile_audio['streams'][$streamindex]['dataformat'] = $thisfile_audio_dataformat; + } + + if (isset($thisfile_riff_WAVE['rgad'][0]['data'])) { + + // shortcuts + $rgadData = &$thisfile_riff_WAVE['rgad'][0]['data']; + $thisfile_riff_raw['rgad'] = array('track'=>array(), 'album'=>array()); + $thisfile_riff_raw_rgad = &$thisfile_riff_raw['rgad']; + $thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track']; + $thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album']; + + $thisfile_riff_raw_rgad['fPeakAmplitude'] = getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4)); + $thisfile_riff_raw_rgad['nRadioRgAdjust'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($rgadData, 4, 2)); + $thisfile_riff_raw_rgad['nAudiophileRgAdjust'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($rgadData, 6, 2)); + + $nRadioRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT); + $nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT); + $thisfile_riff_raw_rgad_track['name'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3)); + $thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3)); + $thisfile_riff_raw_rgad_track['signbit'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1)); + $thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9)); + $thisfile_riff_raw_rgad_album['name'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3)); + $thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3)); + $thisfile_riff_raw_rgad_album['signbit'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1)); + $thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9)); + + $thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude']; + if (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) { + $thisfile_riff['rgad']['track']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']); + $thisfile_riff['rgad']['track']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']); + $thisfile_riff['rgad']['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']); + } + if (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) { + $thisfile_riff['rgad']['album']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']); + $thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']); + $thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']); + } + } + + if (isset($thisfile_riff_WAVE['fact'][0]['data'])) { + $thisfile_riff_raw['fact']['NumberOfSamples'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4)); + + // This should be a good way of calculating exact playtime, + // but some sample files have had incorrect number of samples, + // so cannot use this method + + // if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) { + // $ThisFileInfo['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec']; + // } + } + if (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) { + $thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8); + } + + if (isset($thisfile_riff_WAVE['bext'][0]['data'])) { + // shortcut + $thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0]; + + $thisfile_riff_WAVE_bext_0['title'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 0, 256)); + $thisfile_riff_WAVE_bext_0['author'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 256, 32)); + $thisfile_riff_WAVE_bext_0['reference'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 288, 32)); + $thisfile_riff_WAVE_bext_0['origin_date'] = substr($thisfile_riff_WAVE_bext_0['data'], 320, 10); + $thisfile_riff_WAVE_bext_0['origin_time'] = substr($thisfile_riff_WAVE_bext_0['data'], 330, 8); + $thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338, 8)); + $thisfile_riff_WAVE_bext_0['bwf_version'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346, 1)); + $thisfile_riff_WAVE_bext_0['reserved'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 347, 254)); + $thisfile_riff_WAVE_bext_0['coding_history'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601))); + + $thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime( + substr($thisfile_riff_WAVE_bext_0['origin_time'], 0, 2), + substr($thisfile_riff_WAVE_bext_0['origin_time'], 3, 2), + substr($thisfile_riff_WAVE_bext_0['origin_time'], 6, 2), + substr($thisfile_riff_WAVE_bext_0['origin_date'], 5, 2), + substr($thisfile_riff_WAVE_bext_0['origin_date'], 8, 2), + substr($thisfile_riff_WAVE_bext_0['origin_date'], 0, 4)); + + $thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author']; + $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_bext_0['title']; + } + + if (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) { + // shortcut + $thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0]; + + $thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2)); + $thisfile_riff_WAVE_MEXT_0['flags']['homogenous'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001); + if ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) { + $thisfile_riff_WAVE_MEXT_0['flags']['padding'] = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true; + $thisfile_riff_WAVE_MEXT_0['flags']['22_or_44'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004); + $thisfile_riff_WAVE_MEXT_0['flags']['free_format'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008); + + $thisfile_riff_WAVE_MEXT_0['nominal_frame_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2)); + } + $thisfile_riff_WAVE_MEXT_0['anciliary_data_length'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2)); + $thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2)); + $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001); + $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002); + $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004); + } + + if (isset($thisfile_riff_WAVE['cart'][0]['data'])) { + // shortcut + $thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0]; + + $thisfile_riff_WAVE_cart_0['version'] = substr($thisfile_riff_WAVE_cart_0['data'], 0, 4); + $thisfile_riff_WAVE_cart_0['title'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 4, 64)); + $thisfile_riff_WAVE_cart_0['artist'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 68, 64)); + $thisfile_riff_WAVE_cart_0['cut_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 132, 64)); + $thisfile_riff_WAVE_cart_0['client_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 196, 64)); + $thisfile_riff_WAVE_cart_0['category'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 260, 64)); + $thisfile_riff_WAVE_cart_0['classification'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 324, 64)); + $thisfile_riff_WAVE_cart_0['out_cue'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 388, 64)); + $thisfile_riff_WAVE_cart_0['start_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 452, 10)); + $thisfile_riff_WAVE_cart_0['start_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 462, 8)); + $thisfile_riff_WAVE_cart_0['end_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 470, 10)); + $thisfile_riff_WAVE_cart_0['end_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 480, 8)); + $thisfile_riff_WAVE_cart_0['producer_app_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 488, 64)); + $thisfile_riff_WAVE_cart_0['producer_app_version'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 552, 64)); + $thisfile_riff_WAVE_cart_0['user_defined_text'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 616, 64)); + $thisfile_riff_WAVE_cart_0['zero_db_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 680, 4), true); + for ($i = 0; $i < 8; $i++) { + $thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] = substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4); + $thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4)); + } + $thisfile_riff_WAVE_cart_0['url'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 748, 1024)); + $thisfile_riff_WAVE_cart_0['tag_text'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772))); + + $thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist']; + $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_cart_0['title']; + } + + if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) { + $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; + $ThisFileInfo['playtime_seconds'] = (float) ((($thisfile_avdataend - $thisfile_avdataoffset) * 8) / $thisfile_audio['bitrate']); + } + + if (!empty($ThisFileInfo['wavpack'])) { + $thisfile_audio_dataformat = 'wavpack'; + $thisfile_audio['bitrate_mode'] = 'vbr'; + $thisfile_audio['encoder'] = 'WavPack v'.$ThisFileInfo['wavpack']['version']; + + // Reset to the way it was - RIFF parsing will have messed this up + $thisfile_avdataend = $Original['avdataend']; + $thisfile_audio['bitrate'] = (($thisfile_avdataend - $thisfile_avdataoffset) * 8) / $ThisFileInfo['playtime_seconds']; + + fseek($fd, $thisfile_avdataoffset - 44, SEEK_SET); + $RIFFdata = fread($fd, 44); + $OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 4, 4)) + 8; + $OrignalRIFFdataSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44; + + if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) { + $thisfile_avdataend -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize); + fseek($fd, $thisfile_avdataend, SEEK_SET); + $RIFFdata .= fread($fd, $OrignalRIFFheaderSize - $OrignalRIFFdataSize); + } + + // move the data chunk after all other chunks (if any) + // so that the RIFF parser doesn't see EOF when trying + // to skip over the data chunk + $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8); + getid3_riff::ParseRIFFdata($RIFFdata, $ThisFileInfo); + } + + if (isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { + switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { + case 0x08AE: // ClearJump LiteWave + $thisfile_audio['bitrate_mode'] = 'vbr'; + $thisfile_audio_dataformat = 'litewave'; + + //typedef struct tagSLwFormat { + // WORD m_wCompFormat; // low byte defines compression method, high byte is compression flags + // DWORD m_dwScale; // scale factor for lossy compression + // DWORD m_dwBlockSize; // number of samples in encoded blocks + // WORD m_wQuality; // alias for the scale factor + // WORD m_wMarkDistance; // distance between marks in bytes + // WORD m_wReserved; + // + // //following paramters are ignored if CF_FILESRC is not set + // DWORD m_dwOrgSize; // original file size in bytes + // WORD m_bFactExists; // indicates if 'fact' chunk exists in the original file + // DWORD m_dwRiffChunkSize; // riff chunk size in the original file + // + // PCMWAVEFORMAT m_OrgWf; // original wave format + // }SLwFormat, *PSLwFormat; + + // shortcut + $thisfile_riff['litewave']['raw'] = array(); + $thisfile_riff_litewave = &$thisfile_riff['litewave']; + $thisfile_riff_litewave_raw = &$thisfile_riff_litewave['raw']; + + $thisfile_riff_litewave_raw['compression_method'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 18, 1)); + $thisfile_riff_litewave_raw['compression_flags'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 19, 1)); + $thisfile_riff_litewave_raw['m_dwScale'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 20, 4)); + $thisfile_riff_litewave_raw['m_dwBlockSize'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 24, 4)); + $thisfile_riff_litewave_raw['m_wQuality'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 28, 2)); + $thisfile_riff_litewave_raw['m_wMarkDistance'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 30, 2)); + $thisfile_riff_litewave_raw['m_wReserved'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 32, 2)); + $thisfile_riff_litewave_raw['m_dwOrgSize'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 34, 4)); + $thisfile_riff_litewave_raw['m_bFactExists'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 38, 2)); + $thisfile_riff_litewave_raw['m_dwRiffChunkSize'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 40, 4)); + + //$thisfile_riff_litewave['quality_factor'] = intval(round((2000 - $thisfile_riff_litewave_raw['m_dwScale']) / 20)); + $thisfile_riff_litewave['quality_factor'] = $thisfile_riff_litewave_raw['m_wQuality']; + + $thisfile_riff_litewave['flags']['raw_source'] = ($thisfile_riff_litewave_raw['compression_flags'] & 0x01) ? false : true; + $thisfile_riff_litewave['flags']['vbr_blocksize'] = ($thisfile_riff_litewave_raw['compression_flags'] & 0x02) ? false : true; + $thisfile_riff_litewave['flags']['seekpoints'] = (bool) ($thisfile_riff_litewave_raw['compression_flags'] & 0x04); + + $thisfile_audio['lossless'] = (($thisfile_riff_litewave_raw['m_wQuality'] == 100) ? true : false); + $thisfile_audio['encoder_options'] = '-q'.$thisfile_riff_litewave['quality_factor']; + break; + + default: + break; + } + } + if ($thisfile_avdataend > $ThisFileInfo['filesize']) { + switch (@$thisfile_audio_dataformat) { + case 'wavpack': // WavPack + case 'lpac': // LPAC + case 'ofr': // OptimFROG + case 'ofs': // OptimFROG DualStream + // lossless compressed audio formats that keep original RIFF headers - skip warning + break; + + case 'litewave': + if (($thisfile_avdataend - $ThisFileInfo['filesize']) == 1) { + // LiteWave appears to incorrectly *not* pad actual output file + // to nearest WORD boundary so may appear to be short by one + // byte, in which case - skip warning + } else { + // Short by more than one byte, throw warning + $ThisFileInfo['warning'][] = 'Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($ThisFileInfo['filesize'] - $thisfile_avdataoffset).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($ThisFileInfo['filesize'] - $thisfile_avdataoffset)).' bytes)'; + $thisfile_avdataend = $ThisFileInfo['filesize']; + } + break; + + default: + if ((($thisfile_avdataend - $ThisFileInfo['filesize']) == 1) && (($thisfile_riff[$RIFFsubtype]['data'][0]['size'] % 2) == 0) && ((($ThisFileInfo['filesize'] - $thisfile_avdataoffset) % 2) == 1)) { + // output file appears to be incorrectly *not* padded to nearest WORD boundary + // Output less severe warning + $ThisFileInfo['warning'][] = 'File should probably be padded to nearest WORD boundary, but it is not (expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($ThisFileInfo['filesize'] - $thisfile_avdataoffset).' therefore short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($ThisFileInfo['filesize'] - $thisfile_avdataoffset)).' bytes)'; + $thisfile_avdataend = $ThisFileInfo['filesize']; + break; + } + // Short by more than one byte, throw warning + $ThisFileInfo['warning'][] = 'Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($ThisFileInfo['filesize'] - $thisfile_avdataoffset).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($ThisFileInfo['filesize'] - $thisfile_avdataoffset)).' bytes)'; + $thisfile_avdataend = $ThisFileInfo['filesize']; + break; + } + } + if (!empty($ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes'])) { + if ((($thisfile_avdataend - $thisfile_avdataoffset) - $ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes']) == 1) { + $thisfile_avdataend--; + $ThisFileInfo['warning'][] = 'Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'; + } + } + if (@$thisfile_audio_dataformat == 'ac3') { + unset($thisfile_audio['bits_per_sample']); + if (!empty($ThisFileInfo['ac3']['bitrate']) && ($ThisFileInfo['ac3']['bitrate'] != $thisfile_audio['bitrate'])) { + $thisfile_audio['bitrate'] = $ThisFileInfo['ac3']['bitrate']; + } + } + break; + + case 'AVI ': + $thisfile_video['bitrate_mode'] = 'vbr'; // maybe not, but probably + $thisfile_video['dataformat'] = 'avi'; + $ThisFileInfo['mime_type'] = 'video/avi'; + + if (isset($thisfile_riff[$RIFFsubtype]['movi']['offset'])) { + $thisfile_avdataoffset = $thisfile_riff[$RIFFsubtype]['movi']['offset'] + 8; + $thisfile_avdataend = $thisfile_avdataoffset + $thisfile_riff[$RIFFsubtype]['movi']['size']; + if ($thisfile_avdataend > $ThisFileInfo['filesize']) { + $ThisFileInfo['warning'][] = 'Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['movi']['size'].' bytes of data, only found '.($ThisFileInfo['filesize'] - $thisfile_avdataoffset).' (short by '.($thisfile_riff[$RIFFsubtype]['movi']['size'] - ($ThisFileInfo['filesize'] - $thisfile_avdataoffset)).' bytes)'; + $thisfile_avdataend = $ThisFileInfo['filesize']; + } + } + + if (isset($thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'])) { + $avihData = $thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data']; + + // shortcut + $thisfile_riff_raw['avih'] = array(); + $thisfile_riff_raw_avih = &$thisfile_riff_raw['avih']; + + $thisfile_riff_raw_avih['dwMicroSecPerFrame'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 0, 4)); // frame display rate (or 0L) + if ($thisfile_riff_raw_avih['dwMicroSecPerFrame'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt RIFF file: avih.dwMicroSecPerFrame == zero'; + return false; + } + $thisfile_riff_raw_avih['dwMaxBytesPerSec'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 4, 4)); // max. transfer rate + $thisfile_riff_raw_avih['dwPaddingGranularity'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 8, 4)); // pad to multiples of this size; normally 2K. + $thisfile_riff_raw_avih['dwFlags'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 12, 4)); // the ever-present flags + $thisfile_riff_raw_avih['dwTotalFrames'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 16, 4)); // # frames in file + $thisfile_riff_raw_avih['dwInitialFrames'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 20, 4)); + $thisfile_riff_raw_avih['dwStreams'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 24, 4)); + $thisfile_riff_raw_avih['dwSuggestedBufferSize'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 28, 4)); + $thisfile_riff_raw_avih['dwWidth'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 32, 4)); + $thisfile_riff_raw_avih['dwHeight'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 36, 4)); + $thisfile_riff_raw_avih['dwScale'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 40, 4)); + $thisfile_riff_raw_avih['dwRate'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 44, 4)); + $thisfile_riff_raw_avih['dwStart'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 48, 4)); + $thisfile_riff_raw_avih['dwLength'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($avihData, 52, 4)); + + $thisfile_riff_raw_avih['flags']['hasindex'] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & 0x00000010); + $thisfile_riff_raw_avih['flags']['mustuseindex'] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & 0x00000020); + $thisfile_riff_raw_avih['flags']['interleaved'] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & 0x00000100); + $thisfile_riff_raw_avih['flags']['trustcktype'] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & 0x00000800); + $thisfile_riff_raw_avih['flags']['capturedfile'] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & 0x00010000); + $thisfile_riff_raw_avih['flags']['copyrighted'] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & 0x00020010); + + // shortcut + $thisfile_riff_video[$streamindex] = array(); + $thisfile_riff_video_current = &$thisfile_riff_video[$streamindex]; + + if ($thisfile_riff_raw_avih['dwWidth'] > 0) { + $thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth']; + $thisfile_video['resolution_x'] = $thisfile_riff_video_current['frame_width']; + } + if ($thisfile_riff_raw_avih['dwHeight'] > 0) { + $thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight']; + $thisfile_video['resolution_y'] = $thisfile_riff_video_current['frame_height']; + } + if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) { + $thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames']; + $thisfile_video['total_frames'] = $thisfile_riff_video_current['total_frames']; + } + + $thisfile_riff_video_current['frame_rate'] = round(1000000 / $thisfile_riff_raw_avih['dwMicroSecPerFrame'], 3); + $thisfile_video['frame_rate'] = $thisfile_riff_video_current['frame_rate']; + } + if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) { + if (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) { + for ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) { + if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) { + $strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data']; + $strhfccType = substr($strhData, 0, 4); + + if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) { + $strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data']; + + // shortcut + $thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex]; + + switch ($strhfccType) { + case 'auds': + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio_dataformat = 'wav'; + if (isset($thisfile_riff_audio) && is_array($thisfile_riff_audio)) { + $streamindex = count($thisfile_riff_audio); + } + + $thisfile_riff_audio[$streamindex] = getid3_riff::RIFFparseWAVEFORMATex($strfData); + $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; + + // shortcut + $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; + $thisfile_audio_streams_currentstream = &$thisfile_audio['streams'][$streamindex]; + + if ($thisfile_audio_streams_currentstream['bits_per_sample'] == 0) { + unset($thisfile_audio_streams_currentstream['bits_per_sample']); + } + $thisfile_audio_streams_currentstream['wformattag'] = $thisfile_audio_streams_currentstream['raw']['wFormatTag']; + unset($thisfile_audio_streams_currentstream['raw']); + + // shortcut + $thisfile_riff_raw['strf'][$strhfccType][$streamindex] = $thisfile_riff_audio[$streamindex]['raw']; + + unset($thisfile_riff_audio[$streamindex]['raw']); + $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); + + $thisfile_audio['lossless'] = false; + switch ($thisfile_riff_raw_strf_strhfccType_streamindex['wFormatTag']) { + case 0x0001: // PCM + $thisfile_audio_dataformat = 'wav'; + $thisfile_audio['lossless'] = true; + break; + + case 0x0050: // MPEG Layer 2 or Layer 1 + $thisfile_audio_dataformat = 'mp2'; // Assume Layer-2 + break; + + case 0x0055: // MPEG Layer 3 + $thisfile_audio_dataformat = 'mp3'; + break; + + case 0x00FF: // AAC + $thisfile_audio_dataformat = 'aac'; + break; + + case 0x0161: // Windows Media v7 / v8 / v9 + case 0x0162: // Windows Media Professional v9 + case 0x0163: // Windows Media Lossess v9 + $thisfile_audio_dataformat = 'wma'; + break; + + case 0x2000: // AC-3 + $thisfile_audio_dataformat = 'ac3'; + break; + + case 0x2001: // DTS + $thisfile_audio_dataformat = 'dts'; + break; + + default: + $thisfile_audio_dataformat = 'wav'; + break; + } + $thisfile_audio_streams_currentstream['dataformat'] = $thisfile_audio_dataformat; + $thisfile_audio_streams_currentstream['lossless'] = $thisfile_audio['lossless']; + $thisfile_audio_streams_currentstream['bitrate_mode'] = $thisfile_audio['bitrate_mode']; + break; + + + case 'iavs': + case 'vids': + // shortcut + $thisfile_riff_raw['strh'][$i] = array(); + $thisfile_riff_raw_strh_current = &$thisfile_riff_raw['strh'][$i]; + + $thisfile_riff_raw_strh_current['fccType'] = substr($strhData, 0, 4); // same as $strhfccType; + $thisfile_riff_raw_strh_current['fccHandler'] = substr($strhData, 4, 4); + $thisfile_riff_raw_strh_current['dwFlags'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 8, 4)); // Contains AVITF_* flags + $thisfile_riff_raw_strh_current['wPriority'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 12, 2)); + $thisfile_riff_raw_strh_current['wLanguage'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 14, 2)); + $thisfile_riff_raw_strh_current['dwInitialFrames'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 16, 4)); + $thisfile_riff_raw_strh_current['dwScale'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 20, 4)); + $thisfile_riff_raw_strh_current['dwRate'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 24, 4)); + $thisfile_riff_raw_strh_current['dwStart'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 28, 4)); + $thisfile_riff_raw_strh_current['dwLength'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 32, 4)); + $thisfile_riff_raw_strh_current['dwSuggestedBufferSize'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 36, 4)); + $thisfile_riff_raw_strh_current['dwQuality'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 40, 4)); + $thisfile_riff_raw_strh_current['dwSampleSize'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 44, 4)); + $thisfile_riff_raw_strh_current['rcFrame'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strhData, 48, 4)); + + $thisfile_riff_video_current['codec'] = getid3_riff::RIFFfourccLookup($thisfile_riff_raw_strh_current['fccHandler']); + $thisfile_video['fourcc'] = $thisfile_riff_raw_strh_current['fccHandler']; + if (!$thisfile_riff_video_current['codec'] && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && getid3_riff::RIFFfourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { + $thisfile_riff_video_current['codec'] = getid3_riff::RIFFfourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']); + $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; + } + $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; + $thisfile_video['pixel_aspect_ratio'] = (float) 1; + switch ($thisfile_riff_raw_strh_current['fccHandler']) { + case 'HFYU': // Huffman Lossless Codec + case 'IRAW': // Intel YUV Uncompressed + case 'YUY2': // Uncompressed YUV 4:2:2 + $thisfile_video['lossless'] = true; + break; + + default: + $thisfile_video['lossless'] = false; + break; + } + + switch ($strhfccType) { + case 'vids': + $thisfile_riff_raw_strf_strhfccType_streamindex['biSize'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 0, 4)); // number of bytes required by the BITMAPINFOHEADER structure + $thisfile_riff_raw_strf_strhfccType_streamindex['biWidth'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 4, 4)); // width of the bitmap in pixels + $thisfile_riff_raw_strf_strhfccType_streamindex['biHeight'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 8, 4)); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner + $thisfile_riff_raw_strf_strhfccType_streamindex['biPlanes'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 12, 2)); // number of color planes on the target device. In most cases this value must be set to 1 + $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 14, 2)); // Specifies the number of bits per pixels + $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'] = substr($strfData, 16, 4); // + $thisfile_riff_raw_strf_strhfccType_streamindex['biSizeImage'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 20, 4)); // size of the bitmap data section of the image (the actual pixel data, excluding BITMAPINFOHEADER and RGBQUAD structures) + $thisfile_riff_raw_strf_strhfccType_streamindex['biXPelsPerMeter'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 24, 4)); // horizontal resolution, in pixels per metre, of the target device + $thisfile_riff_raw_strf_strhfccType_streamindex['biYPelsPerMeter'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 28, 4)); // vertical resolution, in pixels per metre, of the target device + $thisfile_riff_raw_strf_strhfccType_streamindex['biClrUsed'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 32, 4)); // actual number of color indices in the color table used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression + $thisfile_riff_raw_strf_strhfccType_streamindex['biClrImportant'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($strfData, 36, 4)); // number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important + + $thisfile_video['bits_per_sample'] = $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount']; + + if ($thisfile_riff_video_current['codec'] == 'DV') { + $thisfile_riff_video_current['dv_type'] = 2; + } + break; + + case 'iavs': + $thisfile_riff_video_current['dv_type'] = 1; + break; + } + break; + + default: + $ThisFileInfo['warning'][] = 'Unhandled fccType for stream ('.$i.'): "'.$strhfccType.'"'; + break; + + } + } + } + + if (isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && getid3_riff::RIFFfourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { + + $thisfile_riff_video_current['codec'] = getid3_riff::RIFFfourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']); + $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; + $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; + + switch ($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) { + case 'HFYU': // Huffman Lossless Codec + case 'IRAW': // Intel YUV Uncompressed + case 'YUY2': // Uncompressed YUV 4:2:2 + $thisfile_video['lossless'] = true; + $thisfile_video['bits_per_sample'] = 24; + break; + + default: + $thisfile_video['lossless'] = false; + $thisfile_video['bits_per_sample'] = 24; + break; + } + + } + } + } + } + break; + + case 'CDDA': + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio_dataformat = 'cda'; + $thisfile_audio['lossless'] = true; + unset($ThisFileInfo['mime_type']); + + $thisfile_avdataoffset = 44; + + if (isset($thisfile_riff['CDDA']['fmt '][0]['data'])) { + // shortcut + $thisfile_riff_CDDA_fmt_0 = &$thisfile_riff['CDDA']['fmt '][0]; + + $thisfile_riff_CDDA_fmt_0['unknown1'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_CDDA_fmt_0['data'], 0, 2)); + $thisfile_riff_CDDA_fmt_0['track_num'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_CDDA_fmt_0['data'], 2, 2)); + $thisfile_riff_CDDA_fmt_0['disc_id'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_CDDA_fmt_0['data'], 4, 4)); + $thisfile_riff_CDDA_fmt_0['start_offset_frame'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_CDDA_fmt_0['data'], 8, 4)); + $thisfile_riff_CDDA_fmt_0['playtime_frames'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_CDDA_fmt_0['data'], 12, 4)); + $thisfile_riff_CDDA_fmt_0['unknown6'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_CDDA_fmt_0['data'], 16, 4)); + $thisfile_riff_CDDA_fmt_0['unknown7'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_CDDA_fmt_0['data'], 20, 4)); + + $thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75; + $thisfile_riff_CDDA_fmt_0['playtime_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75; + $ThisFileInfo['comments']['track'] = $thisfile_riff_CDDA_fmt_0['track_num']; + $ThisFileInfo['playtime_seconds'] = $thisfile_riff_CDDA_fmt_0['playtime_seconds']; + + // hardcoded data for CD-audio + $thisfile_audio['sample_rate'] = 44100; + $thisfile_audio['channels'] = 2; + $thisfile_audio['bits_per_sample'] = 16; + $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $thisfile_audio['channels'] * $thisfile_audio['bits_per_sample']; + $thisfile_audio['bitrate_mode'] = 'cbr'; + } + break; + + + case 'AIFF': + case 'AIFC': + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio_dataformat = 'aiff'; + $thisfile_audio['lossless'] = true; + $ThisFileInfo['mime_type'] = 'audio/x-aiff'; + + if (isset($thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'])) { + $thisfile_avdataoffset = $thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'] + 8; + $thisfile_avdataend = $thisfile_avdataoffset + $thisfile_riff[$RIFFsubtype]['SSND'][0]['size']; + if ($thisfile_avdataend > $ThisFileInfo['filesize']) { + if (($thisfile_avdataend == ($ThisFileInfo['filesize'] + 1)) && (($ThisFileInfo['filesize'] % 2) == 1)) { + // structures rounded to 2-byte boundary, but dumb encoders + // forget to pad end of file to make this actually work + } else { + $ThisFileInfo['warning'][] = 'Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['SSND'][0]['size'].' bytes of audio data, only '.($ThisFileInfo['filesize'] - $thisfile_avdataoffset).' bytes found'; + } + $thisfile_avdataend = $ThisFileInfo['filesize']; + } + } + + if (isset($thisfile_riff[$RIFFsubtype]['COMM'][0]['data'])) { + + // shortcut + $thisfile_riff_RIFFsubtype_COMM_0_data = &$thisfile_riff[$RIFFsubtype]['COMM'][0]['data']; + + $thisfile_riff_audio['channels'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 0, 2), true); + $thisfile_riff_audio['total_samples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 2, 4), false); + $thisfile_riff_audio['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 6, 2), true); + $thisfile_riff_audio['sample_rate'] = (int) getid3_lib::BigEndian2Float(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 8, 10)); + + if ($thisfile_riff[$RIFFsubtype]['COMM'][0]['size'] > 18) { + $thisfile_riff_audio['codec_fourcc'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 18, 4); + $CodecNameSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 22, 1), false); + $thisfile_riff_audio['codec_name'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 23, $CodecNameSize); + switch ($thisfile_riff_audio['codec_name']) { + case 'NONE': + $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; + $thisfile_audio['lossless'] = true; + break; + + case '': + switch ($thisfile_riff_audio['codec_fourcc']) { + // http://developer.apple.com/qa/snd/snd07.html + case 'sowt': + $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Little-Endian PCM'; + $thisfile_audio['lossless'] = true; + break; + + case 'twos': + $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Big-Endian PCM'; + $thisfile_audio['lossless'] = true; + break; + + default: + break; + } + break; + + default: + $thisfile_audio['codec'] = $thisfile_riff_audio['codec_name']; + $thisfile_audio['lossless'] = false; + break; + } + } + + $thisfile_audio['channels'] = $thisfile_riff_audio['channels']; + if ($thisfile_riff_audio['bits_per_sample'] > 0) { + $thisfile_audio['bits_per_sample'] = $thisfile_riff_audio['bits_per_sample']; + } + $thisfile_audio['sample_rate'] = $thisfile_riff_audio['sample_rate']; + if ($thisfile_audio['sample_rate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupted AIFF file: sample_rate == zero'; + return false; + } + $ThisFileInfo['playtime_seconds'] = $thisfile_riff_audio['total_samples'] / $thisfile_audio['sample_rate']; + } + + if (isset($thisfile_riff[$RIFFsubtype]['COMT'])) { + $offset = 0; + $CommentCount = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); + $offset += 2; + for ($i = 0; $i < $CommentCount; $i++) { + $ThisFileInfo['comments_raw'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 4), false); + $offset += 4; + $ThisFileInfo['comments_raw'][$i]['marker_id'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), true); + $offset += 2; + $CommentLength = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); + $offset += 2; + $ThisFileInfo['comments_raw'][$i]['comment'] = substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, $CommentLength); + $offset += $CommentLength; + + $ThisFileInfo['comments_raw'][$i]['timestamp_unix'] = getid3_lib::DateMac2Unix($ThisFileInfo['comments_raw'][$i]['timestamp']); + $thisfile_riff['comments']['comment'][] = $ThisFileInfo['comments_raw'][$i]['comment']; + } + } + + $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); + foreach ($CommentsChunkNames as $key => $value) { + if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { + $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; + } + } + break; + + case '8SVX': + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio_dataformat = '8svx'; + $thisfile_audio['bits_per_sample'] = 8; + $thisfile_audio['channels'] = 1; // overridden below, if need be + $ThisFileInfo['mime_type'] = 'audio/x-aiff'; + + if (isset($thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'])) { + $thisfile_avdataoffset = $thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'] + 8; + $thisfile_avdataend = $thisfile_avdataoffset + $thisfile_riff[$RIFFsubtype]['BODY'][0]['size']; + if ($thisfile_avdataend > $ThisFileInfo['filesize']) { + $ThisFileInfo['warning'][] = 'Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['BODY'][0]['size'].' bytes of audio data, only '.($ThisFileInfo['filesize'] - $thisfile_avdataoffset).' bytes found'; + } + } + + if (isset($thisfile_riff[$RIFFsubtype]['VHDR'][0]['offset'])) { + // shortcut + $thisfile_riff_RIFFsubtype_VHDR_0 = &$thisfile_riff[$RIFFsubtype]['VHDR'][0]; + + $thisfile_riff_RIFFsubtype_VHDR_0['oneShotHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 0, 4)); + $thisfile_riff_RIFFsubtype_VHDR_0['repeatHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 4, 4)); + $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerHiCycle'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 8, 4)); + $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 12, 2)); + $thisfile_riff_RIFFsubtype_VHDR_0['ctOctave'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 14, 1)); + $thisfile_riff_RIFFsubtype_VHDR_0['sCompression'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 15, 1)); + $thisfile_riff_RIFFsubtype_VHDR_0['Volume'] = getid3_lib::FixedPoint16_16(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 16, 4)); + + $thisfile_audio['sample_rate'] = $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec']; + + switch ($thisfile_riff_RIFFsubtype_VHDR_0['sCompression']) { + case 0: + $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; + $thisfile_audio['lossless'] = true; + $ActualBitsPerSample = 8; + break; + + case 1: + $thisfile_audio['codec'] = 'Fibonacci-delta encoding'; + $thisfile_audio['lossless'] = false; + $ActualBitsPerSample = 4; + break; + + default: + $ThisFileInfo['warning'][] = 'Unexpected sCompression value in 8SVX.VHDR chunk - expecting 0 or 1, found "'.sCompression.'"'; + break; + } + } + + if (isset($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'])) { + $ChannelsIndex = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'], 0, 4)); + switch ($ChannelsIndex) { + case 6: // Stereo + $thisfile_audio['channels'] = 2; + break; + + case 2: // Left channel only + case 4: // Right channel only + $thisfile_audio['channels'] = 1; + break; + + default: + $ThisFileInfo['warning'][] = 'Unexpected value in 8SVX.CHAN chunk - expecting 2 or 4 or 6, found "'.$ChannelsIndex.'"'; + break; + } + + } + + $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); + foreach ($CommentsChunkNames as $key => $value) { + if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { + $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; + } + } + + $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $ActualBitsPerSample * $thisfile_audio['channels']; + if (!empty($thisfile_audio['bitrate'])) { + $ThisFileInfo['playtime_seconds'] = ($thisfile_avdataend - $thisfile_avdataoffset) / ($thisfile_audio['bitrate'] / 8); + } + break; + + + case 'CDXA': + $ThisFileInfo['mime_type'] = 'video/mpeg'; + if (!empty($thisfile_riff['CDXA']['data'][0]['size'])) { + $GETID3_ERRORARRAY = &$ThisFileInfo['warning']; + if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, false)) { + $dummy = $ThisFileInfo; + $dummy['error'] = array(); + $mpeg_scanner = new getid3_mpeg($fd, $dummy); + if (empty($dummy['error'])) { + $ThisFileInfo['audio'] = $dummy['audio']; + $ThisFileInfo['video'] = $dummy['video']; + $ThisFileInfo['mpeg'] = $dummy['mpeg']; + $ThisFileInfo['warning'] = $dummy['warning']; + } + } + } + break; + + + default: + $ThisFileInfo['error'][] = 'Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA), found "'.$RIFFsubtype.'" instead'; + unset($ThisFileInfo['fileformat']); + break; + } + + if (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) { + $thisfile_riff['comments']['title'][] = trim(substr($thisfile_riff_WAVE['DISP'][count($thisfile_riff_WAVE['DISP']) - 1]['data'], 4)); + } + if (isset($thisfile_riff_WAVE['INFO']) && is_array($thisfile_riff_WAVE['INFO'])) { + $this->RIFFcommentsParse($thisfile_riff_WAVE['INFO'], $thisfile_riff['comments']); + } + + if (empty($thisfile_audio['encoder']) && !empty($ThisFileInfo['mpeg']['audio']['LAME']['short_version'])) { + $thisfile_audio['encoder'] = $ThisFileInfo['mpeg']['audio']['LAME']['short_version']; + } + + if (!isset($ThisFileInfo['playtime_seconds'])) { + $ThisFileInfo['playtime_seconds'] = 0; + } + if (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { + $ThisFileInfo['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); + } + + if ($ThisFileInfo['playtime_seconds'] > 0) { + if (isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { + + if (!isset($ThisFileInfo['bitrate'])) { + $ThisFileInfo['bitrate'] = ((($thisfile_avdataend - $thisfile_avdataoffset) / $ThisFileInfo['playtime_seconds']) * 8); + } + + } elseif (isset($thisfile_riff_audio) && !isset($thisfile_riff_video)) { + + if (!isset($thisfile_audio['bitrate'])) { + $thisfile_audio['bitrate'] = ((($thisfile_avdataend - $thisfile_avdataoffset) / $ThisFileInfo['playtime_seconds']) * 8); + } + + } elseif (!isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { + + if (!isset($thisfile_video['bitrate'])) { + $thisfile_video['bitrate'] = ((($thisfile_avdataend - $thisfile_avdataoffset) / $ThisFileInfo['playtime_seconds']) * 8); + } + + } + } + + + if (isset($thisfile_riff_video) && isset($thisfile_audio['bitrate']) && ($thisfile_audio['bitrate'] > 0) && ($ThisFileInfo['playtime_seconds'] > 0)) { + + $ThisFileInfo['bitrate'] = ((($thisfile_avdataend - $thisfile_avdataoffset) / $ThisFileInfo['playtime_seconds']) * 8); + $thisfile_audio['bitrate'] = 0; + $thisfile_video['bitrate'] = $ThisFileInfo['bitrate']; + foreach ($thisfile_riff_audio as $channelnumber => $audioinfoarray) { + $thisfile_video['bitrate'] -= $audioinfoarray['bitrate']; + $thisfile_audio['bitrate'] += $audioinfoarray['bitrate']; + } + if ($thisfile_video['bitrate'] <= 0) { + unset($thisfile_video['bitrate']); + } + if ($thisfile_audio['bitrate'] <= 0) { + unset($thisfile_audio['bitrate']); + } + } + + if (isset($ThisFileInfo['mpeg']['audio'])) { + $thisfile_audio_dataformat = 'mp'.$ThisFileInfo['mpeg']['audio']['layer']; + $thisfile_audio['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate']; + $thisfile_audio['channels'] = $ThisFileInfo['mpeg']['audio']['channels']; + $thisfile_audio['bitrate'] = $ThisFileInfo['mpeg']['audio']['bitrate']; + $thisfile_audio['bitrate_mode'] = strtolower($ThisFileInfo['mpeg']['audio']['bitrate_mode']); + if (!empty($ThisFileInfo['mpeg']['audio']['codec'])) { + $thisfile_audio['codec'] = $ThisFileInfo['mpeg']['audio']['codec'].' '.$thisfile_audio['codec']; + } + if (!empty($thisfile_audio['streams'])) { + foreach ($thisfile_audio['streams'] as $streamnumber => $streamdata) { + if ($streamdata['dataformat'] == $thisfile_audio_dataformat) { + $thisfile_audio['streams'][$streamnumber]['sample_rate'] = $thisfile_audio['sample_rate']; + $thisfile_audio['streams'][$streamnumber]['channels'] = $thisfile_audio['channels']; + $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; + $thisfile_audio['streams'][$streamnumber]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; + $thisfile_audio['streams'][$streamnumber]['codec'] = $thisfile_audio['codec']; + } + } + } + $thisfile_audio['encoder_options'] = getid3_mp3::GuessEncoderOptions($ThisFileInfo); + } + + + if (!empty($thisfile_riff_raw['fmt ']['wBitsPerSample']) && ($thisfile_riff_raw['fmt ']['wBitsPerSample'] > 0)) { + switch ($thisfile_audio_dataformat) { + case 'ac3': + // ignore bits_per_sample + break; + + default: + $thisfile_audio['bits_per_sample'] = $thisfile_riff_raw['fmt ']['wBitsPerSample']; + break; + } + } + + + if (empty($thisfile_riff_raw)) { + unset($thisfile_riff['raw']); + } + if (empty($thisfile_riff_audio)) { + unset($thisfile_riff['audio']); + } + if (empty($thisfile_riff_video)) { + unset($thisfile_riff['video']); + } + + return true; + } + + + function RIFFcommentsParse(&$RIFFinfoArray, &$CommentsTargetArray) { + $RIFFinfoKeyLookup = array( + 'IARL'=>'archivallocation', + 'IART'=>'artist', + 'ICDS'=>'costumedesigner', + 'ICMS'=>'commissionedby', + 'ICMT'=>'comment', + 'ICNT'=>'country', + 'ICOP'=>'copyright', + 'ICRD'=>'creationdate', + 'IDIM'=>'dimensions', + 'IDIT'=>'digitizationdate', + 'IDPI'=>'resolution', + 'IDST'=>'distributor', + 'IEDT'=>'editor', + 'IENG'=>'engineers', + 'IFRM'=>'accountofparts', + 'IGNR'=>'genre', + 'IKEY'=>'keywords', + 'ILGT'=>'lightness', + 'ILNG'=>'language', + 'IMED'=>'orignalmedium', + 'IMUS'=>'composer', + 'INAM'=>'title', + 'IPDS'=>'productiondesigner', + 'IPLT'=>'palette', + 'IPRD'=>'product', + 'IPRO'=>'producer', + 'IPRT'=>'part', + 'IRTD'=>'rating', + 'ISBJ'=>'subject', + 'ISFT'=>'software', + 'ISGN'=>'secondarygenre', + 'ISHP'=>'sharpness', + 'ISRC'=>'sourcesupplier', + 'ISRF'=>'digitizationsource', + 'ISTD'=>'productionstudio', + 'ISTR'=>'starring', + 'ITCH'=>'encoded_by', + 'IWEB'=>'url', + 'IWRI'=>'writer' + ); + foreach ($RIFFinfoKeyLookup as $key => $value) { + if (isset($RIFFinfoArray[$key])) { + foreach ($RIFFinfoArray[$key] as $commentid => $commentdata) { + if (trim($commentdata['data']) != '') { + @$CommentsTargetArray[$value][] = trim($commentdata['data']); + } + } + } + } + return true; + } + + function ParseRIFF(&$fd, $startoffset, $maxoffset, &$ThisFileInfo) { + + $maxoffset = min($maxoffset, $ThisFileInfo['avdataend']); + + $RIFFchunk = false; + + fseek($fd, $startoffset, SEEK_SET); + + while (ftell($fd) < $maxoffset) { + $chunkname = fread($fd, 4); + if (strlen($chunkname) < 4) { + $ThisFileInfo['error'][] = 'Expecting chunk name at offset '.(ftell($fd) - 4).' but found nothing. Aborting RIFF parsing.'; + break; + } + + $chunksize = getid3_riff::EitherEndian2Int($ThisFileInfo, fread($fd, 4)); + if ($chunksize == 0) { + $ThisFileInfo['error'][] = 'Chunk size at offset '.(ftell($fd) - 4).' is zero. Aborting RIFF parsing.'; + break; + } + if (($chunksize % 2) != 0) { + // all structures are packed on word boundaries + $chunksize++; + } + + switch ($chunkname) { + case 'LIST': + $listname = fread($fd, 4); + switch ($listname) { + case 'movi': + case 'rec ': + $RIFFchunk[$listname]['offset'] = ftell($fd) - 4; + $RIFFchunk[$listname]['size'] = $chunksize; + + static $ParsedAudioStream = false; + if ($ParsedAudioStream) { + + // skip over + + } else { + + $WhereWeWere = ftell($fd); + $AudioChunkHeader = fread($fd, 12); + $AudioChunkStreamNum = substr($AudioChunkHeader, 0, 2); + $AudioChunkStreamType = substr($AudioChunkHeader, 2, 2); + $AudioChunkSize = getid3_lib::LittleEndian2Int(substr($AudioChunkHeader, 4, 4)); + + if ($AudioChunkStreamType == 'wb') { + $FirstFourBytes = substr($AudioChunkHeader, 8, 4); + if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', $FirstFourBytes)) { + + // MP3 + if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) { + $dummy = $ThisFileInfo; + $dummy['avdataoffset'] = ftell($fd) - 4; + $dummy['avdataend'] = ftell($fd) + $AudioChunkSize; + getid3_mp3::getOnlyMPEGaudioInfo($fd, $dummy, $dummy['avdataoffset'], false); + if (isset($dummy['mpeg']['audio'])) { + $ThisFileInfo = $dummy; + $ThisFileInfo['audio']['dataformat'] = 'mp'.$ThisFileInfo['mpeg']['audio']['layer']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['mpeg']['audio']['channels']; + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['bitrate']; + $ThisFileInfo['bitrate'] = $ThisFileInfo['audio']['bitrate']; + $ThisFileInfo['audio']['bitrate_mode'] = strtolower($ThisFileInfo['mpeg']['audio']['bitrate_mode']); + } + } + + } elseif (preg_match('/^\x0B\x77/s', $FirstFourBytes)) { + + // AC3 + $GETID3_ERRORARRAY = &$ThisFileInfo['warning']; + if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, false)) { + + $dummy = $ThisFileInfo; + $dummy['avdataoffset'] = ftell($fd) - 4; + $dummy['avdataend'] = ftell($fd) + $AudioChunkSize; + $dummy['error'] = array(); + $ac3_tag = new getid3_ac3($fd, $dummy); + if (empty($dummy['error'])) { + $ThisFileInfo['audio'] = $dummy['audio']; + $ThisFileInfo['ac3'] = $dummy['ac3']; + $ThisFileInfo['warning'] = $dummy['warning']; + } + + } + + } + + } + + $ParsedAudioStream = true; + fseek($fd, $WhereWeWere, SEEK_SET); + + } + fseek($fd, $chunksize - 4, SEEK_CUR); + break; + + default: + if (!isset($RIFFchunk[$listname])) { + $RIFFchunk[$listname] = array(); + } + $LISTchunkParent = $listname; + $LISTchunkMaxOffset = ftell($fd) - 4 + $chunksize; + if ($parsedChunk = getid3_riff::ParseRIFF($fd, ftell($fd), ftell($fd) + $chunksize - 4, $ThisFileInfo)) { + $RIFFchunk[$listname] = array_merge_recursive($RIFFchunk[$listname], $parsedChunk); + } + break; + } + break; + + default: + $thisindex = 0; + if (isset($RIFFchunk[$chunkname]) && is_array($RIFFchunk[$chunkname])) { + $thisindex = count($RIFFchunk[$chunkname]); + } + $RIFFchunk[$chunkname][$thisindex]['offset'] = ftell($fd) - 8; + $RIFFchunk[$chunkname][$thisindex]['size'] = $chunksize; + switch ($chunkname) { + case 'data': + $ThisFileInfo['avdataoffset'] = ftell($fd); + $ThisFileInfo['avdataend'] = $ThisFileInfo['avdataoffset'] + $chunksize; + + $RIFFdataChunkContentsTest = fread($fd, 36); + + if ((strlen($RIFFdataChunkContentsTest) > 0) && preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', substr($RIFFdataChunkContentsTest, 0, 4))) { + + // Probably is MP3 data + if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($RIFFdataChunkContentsTest, 0, 4))) { + getid3_mp3::getOnlyMPEGaudioInfo($fd, $ThisFileInfo, $RIFFchunk[$chunkname][$thisindex]['offset'], false); + } + + } elseif ((strlen($RIFFdataChunkContentsTest) > 0) && (substr($RIFFdataChunkContentsTest, 0, 2) == "\x0B\x77")) { + + // This is probably AC-3 data + $GETID3_ERRORARRAY = &$ThisFileInfo['warning']; + if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, false)) { + + $dummy = $ThisFileInfo; + $dummy['avdataoffset'] = $RIFFchunk[$chunkname][$thisindex]['offset']; + $dummy['avdataend'] = $dummy['avdataoffset'] + $RIFFchunk[$chunkname][$thisindex]['size']; + $dummy['error'] = array(); + + $ac3_tag = new getid3_ac3($fd, $dummy); + if (empty($dummy['error'])) { + $ThisFileInfo['audio'] = $dummy['audio']; + $ThisFileInfo['ac3'] = $dummy['ac3']; + $ThisFileInfo['warning'] = $dummy['warning']; + } + + } + + } elseif ((strlen($RIFFdataChunkContentsTest) > 0) && (substr($RIFFdataChunkContentsTest, 8, 2) == "\x77\x0B")) { + + // Dolby Digital WAV + // AC-3 content, but not encoded in same format as normal AC-3 file + // For one thing, byte order is swapped + + $GETID3_ERRORARRAY = &$ThisFileInfo['warning']; + if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, false)) { + + // ok to use tmpfile here - only 56 bytes + if ($fd_temp = tmpfile()) { + + for ($i = 0; $i < 28; $i += 2) { + // swap byte order + fwrite($fd_temp, substr($RIFFdataChunkContentsTest, 8 + $i + 1, 1)); + fwrite($fd_temp, substr($RIFFdataChunkContentsTest, 8 + $i + 0, 1)); + } + + $dummy = $ThisFileInfo; + $dummy['avdataoffset'] = 0; + $dummy['avdataend'] = 20; + $dummy['error'] = array(); + $ac3_tag = new getid3_ac3($fd_temp, $dummy); + fclose($fd_temp); + if (empty($dummy['error'])) { + $ThisFileInfo['audio'] = $dummy['audio']; + $ThisFileInfo['ac3'] = $dummy['ac3']; + $ThisFileInfo['warning'] = $dummy['warning']; + } else { + $ThisFileInfo['error'][] = 'Errors parsing DolbyDigital WAV: '.explode(';', $dummy['error']); + } + + } else { + + $ThisFileInfo['error'][] = 'Could not create temporary file to analyze DolbyDigital WAV'; + + } + + } + + } elseif ((strlen($RIFFdataChunkContentsTest) > 0) && (substr($RIFFdataChunkContentsTest, 0, 4) == 'wvpk')) { + + // This is WavPack data + $ThisFileInfo['wavpack']['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset']; + $ThisFileInfo['wavpack']['size'] = getid3_lib::LittleEndian2Int(substr($RIFFdataChunkContentsTest, 4, 4)); + getid3_riff::RIFFparseWavPackHeader(substr($RIFFdataChunkContentsTest, 8, 28), $ThisFileInfo); + + } else { + + // This is some other kind of data (quite possibly just PCM) + // do nothing special, just skip it + + } + fseek($fd, $RIFFchunk[$chunkname][$thisindex]['offset'] + 8 + $chunksize, SEEK_SET); + break; + + case 'bext': + case 'cart': + case 'fmt ': + case 'MEXT': + case 'DISP': + // always read data in + $RIFFchunk[$chunkname][$thisindex]['data'] = fread($fd, $chunksize); + break; + + default: + if (!empty($LISTchunkParent) && (($RIFFchunk[$chunkname][$thisindex]['offset'] + $RIFFchunk[$chunkname][$thisindex]['size']) <= $LISTchunkMaxOffset)) { + $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset']; + $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['size'] = $RIFFchunk[$chunkname][$thisindex]['size']; + unset($RIFFchunk[$chunkname][$thisindex]['offset']); + unset($RIFFchunk[$chunkname][$thisindex]['size']); + if (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) { + unset($RIFFchunk[$chunkname][$thisindex]); + } + if (isset($RIFFchunk[$chunkname]) && empty($RIFFchunk[$chunkname])) { + unset($RIFFchunk[$chunkname]); + } + $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = fread($fd, $chunksize); + } elseif ($chunksize < 2048) { + // only read data in if smaller than 2kB + $RIFFchunk[$chunkname][$thisindex]['data'] = fread($fd, $chunksize); + } else { + fseek($fd, $chunksize, SEEK_CUR); + } + break; + } + break; + + } + + } + + return $RIFFchunk; + } + + + function ParseRIFFdata(&$RIFFdata, &$ThisFileInfo) { + if ($RIFFdata) { + + $tempfile = tempnam('*', 'getID3'); + $fp_temp = fopen($tempfile, "wb"); + $RIFFdataLength = strlen($RIFFdata); + $NewLengthString = getid3_lib::LittleEndian2String($RIFFdataLength, 4); + for ($i = 0; $i < 4; $i++) { + $RIFFdata{$i + 4} = $NewLengthString{$i}; + } + fwrite($fp_temp, $RIFFdata); + fclose($fp_temp); + + $fp_temp = fopen($tempfile, "rb"); + $dummy = array('filesize'=>$RIFFdataLength, 'filenamepath'=>$ThisFileInfo['filenamepath'], 'tags'=>$ThisFileInfo['tags'], 'avdataoffset'=>0, 'avdataend'=>$RIFFdataLength, 'warning'=>$ThisFileInfo['warning'], 'error'=>$ThisFileInfo['error'], 'comments'=>$ThisFileInfo['comments'], 'audio'=>(isset($ThisFileInfo['audio']) ? $ThisFileInfo['audio'] : array()), 'video'=>(isset($ThisFileInfo['video']) ? $ThisFileInfo['video'] : array())); + $riff = new getid3_riff($fp_temp, $dummy); + $ThisFileInfo['riff'] = $dummy['riff']; + $ThisFileInfo['warning'] = $dummy['warning']; + $ThisFileInfo['error'] = $dummy['error']; + $ThisFileInfo['tags'] = $dummy['tags']; + $ThisFileInfo['comments'] = $dummy['comments']; + fclose($fp_temp); + unlink($tempfile); + return true; + } + return false; + } + + + function RIFFparseWAVEFORMATex($WaveFormatExData) { + // shortcut + $WaveFormatEx['raw'] = array(); + $WaveFormatEx_raw = &$WaveFormatEx['raw']; + + $WaveFormatEx_raw['wFormatTag'] = getid3_lib::LittleEndian2Int(substr($WaveFormatExData, 0, 2)); + $WaveFormatEx_raw['nChannels'] = getid3_lib::LittleEndian2Int(substr($WaveFormatExData, 2, 2)); + $WaveFormatEx_raw['nSamplesPerSec'] = getid3_lib::LittleEndian2Int(substr($WaveFormatExData, 4, 4)); + $WaveFormatEx_raw['nAvgBytesPerSec'] = getid3_lib::LittleEndian2Int(substr($WaveFormatExData, 8, 4)); + $WaveFormatEx_raw['nBlockAlign'] = getid3_lib::LittleEndian2Int(substr($WaveFormatExData, 12, 2)); + $WaveFormatEx_raw['wBitsPerSample'] = getid3_lib::LittleEndian2Int(substr($WaveFormatExData, 14, 2)); + if (strlen($WaveFormatExData) > 16) { + $WaveFormatEx_raw['cbSize'] = getid3_lib::LittleEndian2Int(substr($WaveFormatExData, 16, 2)); + } + + $WaveFormatEx['codec'] = getid3_riff::RIFFwFormatTagLookup($WaveFormatEx_raw['wFormatTag']); + $WaveFormatEx['channels'] = $WaveFormatEx_raw['nChannels']; + $WaveFormatEx['sample_rate'] = $WaveFormatEx_raw['nSamplesPerSec']; + $WaveFormatEx['bitrate'] = $WaveFormatEx_raw['nAvgBytesPerSec'] * 8; + $WaveFormatEx['bits_per_sample'] = $WaveFormatEx_raw['wBitsPerSample']; + + return $WaveFormatEx; + } + + + function RIFFparseWavPackHeader($WavPackChunkData, &$ThisFileInfo) { + // typedef struct { + // char ckID [4]; + // long ckSize; + // short version; + // short bits; // added for version 2.00 + // short flags, shift; // added for version 3.00 + // long total_samples, crc, crc2; + // char extension [4], extra_bc, extras [3]; + // } WavpackHeader; + + // shortcut + $ThisFileInfo['wavpack'] = array(); + $thisfile_wavpack = &$ThisFileInfo['wavpack']; + + $thisfile_wavpack['version'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 0, 2)); + if ($thisfile_wavpack['version'] >= 2) { + $thisfile_wavpack['bits'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 2, 2)); + } + if ($thisfile_wavpack['version'] >= 3) { + $thisfile_wavpack['flags_raw'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 4, 2)); + $thisfile_wavpack['shift'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 6, 2)); + $thisfile_wavpack['total_samples'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 8, 4)); + $thisfile_wavpack['crc1'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 12, 4)); + $thisfile_wavpack['crc2'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 16, 4)); + $thisfile_wavpack['extension'] = substr($WavPackChunkData, 20, 4); + $thisfile_wavpack['extra_bc'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 24, 1)); + for ($i = 0; $i <= 2; $i++) { + $thisfile_wavpack['extras'][] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 25 + $i, 1)); + } + + // shortcut + $thisfile_wavpack['flags'] = array(); + $thisfile_wavpack_flags = &$thisfile_wavpack['flags']; + + $thisfile_wavpack_flags['mono'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000001); + $thisfile_wavpack_flags['fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000002); + $thisfile_wavpack_flags['raw_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000004); + $thisfile_wavpack_flags['calc_noise'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000008); + $thisfile_wavpack_flags['high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000010); + $thisfile_wavpack_flags['3_byte_samples'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000020); + $thisfile_wavpack_flags['over_20_bits'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000040); + $thisfile_wavpack_flags['use_wvc'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000080); + $thisfile_wavpack_flags['noiseshaping'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000100); + $thisfile_wavpack_flags['very_fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000200); + $thisfile_wavpack_flags['new_high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000400); + $thisfile_wavpack_flags['cancel_extreme'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000800); + $thisfile_wavpack_flags['cross_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x001000); + $thisfile_wavpack_flags['new_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x002000); + $thisfile_wavpack_flags['joint_stereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x004000); + $thisfile_wavpack_flags['extra_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x008000); + $thisfile_wavpack_flags['override_noiseshape'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x010000); + $thisfile_wavpack_flags['override_jointstereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x020000); + $thisfile_wavpack_flags['copy_source_filetime'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x040000); + $thisfile_wavpack_flags['create_exe'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x080000); + } + + return true; + } + + function RIFFwFormatTagLookup($wFormatTag) { + + $begin = __LINE__; + + /** This is not a comment! + + 0x0000 Microsoft Unknown Wave Format + 0x0001 Pulse Code Modulation (PCM) + 0x0002 Microsoft ADPCM + 0x0003 IEEE Float + 0x0004 Compaq Computer VSELP + 0x0005 IBM CVSD + 0x0006 Microsoft A-Law + 0x0007 Microsoft mu-Law + 0x0008 Microsoft DTS + 0x0010 OKI ADPCM + 0x0011 Intel DVI/IMA ADPCM + 0x0012 Videologic MediaSpace ADPCM + 0x0013 Sierra Semiconductor ADPCM + 0x0014 Antex Electronics G.723 ADPCM + 0x0015 DSP Solutions DigiSTD + 0x0016 DSP Solutions DigiFIX + 0x0017 Dialogic OKI ADPCM + 0x0018 MediaVision ADPCM + 0x0019 Hewlett-Packard CU + 0x0020 Yamaha ADPCM + 0x0021 Speech Compression Sonarc + 0x0022 DSP Group TrueSpeech + 0x0023 Echo Speech EchoSC1 + 0x0024 Audiofile AF36 + 0x0025 Audio Processing Technology APTX + 0x0026 AudioFile AF10 + 0x0027 Prosody 1612 + 0x0028 LRC + 0x0030 Dolby AC2 + 0x0031 Microsoft GSM 6.10 + 0x0032 MSNAudio + 0x0033 Antex Electronics ADPCME + 0x0034 Control Resources VQLPC + 0x0035 DSP Solutions DigiREAL + 0x0036 DSP Solutions DigiADPCM + 0x0037 Control Resources CR10 + 0x0038 Natural MicroSystems VBXADPCM + 0x0039 Crystal Semiconductor IMA ADPCM + 0x003A EchoSC3 + 0x003B Rockwell ADPCM + 0x003C Rockwell Digit LK + 0x003D Xebec + 0x0040 Antex Electronics G.721 ADPCM + 0x0041 G.728 CELP + 0x0042 MSG723 + 0x0050 MPEG Layer-2 or Layer-1 + 0x0052 RT24 + 0x0053 PAC + 0x0055 MPEG Layer-3 + 0x0059 Lucent G.723 + 0x0060 Cirrus + 0x0061 ESPCM + 0x0062 Voxware + 0x0063 Canopus Atrac + 0x0064 G.726 ADPCM + 0x0065 G.722 ADPCM + 0x0066 DSAT + 0x0067 DSAT Display + 0x0069 Voxware Byte Aligned + 0x0070 Voxware AC8 + 0x0071 Voxware AC10 + 0x0072 Voxware AC16 + 0x0073 Voxware AC20 + 0x0074 Voxware MetaVoice + 0x0075 Voxware MetaSound + 0x0076 Voxware RT29HW + 0x0077 Voxware VR12 + 0x0078 Voxware VR18 + 0x0079 Voxware TQ40 + 0x0080 Softsound + 0x0081 Voxware TQ60 + 0x0082 MSRT24 + 0x0083 G.729A + 0x0084 MVI MV12 + 0x0085 DF G.726 + 0x0086 DF GSM610 + 0x0088 ISIAudio + 0x0089 Onlive + 0x0091 SBC24 + 0x0092 Dolby AC3 SPDIF + 0x0093 MediaSonic G.723 + 0x0094 Aculab PLC Prosody 8kbps + 0x0097 ZyXEL ADPCM + 0x0098 Philips LPCBB + 0x0099 Packed + 0x00FF AAC + 0x0100 Rhetorex ADPCM + 0x0101 IBM mu-law + 0x0102 IBM A-law + 0x0103 IBM AVC Adaptive Differential Pulse Code Modulation (ADPCM) + 0x0111 Vivo G.723 + 0x0112 Vivo Siren + 0x0123 Digital G.723 + 0x0125 Sanyo LD ADPCM + 0x0130 Sipro Lab Telecom ACELP NET + 0x0131 Sipro Lab Telecom ACELP 4800 + 0x0132 Sipro Lab Telecom ACELP 8V3 + 0x0133 Sipro Lab Telecom G.729 + 0x0134 Sipro Lab Telecom G.729A + 0x0135 Sipro Lab Telecom Kelvin + 0x0140 Windows Media Video V8 + 0x0150 Qualcomm PureVoice + 0x0151 Qualcomm HalfRate + 0x0155 Ring Zero Systems TUB GSM + 0x0160 Microsoft Audio 1 + 0x0161 Windows Media Audio V7 / V8 / V9 + 0x0162 Windows Media Audio Professional V9 + 0x0163 Windows Media Audio Lossless V9 + 0x0200 Creative Labs ADPCM + 0x0202 Creative Labs Fastspeech8 + 0x0203 Creative Labs Fastspeech10 + 0x0210 UHER Informatic GmbH ADPCM + 0x0220 Quarterdeck + 0x0230 I-link Worldwide VC + 0x0240 Aureal RAW Sport + 0x0250 Interactive Products HSX + 0x0251 Interactive Products RPELP + 0x0260 Consistent Software CS2 + 0x0270 Sony SCX + 0x0300 Fujitsu FM Towns Snd + 0x0400 BTV Digital + 0x0401 Intel Music Coder + 0x0450 QDesign Music + 0x0680 VME VMPCM + 0x0681 AT&T Labs TPC + 0x08AE ClearJump LiteWave + 0x1000 Olivetti GSM + 0x1001 Olivetti ADPCM + 0x1002 Olivetti CELP + 0x1003 Olivetti SBC + 0x1004 Olivetti OPR + 0x1100 Lernout & Hauspie Codec (0x1100) + 0x1101 Lernout & Hauspie CELP Codec (0x1101) + 0x1102 Lernout & Hauspie SBC Codec (0x1102) + 0x1103 Lernout & Hauspie SBC Codec (0x1103) + 0x1104 Lernout & Hauspie SBC Codec (0x1104) + 0x1400 Norris + 0x1401 AT&T ISIAudio + 0x1500 Soundspace Music Compression + 0x181C VoxWare RT24 Speech + 0x1FC4 NCT Soft ALF2CD (www.nctsoft.com) + 0x2000 Dolby AC3 + 0x2001 Dolby DTS + 0x2002 WAVE_FORMAT_14_4 + 0x2003 WAVE_FORMAT_28_8 + 0x2004 WAVE_FORMAT_COOK + 0x2005 WAVE_FORMAT_DNET + 0x674F Ogg Vorbis 1 + 0x6750 Ogg Vorbis 2 + 0x6751 Ogg Vorbis 3 + 0x676F Ogg Vorbis 1+ + 0x6770 Ogg Vorbis 2+ + 0x6771 Ogg Vorbis 3+ + 0x7A21 GSM-AMR (CBR, no SID) + 0x7A22 GSM-AMR (VBR, including SID) + 0xFFFE WAVE_FORMAT_EXTENSIBLE + 0xFFFF WAVE_FORMAT_DEVELOPMENT + + */ + + return getid3_lib::EmbeddedLookup('0x'.str_pad(strtoupper(dechex($wFormatTag)), 4, '0', STR_PAD_LEFT), $begin, __LINE__, __FILE__, 'riff-wFormatTag'); + + } + + + function RIFFfourccLookup($fourcc) { + + $begin = __LINE__; + + /** This is not a comment! + + swot http://developer.apple.com/qa/snd/snd07.html + ____ No Codec (____) + _BIT BI_BITFIELDS (Raw RGB) + _JPG JPEG compressed + _PNG PNG compressed W3C/ISO/IEC (RFC-2083) + _RAW Full Frames (Uncompressed) + _RGB Raw RGB Bitmap + _RL4 RLE 4bpp RGB + _RL8 RLE 8bpp RGB + 3IV1 3ivx MPEG-4 v1 + 3IV2 3ivx MPEG-4 v2 + 3IVX 3ivx MPEG-4 + AASC Autodesk Animator + ABYR Kensington ?ABYR? + AEMI Array Microsystems VideoONE MPEG1-I Capture + AFLC Autodesk Animator FLC + AFLI Autodesk Animator FLI + AMPG Array Microsystems VideoONE MPEG + ANIM Intel RDX (ANIM) + AP41 AngelPotion Definitive + ASV1 Asus Video v1 + ASV2 Asus Video v2 + ASVX Asus Video 2.0 (audio) + AUR2 AuraVision Aura 2 Codec - YUV 4:2:2 + AURA AuraVision Aura 1 Codec - YUV 4:1:1 + AVDJ Independent JPEG Group\'s codec (AVDJ) + AVRN Independent JPEG Group\'s codec (AVRN) + AYUV 4:4:4 YUV (AYUV) + AZPR Quicktime Apple Video (AZPR) + BGR Raw RGB32 + BLZ0 Blizzard DivX MPEG-4 + BTVC Conexant Composite Video + BINK RAD Game Tools Bink Video + BT20 Conexant Prosumer Video + BTCV Conexant Composite Video Codec + BW10 Data Translation Broadway MPEG Capture + CC12 Intel YUV12 + CDVC Canopus DV + CFCC Digital Processing Systems DPS Perception + CGDI Microsoft Office 97 Camcorder Video + CHAM Winnov Caviara Champagne + CJPG Creative WebCam JPEG + CLJR Cirrus Logic YUV 4:1:1 + CMYK Common Data Format in Printing (Colorgraph) + CPLA Weitek 4:2:0 YUV Planar + CRAM Microsoft Video 1 (CRAM) + cvid Radius Cinepak + CVID Radius Cinepak + CWLT Microsoft Color WLT DIB + CYUV Creative Labs YUV + CYUY ATI YUV + D261 H.261 + D263 H.263 + DIB Device Independent Bitmap + DIV1 FFmpeg OpenDivX + DIV2 Microsoft MPEG-4 v1/v2 + DIV3 DivX ;-) MPEG-4 v3.x Low-Motion + DIV4 DivX ;-) MPEG-4 v3.x Fast-Motion + DIV5 DivX MPEG-4 v5.x + DIV6 DivX ;-) (MS MPEG-4 v3.x) + DIVX DivX MPEG-4 v4 (OpenDivX / Project Mayo) + divx DivX MPEG-4 + DMB1 Matrox Rainbow Runner hardware MJPEG + DMB2 Paradigm MJPEG + DSVD ?DSVD? + DUCK Duck TrueMotion 1.0 + DPS0 DPS/Leitch Reality Motion JPEG + DPSC DPS/Leitch PAR Motion JPEG + DV25 Matrox DVCPRO codec + DV50 Matrox DVCPRO50 codec + DVC IEC 61834 and SMPTE 314M (DVC/DV Video) + DVCP IEC 61834 and SMPTE 314M (DVC/DV Video) + DVHD IEC Standard DV 1125 lines @ 30fps / 1250 lines @ 25fps + DVMA Darim Vision DVMPEG (dummy for MPEG compressor) (www.darvision.com) + DVSL IEC Standard DV compressed in SD (SDL) + DVAN ?DVAN? + DVE2 InSoft DVE-2 Videoconferencing + dvsd IEC 61834 and SMPTE 314M DVC/DV Video + DVSD IEC 61834 and SMPTE 314M DVC/DV Video + DVX1 Lucent DVX1000SP Video Decoder + DVX2 Lucent DVX2000S Video Decoder + DVX3 Lucent DVX3000S Video Decoder + DX50 DivX v5 + DXT1 Microsoft DirectX Compressed Texture (DXT1) + DXT2 Microsoft DirectX Compressed Texture (DXT2) + DXT3 Microsoft DirectX Compressed Texture (DXT3) + DXT4 Microsoft DirectX Compressed Texture (DXT4) + DXT5 Microsoft DirectX Compressed Texture (DXT5) + DXTC Microsoft DirectX Compressed Texture (DXTC) + DXTn Microsoft DirectX Compressed Texture (DXTn) + EM2V Etymonix MPEG-2 I-frame (www.etymonix.com) + EKQ0 Elsa ?EKQ0? + ELK0 Elsa ?ELK0? + ESCP Eidos Escape + ETV1 eTreppid Video ETV1 + ETV2 eTreppid Video ETV2 + ETVC eTreppid Video ETVC + FLIC Autodesk FLI/FLC Animation + FRWT Darim Vision Forward Motion JPEG (www.darvision.com) + FRWU Darim Vision Forward Uncompressed (www.darvision.com) + FLJP D-Vision Field Encoded Motion JPEG + FRWA SoftLab-Nsk Forward Motion JPEG w/ alpha channel + FRWD SoftLab-Nsk Forward Motion JPEG + FVF1 Iterated Systems Fractal Video Frame + GLZW Motion LZW (gabest@freemail.hu) + GPEG Motion JPEG (gabest@freemail.hu) + GWLT Microsoft Greyscale WLT DIB + H260 Intel ITU H.260 Videoconferencing + H261 Intel ITU H.261 Videoconferencing + H262 Intel ITU H.262 Videoconferencing + H263 Intel ITU H.263 Videoconferencing + H264 Intel ITU H.264 Videoconferencing + H265 Intel ITU H.265 Videoconferencing + H266 Intel ITU H.266 Videoconferencing + H267 Intel ITU H.267 Videoconferencing + H268 Intel ITU H.268 Videoconferencing + H269 Intel ITU H.269 Videoconferencing + HFYU Huffman Lossless Codec + HMCR Rendition Motion Compensation Format (HMCR) + HMRR Rendition Motion Compensation Format (HMRR) + I263 FFmpeg I263 decoder + IF09 Indeo YVU9 ("YVU9 with additional delta-frame info after the U plane") + IUYV Interlaced version of UYVY (www.leadtools.com) + IY41 Interlaced version of Y41P (www.leadtools.com) + IYU1 12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard + IYU2 24 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard + IYUV Planar YUV format (8-bpp Y plane, followed by 8-bpp 22 U and V planes) + i263 Intel ITU H.263 Videoconferencing (i263) + I420 Intel Indeo 4 + IAN Intel Indeo 4 (RDX) + ICLB InSoft CellB Videoconferencing + IGOR Power DVD + IJPG Intergraph JPEG + ILVC Intel Layered Video + ILVR ITU-T H.263+ + IPDV I-O Data Device Giga AVI DV Codec + IR21 Intel Indeo 2.1 + IRAW Intel YUV Uncompressed + IV30 Intel Indeo 3.0 + IV31 Intel Indeo 3.1 + IV32 Ligos Indeo 3.2 + IV33 Ligos Indeo 3.3 + IV34 Ligos Indeo 3.4 + IV35 Ligos Indeo 3.5 + IV36 Ligos Indeo 3.6 + IV37 Ligos Indeo 3.7 + IV38 Ligos Indeo 3.8 + IV39 Ligos Indeo 3.9 + IV40 Ligos Indeo Interactive 4.0 + IV41 Ligos Indeo Interactive 4.1 + IV42 Ligos Indeo Interactive 4.2 + IV43 Ligos Indeo Interactive 4.3 + IV44 Ligos Indeo Interactive 4.4 + IV45 Ligos Indeo Interactive 4.5 + IV46 Ligos Indeo Interactive 4.6 + IV47 Ligos Indeo Interactive 4.7 + IV48 Ligos Indeo Interactive 4.8 + IV49 Ligos Indeo Interactive 4.9 + IV50 Ligos Indeo Interactive 5.0 + JBYR Kensington ?JBYR? + JPEG Still Image JPEG DIB + JPGL Pegasus Lossless Motion JPEG + KMVC Team17 Software Karl Morton\'s Video Codec + LSVM Vianet Lighting Strike Vmail (Streaming) (www.vianet.com) + LEAD LEAD Video Codec + Ljpg LEAD MJPEG Codec + MDVD Alex MicroDVD Video (hacked MS MPEG-4) (www.tiasoft.de) + MJPA Morgan Motion JPEG (MJPA) (www.morgan-multimedia.com) + MJPB Morgan Motion JPEG (MJPB) (www.morgan-multimedia.com) + MMES Matrox MPEG-2 I-frame + MP2v Microsoft S-Mpeg 4 version 1 (MP2v) + MP42 Microsoft S-Mpeg 4 version 2 (MP42) + MP43 Microsoft S-Mpeg 4 version 3 (MP43) + MP4S Microsoft S-Mpeg 4 version 3 (MP4S) + MP4V FFmpeg MPEG-4 + MPG1 FFmpeg MPEG 1/2 + MPG2 FFmpeg MPEG 1/2 + MPG3 FFmpeg DivX ;-) (MS MPEG-4 v3) + MPG4 Microsoft MPEG-4 + MPGI Sigma Designs MPEG + MPNG PNG images decoder + MSS1 Microsoft Windows Screen Video + MSZH LCL (Lossless Codec Library) (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) + M261 Microsoft H.261 + M263 Microsoft H.263 + M4S2 Microsoft Fully Compliant MPEG-4 v2 simple profile (M4S2) + m4s2 Microsoft Fully Compliant MPEG-4 v2 simple profile (m4s2) + MC12 ATI Motion Compensation Format (MC12) + MCAM ATI Motion Compensation Format (MCAM) + MJ2C Morgan Multimedia Motion JPEG2000 + mJPG IBM Motion JPEG w/ Huffman Tables + MJPG Microsoft Motion JPEG DIB + MP42 Microsoft MPEG-4 (low-motion) + MP43 Microsoft MPEG-4 (fast-motion) + MP4S Microsoft MPEG-4 (MP4S) + mp4s Microsoft MPEG-4 (mp4s) + MPEG Chromatic Research MPEG-1 Video I-Frame + MPG4 Microsoft MPEG-4 Video High Speed Compressor + MPGI Sigma Designs MPEG + MRCA FAST Multimedia Martin Regen Codec + MRLE Microsoft Run Length Encoding + MSVC Microsoft Video 1 + MTX1 Matrox ?MTX1? + MTX2 Matrox ?MTX2? + MTX3 Matrox ?MTX3? + MTX4 Matrox ?MTX4? + MTX5 Matrox ?MTX5? + MTX6 Matrox ?MTX6? + MTX7 Matrox ?MTX7? + MTX8 Matrox ?MTX8? + MTX9 Matrox ?MTX9? + MV12 Motion Pixels Codec (old) + MWV1 Aware Motion Wavelets + nAVI SMR Codec (hack of Microsoft MPEG-4) (IRC #shadowrealm) + NT00 NewTek LightWave HDTV YUV w/ Alpha (www.newtek.com) + NUV1 NuppelVideo + NTN1 Nogatech Video Compression 1 + NVS0 nVidia GeForce Texture (NVS0) + NVS1 nVidia GeForce Texture (NVS1) + NVS2 nVidia GeForce Texture (NVS2) + NVS3 nVidia GeForce Texture (NVS3) + NVS4 nVidia GeForce Texture (NVS4) + NVS5 nVidia GeForce Texture (NVS5) + NVT0 nVidia GeForce Texture (NVT0) + NVT1 nVidia GeForce Texture (NVT1) + NVT2 nVidia GeForce Texture (NVT2) + NVT3 nVidia GeForce Texture (NVT3) + NVT4 nVidia GeForce Texture (NVT4) + NVT5 nVidia GeForce Texture (NVT5) + PIXL MiroXL, Pinnacle PCTV + PDVC I-O Data Device Digital Video Capture DV codec + PGVV Radius Video Vision + PHMO IBM Photomotion + PIM1 MPEG Realtime (Pinnacle Cards) + PIM2 Pegasus Imaging ?PIM2? + PIMJ Pegasus Imaging Lossless JPEG + PVEZ Horizons Technology PowerEZ + PVMM PacketVideo Corporation MPEG-4 + PVW2 Pegasus Imaging Wavelet Compression + Q1.0 Q-Team\'s QPEG 1.0 (www.q-team.de) + Q1.1 Q-Team\'s QPEG 1.1 (www.q-team.de) + QPEG Q-Team QPEG 1.0 + qpeq Q-Team QPEG 1.1 + RGB Raw BGR32 + RGBA Raw RGB w/ Alpha + RMP4 REALmagic MPEG-4 (unauthorized XVID copy) (www.sigmadesigns.com) + ROQV Id RoQ File Video Decoder + RPZA Quicktime Apple Video (RPZA) + RUD0 Rududu video codec (http://rududu.ifrance.com/rududu/) + RV10 RealVideo 1.0 (aka RealVideo 5.0) + RV13 RealVideo 1.0 (RV13) + RV20 RealVideo G2 + RV30 RealVideo 8 + RV40 RealVideo 9 + RGBT Raw RGB w/ Transparency + RLE Microsoft Run Length Encoder + RLE4 Run Length Encoded (4bpp, 16-color) + RLE8 Run Length Encoded (8bpp, 256-color) + RT21 Intel Indeo RealTime Video 2.1 + rv20 RealVideo G2 + rv30 RealVideo 8 + RVX Intel RDX (RVX ) + SMC Apple Graphics (SMC ) + SP54 Logitech Sunplus Sp54 Codec for Mustek GSmart Mini 2 + SPIG Radius Spigot + SVQ3 Sorenson Video 3 (Apple Quicktime 5) + s422 Tekram VideoCap C210 YUV 4:2:2 + SDCC Sun Communication Digital Camera Codec + SFMC CrystalNet Surface Fitting Method + SMSC Radius SMSC + SMSD Radius SMSD + smsv WorldConnect Wavelet Video + SPIG Radius Spigot + SPLC Splash Studios ACM Audio Codec (www.splashstudios.net) + SQZ2 Microsoft VXTreme Video Codec V2 + STVA ST Microelectronics CMOS Imager Data (Bayer) + STVB ST Microelectronics CMOS Imager Data (Nudged Bayer) + STVC ST Microelectronics CMOS Imager Data (Bunched) + STVX ST Microelectronics CMOS Imager Data (Extended CODEC Data Format) + STVY ST Microelectronics CMOS Imager Data (Extended CODEC Data Format with Correction Data) + SV10 Sorenson Video R1 + SVQ1 Sorenson Video + T420 Toshiba YUV 4:2:0 + TM2A Duck TrueMotion Archiver 2.0 (www.duck.com) + TVJP Pinnacle/Truevision Targa 2000 board (TVJP) + TVMJ Pinnacle/Truevision Targa 2000 board (TVMJ) + TY0N Tecomac Low-Bit Rate Codec (www.tecomac.com) + TY2C Trident Decompression Driver + TLMS TeraLogic Motion Intraframe Codec (TLMS) + TLST TeraLogic Motion Intraframe Codec (TLST) + TM20 Duck TrueMotion 2.0 + TM2X Duck TrueMotion 2X + TMIC TeraLogic Motion Intraframe Codec (TMIC) + TMOT Horizons Technology TrueMotion S + tmot Horizons TrueMotion Video Compression + TR20 Duck TrueMotion RealTime 2.0 + TSCC TechSmith Screen Capture Codec + TV10 Tecomac Low-Bit Rate Codec + TY2N Trident ?TY2N? + U263 UB Video H.263/H.263+/H.263++ Decoder + UMP4 UB Video MPEG 4 (www.ubvideo.com) + UYNV Nvidia UYVY packed 4:2:2 + UYVP Evans & Sutherland YCbCr 4:2:2 extended precision + UCOD eMajix.com ClearVideo + ULTI IBM Ultimotion + UYVY UYVY packed 4:2:2 + V261 Lucent VX2000S + VIFP VFAPI Reader Codec (www.yks.ne.jp/~hori/) + VIV1 FFmpeg H263+ decoder + VIV2 Vivo H.263 + VQC2 Vector-quantised codec 2 (research) http://eprints.ecs.soton.ac.uk/archive/00001310/01/VTC97-js.pdf) + VTLP Alaris VideoGramPiX + VYU9 ATI YUV (VYU9) + VYUY ATI YUV (VYUY) + V261 Lucent VX2000S + V422 Vitec Multimedia 24-bit YUV 4:2:2 Format + V655 Vitec Multimedia 16-bit YUV 4:2:2 Format + VCR1 ATI Video Codec 1 + VCR2 ATI Video Codec 2 + VCR3 ATI VCR 3.0 + VCR4 ATI VCR 4.0 + VCR5 ATI VCR 5.0 + VCR6 ATI VCR 6.0 + VCR7 ATI VCR 7.0 + VCR8 ATI VCR 8.0 + VCR9 ATI VCR 9.0 + VDCT Vitec Multimedia Video Maker Pro DIB + VDOM VDOnet VDOWave + VDOW VDOnet VDOLive (H.263) + VDTZ Darim Vison VideoTizer YUV + VGPX Alaris VideoGramPiX + VIDS Vitec Multimedia YUV 4:2:2 CCIR 601 for V422 + VIVO Vivo H.263 v2.00 + vivo Vivo H.263 + VIXL Miro/Pinnacle Video XL + VLV1 VideoLogic/PURE Digital Videologic Capture + VP30 On2 VP3.0 + VP31 On2 VP3.1 + VX1K Lucent VX1000S Video Codec + VX2K Lucent VX2000S Video Codec + VXSP Lucent VX1000SP Video Codec + WBVC Winbond W9960 + WHAM Microsoft Video 1 (WHAM) + WINX Winnov Software Compression + WJPG AverMedia Winbond JPEG + WMV1 Windows Media Video V7 + WMV2 Windows Media Video V8 + WMV3 Windows Media Video V9 + WNV1 Winnov Hardware Compression + XYZP Extended PAL format XYZ palette (www.riff.org) + x263 Xirlink H.263 + XLV0 NetXL Video Decoder + XMPG Xing MPEG (I-Frame only) + XVID XviD MPEG-4 (www.xvid.org) + XXAN ?XXAN? + YU92 Intel YUV (YU92) + YUNV Nvidia Uncompressed YUV 4:2:2 + YUVP Extended PAL format YUV palette (www.riff.org) + Y211 YUV 2:1:1 Packed + Y411 YUV 4:1:1 Packed + Y41B Weitek YUV 4:1:1 Planar + Y41P Brooktree PC1 YUV 4:1:1 Packed + Y41T Brooktree PC1 YUV 4:1:1 with transparency + Y42B Weitek YUV 4:2:2 Planar + Y42T Brooktree UYUV 4:2:2 with transparency + Y422 ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera + Y800 Simple, single Y plane for monochrome images + Y8 Grayscale video + YC12 Intel YUV 12 codec + YUV8 Winnov Caviar YUV8 + YUV9 Intel YUV9 + YUY2 Uncompressed YUV 4:2:2 + YUYV Canopus YUV + YV12 YVU12 Planar + YVU9 Intel YVU9 Planar (8-bpp Y plane, followed by 8-bpp 4x4 U and V planes) + YVYU YVYU 4:2:2 Packed + ZLIB Lossless Codec Library zlib compression (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) + ZPEG Metheus Video Zipper + + */ + + return getid3_lib::EmbeddedLookup($fourcc, $begin, __LINE__, __FILE__, 'riff-fourcc'); + } + + + function EitherEndian2Int(&$ThisFileInfo, $byteword, $signed=false) { + if ($ThisFileInfo['fileformat'] == 'riff') { + return getid3_lib::LittleEndian2Int($byteword, $signed); + } + return getid3_lib::BigEndian2Int($byteword, false, $signed); + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio-video.swf.php b/campcaster/src/modules/getid3/var/module.audio-video.swf.php new file mode 100644 index 000000000..a03806ea9 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio-video.swf.php @@ -0,0 +1,153 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.swf.php // +// module for analyzing Shockwave Flash files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_swf +{ + + function getid3_swf(&$fd, &$ThisFileInfo, $ReturnAllTagData=false) { + $ThisFileInfo['fileformat'] = 'swf'; + $ThisFileInfo['video']['dataformat'] = 'swf'; + + // http://www.openswf.org/spec/SWFfileformat.html + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + +//echo 'reading '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' bytes
    '; + $SWFfileData = fread($fd, $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']); // 8 + 2 + 2 + max(9) bytes NOT including Frame_Size RECT data + + $ThisFileInfo['swf']['header']['signature'] = substr($SWFfileData, 0, 3); + switch ($ThisFileInfo['swf']['header']['signature']) { + case 'FWS': + $ThisFileInfo['swf']['header']['compressed'] = false; + break; + + case 'CWS': + $ThisFileInfo['swf']['header']['compressed'] = true; + break; + + default: + $ThisFileInfo['error'][] = 'Expecting "FWS" or "CWS" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$ThisFileInfo['swf']['header']['signature'].'"'; + unset($ThisFileInfo['swf']); + unset($ThisFileInfo['fileformat']); + return false; + break; + } + $ThisFileInfo['swf']['header']['version'] = getid3_lib::LittleEndian2Int(substr($SWFfileData, 3, 1)); + $ThisFileInfo['swf']['header']['length'] = getid3_lib::LittleEndian2Int(substr($SWFfileData, 4, 4)); + +//echo '1
    '; + if ($ThisFileInfo['swf']['header']['compressed']) { + +//echo '2
    '; +// $foo = substr($SWFfileData, 8, 4096); +// echo '['.strlen($foo).']
    '; +// $fee = gzuncompress($foo); +// echo '('.strlen($fee).')
    '; +//return false; +//echo '
    time: '.time().'
    '; +//return false; + if ($UncompressedFileData = gzuncompress(substr($SWFfileData, 8))) { + +//echo '3
    '; + $SWFfileData = substr($SWFfileData, 0, 8).$UncompressedFileData; + + } else { + +//echo '4
    '; + $ThisFileInfo['error'][] = 'Error decompressing compressed SWF data'; + return false; + + } + + } + + $FrameSizeBitsPerValue = (ord(substr($SWFfileData, 8, 1)) & 0xF8) >> 3; + $FrameSizeDataLength = ceil((5 + (4 * $FrameSizeBitsPerValue)) / 8); + $FrameSizeDataString = str_pad(decbin(ord(substr($SWFfileData, 8, 1)) & 0x07), 3, '0', STR_PAD_LEFT); + for ($i = 1; $i < $FrameSizeDataLength; $i++) { + $FrameSizeDataString .= str_pad(decbin(ord(substr($SWFfileData, 8 + $i, 1))), 8, '0', STR_PAD_LEFT); + } + list($X1, $X2, $Y1, $Y2) = explode("\n", wordwrap($FrameSizeDataString, $FrameSizeBitsPerValue, "\n", 1)); + $ThisFileInfo['swf']['header']['frame_width'] = getid3_lib::Bin2Dec($X2); + $ThisFileInfo['swf']['header']['frame_height'] = getid3_lib::Bin2Dec($Y2); + + // http://www-lehre.informatik.uni-osnabrueck.de/~fbstark/diplom/docs/swf/Flash_Uncovered.htm + // Next in the header is the frame rate, which is kind of weird. + // It is supposed to be stored as a 16bit integer, but the first byte + // (or last depending on how you look at it) is completely ignored. + // Example: 0x000C -> 0x0C -> 12 So the frame rate is 12 fps. + + // Byte at (8 + $FrameSizeDataLength) is always zero and ignored + $ThisFileInfo['swf']['header']['frame_rate'] = getid3_lib::LittleEndian2Int(substr($SWFfileData, 9 + $FrameSizeDataLength, 1)); + $ThisFileInfo['swf']['header']['frame_count'] = getid3_lib::LittleEndian2Int(substr($SWFfileData, 10 + $FrameSizeDataLength, 2)); + + $ThisFileInfo['video']['frame_rate'] = $ThisFileInfo['swf']['header']['frame_rate']; + $ThisFileInfo['video']['resolution_x'] = intval(round($ThisFileInfo['swf']['header']['frame_width'] / 20)); + $ThisFileInfo['video']['resolution_y'] = intval(round($ThisFileInfo['swf']['header']['frame_height'] / 20)); + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + + if (($ThisFileInfo['swf']['header']['frame_count'] > 0) && ($ThisFileInfo['swf']['header']['frame_rate'] > 0)) { + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['swf']['header']['frame_count'] / $ThisFileInfo['swf']['header']['frame_rate']; + } + + + // SWF tags + + $CurrentOffset = 12 + $FrameSizeDataLength; + $SWFdataLength = strlen($SWFfileData); + + while ($CurrentOffset < $SWFdataLength) { + + $TagIDTagLength = getid3_lib::LittleEndian2Int(substr($SWFfileData, $CurrentOffset, 2)); + $TagID = ($TagIDTagLength & 0xFFFC) >> 6; + $TagLength = ($TagIDTagLength & 0x003F); + $CurrentOffset += 2; + if ($TagLength == 0x3F) { + $TagLength = getid3_lib::LittleEndian2Int(substr($SWFfileData, $CurrentOffset, 4)); + $CurrentOffset += 4; + } + + unset($TagData); + $TagData['offset'] = $CurrentOffset; + $TagData['size'] = $TagLength; + $TagData['id'] = $TagID; + $TagData['data'] = substr($SWFfileData, $CurrentOffset, $TagLength); + switch ($TagID) { + case 0: // end of movie + break 2; + + case 9: // Set background color + //$ThisFileInfo['swf']['tags'][] = $TagData; + $ThisFileInfo['swf']['bgcolor'] = strtoupper(str_pad(dechex(getid3_lib::BigEndian2Int($TagData['data'])), 6, '0', STR_PAD_LEFT)); + break; + + default: + if ($ReturnAllTagData) { + $ThisFileInfo['swf']['tags'][] = $TagData; + } + break; + } + + $CurrentOffset += $TagLength; + } + + return true; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.aac.php b/campcaster/src/modules/getid3/var/module.audio.aac.php new file mode 100644 index 000000000..4d35fb216 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.aac.php @@ -0,0 +1,538 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.aac.php // +// module for analyzing AAC Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_aac +{ + + // new combined constructor + function getid3_aac(&$fd, &$ThisFileInfo, $option) { + + if ($option === 'adif') { + $this->getAACADIFheaderFilepointer($fd, $ThisFileInfo); + } + elseif ($option === 'adts') { + $this->getAACADTSheaderFilepointer($fd, $ThisFileInfo); + } + } + + + + function getAACADIFheaderFilepointer(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'aac'; + $ThisFileInfo['audio']['dataformat'] = 'aac'; + $ThisFileInfo['audio']['lossless'] = false; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $AACheader = fread($fd, 1024); + $offset = 0; + + if (substr($AACheader, 0, 4) == 'ADIF') { + + // http://faac.sourceforge.net/wiki/index.php?page=ADIF + + // http://libmpeg.org/mpeg4/doc/w2203tfs.pdf + // adif_header() { + // adif_id 32 + // copyright_id_present 1 + // if( copyright_id_present ) + // copyright_id 72 + // original_copy 1 + // home 1 + // bitstream_type 1 + // bitrate 23 + // num_program_config_elements 4 + // for (i = 0; i < num_program_config_elements + 1; i++ ) { + // if( bitstream_type == '0' ) + // adif_buffer_fullness 20 + // program_config_element() + // } + // } + + $AACheaderBitstream = getid3_lib::BigEndian2Bin($AACheader); + $bitoffset = 0; + + $ThisFileInfo['aac']['header_type'] = 'ADIF'; + $bitoffset += 32; + $ThisFileInfo['aac']['header']['mpeg_version'] = 4; + + $ThisFileInfo['aac']['header']['copyright'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); + $bitoffset += 1; + if ($ThisFileInfo['aac']['header']['copyright']) { + $ThisFileInfo['aac']['header']['copyright_id'] = getid3_lib::Bin2String(substr($AACheaderBitstream, $bitoffset, 72)); + $bitoffset += 72; + } + $ThisFileInfo['aac']['header']['original_copy'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); + $bitoffset += 1; + $ThisFileInfo['aac']['header']['home'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); + $bitoffset += 1; + $ThisFileInfo['aac']['header']['is_vbr'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); + $bitoffset += 1; + if ($ThisFileInfo['aac']['header']['is_vbr']) { + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + $ThisFileInfo['aac']['header']['bitrate_max'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 23)); + $bitoffset += 23; + } else { + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + $ThisFileInfo['aac']['header']['bitrate'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 23)); + $bitoffset += 23; + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['aac']['header']['bitrate']; + } + if ($ThisFileInfo['audio']['bitrate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt AAC file: bitrate_audio == zero'; + return false; + } + $ThisFileInfo['aac']['header']['num_program_configs'] = 1 + getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + + for ($i = 0; $i < $ThisFileInfo['aac']['header']['num_program_configs']; $i++) { + // http://www.audiocoding.com/wiki/index.php?page=program_config_element + + // buffer_fullness 20 + + // element_instance_tag 4 + // object_type 2 + // sampling_frequency_index 4 + // num_front_channel_elements 4 + // num_side_channel_elements 4 + // num_back_channel_elements 4 + // num_lfe_channel_elements 2 + // num_assoc_data_elements 3 + // num_valid_cc_elements 4 + // mono_mixdown_present 1 + // mono_mixdown_element_number 4 if mono_mixdown_present == 1 + // stereo_mixdown_present 1 + // stereo_mixdown_element_number 4 if stereo_mixdown_present == 1 + // matrix_mixdown_idx_present 1 + // matrix_mixdown_idx 2 if matrix_mixdown_idx_present == 1 + // pseudo_surround_enable 1 if matrix_mixdown_idx_present == 1 + // for (i = 0; i < num_front_channel_elements; i++) { + // front_element_is_cpe[i] 1 + // front_element_tag_select[i] 4 + // } + // for (i = 0; i < num_side_channel_elements; i++) { + // side_element_is_cpe[i] 1 + // side_element_tag_select[i] 4 + // } + // for (i = 0; i < num_back_channel_elements; i++) { + // back_element_is_cpe[i] 1 + // back_element_tag_select[i] 4 + // } + // for (i = 0; i < num_lfe_channel_elements; i++) { + // lfe_element_tag_select[i] 4 + // } + // for (i = 0; i < num_assoc_data_elements; i++) { + // assoc_data_element_tag_select[i] 4 + // } + // for (i = 0; i < num_valid_cc_elements; i++) { + // cc_element_is_ind_sw[i] 1 + // valid_cc_element_tag_select[i] 4 + // } + // byte_alignment() VAR + // comment_field_bytes 8 + // for (i = 0; i < comment_field_bytes; i++) { + // comment_field_data[i] 8 + // } + + if (!$ThisFileInfo['aac']['header']['is_vbr']) { + $ThisFileInfo['aac']['program_configs'][$i]['buffer_fullness'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 20)); + $bitoffset += 20; + } + $ThisFileInfo['aac']['program_configs'][$i]['element_instance_tag'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + $ThisFileInfo['aac']['program_configs'][$i]['object_type'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); + $bitoffset += 2; + $ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency_index'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + $ThisFileInfo['aac']['program_configs'][$i]['num_front_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + $ThisFileInfo['aac']['program_configs'][$i]['num_side_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + $ThisFileInfo['aac']['program_configs'][$i]['num_back_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + $ThisFileInfo['aac']['program_configs'][$i]['num_lfe_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); + $bitoffset += 2; + $ThisFileInfo['aac']['program_configs'][$i]['num_assoc_data_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 3)); + $bitoffset += 3; + $ThisFileInfo['aac']['program_configs'][$i]['num_valid_cc_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + $ThisFileInfo['aac']['program_configs'][$i]['mono_mixdown_present'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + if ($ThisFileInfo['aac']['program_configs'][$i]['mono_mixdown_present']) { + $ThisFileInfo['aac']['program_configs'][$i]['mono_mixdown_element_number'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + $ThisFileInfo['aac']['program_configs'][$i]['stereo_mixdown_present'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + if ($ThisFileInfo['aac']['program_configs'][$i]['stereo_mixdown_present']) { + $ThisFileInfo['aac']['program_configs'][$i]['stereo_mixdown_element_number'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + $ThisFileInfo['aac']['program_configs'][$i]['matrix_mixdown_idx_present'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + if ($ThisFileInfo['aac']['program_configs'][$i]['matrix_mixdown_idx_present']) { + $ThisFileInfo['aac']['program_configs'][$i]['matrix_mixdown_idx'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); + $bitoffset += 2; + $ThisFileInfo['aac']['program_configs'][$i]['pseudo_surround_enable'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + } + for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_front_channel_elements']; $j++) { + $ThisFileInfo['aac']['program_configs'][$i]['front_element_is_cpe'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + $ThisFileInfo['aac']['program_configs'][$i]['front_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_side_channel_elements']; $j++) { + $ThisFileInfo['aac']['program_configs'][$i]['side_element_is_cpe'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + $ThisFileInfo['aac']['program_configs'][$i]['side_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_back_channel_elements']; $j++) { + $ThisFileInfo['aac']['program_configs'][$i]['back_element_is_cpe'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + $ThisFileInfo['aac']['program_configs'][$i]['back_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_lfe_channel_elements']; $j++) { + $ThisFileInfo['aac']['program_configs'][$i]['lfe_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_assoc_data_elements']; $j++) { + $ThisFileInfo['aac']['program_configs'][$i]['assoc_data_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_valid_cc_elements']; $j++) { + $ThisFileInfo['aac']['program_configs'][$i]['cc_element_is_ind_sw'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + $ThisFileInfo['aac']['program_configs'][$i]['valid_cc_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + } + + $bitoffset = ceil($bitoffset / 8) * 8; + + $ThisFileInfo['aac']['program_configs'][$i]['comment_field_bytes'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 8)); + $bitoffset += 8; + $ThisFileInfo['aac']['program_configs'][$i]['comment_field'] = getid3_lib::Bin2String(substr($AACheaderBitstream, $bitoffset, 8 * $ThisFileInfo['aac']['program_configs'][$i]['comment_field_bytes'])); + $bitoffset += 8 * $ThisFileInfo['aac']['program_configs'][$i]['comment_field_bytes']; + + + $ThisFileInfo['aac']['header']['profile_text'] = $this->AACprofileLookup($ThisFileInfo['aac']['program_configs'][$i]['object_type'], $ThisFileInfo['aac']['header']['mpeg_version']); + $ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency'] = $this->AACsampleRateLookup($ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency_index']); + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency']; + $ThisFileInfo['audio']['channels'] = $this->AACchannelCountCalculate($ThisFileInfo['aac']['program_configs'][$i]); + if ($ThisFileInfo['aac']['program_configs'][$i]['comment_field']) { + $ThisFileInfo['aac']['comments'][] = $ThisFileInfo['aac']['program_configs'][$i]['comment_field']; + } + } + $ThisFileInfo['playtime_seconds'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['audio']['bitrate']; + + $ThisFileInfo['audio']['encoder_options'] = $ThisFileInfo['aac']['header_type'].' '.$ThisFileInfo['aac']['header']['profile_text']; + + + + return true; + + } else { + + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['aac']); + $ThisFileInfo['error'][] = 'AAC-ADIF synch not found at offset '.$ThisFileInfo['avdataoffset'].' (expected "ADIF", found "'.substr($AACheader, 0, 4).'" instead)'; + return false; + + } + + } + + + function getAACADTSheaderFilepointer(&$fd, &$ThisFileInfo, $MaxFramesToScan=1000000, $ReturnExtendedInfo=false) { + // based loosely on code from AACfile by Jurgen Faul + // http://jfaul.de/atl or http://j-faul.virtualave.net/atl/atl.html + + + // http://faac.sourceforge.net/wiki/index.php?page=ADTS + + // * ADTS Fixed Header: these don't change from frame to frame + // syncword 12 always: '111111111111' + // ID 1 0: MPEG-4, 1: MPEG-2 + // layer 2 always: '00' + // protection_absent 1 + // profile 2 + // sampling_frequency_index 4 + // private_bit 1 + // channel_configuration 3 + // original/copy 1 + // home 1 + // emphasis 2 only if ID == 0 (ie MPEG-4) + + // * ADTS Variable Header: these can change from frame to frame + // copyright_identification_bit 1 + // copyright_identification_start 1 + // aac_frame_length 13 length of the frame including header (in bytes) + // adts_buffer_fullness 11 0x7FF indicates VBR + // no_raw_data_blocks_in_frame 2 + + // * ADTS Error check + // crc_check 16 only if protection_absent == 0 + + $byteoffset = 0; + $framenumber = 0; + + // Init bit pattern array + static $decbin = array(); + + // Populate $bindec + for ($i = 0; $i < 256; $i++) { + $decbin[chr($i)] = str_pad(decbin($i), 8, '0', STR_PAD_LEFT); + } + + // used to calculate bitrate below + $BitrateCache = array(); + + + while (true) { + // breaks out when end-of-file encountered, or invalid data found, + // or MaxFramesToScan frames have been scanned + + fseek($fd, $byteoffset, SEEK_SET); + + // First get substring + $substring = fread($fd, 10); + $substringlength = strlen($substring); + if ($substringlength != 10) { + $ThisFileInfo['error'][] = 'Failed to read 10 bytes at offset '.(ftell($fd) - $substringlength).' (only read '.$substringlength.' bytes)'; + return false; + } + + // Initialise $AACheaderBitstream + $AACheaderBitstream = ''; + + // Loop thru substring chars + for ($i = 0; $i < 10; $i++) { + $AACheaderBitstream .= $decbin[$substring{$i}]; + } + + $bitoffset = 0; + + $synctest = bindec(substr($AACheaderBitstream, $bitoffset, 12)); + + $bitoffset += 12; + if ($synctest != 0x0FFF) { + $ThisFileInfo['error'][] = 'Synch pattern (0x0FFF) not found at offset '.(ftell($fd) - 10).' (found 0x0'.strtoupper(dechex($synctest)).' instead)'; + if ($ThisFileInfo['fileformat'] == 'aac') { + return true; + } + return false; + } + + // Gather info for first frame only - this takes time to do 1000 times! + if ($framenumber > 0) { + + if (!$AACheaderBitstream[$bitoffset]) { + + // MPEG-4 + $bitoffset += 20; + + } else { + + // MPEG-2 + $bitoffset += 18; + + } + + } else { + + $ThisFileInfo['aac']['header_type'] = 'ADTS'; + $ThisFileInfo['aac']['header']['synch'] = $synctest; + $ThisFileInfo['fileformat'] = 'aac'; + $ThisFileInfo['audio']['dataformat'] = 'aac'; + + $ThisFileInfo['aac']['header']['mpeg_version'] = ((substr($AACheaderBitstream, $bitoffset, 1) == '0') ? 4 : 2); + $bitoffset += 1; + $ThisFileInfo['aac']['header']['layer'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); + $bitoffset += 2; + if ($ThisFileInfo['aac']['header']['layer'] != 0) { + $ThisFileInfo['error'][] = 'Layer error - expected 0x00, found 0x'.dechex($ThisFileInfo['aac']['header']['layer']).' instead'; + return false; + } + $ThisFileInfo['aac']['header']['crc_present'] = ((substr($AACheaderBitstream, $bitoffset, 1) == '0') ? true : false); + $bitoffset += 1; + $ThisFileInfo['aac']['header']['profile_id'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); + $bitoffset += 2; + $ThisFileInfo['aac']['header']['profile_text'] = $this->AACprofileLookup($ThisFileInfo['aac']['header']['profile_id'], $ThisFileInfo['aac']['header']['mpeg_version']); + + $ThisFileInfo['aac']['header']['sample_frequency_index'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); + $bitoffset += 4; + $ThisFileInfo['aac']['header']['sample_frequency'] = $this->AACsampleRateLookup($ThisFileInfo['aac']['header']['sample_frequency_index']); + if ($ThisFileInfo['aac']['header']['sample_frequency'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt AAC file: sample_frequency == zero'; + return false; + } + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['aac']['header']['sample_frequency']; + + $ThisFileInfo['aac']['header']['private'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + $ThisFileInfo['aac']['header']['channel_configuration'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 3)); + $bitoffset += 3; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['aac']['header']['channel_configuration']; + $ThisFileInfo['aac']['header']['original'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + $ThisFileInfo['aac']['header']['home'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + + if ($ThisFileInfo['aac']['header']['mpeg_version'] == 4) { + $ThisFileInfo['aac']['header']['emphasis'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); + $bitoffset += 2; + } + + if ($ReturnExtendedInfo) { + + $ThisFileInfo['aac'][$framenumber]['copyright_id_bit'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + $ThisFileInfo['aac'][$framenumber]['copyright_id_start'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); + $bitoffset += 1; + + } else { + + $bitoffset += 2; + + } + + } + + $FrameLength = bindec(substr($AACheaderBitstream, $bitoffset, 13)); + + if (!isset($BitrateCache[$FrameLength])) { + $BitrateCache[$FrameLength] = ($ThisFileInfo['aac']['header']['sample_frequency'] / 1024) * $FrameLength * 8; + } + @$ThisFileInfo['aac']['bitrate_distribution'][$BitrateCache[$FrameLength]]++; + + $ThisFileInfo['aac'][$framenumber]['aac_frame_length'] = $FrameLength; + $bitoffset += 13; + $ThisFileInfo['aac'][$framenumber]['adts_buffer_fullness'] = bindec(substr($AACheaderBitstream, $bitoffset, 11)); + $bitoffset += 11; + if ($ThisFileInfo['aac'][$framenumber]['adts_buffer_fullness'] == 0x07FF) { + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + } else { + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + } + $ThisFileInfo['aac'][$framenumber]['num_raw_data_blocks'] = bindec(substr($AACheaderBitstream, $bitoffset, 2)); + $bitoffset += 2; + + if ($ThisFileInfo['aac']['header']['crc_present']) { + //$ThisFileInfo['aac'][$framenumber]['crc'] = bindec(substr($AACheaderBitstream, $bitoffset, 16)); + $bitoffset += 16; + } + + if (!$ReturnExtendedInfo) { + unset($ThisFileInfo['aac'][$framenumber]); + } + + $byteoffset += $FrameLength; + if ((++$framenumber < $MaxFramesToScan) && (($byteoffset + 10) < $ThisFileInfo['avdataend'])) { + + // keep scanning + + } else { + + $ThisFileInfo['aac']['frames'] = $framenumber; + $ThisFileInfo['playtime_seconds'] = ($ThisFileInfo['avdataend'] / $byteoffset) * (($framenumber * 1024) / $ThisFileInfo['aac']['header']['sample_frequency']); // (1 / % of file scanned) * (samples / (samples/sec)) = seconds + if ($ThisFileInfo['playtime_seconds'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt AAC file: playtime_seconds == zero'; + return false; + } + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + ksort($ThisFileInfo['aac']['bitrate_distribution']); + + $ThisFileInfo['audio']['encoder_options'] = $ThisFileInfo['aac']['header_type'].' '.$ThisFileInfo['aac']['header']['profile_text']; + + return true; + + } + } + // should never get here. + } + + function AACsampleRateLookup($samplerateid) { + static $AACsampleRateLookup = array(); + if (empty($AACsampleRateLookup)) { + $AACsampleRateLookup[0] = 96000; + $AACsampleRateLookup[1] = 88200; + $AACsampleRateLookup[2] = 64000; + $AACsampleRateLookup[3] = 48000; + $AACsampleRateLookup[4] = 44100; + $AACsampleRateLookup[5] = 32000; + $AACsampleRateLookup[6] = 24000; + $AACsampleRateLookup[7] = 22050; + $AACsampleRateLookup[8] = 16000; + $AACsampleRateLookup[9] = 12000; + $AACsampleRateLookup[10] = 11025; + $AACsampleRateLookup[11] = 8000; + $AACsampleRateLookup[12] = 0; + $AACsampleRateLookup[13] = 0; + $AACsampleRateLookup[14] = 0; + $AACsampleRateLookup[15] = 0; + } + return (isset($AACsampleRateLookup[$samplerateid]) ? $AACsampleRateLookup[$samplerateid] : 'invalid'); + } + + function AACprofileLookup($profileid, $mpegversion) { + static $AACprofileLookup = array(); + if (empty($AACprofileLookup)) { + $AACprofileLookup[2][0] = 'Main profile'; + $AACprofileLookup[2][1] = 'Low Complexity profile (LC)'; + $AACprofileLookup[2][2] = 'Scalable Sample Rate profile (SSR)'; + $AACprofileLookup[2][3] = '(reserved)'; + $AACprofileLookup[4][0] = 'AAC_MAIN'; + $AACprofileLookup[4][1] = 'AAC_LC'; + $AACprofileLookup[4][2] = 'AAC_SSR'; + $AACprofileLookup[4][3] = 'AAC_LTP'; + } + return (isset($AACprofileLookup[$mpegversion][$profileid]) ? $AACprofileLookup[$mpegversion][$profileid] : 'invalid'); + } + + function AACchannelCountCalculate($program_configs) { + $channels = 0; + for ($i = 0; $i < $program_configs['num_front_channel_elements']; $i++) { + $channels++; + if ($program_configs['front_element_is_cpe'][$i]) { + // each front element is channel pair (CPE = Channel Pair Element) + $channels++; + } + } + for ($i = 0; $i < $program_configs['num_side_channel_elements']; $i++) { + $channels++; + if ($program_configs['side_element_is_cpe'][$i]) { + // each side element is channel pair (CPE = Channel Pair Element) + $channels++; + } + } + for ($i = 0; $i < $program_configs['num_back_channel_elements']; $i++) { + $channels++; + if ($program_configs['back_element_is_cpe'][$i]) { + // each back element is channel pair (CPE = Channel Pair Element) + $channels++; + } + } + for ($i = 0; $i < $program_configs['num_lfe_channel_elements']; $i++) { + $channels++; + } + return $channels; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.ac3.php b/campcaster/src/modules/getid3/var/module.audio.ac3.php new file mode 100644 index 000000000..9809a47c7 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.ac3.php @@ -0,0 +1,497 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.ac3.php // +// module for analyzing AC-3 (aka Dolby Digital) audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_ac3 +{ + + function getid3_ac3(&$fd, &$ThisFileInfo) { + + ///AH + $ThisFileInfo['ac3']['raw']['bsi'] = array(); + $thisfile_ac3 = &$ThisFileInfo['ac3']; + $thisfile_ac3_raw = &$thisfile_ac3['raw']; + $thisfile_ac3_raw_bsi = &$thisfile_ac3_raw['bsi']; + + + // http://www.atsc.org/standards/a_52a.pdf + + $ThisFileInfo['fileformat'] = 'ac3'; + $ThisFileInfo['audio']['dataformat'] = 'ac3'; + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + $ThisFileInfo['audio']['lossless'] = false; + + // An AC-3 serial coded audio bit stream is made up of a sequence of synchronization frames + // Each synchronization frame contains 6 coded audio blocks (AB), each of which represent 256 + // new audio samples per channel. A synchronization information (SI) header at the beginning + // of each frame contains information needed to acquire and maintain synchronization. A + // bit stream information (BSI) header follows SI, and contains parameters describing the coded + // audio service. The coded audio blocks may be followed by an auxiliary data (Aux) field. At the + // end of each frame is an error check field that includes a CRC word for error detection. An + // additional CRC word is located in the SI header, the use of which, by a decoder, is optional. + // + // syncinfo() | bsi() | AB0 | AB1 | AB2 | AB3 | AB4 | AB5 | Aux | CRC + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $AC3header['syncinfo'] = fread($fd, 5); + $thisfile_ac3_raw['synchinfo']['synchword'] = substr($AC3header['syncinfo'], 0, 2); + + if ($thisfile_ac3_raw['synchinfo']['synchword'] != "\x0B\x77") { + + $ThisFileInfo['error'][] = 'Expecting "\x0B\x77" at offset '.$ThisFileInfo['avdataoffset'].', found \x'.strtoupper(dechex($AC3header['syncinfo']{0})).'\x'.strtoupper(dechex($AC3header['syncinfo']{1})).' instead'; + unset($thisfile_ac3); + return false; + + } else { + + // syncinfo() { + // syncword 16 + // crc1 16 + // fscod 2 + // frmsizecod 6 + // } /* end of syncinfo */ + + $thisfile_ac3_raw['synchinfo']['crc1'] = getid3_lib::LittleEndian2Int(substr($AC3header['syncinfo'], 2, 2)); + $ac3_synchinfo_fscod_frmsizecod = getid3_lib::LittleEndian2Int(substr($AC3header['syncinfo'], 4, 1)); + $thisfile_ac3_raw['synchinfo']['fscod'] = ($ac3_synchinfo_fscod_frmsizecod & 0xC0) >> 6; + $thisfile_ac3_raw['synchinfo']['frmsizecod'] = ($ac3_synchinfo_fscod_frmsizecod & 0x3F); + + $thisfile_ac3['sample_rate'] = $this->AC3sampleRateCodeLookup($thisfile_ac3_raw['synchinfo']['fscod']); + if ($thisfile_ac3_raw['synchinfo']['fscod'] <= 3) { + $ThisFileInfo['audio']['sample_rate'] = $thisfile_ac3['sample_rate']; + } + + $thisfile_ac3['frame_length'] = $this->AC3frameSizeLookup($thisfile_ac3_raw['synchinfo']['frmsizecod'], $thisfile_ac3_raw['synchinfo']['fscod']); + $thisfile_ac3['bitrate'] = $this->AC3bitrateLookup($thisfile_ac3_raw['synchinfo']['frmsizecod']); + $ThisFileInfo['audio']['bitrate'] = $thisfile_ac3['bitrate']; + + $AC3header['bsi'] = getid3_lib::BigEndian2Bin(fread($fd, 15)); + $ac3_bsi_offset = 0; + + $thisfile_ac3_raw_bsi['bsid'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 5)); + $ac3_bsi_offset += 5; + if ($thisfile_ac3_raw_bsi['bsid'] > 8) { + // Decoders which can decode version 8 will thus be able to decode version numbers less than 8. + // If this standard is extended by the addition of additional elements or features, a value of bsid greater than 8 will be used. + // Decoders built to this version of the standard will not be able to decode versions with bsid greater than 8. + $ThisFileInfo['error'][] = 'Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 8'; + unset($thisfile_ac3); + return false; + } + + $thisfile_ac3_raw_bsi['bsmod'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 3)); + $ac3_bsi_offset += 3; + $thisfile_ac3_raw_bsi['acmod'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 3)); + $ac3_bsi_offset += 3; + + $thisfile_ac3['service_type'] = $this->AC3serviceTypeLookup($thisfile_ac3_raw_bsi['bsmod'], $thisfile_ac3_raw_bsi['acmod']); + $ac3_coding_mode = $this->AC3audioCodingModeLookup($thisfile_ac3_raw_bsi['acmod']); + foreach($ac3_coding_mode as $key => $value) { + $thisfile_ac3[$key] = $value; + } + switch ($thisfile_ac3_raw_bsi['acmod']) { + case 0: + case 1: + $ThisFileInfo['audio']['channelmode'] = 'mono'; + break; + case 3: + case 4: + $ThisFileInfo['audio']['channelmode'] = 'stereo'; + break; + default: + $ThisFileInfo['audio']['channelmode'] = 'surround'; + break; + } + $ThisFileInfo['audio']['channels'] = $thisfile_ac3['num_channels']; + + if ($thisfile_ac3_raw_bsi['acmod'] & 0x01) { + // If the lsb of acmod is a 1, center channel is in use and cmixlev follows in the bit stream. + $thisfile_ac3_raw_bsi['cmixlev'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 2)); + $ac3_bsi_offset += 2; + $thisfile_ac3['center_mix_level'] = $this->AC3centerMixLevelLookup($thisfile_ac3_raw_bsi['cmixlev']); + } + + if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { + // If the msb of acmod is a 1, surround channels are in use and surmixlev follows in the bit stream. + $thisfile_ac3_raw_bsi['surmixlev'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 2)); + $ac3_bsi_offset += 2; + $thisfile_ac3['surround_mix_level'] = $this->AC3surroundMixLevelLookup($thisfile_ac3_raw_bsi['surmixlev']); + } + + if ($thisfile_ac3_raw_bsi['acmod'] == 0x02) { + // When operating in the two channel mode, this 2-bit code indicates whether or not the program has been encoded in Dolby Surround. + $thisfile_ac3_raw_bsi['dsurmod'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 2)); + $ac3_bsi_offset += 2; + $thisfile_ac3['dolby_surround_mode'] = $this->AC3dolbySurroundModeLookup($thisfile_ac3_raw_bsi['dsurmod']); + } + + $thisfile_ac3_raw_bsi['lfeon'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + $thisfile_ac3['lfe_enabled'] = $thisfile_ac3_raw_bsi['lfeon']; + if ($thisfile_ac3_raw_bsi['lfeon']) { + //$ThisFileInfo['audio']['channels']++; + $ThisFileInfo['audio']['channels'] .= '.1'; + } + + $thisfile_ac3['channels_enabled'] = $this->AC3channelsEnabledLookup($thisfile_ac3_raw_bsi['acmod'], $thisfile_ac3_raw_bsi['lfeon']); + + // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 131. + // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. + $thisfile_ac3_raw_bsi['dialnorm'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 5)); + $ac3_bsi_offset += 5; + $thisfile_ac3['dialogue_normalization'] = '-'.$thisfile_ac3_raw_bsi['dialnorm'].'dB'; + + $thisfile_ac3_raw_bsi['compre_flag'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['compre_flag']) { + $thisfile_ac3_raw_bsi['compr'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 8)); + $ac3_bsi_offset += 8; + $thisfile_ac3['heavy_compression'] = $this->AC3heavyCompression($thisfile_ac3_raw_bsi['compr']); + } + + $thisfile_ac3_raw_bsi['langcode_flag'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['langcode_flag']) { + $thisfile_ac3_raw_bsi['langcod'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 8)); + $ac3_bsi_offset += 8; + } + + $thisfile_ac3_raw_bsi['audprodie'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['audprodie']) { + $thisfile_ac3_raw_bsi['mixlevel'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 5)); + $ac3_bsi_offset += 5; + $thisfile_ac3_raw_bsi['roomtyp'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 2)); + $ac3_bsi_offset += 2; + + $thisfile_ac3['mixing_level'] = (80 + $thisfile_ac3_raw_bsi['mixlevel']).'dB'; + $thisfile_ac3['room_type'] = $this->AC3roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp']); + } + + if ($thisfile_ac3_raw_bsi['acmod'] == 0x00) { + // If acmod is 0, then two completely independent program channels (dual mono) + // are encoded into the bit stream, and are referenced as Ch1, Ch2. In this case, + // a number of additional items are present in BSI or audblk to fully describe Ch2. + + + // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 131. + // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. + $thisfile_ac3_raw_bsi['dialnorm2'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 5)); + $ac3_bsi_offset += 5; + $thisfile_ac3['dialogue_normalization2'] = '-'.$thisfile_ac3_raw_bsi['dialnorm2'].'dB'; + + $thisfile_ac3_raw_bsi['compre_flag2'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['compre_flag2']) { + $thisfile_ac3_raw_bsi['compr2'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 8)); + $ac3_bsi_offset += 8; + $thisfile_ac3['heavy_compression2'] = $this->AC3heavyCompression($thisfile_ac3_raw_bsi['compr2']); + } + + $thisfile_ac3_raw_bsi['langcode_flag2'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['langcode_flag2']) { + $thisfile_ac3_raw_bsi['langcod2'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 8)); + $ac3_bsi_offset += 8; + } + + $thisfile_ac3_raw_bsi['audprodie2'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['audprodie2']) { + $thisfile_ac3_raw_bsi['mixlevel2'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 5)); + $ac3_bsi_offset += 5; + $thisfile_ac3_raw_bsi['roomtyp2'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 2)); + $ac3_bsi_offset += 2; + + $thisfile_ac3['mixing_level2'] = (80 + $thisfile_ac3_raw_bsi['mixlevel2']).'dB'; + $thisfile_ac3['room_type2'] = $this->AC3roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp2']); + } + + } + + $thisfile_ac3_raw_bsi['copyright'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + + $thisfile_ac3_raw_bsi['original'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + + $thisfile_ac3_raw_bsi['timecode1_flag'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['timecode1_flag']) { + $thisfile_ac3_raw_bsi['timecode1'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 14)); + $ac3_bsi_offset += 14; + } + + $thisfile_ac3_raw_bsi['timecode2_flag'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['timecode2_flag']) { + $thisfile_ac3_raw_bsi['timecode2'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 14)); + $ac3_bsi_offset += 14; + } + + $thisfile_ac3_raw_bsi['addbsi_flag'] = (bool) bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 1)); + $ac3_bsi_offset += 1; + if ($thisfile_ac3_raw_bsi['addbsi_flag']) { + $thisfile_ac3_raw_bsi['addbsi_length'] = bindec(substr($AC3header['bsi'], $ac3_bsi_offset, 6)); + $ac3_bsi_offset += 6; + + $AC3header['bsi'] .= getid3_lib::BigEndian2Bin(fread($fd, $thisfile_ac3_raw_bsi['addbsi_length'])); + + $thisfile_ac3_raw_bsi['addbsi_data'] = substr($AC3header['bsi'], $ac3_bsi_offset, $thisfile_ac3_raw_bsi['addbsi_length'] * 8); + $ac3_bsi_offset += $thisfile_ac3_raw_bsi['addbsi_length'] * 8; + } + + } + + return true; + } + + + function AC3sampleRateCodeLookup($fscod) { + static $AC3sampleRateCodeLookup = array( + 0 => 48000, + 1 => 44100, + 2 => 32000, + 3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute. + ); + return (isset($AC3sampleRateCodeLookup[$fscod]) ? $AC3sampleRateCodeLookup[$fscod] : false); + } + + function AC3serviceTypeLookup($bsmod, $acmod) { + static $AC3serviceTypeLookup = array(); + if (empty($AC3serviceTypeLookup)) { + for ($i = 0; $i <= 7; $i++) { + $AC3serviceTypeLookup[0][$i] = 'main audio service: complete main (CM)'; + $AC3serviceTypeLookup[1][$i] = 'main audio service: music and effects (ME)'; + $AC3serviceTypeLookup[2][$i] = 'associated service: visually impaired (VI)'; + $AC3serviceTypeLookup[3][$i] = 'associated service: hearing impaired (HI)'; + $AC3serviceTypeLookup[4][$i] = 'associated service: dialogue (D)'; + $AC3serviceTypeLookup[5][$i] = 'associated service: commentary (C)'; + $AC3serviceTypeLookup[6][$i] = 'associated service: emergency (E)'; + } + + $AC3serviceTypeLookup[7][1] = 'associated service: voice over (VO)'; + for ($i = 2; $i <= 7; $i++) { + $AC3serviceTypeLookup[7][$i] = 'main audio service: karaoke'; + } + } + return (isset($AC3serviceTypeLookup[$bsmod][$acmod]) ? $AC3serviceTypeLookup[$bsmod][$acmod] : false); + } + + function AC3audioCodingModeLookup($acmod) { + static $AC3audioCodingModeLookup = array(); + if (empty($AC3audioCodingModeLookup)) { + // array(channel configuration, # channels (not incl LFE), channel order) + $AC3audioCodingModeLookup = array ( + 0 => array('channel_config'=>'1+1', 'num_channels'=>2, 'channel_order'=>'Ch1,Ch2'), + 1 => array('channel_config'=>'1/0', 'num_channels'=>1, 'channel_order'=>'C'), + 2 => array('channel_config'=>'2/0', 'num_channels'=>2, 'channel_order'=>'L,R'), + 3 => array('channel_config'=>'3/0', 'num_channels'=>3, 'channel_order'=>'L,C,R'), + 4 => array('channel_config'=>'2/1', 'num_channels'=>3, 'channel_order'=>'L,R,S'), + 5 => array('channel_config'=>'3/1', 'num_channels'=>4, 'channel_order'=>'L,C,R,S'), + 6 => array('channel_config'=>'2/2', 'num_channels'=>4, 'channel_order'=>'L,R,SL,SR'), + 7 => array('channel_config'=>'3/2', 'num_channels'=>5, 'channel_order'=>'L,C,R,SL,SR') + ); + } + return (isset($AC3audioCodingModeLookup[$acmod]) ? $AC3audioCodingModeLookup[$acmod] : false); + } + + function AC3centerMixLevelLookup($cmixlev) { + static $AC3centerMixLevelLookup; + if (empty($AC3centerMixLevelLookup)) { + $AC3centerMixLevelLookup = array( + 0 => pow(2, -3.0 / 6), // 0.707 (3.0 dB) + 1 => pow(2, -4.5 / 6), // 0.595 (4.5 dB) + 2 => pow(2, -6.0 / 6), // 0.500 (6.0 dB) + 3 => 'reserved' + ); + } + return (isset($AC3centerMixLevelLookup[$cmixlev]) ? $AC3centerMixLevelLookup[$cmixlev] : false); + } + + function AC3surroundMixLevelLookup($surmixlev) { + static $AC3surroundMixLevelLookup; + if (empty($AC3surroundMixLevelLookup)) { + $AC3surroundMixLevelLookup = array( + 0 => pow(2, -3.0 / 6), + 1 => pow(2, -6.0 / 6), + 2 => 0, + 3 => 'reserved' + ); + } + return (isset($AC3surroundMixLevelLookup[$surmixlev]) ? $AC3surroundMixLevelLookup[$surmixlev] : false); + } + + function AC3dolbySurroundModeLookup($dsurmod) { + static $AC3dolbySurroundModeLookup = array( + 0 => 'not indicated', + 1 => 'Not Dolby Surround encoded', + 2 => 'Dolby Surround encoded', + 3 => 'reserved' + ); + return (isset($AC3dolbySurroundModeLookup[$dsurmod]) ? $AC3dolbySurroundModeLookup[$dsurmod] : false); + } + + function AC3channelsEnabledLookup($acmod, $lfeon) { + $AC3channelsEnabledLookup = array( + 'ch1'=>(bool) ($acmod == 0), + 'ch2'=>(bool) ($acmod == 0), + 'left'=>(bool) ($acmod > 1), + 'right'=>(bool) ($acmod > 1), + 'center'=>(bool) ($acmod & 0x01), + 'surround_mono'=>false, + 'surround_left'=>false, + 'surround_right'=>false, + 'lfe'=>$lfeon); + switch ($acmod) { + case 4: + case 5: + $AC3channelsEnabledLookup['surround_mono'] = true; + break; + case 6: + case 7: + $AC3channelsEnabledLookup['surround_left'] = true; + $AC3channelsEnabledLookup['surround_right'] = true; + break; + } + return $AC3channelsEnabledLookup; + } + + function AC3heavyCompression($compre) { + // The first four bits indicate gain changes in 6.02dB increments which can be + // implemented with an arithmetic shift operation. The following four bits + // indicate linear gain changes, and require a 5-bit multiply. + // We will represent the two 4-bit fields of compr as follows: + // X0 X1 X2 X3 . Y4 Y5 Y6 Y7 + // The meaning of the X values is most simply described by considering X to represent a 4-bit + // signed integer with values from 8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The + // following table shows this in detail. + + // Meaning of 4 msb of compr + // 7 +48.16 dB + // 6 +42.14 dB + // 5 +36.12 dB + // 4 +30.10 dB + // 3 +24.08 dB + // 2 +18.06 dB + // 1 +12.04 dB + // 0 +6.02 dB + // -1 0 dB + // -2 6.02 dB + // -3 12.04 dB + // -4 18.06 dB + // -5 24.08 dB + // -6 30.10 dB + // -7 36.12 dB + // -8 42.14 dB + + $fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT); + if ($fourbit{0} == '1') { + $log_gain = -8 + bindec(substr($fourbit, 1)); + } else { + $log_gain = bindec(substr($fourbit, 1)); + } + $log_gain = ($log_gain + 1) * getid3_lib::RGADamplitude2dB(2); + + // The value of Y is a linear representation of a gain change of up to 6 dB. Y is considered to + // be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can + // represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain + // changes from 0.28 dB to 6.02 dB. + + $lin_gain = (16 + ($compre & 0x0F)) / 32; + + // The combination of X and Y values allows compr to indicate gain changes from + // 48.16 0.28 = +47.89 dB, to + // 42.14 6.02 = 48.16 dB. + + return $log_gain - $lin_gain; + } + + function AC3roomTypeLookup($roomtyp) { + static $AC3roomTypeLookup = array( + 0 => 'not indicated', + 1 => 'large room, X curve monitor', + 2 => 'small room, flat monitor', + 3 => 'reserved' + ); + return (isset($AC3roomTypeLookup[$roomtyp]) ? $AC3roomTypeLookup[$roomtyp] : false); + } + + function AC3frameSizeLookup($frmsizecod, $fscod) { + $padding = (bool) ($frmsizecod % 2); + $framesizeid = floor($frmsizecod / 2); + + static $AC3frameSizeLookup = array(); + if (empty($AC3frameSizeLookup)) { + $AC3frameSizeLookup = array ( + 0 => array(128, 138, 192), + 1 => array(40, 160, 174, 240), + 2 => array(48, 192, 208, 288), + 3 => array(56, 224, 242, 336), + 4 => array(64, 256, 278, 384), + 5 => array(80, 320, 348, 480), + 6 => array(96, 384, 416, 576), + 7 => array(112, 448, 486, 672), + 8 => array(128, 512, 556, 768), + 9 => array(160, 640, 696, 960), + 10 => array(192, 768, 834, 1152), + 11 => array(224, 896, 974, 1344), + 12 => array(256, 1024, 1114, 1536), + 13 => array(320, 1280, 1392, 1920), + 14 => array(384, 1536, 1670, 2304), + 15 => array(448, 1792, 1950, 2688), + 16 => array(512, 2048, 2228, 3072), + 17 => array(576, 2304, 2506, 3456), + 18 => array(640, 2560, 2786, 3840) + ); + } + if (($fscod == 1) && $padding) { + // frame lengths are padded by 1 word (16 bits) at 44100 + $AC3frameSizeLookup[$frmsizecod] += 2; + } + return (isset($AC3frameSizeLookup[$framesizeid][$fscod]) ? $AC3frameSizeLookup[$framesizeid][$fscod] : false); + } + + function AC3bitrateLookup($frmsizecod) { + $framesizeid = floor($frmsizecod / 2); + + static $AC3bitrateLookup = array( + 0 => 32000, + 1 => 40000, + 2 => 48000, + 3 => 56000, + 4 => 64000, + 5 => 80000, + 6 => 96000, + 7 => 112000, + 8 => 128000, + 9 => 160000, + 10 => 192000, + 11 => 224000, + 12 => 256000, + 13 => 320000, + 14 => 384000, + 15 => 448000, + 16 => 512000, + 17 => 576000, + 18 => 640000 + ); + return (isset($AC3bitrateLookup[$framesizeid]) ? $AC3bitrateLookup[$framesizeid] : false); + } + + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.au.php b/campcaster/src/modules/getid3/var/module.audio.au.php new file mode 100644 index 000000000..afbc75d67 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.au.php @@ -0,0 +1,163 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.au.php // +// module for analyzing AU files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_au +{ + + function getid3_au(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $AUheader = fread($fd, 8); + + if (substr($AUheader, 0, 4) != '.snd') { + $ThisFileInfo['error'][] = 'Expecting ".snd" at offset '.$ThisFileInfo['avdataoffset'].', found "'.substr($AUheader, 0, 4).'"'; + return false; + } + + // shortcut + $ThisFileInfo['au'] = array(); + $thisfile_au = &$ThisFileInfo['au']; + + $ThisFileInfo['fileformat'] = 'au'; + $ThisFileInfo['audio']['dataformat'] = 'au'; + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + $thisfile_au['encoding'] = 'ISO-8859-1'; + + $thisfile_au['header_length'] = getid3_lib::BigEndian2Int(substr($AUheader, 4, 4)); + $AUheader .= fread($fd, $thisfile_au['header_length'] - 8); + $ThisFileInfo['avdataoffset'] += $thisfile_au['header_length']; + + $thisfile_au['data_size'] = getid3_lib::BigEndian2Int(substr($AUheader, 8, 4)); + $thisfile_au['data_format_id'] = getid3_lib::BigEndian2Int(substr($AUheader, 12, 4)); + $thisfile_au['sample_rate'] = getid3_lib::BigEndian2Int(substr($AUheader, 16, 4)); + $thisfile_au['channels'] = getid3_lib::BigEndian2Int(substr($AUheader, 20, 4)); + $thisfile_au['comments']['comment'][] = trim(substr($AUheader, 24)); + + $thisfile_au['data_format'] = $this->AUdataFormatNameLookup($thisfile_au['data_format_id']); + $thisfile_au['used_bits_per_sample'] = $this->AUdataFormatUsedBitsPerSampleLookup($thisfile_au['data_format_id']); + if ($thisfile_au['bits_per_sample'] = $this->AUdataFormatBitsPerSampleLookup($thisfile_au['data_format_id'])) { + $ThisFileInfo['audio']['bits_per_sample'] = $thisfile_au['bits_per_sample']; + } else { + unset($thisfile_au['bits_per_sample']); + } + + $ThisFileInfo['audio']['sample_rate'] = $thisfile_au['sample_rate']; + $ThisFileInfo['audio']['channels'] = $thisfile_au['channels']; + + if (($ThisFileInfo['avdataoffset'] + $thisfile_au['data_size']) > $ThisFileInfo['avdataend']) { + $ThisFileInfo['warning'][] = 'Possible truncated file - expecting "'.$thisfile_au['data_size'].'" bytes of audio data, only found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' bytes"'; + } + + $ThisFileInfo['playtime_seconds'] = $thisfile_au['data_size'] / ($thisfile_au['sample_rate'] * $thisfile_au['channels'] * ($thisfile_au['used_bits_per_sample'] / 8)); + $ThisFileInfo['audio']['bitrate'] = ($thisfile_au['data_size'] * 8) / $ThisFileInfo['playtime_seconds']; + + return true; + } + + function AUdataFormatNameLookup($id) { + static $AUdataFormatNameLookup = array( + 0 => 'unspecified format', + 1 => '8-bit mu-law', + 2 => '8-bit linear', + 3 => '16-bit linear', + 4 => '24-bit linear', + 5 => '32-bit linear', + 6 => 'floating-point', + 7 => 'double-precision float', + 8 => 'fragmented sampled data', + 9 => 'SUN_FORMAT_NESTED', + 10 => 'DSP program', + 11 => '8-bit fixed-point', + 12 => '16-bit fixed-point', + 13 => '24-bit fixed-point', + 14 => '32-bit fixed-point', + + 16 => 'non-audio display data', + 17 => 'SND_FORMAT_MULAW_SQUELCH', + 18 => '16-bit linear with emphasis', + 19 => '16-bit linear with compression', + 20 => '16-bit linear with emphasis + compression', + 21 => 'Music Kit DSP commands', + 22 => 'SND_FORMAT_DSP_COMMANDS_SAMPLES', + 23 => 'CCITT g.721 4-bit ADPCM', + 24 => 'CCITT g.722 ADPCM', + 25 => 'CCITT g.723 3-bit ADPCM', + 26 => 'CCITT g.723 5-bit ADPCM', + 27 => 'A-Law 8-bit' + ); + return (isset($AUdataFormatNameLookup[$id]) ? $AUdataFormatNameLookup[$id] : false); + } + + function AUdataFormatBitsPerSampleLookup($id) { + static $AUdataFormatBitsPerSampleLookup = array( + 1 => 8, + 2 => 8, + 3 => 16, + 4 => 24, + 5 => 32, + 6 => 32, + 7 => 64, + + 11 => 8, + 12 => 16, + 13 => 24, + 14 => 32, + + 18 => 16, + 19 => 16, + 20 => 16, + + 23 => 16, + + 25 => 16, + 26 => 16, + 27 => 8 + ); + return (isset($AUdataFormatBitsPerSampleLookup[$id]) ? $AUdataFormatBitsPerSampleLookup[$id] : false); + } + + function AUdataFormatUsedBitsPerSampleLookup($id) { + static $AUdataFormatUsedBitsPerSampleLookup = array( + 1 => 8, + 2 => 8, + 3 => 16, + 4 => 24, + 5 => 32, + 6 => 32, + 7 => 64, + + 11 => 8, + 12 => 16, + 13 => 24, + 14 => 32, + + 18 => 16, + 19 => 16, + 20 => 16, + + 23 => 4, + + 25 => 3, + 26 => 5, + 27 => 8, + ); + return (isset($AUdataFormatUsedBitsPerSampleLookup[$id]) ? $AUdataFormatUsedBitsPerSampleLookup[$id] : false); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.avr.php b/campcaster/src/modules/getid3/var/module.audio.avr.php new file mode 100644 index 000000000..60994397e --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.avr.php @@ -0,0 +1,125 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.avr.php // +// module for analyzing AVR Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_avr +{ + + function getid3_avr(&$fd, &$ThisFileInfo) { + + // http://cui.unige.ch/OSG/info/AudioFormats/ap11.html + // http://www.btinternet.com/~AnthonyJ/Atari/programming/avr_format.html + // offset type length name comments + // --------------------------------------------------------------------- + // 0 char 4 ID format ID == "2BIT" + // 4 char 8 name sample name (unused space filled with 0) + // 12 short 1 mono/stereo 0=mono, -1 (0xFFFF)=stereo + // With stereo, samples are alternated, + // the first voice is the left : + // (LRLRLRLRLRLRLRLRLR...) + // 14 short 1 resolution 8, 12 or 16 (bits) + // 16 short 1 signed or not 0=unsigned, -1 (0xFFFF)=signed + // 18 short 1 loop or not 0=no loop, -1 (0xFFFF)=loop on + // 20 short 1 MIDI note 0xFFnn, where 0 <= nn <= 127 + // 0xFFFF means "no MIDI note defined" + // 22 byte 1 Replay speed Frequence in the Replay software + // 0=5.485 Khz, 1=8.084 Khz, 2=10.971 Khz, + // 3=16.168 Khz, 4=21.942 Khz, 5=32.336 Khz + // 6=43.885 Khz, 7=47.261 Khz + // -1 (0xFF)=no defined Frequence + // 23 byte 3 sample rate in Hertz + // 26 long 1 size in bytes (2 * bytes in stereo) + // 30 long 1 loop begin 0 for no loop + // 34 long 1 loop size equal to 'size' for no loop + // 38 short 2 Reserved, MIDI keyboard split */ + // 40 short 2 Reserved, sample compression */ + // 42 short 2 Reserved */ + // 44 char 20; Additional filename space, used if (name[7] != 0) + // 64 byte 64 user data + // 128 bytes ? sample data (12 bits samples are coded on 16 bits: + // 0000 xxxx xxxx xxxx) + // --------------------------------------------------------------------- + + // Note that all values are in motorola (big-endian) format, and that long is + // assumed to be 4 bytes, and short 2 bytes. + // When reading the samples, you should handle both signed and unsigned data, + // and be prepared to convert 16->8 bit, or mono->stereo if needed. To convert + // 8-bit data between signed/unsigned just add 127 to the sample values. + // Simularly for 16-bit data you should add 32769 + + $ThisFileInfo['fileformat'] = 'avr'; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $AVRheader = fread($fd, 128); + + $ThisFileInfo['avr']['raw']['magic'] = substr($AVRheader, 0, 4); + if ($ThisFileInfo['avr']['raw']['magic'] != '2BIT') { + $ThisFileInfo['error'][] = 'Expecting "2BIT" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$ThisFileInfo['avr']['raw']['magic'].'"'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['avr']); + return false; + } + $ThisFileInfo['avdataoffset'] += 128; + + $ThisFileInfo['avr']['sample_name'] = rtrim(substr($AVRheader, 4, 8)); + $ThisFileInfo['avr']['raw']['mono'] = getid3_lib::BigEndian2Int(substr($AVRheader, 12, 2)); + $ThisFileInfo['avr']['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($AVRheader, 14, 2)); + $ThisFileInfo['avr']['raw']['signed'] = getid3_lib::BigEndian2Int(substr($AVRheader, 16, 2)); + $ThisFileInfo['avr']['raw']['loop'] = getid3_lib::BigEndian2Int(substr($AVRheader, 18, 2)); + $ThisFileInfo['avr']['raw']['midi'] = getid3_lib::BigEndian2Int(substr($AVRheader, 20, 2)); + $ThisFileInfo['avr']['raw']['replay_freq'] = getid3_lib::BigEndian2Int(substr($AVRheader, 22, 1)); + $ThisFileInfo['avr']['sample_rate'] = getid3_lib::BigEndian2Int(substr($AVRheader, 23, 3)); + $ThisFileInfo['avr']['sample_length'] = getid3_lib::BigEndian2Int(substr($AVRheader, 26, 4)); + $ThisFileInfo['avr']['loop_start'] = getid3_lib::BigEndian2Int(substr($AVRheader, 30, 4)); + $ThisFileInfo['avr']['loop_end'] = getid3_lib::BigEndian2Int(substr($AVRheader, 34, 4)); + $ThisFileInfo['avr']['midi_split'] = getid3_lib::BigEndian2Int(substr($AVRheader, 38, 2)); + $ThisFileInfo['avr']['sample_compression'] = getid3_lib::BigEndian2Int(substr($AVRheader, 40, 2)); + $ThisFileInfo['avr']['reserved'] = getid3_lib::BigEndian2Int(substr($AVRheader, 42, 2)); + $ThisFileInfo['avr']['sample_name_extra'] = rtrim(substr($AVRheader, 44, 20)); + $ThisFileInfo['avr']['comment'] = rtrim(substr($AVRheader, 64, 64)); + + $ThisFileInfo['avr']['flags']['stereo'] = (($ThisFileInfo['avr']['raw']['mono'] == 0) ? false : true); + $ThisFileInfo['avr']['flags']['signed'] = (($ThisFileInfo['avr']['raw']['signed'] == 0) ? false : true); + $ThisFileInfo['avr']['flags']['loop'] = (($ThisFileInfo['avr']['raw']['loop'] == 0) ? false : true); + + $ThisFileInfo['avr']['midi_notes'] = array(); + if (($ThisFileInfo['avr']['raw']['midi'] & 0xFF00) != 0xFF00) { + $ThisFileInfo['avr']['midi_notes'][] = ($ThisFileInfo['avr']['raw']['midi'] & 0xFF00) >> 8; + } + if (($ThisFileInfo['avr']['raw']['midi'] & 0x00FF) != 0x00FF) { + $ThisFileInfo['avr']['midi_notes'][] = ($ThisFileInfo['avr']['raw']['midi'] & 0x00FF); + } + + if (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) != ($ThisFileInfo['avr']['sample_length'] * (($ThisFileInfo['avr']['bits_per_sample'] == 8) ? 1 : 2))) { + $ThisFileInfo['warning'][] = 'Probable truncated file: expecting '.($ThisFileInfo['avr']['sample_length'] * (($ThisFileInfo['avr']['bits_per_sample'] == 8) ? 1 : 2)).' bytes of audio data, found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']); + } + + $ThisFileInfo['audio']['dataformat'] = 'avr'; + $ThisFileInfo['audio']['lossless'] = true; + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['avr']['bits_per_sample']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['avr']['sample_rate']; + $ThisFileInfo['audio']['channels'] = ($ThisFileInfo['avr']['flags']['stereo'] ? 2 : 1); + $ThisFileInfo['playtime_seconds'] = ($ThisFileInfo['avr']['sample_length'] / $ThisFileInfo['audio']['channels']) / $ThisFileInfo['avr']['sample_rate']; + $ThisFileInfo['audio']['bitrate'] = ($ThisFileInfo['avr']['sample_length'] * (($ThisFileInfo['avr']['bits_per_sample'] == 8) ? 8 : 16)) / $ThisFileInfo['playtime_seconds']; + + + return true; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.bonk.php b/campcaster/src/modules/getid3/var/module.audio.bonk.php new file mode 100644 index 000000000..218aa328c --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.bonk.php @@ -0,0 +1,213 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.la.php // +// module for analyzing BONK audio files // +// dependencies: module.tag.id3v2.php (optional) // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_bonk +{ + function getid3_bonk(&$fd, &$ThisFileInfo) { + + // shortcut + $ThisFileInfo['bonk'] = array(); + $thisfile_bonk = &$ThisFileInfo['bonk']; + + $thisfile_bonk['dataoffset'] = $ThisFileInfo['avdataoffset']; + $thisfile_bonk['dataend'] = $ThisFileInfo['avdataend']; + + // scan-from-end method, for v0.6 and higher + fseek($fd, $thisfile_bonk['dataend'] - 8, SEEK_SET); + $PossibleBonkTag = fread($fd, 8); + while ($this->BonkIsValidTagName(substr($PossibleBonkTag, 4, 4), true)) { + $BonkTagSize = getid3_lib::LittleEndian2Int(substr($PossibleBonkTag, 0, 4)); + fseek($fd, 0 - $BonkTagSize, SEEK_CUR); + $BonkTagOffset = ftell($fd); + $TagHeaderTest = fread($fd, 5); + if (($TagHeaderTest{0} != "\x00") || (substr($PossibleBonkTag, 4, 4) != strtolower(substr($PossibleBonkTag, 4, 4)))) { + $ThisFileInfo['error'][] = 'Expecting "'.strtoupper(substr($PossibleBonkTag, 4, 4)).'" at offset '.$BonkTagOffset.', found "'.$TagHeaderTest.'"'; + return false; + } + $BonkTagName = substr($TagHeaderTest, 1, 4); + + $thisfile_bonk[$BonkTagName]['size'] = $BonkTagSize; + $thisfile_bonk[$BonkTagName]['offset'] = $BonkTagOffset; + $this->HandleBonkTags($fd, $BonkTagName, $ThisFileInfo); + $NextTagEndOffset = $BonkTagOffset - 8; + if ($NextTagEndOffset < $thisfile_bonk['dataoffset']) { + if (empty($ThisFileInfo['audio']['encoder'])) { + $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.9+'; + } + return true; + } + fseek($fd, $NextTagEndOffset, SEEK_SET); + $PossibleBonkTag = fread($fd, 8); + } + + // seek-from-beginning method for v0.4 and v0.5 + if (empty($thisfile_bonk['BONK'])) { + fseek($fd, $thisfile_bonk['dataoffset'], SEEK_SET); + do { + $TagHeaderTest = fread($fd, 5); + switch ($TagHeaderTest) { + case "\x00".'BONK': + if (empty($ThisFileInfo['audio']['encoder'])) { + $ThisFileInfo['audio']['encoder'] = 'BONK v0.4'; + } + break; + + case "\x00".'INFO': + $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.5'; + break; + + default: + break 2; + } + $BonkTagName = substr($TagHeaderTest, 1, 4); + $thisfile_bonk[$BonkTagName]['size'] = $thisfile_bonk['dataend'] - $thisfile_bonk['dataoffset']; + $thisfile_bonk[$BonkTagName]['offset'] = $thisfile_bonk['dataoffset']; + $this->HandleBonkTags($fd, $BonkTagName, $ThisFileInfo); + + } while (true); + } + + // parse META block for v0.6 - v0.8 + if (empty($thisfile_bonk['INFO']) && isset($thisfile_bonk['META']['tags']['info'])) { + fseek($fd, $thisfile_bonk['META']['tags']['info'], SEEK_SET); + $TagHeaderTest = fread($fd, 5); + if ($TagHeaderTest == "\x00".'INFO') { + $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.6 - v0.8'; + + $BonkTagName = substr($TagHeaderTest, 1, 4); + $thisfile_bonk[$BonkTagName]['size'] = $thisfile_bonk['dataend'] - $thisfile_bonk['dataoffset']; + $thisfile_bonk[$BonkTagName]['offset'] = $thisfile_bonk['dataoffset']; + $this->HandleBonkTags($fd, $BonkTagName, $ThisFileInfo); + } + } + + if (empty($ThisFileInfo['audio']['encoder'])) { + $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.9+'; + } + if (empty($thisfile_bonk['BONK'])) { + unset($ThisFileInfo['bonk']); + } + return true; + + } + + function HandleBonkTags(&$fd, &$BonkTagName, &$ThisFileInfo) { + + switch ($BonkTagName) { + case 'BONK': + // shortcut + $thisfile_bonk_BONK = &$ThisFileInfo['bonk']['BONK']; + + $BonkData = "\x00".'BONK'.fread($fd, 17); + $thisfile_bonk_BONK['version'] = getid3_lib::LittleEndian2Int(substr($BonkData, 5, 1)); + $thisfile_bonk_BONK['number_samples'] = getid3_lib::LittleEndian2Int(substr($BonkData, 6, 4)); + $thisfile_bonk_BONK['sample_rate'] = getid3_lib::LittleEndian2Int(substr($BonkData, 10, 4)); + + $thisfile_bonk_BONK['channels'] = getid3_lib::LittleEndian2Int(substr($BonkData, 14, 1)); + $thisfile_bonk_BONK['lossless'] = (bool) getid3_lib::LittleEndian2Int(substr($BonkData, 15, 1)); + $thisfile_bonk_BONK['joint_stereo'] = (bool) getid3_lib::LittleEndian2Int(substr($BonkData, 16, 1)); + $thisfile_bonk_BONK['number_taps'] = getid3_lib::LittleEndian2Int(substr($BonkData, 17, 2)); + $thisfile_bonk_BONK['downsampling_ratio'] = getid3_lib::LittleEndian2Int(substr($BonkData, 19, 1)); + $thisfile_bonk_BONK['samples_per_packet'] = getid3_lib::LittleEndian2Int(substr($BonkData, 20, 2)); + + $ThisFileInfo['avdataoffset'] = $thisfile_bonk_BONK['offset'] + 5 + 17; + $ThisFileInfo['avdataend'] = $thisfile_bonk_BONK['offset'] + $thisfile_bonk_BONK['size']; + + $ThisFileInfo['fileformat'] = 'bonk'; + $ThisFileInfo['audio']['dataformat'] = 'bonk'; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; // assumed + $ThisFileInfo['audio']['channels'] = $thisfile_bonk_BONK['channels']; + $ThisFileInfo['audio']['sample_rate'] = $thisfile_bonk_BONK['sample_rate']; + $ThisFileInfo['audio']['channelmode'] = ($thisfile_bonk_BONK['joint_stereo'] ? 'joint stereo' : 'stereo'); + $ThisFileInfo['audio']['lossless'] = $thisfile_bonk_BONK['lossless']; + $ThisFileInfo['audio']['codec'] = 'bonk'; + + $ThisFileInfo['playtime_seconds'] = $thisfile_bonk_BONK['number_samples'] / ($thisfile_bonk_BONK['sample_rate'] * $thisfile_bonk_BONK['channels']); + if ($ThisFileInfo['playtime_seconds'] > 0) { + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['bonk']['dataend'] - $ThisFileInfo['bonk']['dataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + } + break; + + case 'INFO': + // shortcut + $thisfile_bonk_INFO = &$ThisFileInfo['bonk']['INFO']; + + $thisfile_bonk_INFO['version'] = getid3_lib::LittleEndian2Int(fread($fd, 1)); + $thisfile_bonk_INFO['entries_count'] = 0; + $NextInfoDataPair = fread($fd, 5); + if (!$this->BonkIsValidTagName(substr($NextInfoDataPair, 1, 4))) { + while (!feof($fd)) { + //$CurrentSeekInfo['offset'] = getid3_lib::LittleEndian2Int(substr($NextInfoDataPair, 0, 4)); + //$CurrentSeekInfo['nextbit'] = getid3_lib::LittleEndian2Int(substr($NextInfoDataPair, 4, 1)); + //$thisfile_bonk_INFO[] = $CurrentSeekInfo; + + $NextInfoDataPair = fread($fd, 5); + if ($this->BonkIsValidTagName(substr($NextInfoDataPair, 1, 4))) { + fseek($fd, -5, SEEK_CUR); + break; + } + $thisfile_bonk_INFO['entries_count']++; + } + } + break; + + case 'META': + $BonkData = "\x00".'META'.fread($fd, $ThisFileInfo['bonk']['META']['size'] - 5); + $ThisFileInfo['bonk']['META']['version'] = getid3_lib::LittleEndian2Int(substr($BonkData, 5, 1)); + + $MetaTagEntries = floor(((strlen($BonkData) - 8) - 6) / 8); // BonkData - xxxxmeta - META + $offset = 6; + for ($i = 0; $i < $MetaTagEntries; $i++) { + $MetaEntryTagName = substr($BonkData, $offset, 4); + $offset += 4; + $MetaEntryTagOffset = getid3_lib::LittleEndian2Int(substr($BonkData, $offset, 4)); + $offset += 4; + $ThisFileInfo['bonk']['META']['tags'][$MetaEntryTagName] = $MetaEntryTagOffset; + } + break; + + case ' ID3': + $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.9+'; + + // ID3v2 checking is optional + if (class_exists('getid3_id3v2')) { + $ThisFileInfo['bonk'][' ID3']['valid'] = new getid3_id3v2($fd, $ThisFileInfo, $ThisFileInfo['bonk'][' ID3']['offset'] + 2); + } + break; + + default: + $ThisFileInfo['warning'][] = 'Unexpected Bonk tag "'.$BonkTagName.'" at offset '.$ThisFileInfo['bonk'][$BonkTagName]['offset']; + break; + + } + } + + function BonkIsValidTagName($PossibleBonkTag, $ignorecase=false) { + static $BonkIsValidTagName = array('BONK', 'INFO', ' ID3', 'META'); + foreach ($BonkIsValidTagName as $validtagname) { + if ($validtagname == $PossibleBonkTag) { + return true; + } elseif ($ignorecase && (strtolower($validtagname) == strtolower($PossibleBonkTag))) { + return true; + } + } + return false; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.flac.php b/campcaster/src/modules/getid3/var/module.audio.flac.php new file mode 100644 index 000000000..573ed9868 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.flac.php @@ -0,0 +1,309 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.flac.php // +// module for analyzing FLAC and OggFLAC audio files // +// dependencies: module.audio.ogg.php // +// /// +///////////////////////////////////////////////////////////////// + + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); + +class getid3_flac +{ + + function getid3_flac(&$fd, &$ThisFileInfo) { + // http://flac.sourceforge.net/format.html + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $StreamMarker = fread($fd, 4); + if ($StreamMarker != 'fLaC') { + $ThisFileInfo['error'][] = 'Expecting "fLaC" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$StreamMarker.'"'; + return false; + } + $ThisFileInfo['fileformat'] = 'flac'; + $ThisFileInfo['audio']['dataformat'] = 'flac'; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + $ThisFileInfo['audio']['lossless'] = true; + + return getid3_flac::FLACparseMETAdata($fd, $ThisFileInfo); + } + + + function FLACparseMETAdata(&$fd, &$ThisFileInfo) { + + do { + $METAdataBlockOffset = ftell($fd); + $METAdataBlockHeader = fread($fd, 4); + $METAdataLastBlockFlag = (bool) (getid3_lib::BigEndian2Int(substr($METAdataBlockHeader, 0, 1)) & 0x80); + $METAdataBlockType = getid3_lib::BigEndian2Int(substr($METAdataBlockHeader, 0, 1)) & 0x7F; + $METAdataBlockLength = getid3_lib::BigEndian2Int(substr($METAdataBlockHeader, 1, 3)); + $METAdataBlockTypeText = getid3_flac::FLACmetaBlockTypeLookup($METAdataBlockType); + + if ($METAdataBlockLength < 0) { + $ThisFileInfo['error'][] = 'corrupt or invalid METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$METAdataBlockType.') at offset '.$METAdataBlockOffset; + break; + } + + $ThisFileInfo['flac'][$METAdataBlockTypeText]['raw'] = array(); + $ThisFileInfo_flac_METAdataBlockTypeText_raw = &$ThisFileInfo['flac'][$METAdataBlockTypeText]['raw']; + + $ThisFileInfo_flac_METAdataBlockTypeText_raw['offset'] = $METAdataBlockOffset; + $ThisFileInfo_flac_METAdataBlockTypeText_raw['last_meta_block'] = $METAdataLastBlockFlag; + $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_type'] = $METAdataBlockType; + $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_type_text'] = $METAdataBlockTypeText; + $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_length'] = $METAdataBlockLength; + $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data'] = @fread($fd, $METAdataBlockLength); + $ThisFileInfo['avdataoffset'] = ftell($fd); + + switch ($METAdataBlockTypeText) { + + case 'STREAMINFO': + if (!getid3_flac::FLACparseSTREAMINFO($ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data'], $ThisFileInfo)) { + return false; + } + break; + + case 'PADDING': + // ignore + break; + + case 'APPLICATION': + if (!getid3_flac::FLACparseAPPLICATION($ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data'], $ThisFileInfo)) { + return false; + } + break; + + case 'SEEKTABLE': + if (!getid3_flac::FLACparseSEEKTABLE($ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data'], $ThisFileInfo)) { + return false; + } + break; + + case 'VORBIS_COMMENT': + $OldOffset = ftell($fd); + fseek($fd, 0 - $METAdataBlockLength, SEEK_CUR); + getid3_ogg::ParseVorbisCommentsFilepointer($fd, $ThisFileInfo); + fseek($fd, $OldOffset, SEEK_SET); + break; + + case 'CUESHEET': + if (!getid3_flac::FLACparseCUESHEET($ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data'], $ThisFileInfo)) { + return false; + } + break; + + default: + $ThisFileInfo['warning'][] = 'Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$METAdataBlockType.') at offset '.$METAdataBlockOffset; + break; + } + + } while ($METAdataLastBlockFlag === false); + + + if (isset($ThisFileInfo['flac']['STREAMINFO'])) { + $ThisFileInfo['flac']['compressed_audio_bytes'] = $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']; + $ThisFileInfo['flac']['uncompressed_audio_bytes'] = $ThisFileInfo['flac']['STREAMINFO']['samples_stream'] * $ThisFileInfo['flac']['STREAMINFO']['channels'] * ($ThisFileInfo['flac']['STREAMINFO']['bits_per_sample'] / 8); + if ($ThisFileInfo['flac']['uncompressed_audio_bytes'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt FLAC file: uncompressed_audio_bytes == zero'; + return false; + } + $ThisFileInfo['flac']['compression_ratio'] = $ThisFileInfo['flac']['compressed_audio_bytes'] / $ThisFileInfo['flac']['uncompressed_audio_bytes']; + } + + // set md5_data_source - built into flac 0.5+ + if (isset($ThisFileInfo['flac']['STREAMINFO']['audio_signature'])) { + + if ($ThisFileInfo['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) { + + $ThisFileInfo['warning'][] = 'FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)'; + + } else { + + $ThisFileInfo['md5_data_source'] = ''; + $md5 = $ThisFileInfo['flac']['STREAMINFO']['audio_signature']; + for ($i = 0; $i < strlen($md5); $i++) { + $ThisFileInfo['md5_data_source'] .= str_pad(dechex(ord($md5{$i})), 2, '00', STR_PAD_LEFT); + } + if (!preg_match('/^[0-9a-f]{32}$/', $ThisFileInfo['md5_data_source'])) { + unset($ThisFileInfo['md5_data_source']); + } + + } + + } + + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['flac']['STREAMINFO']['bits_per_sample']; + if ($ThisFileInfo['audio']['bits_per_sample'] == 8) { + // special case + // must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value + // MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed + $ThisFileInfo['warning'][] = 'FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file'; + } + if (!empty($ThisFileInfo['ogg']['vendor'])) { + $ThisFileInfo['audio']['encoder'] = $ThisFileInfo['ogg']['vendor']; + } + + return true; + } + + function FLACmetaBlockTypeLookup($blocktype) { + static $FLACmetaBlockTypeLookup = array(); + if (empty($FLACmetaBlockTypeLookup)) { + $FLACmetaBlockTypeLookup[0] = 'STREAMINFO'; + $FLACmetaBlockTypeLookup[1] = 'PADDING'; + $FLACmetaBlockTypeLookup[2] = 'APPLICATION'; + $FLACmetaBlockTypeLookup[3] = 'SEEKTABLE'; + $FLACmetaBlockTypeLookup[4] = 'VORBIS_COMMENT'; + $FLACmetaBlockTypeLookup[5] = 'CUESHEET'; + } + return (isset($FLACmetaBlockTypeLookup[$blocktype]) ? $FLACmetaBlockTypeLookup[$blocktype] : 'reserved'); + } + + function FLACapplicationIDLookup($applicationid) { + static $FLACapplicationIDLookup = array(); + if (empty($FLACapplicationIDLookup)) { + // http://flac.sourceforge.net/id.html + $FLACapplicationIDLookup[0x46746F6C] = 'flac-tools'; // 'Ftol' + $FLACapplicationIDLookup[0x46746F6C] = 'Sound Font FLAC'; // 'SFFL' + } + return (isset($FLACapplicationIDLookup[$applicationid]) ? $FLACapplicationIDLookup[$applicationid] : 'reserved'); + } + + function FLACparseSTREAMINFO($METAdataBlockData, &$ThisFileInfo) { + $offset = 0; + $ThisFileInfo['flac']['STREAMINFO']['min_block_size'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 2)); + $offset += 2; + $ThisFileInfo['flac']['STREAMINFO']['max_block_size'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 2)); + $offset += 2; + $ThisFileInfo['flac']['STREAMINFO']['min_frame_size'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 3)); + $offset += 3; + $ThisFileInfo['flac']['STREAMINFO']['max_frame_size'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 3)); + $offset += 3; + + $SampleRateChannelsSampleBitsStreamSamples = getid3_lib::BigEndian2Bin(substr($METAdataBlockData, $offset, 8)); + $ThisFileInfo['flac']['STREAMINFO']['sample_rate'] = getid3_lib::Bin2Dec(substr($SampleRateChannelsSampleBitsStreamSamples, 0, 20)); + $ThisFileInfo['flac']['STREAMINFO']['channels'] = getid3_lib::Bin2Dec(substr($SampleRateChannelsSampleBitsStreamSamples, 20, 3)) + 1; + $ThisFileInfo['flac']['STREAMINFO']['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SampleRateChannelsSampleBitsStreamSamples, 23, 5)) + 1; + $ThisFileInfo['flac']['STREAMINFO']['samples_stream'] = getid3_lib::Bin2Dec(substr($SampleRateChannelsSampleBitsStreamSamples, 28, 36)); + $offset += 8; + + $ThisFileInfo['flac']['STREAMINFO']['audio_signature'] = substr($METAdataBlockData, $offset, 16); + $offset += 16; + + if (!empty($ThisFileInfo['flac']['STREAMINFO']['sample_rate'])) { + + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['flac']['STREAMINFO']['sample_rate']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['flac']['STREAMINFO']['channels']; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['flac']['STREAMINFO']['bits_per_sample']; + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['flac']['STREAMINFO']['samples_stream'] / $ThisFileInfo['flac']['STREAMINFO']['sample_rate']; + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + + } else { + + $ThisFileInfo['error'][] = 'Corrupt METAdata block: STREAMINFO'; + return false; + + } + return true; + } + + + function FLACparseAPPLICATION($METAdataBlockData, &$ThisFileInfo) { + $offset = 0; + $ApplicationID = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 4)); + $offset += 4; + $ThisFileInfo['flac']['APPLICATION'][$ApplicationID]['name'] = getid3_flac::FLACapplicationIDLookup($ApplicationID); + $ThisFileInfo['flac']['APPLICATION'][$ApplicationID]['data'] = substr($METAdataBlockData, $offset); + $offset = $METAdataBlockLength; + + return true; + } + + + function FLACparseSEEKTABLE($METAdataBlockData, &$ThisFileInfo) { + $offset = 0; + $METAdataBlockLength = strlen($METAdataBlockData); + $placeholderpattern = str_repeat("\xFF", 8); + while ($offset < $METAdataBlockLength) { + $SampleNumberString = substr($METAdataBlockData, $offset, 8); + $offset += 8; + if ($SampleNumberString == $placeholderpattern) { + + // placeholder point + @$ThisFileInfo['flac']['SEEKTABLE']['placeholders']++; + $offset += 10; + + } else { + + $SampleNumber = getid3_lib::BigEndian2Int($SampleNumberString); + $ThisFileInfo['flac']['SEEKTABLE'][$SampleNumber]['offset'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 8)); + $offset += 8; + $ThisFileInfo['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 2)); + $offset += 2; + + } + } + return true; + } + + function FLACparseCUESHEET($METAdataBlockData, &$ThisFileInfo) { + $offset = 0; + $ThisFileInfo['flac']['CUESHEET']['media_catalog_number'] = trim(substr($METAdataBlockData, $offset, 128), "\0"); + $offset += 128; + $ThisFileInfo['flac']['CUESHEET']['lead_in_samples'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 8)); + $offset += 8; + $ThisFileInfo['flac']['CUESHEET']['flags']['is_cd'] = (bool) (getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 1)) & 0x80); + $offset += 1; + + $offset += 258; // reserved + + $ThisFileInfo['flac']['CUESHEET']['number_tracks'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 1)); + $offset += 1; + + for ($track = 0; $track < $ThisFileInfo['flac']['CUESHEET']['number_tracks']; $track++) { + $TrackSampleOffset = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 8)); + $offset += 8; + $TrackNumber = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 1)); + $offset += 1; + + $ThisFileInfo['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset'] = $TrackSampleOffset; + + $ThisFileInfo['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc'] = substr($METAdataBlockData, $offset, 12); + $offset += 12; + + $TrackFlagsRaw = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 1)); + $offset += 1; + $ThisFileInfo['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio'] = (bool) ($TrackFlagsRaw & 0x80); + $ThisFileInfo['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40); + + $offset += 13; // reserved + + $ThisFileInfo['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points'] = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 1)); + $offset += 1; + + for ($index = 0; $index < $ThisFileInfo['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) { + $IndexSampleOffset = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 8)); + $offset += 8; + $IndexNumber = getid3_lib::BigEndian2Int(substr($METAdataBlockData, $offset, 1)); + $offset += 1; + + $offset += 3; // reserved + + $ThisFileInfo['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset; + } + } + return true; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.la.php b/campcaster/src/modules/getid3/var/module.audio.la.php new file mode 100644 index 000000000..9f82aca2a --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.la.php @@ -0,0 +1,227 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.la.php // +// module for analyzing LA audio files // +// dependencies: module.audio.riff.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + +class getid3_la +{ + + function getid3_la(&$fd, &$ThisFileInfo) { + $offset = 0; + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $rawdata = fread($fd, GETID3_FREAD_BUFFER_SIZE); + + switch (substr($rawdata, $offset, 4)) { + case 'LA02': + case 'LA03': + case 'LA04': + $ThisFileInfo['fileformat'] = 'la'; + $ThisFileInfo['audio']['dataformat'] = 'la'; + $ThisFileInfo['audio']['lossless'] = true; + + $ThisFileInfo['la']['version_major'] = (int) substr($rawdata, $offset + 2, 1); + $ThisFileInfo['la']['version_minor'] = (int) substr($rawdata, $offset + 3, 1); + $ThisFileInfo['la']['version'] = (float) $ThisFileInfo['la']['version_major'] + ($ThisFileInfo['la']['version_minor'] / 10); + $offset += 4; + + $ThisFileInfo['la']['uncompressed_size'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + if ($ThisFileInfo['la']['uncompressed_size'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt LA file: uncompressed_size == zero'; + return false; + } + + $WAVEchunk = substr($rawdata, $offset, 4); + if ($WAVEchunk !== 'WAVE') { + $ThisFileInfo['error'][] = 'Expected "WAVE" ('.getid3_lib::PrintHexBytes('WAVE').') at offset '.$offset.', found "'.$WAVEchunk.'" ('.getid3_lib::PrintHexBytes($WAVEchunk).') instead.'; + return false; + } + $offset += 4; + + $ThisFileInfo['la']['fmt_size'] = 24; + if ($ThisFileInfo['la']['version'] >= 0.3) { + + $ThisFileInfo['la']['fmt_size'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $ThisFileInfo['la']['header_size'] = 49 + $ThisFileInfo['la']['fmt_size'] - 24; + $offset += 4; + + } else { + + // version 0.2 didn't support additional data blocks + $ThisFileInfo['la']['header_size'] = 41; + + } + + $fmt_chunk = substr($rawdata, $offset, 4); + if ($fmt_chunk !== 'fmt ') { + $ThisFileInfo['error'][] = 'Expected "fmt " ('.getid3_lib::PrintHexBytes('fmt ').') at offset '.$offset.', found "'.$fmt_chunk.'" ('.getid3_lib::PrintHexBytes($fmt_chunk).') instead.'; + return false; + } + $offset += 4; + $fmt_size = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + + $ThisFileInfo['la']['raw']['format'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 2)); + $offset += 2; + + $ThisFileInfo['la']['channels'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 2)); + $offset += 2; + if ($ThisFileInfo['la']['channels'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt LA file: channels == zero'; + return false; + } + + $ThisFileInfo['la']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + if ($ThisFileInfo['la']['sample_rate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt LA file: sample_rate == zero'; + return false; + } + + $ThisFileInfo['la']['bytes_per_second'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + $ThisFileInfo['la']['bytes_per_sample'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 2)); + $offset += 2; + $ThisFileInfo['la']['bits_per_sample'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 2)); + $offset += 2; + + $ThisFileInfo['la']['samples'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + + $ThisFileInfo['la']['raw']['flags'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 1)); + $offset += 1; + $ThisFileInfo['la']['flags']['seekable'] = (bool) ($ThisFileInfo['la']['raw']['flags'] & 0x01); + if ($ThisFileInfo['la']['version'] >= 0.4) { + $ThisFileInfo['la']['flags']['high_compression'] = (bool) ($ThisFileInfo['la']['raw']['flags'] & 0x02); + } + + $ThisFileInfo['la']['original_crc'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + + // mikebevin*de + // Basically, the blocksize/seekevery are 61440/19 in La0.4 and 73728/16 + // in earlier versions. A seekpoint is added every blocksize * seekevery + // samples, so 4 * int(totalSamples / (blockSize * seekEvery)) should + // give the number of bytes used for the seekpoints. Of course, if seeking + // is disabled, there are no seekpoints stored. + if ($ThisFileInfo['la']['version'] >= 0.4) { + $ThisFileInfo['la']['blocksize'] = 61440; + $ThisFileInfo['la']['seekevery'] = 19; + } else { + $ThisFileInfo['la']['blocksize'] = 73728; + $ThisFileInfo['la']['seekevery'] = 16; + } + + $ThisFileInfo['la']['seekpoint_count'] = 0; + if ($ThisFileInfo['la']['flags']['seekable']) { + $ThisFileInfo['la']['seekpoint_count'] = floor($ThisFileInfo['la']['samples'] / ($ThisFileInfo['la']['blocksize'] * $ThisFileInfo['la']['seekevery'])); + + for ($i = 0; $i < $ThisFileInfo['la']['seekpoint_count']; $i++) { + $ThisFileInfo['la']['seekpoints'][] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + } + } + + if ($ThisFileInfo['la']['version'] >= 0.3) { + + // Following the main header information, the program outputs all of the + // seekpoints. Following these is what I called the 'footer start', + // i.e. the position immediately after the La audio data is finished. + $ThisFileInfo['la']['footerstart'] = getid3_lib::LittleEndian2Int(substr($rawdata, $offset, 4)); + $offset += 4; + + if ($ThisFileInfo['la']['footerstart'] > $ThisFileInfo['filesize']) { + $ThisFileInfo['warning'][] = 'FooterStart value points to offset '.$ThisFileInfo['la']['footerstart'].' which is beyond end-of-file ('.$ThisFileInfo['filesize'].')'; + $ThisFileInfo['la']['footerstart'] = $ThisFileInfo['filesize']; + } + + } else { + + // La v0.2 didn't have FooterStart value + $ThisFileInfo['la']['footerstart'] = $ThisFileInfo['avdataend']; + + } + + if ($ThisFileInfo['la']['footerstart'] < $ThisFileInfo['avdataend']) { + if ($RIFFtempfilename = tempnam('*', 'id3')) { + if ($RIFF_fp = fopen($RIFFtempfilename, 'w+b')) { + $RIFFdata = 'WAVE'; + if ($ThisFileInfo['la']['version'] == 0.2) { + $RIFFdata .= substr($rawdata, 12, 24); + } else { + $RIFFdata .= substr($rawdata, 16, 24); + } + if ($ThisFileInfo['la']['footerstart'] < $ThisFileInfo['avdataend']) { + fseek($fd, $ThisFileInfo['la']['footerstart'], SEEK_SET); + $RIFFdata .= fread($fd, $ThisFileInfo['avdataend'] - $ThisFileInfo['la']['footerstart']); + } + $RIFFdata = 'RIFF'.getid3_lib::LittleEndian2String(strlen($RIFFdata), 4, false).$RIFFdata; + fwrite($RIFF_fp, $RIFFdata, strlen($RIFFdata)); + $dummy = $ThisFileInfo; + $dummy['filesize'] = strlen($RIFFdata); + $dummy['avdataoffset'] = 0; + $dummy['avdataend'] = $dummy['filesize']; + + $riff = new getid3_riff($RIFF_fp, $dummy); + if (empty($dummy['error'])) { + $ThisFileInfo['riff'] = $dummy['riff']; + } else { + $ThisFileInfo['warning'][] = 'Error parsing RIFF portion of La file: '.implode($dummy['error']); + } + unset($dummy); + fclose($RIFF_fp); + } + unlink($RIFFtempfilename); + } + } + + // $ThisFileInfo['avdataoffset'] should be zero to begin with, but just in case it's not, include the addition anyway + $ThisFileInfo['avdataend'] = $ThisFileInfo['avdataoffset'] + $ThisFileInfo['la']['footerstart']; + $ThisFileInfo['avdataoffset'] = $ThisFileInfo['avdataoffset'] + $offset; + + //$ThisFileInfo['la']['codec'] = RIFFwFormatTagLookup($ThisFileInfo['la']['raw']['format']); + $ThisFileInfo['la']['compression_ratio'] = (float) (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) / $ThisFileInfo['la']['uncompressed_size']); + $ThisFileInfo['playtime_seconds'] = (float) ($ThisFileInfo['la']['samples'] / $ThisFileInfo['la']['sample_rate']) / $ThisFileInfo['la']['channels']; + if ($ThisFileInfo['playtime_seconds'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt LA file: playtime_seconds == zero'; + return false; + } + + $ThisFileInfo['audio']['bitrate'] = ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8 / $ThisFileInfo['playtime_seconds']; + //$ThisFileInfo['audio']['codec'] = $ThisFileInfo['la']['codec']; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['la']['bits_per_sample']; + break; + + default: + if (substr($rawdata, $offset, 2) == 'LA') { + $ThisFileInfo['error'][] = 'This version of getID3() (v'.GETID3_VERSION.') doesn\'t support LA version '.substr($rawdata, $offset + 2, 1).'.'.substr($rawdata, $offset + 3, 1).' which this appears to be - check http://getid3.sourceforge.net for updates.'; + } else { + $ThisFileInfo['error'][] = 'Not a LA (Lossless-Audio) file'; + } + return false; + break; + } + + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['la']['channels']; + $ThisFileInfo['audio']['sample_rate'] = (int) $ThisFileInfo['la']['sample_rate']; + $ThisFileInfo['audio']['encoder'] = 'LA v'.$ThisFileInfo['la']['version']; + + return true; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.lpac.php b/campcaster/src/modules/getid3/var/module.audio.lpac.php new file mode 100644 index 000000000..64a87d05b --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.lpac.php @@ -0,0 +1,125 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.lpac.php // +// module for analyzing LPAC Audio files // +// dependencies: module.audio-video.riff.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + +class getid3_lpac +{ + + function getid3_lpac(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $LPACheader = fread($fd, 14); + if (substr($LPACheader, 0, 4) != 'LPAC') { + $ThisFileInfo['error'][] = 'Expected "LPAC" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$StreamMarker.'"'; + return false; + } + $ThisFileInfo['avdataoffset'] += 14; + + $ThisFileInfo['fileformat'] = 'lpac'; + $ThisFileInfo['audio']['dataformat'] = 'lpac'; + $ThisFileInfo['audio']['lossless'] = true; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + + $ThisFileInfo['lpac']['file_version'] = getid3_lib::BigEndian2Int(substr($LPACheader, 4, 1)); + $flags['audio_type'] = getid3_lib::BigEndian2Int(substr($LPACheader, 5, 1)); + $ThisFileInfo['lpac']['total_samples']= getid3_lib::BigEndian2Int(substr($LPACheader, 6, 4)); + $flags['parameters'] = getid3_lib::BigEndian2Int(substr($LPACheader, 10, 4)); + + $ThisFileInfo['lpac']['flags']['is_wave'] = (bool) ($flags['audio_type'] & 0x40); + $ThisFileInfo['lpac']['flags']['stereo'] = (bool) ($flags['audio_type'] & 0x04); + $ThisFileInfo['lpac']['flags']['24_bit'] = (bool) ($flags['audio_type'] & 0x02); + $ThisFileInfo['lpac']['flags']['16_bit'] = (bool) ($flags['audio_type'] & 0x01); + + if ($ThisFileInfo['lpac']['flags']['24_bit'] && $ThisFileInfo['lpac']['flags']['16_bit']) { + $ThisFileInfo['warning'][] = '24-bit and 16-bit flags cannot both be set'; + } + + $ThisFileInfo['lpac']['flags']['fast_compress'] = (bool) ($flags['parameters'] & 0x40000000); + $ThisFileInfo['lpac']['flags']['random_access'] = (bool) ($flags['parameters'] & 0x08000000); + $ThisFileInfo['lpac']['block_length'] = pow(2, (($flags['parameters'] & 0x07000000) >> 24)) * 256; + $ThisFileInfo['lpac']['flags']['adaptive_prediction_order'] = (bool) ($flags['parameters'] & 0x00800000); + $ThisFileInfo['lpac']['flags']['adaptive_quantization'] = (bool) ($flags['parameters'] & 0x00400000); + $ThisFileInfo['lpac']['flags']['joint_stereo'] = (bool) ($flags['parameters'] & 0x00040000); + $ThisFileInfo['lpac']['quantization'] = ($flags['parameters'] & 0x00001F00) >> 8; + $ThisFileInfo['lpac']['max_prediction_order'] = ($flags['parameters'] & 0x0000003F); + + if ($ThisFileInfo['lpac']['flags']['fast_compress'] && ($ThisFileInfo['lpac']['max_prediction_order'] != 3)) { + $ThisFileInfo['warning'][] = 'max_prediction_order expected to be "3" if fast_compress is true, actual value is "'.$ThisFileInfo['lpac']['max_prediction_order'].'"'; + } + switch ($ThisFileInfo['lpac']['file_version']) { + case 6: + if ($ThisFileInfo['lpac']['flags']['adaptive_quantization']) { + $ThisFileInfo['warning'][] = 'adaptive_quantization expected to be false in LPAC file stucture v6, actually true'; + } + if ($ThisFileInfo['lpac']['quantization'] != 20) { + $ThisFileInfo['warning'][] = 'Quantization expected to be 20 in LPAC file stucture v6, actually '.$ThisFileInfo['lpac']['flags']['Q']; + } + break; + + default: + //$ThisFileInfo['warning'][] = 'This version of getID3() only supports LPAC file format version 6, this file is version '.$ThisFileInfo['lpac']['file_version'].' - please report to info@getid3.org'; + break; + } + + $dummy = $ThisFileInfo; + $riff = new getid3_riff($fd, $dummy); + $ThisFileInfo['avdataoffset'] = $dummy['avdataoffset']; + $ThisFileInfo['riff'] = $dummy['riff']; + $ThisFileInfo['error'] = $dummy['error']; + $ThisFileInfo['warning'] = $dummy['warning']; + $ThisFileInfo['lpac']['comments']['comment'] = $dummy['comments']; + $ThisFileInfo['audio']['sample_rate'] = $dummy['audio']['sample_rate']; + + $ThisFileInfo['audio']['channels'] = ($ThisFileInfo['lpac']['flags']['stereo'] ? 2 : 1); + + if ($ThisFileInfo['lpac']['flags']['24_bit']) { + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['riff']['audio'][0]['bits_per_sample']; + } elseif ($ThisFileInfo['lpac']['flags']['16_bit']) { + $ThisFileInfo['audio']['bits_per_sample'] = 16; + } else { + $ThisFileInfo['audio']['bits_per_sample'] = 8; + } + + if ($ThisFileInfo['lpac']['flags']['fast_compress']) { + // fast + $ThisFileInfo['audio']['encoder_options'] = '-1'; + } else { + switch ($ThisFileInfo['lpac']['max_prediction_order']) { + case 20: // simple + $ThisFileInfo['audio']['encoder_options'] = '-2'; + break; + case 30: // medium + $ThisFileInfo['audio']['encoder_options'] = '-3'; + break; + case 40: // high + $ThisFileInfo['audio']['encoder_options'] = '-4'; + break; + case 60: // extrahigh + $ThisFileInfo['audio']['encoder_options'] = '-5'; + break; + } + } + + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['lpac']['total_samples'] / $ThisFileInfo['audio']['sample_rate']; + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + + return true; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.midi.php b/campcaster/src/modules/getid3/var/module.audio.midi.php new file mode 100644 index 000000000..f72760d1e --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.midi.php @@ -0,0 +1,520 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.midi.php // +// module for Midi Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_midi +{ + + function getid3_midi(&$fd, &$ThisFileInfo, $scanwholefile=true) { + + // shortcut + $ThisFileInfo['midi']['raw'] = array(); + $thisfile_midi = &$ThisFileInfo['midi']; + $thisfile_midi_raw = &$thisfile_midi['raw']; + + $ThisFileInfo['fileformat'] = 'midi'; + $ThisFileInfo['audio']['dataformat'] = 'midi'; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $MIDIdata = fread($fd, GETID3_FREAD_BUFFER_SIZE); + $offset = 0; + $MIDIheaderID = substr($MIDIdata, $offset, 4); // 'MThd' + if ($MIDIheaderID != 'MThd') { + $ThisFileInfo['error'][] = 'Expecting "MThd" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$MIDIheaderID.'"'; + unset($ThisFileInfo['fileformat']); + return false; + } + $offset += 4; + $thisfile_midi_raw['headersize'] = getid3_lib::BigEndian2Int(substr($MIDIdata, $offset, 4)); + $offset += 4; + $thisfile_midi_raw['fileformat'] = getid3_lib::BigEndian2Int(substr($MIDIdata, $offset, 2)); + $offset += 2; + $thisfile_midi_raw['tracks'] = getid3_lib::BigEndian2Int(substr($MIDIdata, $offset, 2)); + $offset += 2; + $thisfile_midi_raw['ticksperqnote'] = getid3_lib::BigEndian2Int(substr($MIDIdata, $offset, 2)); + $offset += 2; + + for ($i = 0; $i < $thisfile_midi_raw['tracks']; $i++) { + if ((strlen($MIDIdata) - $offset) < 8) { + $MIDIdata .= fread($fd, GETID3_FREAD_BUFFER_SIZE); + } + $trackID = substr($MIDIdata, $offset, 4); + $offset += 4; + if ($trackID == 'MTrk') { + $tracksize = getid3_lib::BigEndian2Int(substr($MIDIdata, $offset, 4)); + $offset += 4; + // $thisfile_midi['tracks'][$i]['size'] = $tracksize; + $trackdataarray[$i] = substr($MIDIdata, $offset, $tracksize); + $offset += $tracksize; + } else { + $ThisFileInfo['error'][] = 'Expecting "MTrk" at '.$offset.', found '.$trackID.' instead'; + return false; + } + } + + if (!isset($trackdataarray) || !is_array($trackdataarray)) { + $ThisFileInfo['error'][] = 'Cannot find MIDI track information'; + unset($thisfile_midi); + unset($ThisFileInfo['fileformat']); + return false; + } + + if ($scanwholefile) { // this can take quite a long time, so have the option to bypass it if speed is very important + $thisfile_midi['totalticks'] = 0; + $ThisFileInfo['playtime_seconds'] = 0; + $CurrentMicroSecondsPerBeat = 500000; // 120 beats per minute; 60,000,000 microseconds per minute -> 500,000 microseconds per beat + $CurrentBeatsPerMinute = 120; // 120 beats per minute; 60,000,000 microseconds per minute -> 500,000 microseconds per beat + + foreach ($trackdataarray as $tracknumber => $trackdata) { + + $eventsoffset = 0; + $LastIssuedMIDIcommand = 0; + $LastIssuedMIDIchannel = 0; + $CumulativeDeltaTime = 0; + $TicksAtCurrentBPM = 0; + while ($eventsoffset < strlen($trackdata)) { + $eventid = 0; + if (isset($MIDIevents[$tracknumber]) && is_array($MIDIevents[$tracknumber])) { + $eventid = count($MIDIevents[$tracknumber]); + } + $deltatime = 0; + for ($i = 0; $i < 4; $i++) { + $deltatimebyte = ord(substr($trackdata, $eventsoffset++, 1)); + $deltatime = ($deltatime << 7) + ($deltatimebyte & 0x7F); + if ($deltatimebyte & 0x80) { + // another byte follows + } else { + break; + } + } + $CumulativeDeltaTime += $deltatime; + $TicksAtCurrentBPM += $deltatime; + $MIDIevents[$tracknumber][$eventid]['deltatime'] = $deltatime; + $MIDI_event_channel = ord(substr($trackdata, $eventsoffset++, 1)); + if ($MIDI_event_channel & 0x80) { + // OK, normal event - MIDI command has MSB set + $LastIssuedMIDIcommand = $MIDI_event_channel >> 4; + $LastIssuedMIDIchannel = $MIDI_event_channel & 0x0F; + } else { + // running event - assume last command + $eventsoffset--; + } + $MIDIevents[$tracknumber][$eventid]['eventid'] = $LastIssuedMIDIcommand; + $MIDIevents[$tracknumber][$eventid]['channel'] = $LastIssuedMIDIchannel; + if ($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x08) { // Note off (key is released) + + $notenumber = ord(substr($trackdata, $eventsoffset++, 1)); + $velocity = ord(substr($trackdata, $eventsoffset++, 1)); + + } elseif ($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x09) { // Note on (key is pressed) + + $notenumber = ord(substr($trackdata, $eventsoffset++, 1)); + $velocity = ord(substr($trackdata, $eventsoffset++, 1)); + + } elseif ($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x0A) { // Key after-touch + + $notenumber = ord(substr($trackdata, $eventsoffset++, 1)); + $velocity = ord(substr($trackdata, $eventsoffset++, 1)); + + } elseif ($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x0B) { // Control Change + + $controllernum = ord(substr($trackdata, $eventsoffset++, 1)); + $newvalue = ord(substr($trackdata, $eventsoffset++, 1)); + + } elseif ($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x0C) { // Program (patch) change + + $newprogramnum = ord(substr($trackdata, $eventsoffset++, 1)); + + $thisfile_midi_raw['track'][$tracknumber]['instrumentid'] = $newprogramnum; + if ($tracknumber == 10) { + $thisfile_midi_raw['track'][$tracknumber]['instrument'] = $this->GeneralMIDIpercussionLookup($newprogramnum); + } else { + $thisfile_midi_raw['track'][$tracknumber]['instrument'] = $this->GeneralMIDIinstrumentLookup($newprogramnum); + } + + } elseif ($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x0D) { // Channel after-touch + + $channelnumber = ord(substr($trackdata, $eventsoffset++, 1)); + + } elseif ($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x0E) { // Pitch wheel change (2000H is normal or no change) + + $changeLSB = ord(substr($trackdata, $eventsoffset++, 1)); + $changeMSB = ord(substr($trackdata, $eventsoffset++, 1)); + $pitchwheelchange = (($changeMSB & 0x7F) << 7) & ($changeLSB & 0x7F); + + } elseif (($MIDIevents[$tracknumber][$eventid]['eventid'] == 0x0F) && ($MIDIevents[$tracknumber][$eventid]['channel'] == 0x0F)) { + + $METAeventCommand = ord(substr($trackdata, $eventsoffset++, 1)); + $METAeventLength = ord(substr($trackdata, $eventsoffset++, 1)); + $METAeventData = substr($trackdata, $eventsoffset, $METAeventLength); + $eventsoffset += $METAeventLength; + switch ($METAeventCommand) { + case 0x00: // Set track sequence number + $track_sequence_number = getid3_lib::BigEndian2Int(substr($METAeventData, 0, $METAeventLength)); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['seqno'] = $track_sequence_number; + break; + + case 0x01: // Text: generic + $text_generic = substr($METAeventData, 0, $METAeventLength); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['text'] = $text_generic; + $thisfile_midi['comments']['comment'][] = $text_generic; + break; + + case 0x02: // Text: copyright + $text_copyright = substr($METAeventData, 0, $METAeventLength); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['copyright'] = $text_copyright; + $thisfile_midi['comments']['copyright'][] = $text_copyright; + break; + + case 0x03: // Text: track name + $text_trackname = substr($METAeventData, 0, $METAeventLength); + $thisfile_midi_raw['track'][$tracknumber]['name'] = $text_trackname; + break; + + case 0x04: // Text: track instrument name + $text_instrument = substr($METAeventData, 0, $METAeventLength); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['instrument'] = $text_instrument; + break; + + case 0x05: // Text: lyrics + $text_lyrics = substr($METAeventData, 0, $METAeventLength); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['lyrics'] = $text_lyrics; + if (!isset($thisfile_midi['lyrics'])) { + $thisfile_midi['lyrics'] = ''; + } + $thisfile_midi['lyrics'] .= $text_lyrics."\n"; + break; + + case 0x06: // Text: marker + $text_marker = substr($METAeventData, 0, $METAeventLength); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['marker'] = $text_marker; + break; + + case 0x07: // Text: cue point + $text_cuepoint = substr($METAeventData, 0, $METAeventLength); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['cuepoint'] = $text_cuepoint; + break; + + case 0x2F: // End Of Track + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['EOT'] = $CumulativeDeltaTime; + break; + + case 0x51: // Tempo: microseconds / quarter note + $CurrentMicroSecondsPerBeat = getid3_lib::BigEndian2Int(substr($METAeventData, 0, $METAeventLength)); + if ($CurrentMicroSecondsPerBeat == 0) { + $ThisFileInfo['error'][] = 'Corrupt MIDI file: CurrentMicroSecondsPerBeat == zero'; + return false; + } + $thisfile_midi_raw['events'][$tracknumber][$CumulativeDeltaTime]['us_qnote'] = $CurrentMicroSecondsPerBeat; + $CurrentBeatsPerMinute = (1000000 / $CurrentMicroSecondsPerBeat) * 60; + $MicroSecondsPerQuarterNoteAfter[$CumulativeDeltaTime] = $CurrentMicroSecondsPerBeat; + $TicksAtCurrentBPM = 0; + break; + + case 0x58: // Time signature + $timesig_numerator = getid3_lib::BigEndian2Int($METAeventData{0}); + $timesig_denominator = pow(2, getid3_lib::BigEndian2Int($METAeventData{1})); // $02 -> x/4, $03 -> x/8, etc + $timesig_32inqnote = getid3_lib::BigEndian2Int($METAeventData{2}); // number of 32nd notes to the quarter note + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['timesig_32inqnote'] = $timesig_32inqnote; + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['timesig_numerator'] = $timesig_numerator; + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['timesig_denominator'] = $timesig_denominator; + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['timesig_text'] = $timesig_numerator.'/'.$timesig_denominator; + $thisfile_midi['timesignature'][] = $timesig_numerator.'/'.$timesig_denominator; + break; + + case 0x59: // Keysignature + $keysig_sharpsflats = getid3_lib::BigEndian2Int($METAeventData{0}); + if ($keysig_sharpsflats & 0x80) { + // (-7 -> 7 flats, 0 ->key of C, 7 -> 7 sharps) + $keysig_sharpsflats -= 256; + } + + $keysig_majorminor = getid3_lib::BigEndian2Int($METAeventData{1}); // 0 -> major, 1 -> minor + $keysigs = array(-7=>'Cb', -6=>'Gb', -5=>'Db', -4=>'Ab', -3=>'Eb', -2=>'Bb', -1=>'F', 0=>'C', 1=>'G', 2=>'D', 3=>'A', 4=>'E', 5=>'B', 6=>'F#', 7=>'C#'); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['keysig_sharps'] = (($keysig_sharpsflats > 0) ? abs($keysig_sharpsflats) : 0); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['keysig_flats'] = (($keysig_sharpsflats < 0) ? abs($keysig_sharpsflats) : 0); + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['keysig_minor'] = (bool) $keysig_majorminor; + //$thisfile_midi_raw['events'][$tracknumber][$eventid]['keysig_text'] = $keysigs[$keysig_sharpsflats].' '.($thisfile_midi_raw['events'][$tracknumber][$eventid]['keysig_minor'] ? 'minor' : 'major'); + + // $keysigs[$keysig_sharpsflats] gets an int key (correct) - $keysigs["$keysig_sharpsflats"] gets a string key (incorrect) + $thisfile_midi['keysignature'][] = $keysigs[$keysig_sharpsflats].' '.((bool) $keysig_majorminor ? 'minor' : 'major'); + break; + + case 0x7F: // Sequencer specific information + $custom_data = substr($METAeventData, 0, $METAeventLength); + break; + + default: + $ThisFileInfo['warning'][] = 'Unhandled META Event Command: '.$METAeventCommand; + break; + } + + } else { + + $ThisFileInfo['warning'][] = 'Unhandled MIDI Event ID: '.$MIDIevents[$tracknumber][$eventid]['eventid'].' + Channel ID: '.$MIDIevents[$tracknumber][$eventid]['channel']; + + } + } + if (($tracknumber > 0) || (count($trackdataarray) == 1)) { + $thisfile_midi['totalticks'] = max($thisfile_midi['totalticks'], $CumulativeDeltaTime); + } + } + $previoustickoffset = null; + + ksort($MicroSecondsPerQuarterNoteAfter); + foreach ($MicroSecondsPerQuarterNoteAfter as $tickoffset => $microsecondsperbeat) { + if (is_null($previoustickoffset)) { + $prevmicrosecondsperbeat = $microsecondsperbeat; + $previoustickoffset = $tickoffset; + continue; + } + if ($thisfile_midi['totalticks'] > $tickoffset) { + + if ($thisfile_midi_raw['ticksperqnote'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt MIDI file: ticksperqnote == zero'; + return false; + } + + $ThisFileInfo['playtime_seconds'] += (($tickoffset - $previoustickoffset) / $thisfile_midi_raw['ticksperqnote']) * ($prevmicrosecondsperbeat / 1000000); + + $prevmicrosecondsperbeat = $microsecondsperbeat; + $previoustickoffset = $tickoffset; + } + } + if ($thisfile_midi['totalticks'] > $previoustickoffset) { + + if ($thisfile_midi_raw['ticksperqnote'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt MIDI file: ticksperqnote == zero'; + return false; + } + + $ThisFileInfo['playtime_seconds'] += (($thisfile_midi['totalticks'] - $previoustickoffset) / $thisfile_midi_raw['ticksperqnote']) * ($microsecondsperbeat / 1000000); + + } + } + + if ($ThisFileInfo['playtime_seconds'] > 0) { + $ThisFileInfo['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + } + + if (!empty($thisfile_midi['lyrics'])) { + $thisfile_midi['comments']['lyrics'][] = $thisfile_midi['lyrics']; + } + + return true; + } + + function GeneralMIDIinstrumentLookup($instrumentid) { + + $begin = __LINE__; + + /** This is not a comment! + + 0 Acoustic Grand + 1 Bright Acoustic + 2 Electric Grand + 3 Honky-Tonk + 4 Electric Piano 1 + 5 Electric Piano 2 + 6 Harpsichord + 7 Clavier + 8 Celesta + 9 Glockenspiel + 10 Music Box + 11 Vibraphone + 12 Marimba + 13 Xylophone + 14 Tubular Bells + 15 Dulcimer + 16 Drawbar Organ + 17 Percussive Organ + 18 Rock Organ + 19 Church Organ + 20 Reed Organ + 21 Accordian + 22 Harmonica + 23 Tango Accordian + 24 Acoustic Guitar (nylon) + 25 Acoustic Guitar (steel) + 26 Electric Guitar (jazz) + 27 Electric Guitar (clean) + 28 Electric Guitar (muted) + 29 Overdriven Guitar + 30 Distortion Guitar + 31 Guitar Harmonics + 32 Acoustic Bass + 33 Electric Bass (finger) + 34 Electric Bass (pick) + 35 Fretless Bass + 36 Slap Bass 1 + 37 Slap Bass 2 + 38 Synth Bass 1 + 39 Synth Bass 2 + 40 Violin + 41 Viola + 42 Cello + 43 Contrabass + 44 Tremolo Strings + 45 Pizzicato Strings + 46 Orchestral Strings + 47 Timpani + 48 String Ensemble 1 + 49 String Ensemble 2 + 50 SynthStrings 1 + 51 SynthStrings 2 + 52 Choir Aahs + 53 Voice Oohs + 54 Synth Voice + 55 Orchestra Hit + 56 Trumpet + 57 Trombone + 58 Tuba + 59 Muted Trumpet + 60 French Horn + 61 Brass Section + 62 SynthBrass 1 + 63 SynthBrass 2 + 64 Soprano Sax + 65 Alto Sax + 66 Tenor Sax + 67 Baritone Sax + 68 Oboe + 69 English Horn + 70 Bassoon + 71 Clarinet + 72 Piccolo + 73 Flute + 74 Recorder + 75 Pan Flute + 76 Blown Bottle + 77 Shakuhachi + 78 Whistle + 79 Ocarina + 80 Lead 1 (square) + 81 Lead 2 (sawtooth) + 82 Lead 3 (calliope) + 83 Lead 4 (chiff) + 84 Lead 5 (charang) + 85 Lead 6 (voice) + 86 Lead 7 (fifths) + 87 Lead 8 (bass + lead) + 88 Pad 1 (new age) + 89 Pad 2 (warm) + 90 Pad 3 (polysynth) + 91 Pad 4 (choir) + 92 Pad 5 (bowed) + 93 Pad 6 (metallic) + 94 Pad 7 (halo) + 95 Pad 8 (sweep) + 96 FX 1 (rain) + 97 FX 2 (soundtrack) + 98 FX 3 (crystal) + 99 FX 4 (atmosphere) + 100 FX 5 (brightness) + 101 FX 6 (goblins) + 102 FX 7 (echoes) + 103 FX 8 (sci-fi) + 104 Sitar + 105 Banjo + 106 Shamisen + 107 Koto + 108 Kalimba + 109 Bagpipe + 110 Fiddle + 111 Shanai + 112 Tinkle Bell + 113 Agogo + 114 Steel Drums + 115 Woodblock + 116 Taiko Drum + 117 Melodic Tom + 118 Synth Drum + 119 Reverse Cymbal + 120 Guitar Fret Noise + 121 Breath Noise + 122 Seashore + 123 Bird Tweet + 124 Telephone Ring + 125 Helicopter + 126 Applause + 127 Gunshot + + */ + + return getid3_lib::EmbeddedLookup($instrumentid, $begin, __LINE__, __FILE__, 'GeneralMIDIinstrument'); + } + + function GeneralMIDIpercussionLookup($instrumentid) { + + $begin = __LINE__; + + /** This is not a comment! + + 35 Acoustic Bass Drum + 36 Bass Drum 1 + 37 Side Stick + 38 Acoustic Snare + 39 Hand Clap + 40 Electric Snare + 41 Low Floor Tom + 42 Closed Hi-Hat + 43 High Floor Tom + 44 Pedal Hi-Hat + 45 Low Tom + 46 Open Hi-Hat + 47 Low-Mid Tom + 48 Hi-Mid Tom + 49 Crash Cymbal 1 + 50 High Tom + 51 Ride Cymbal 1 + 52 Chinese Cymbal + 53 Ride Bell + 54 Tambourine + 55 Splash Cymbal + 56 Cowbell + 57 Crash Cymbal 2 + 59 Ride Cymbal 2 + 60 Hi Bongo + 61 Low Bongo + 62 Mute Hi Conga + 63 Open Hi Conga + 64 Low Conga + 65 High Timbale + 66 Low Timbale + 67 High Agogo + 68 Low Agogo + 69 Cabasa + 70 Maracas + 71 Short Whistle + 72 Long Whistle + 73 Short Guiro + 74 Long Guiro + 75 Claves + 76 Hi Wood Block + 77 Low Wood Block + 78 Mute Cuica + 79 Open Cuica + 80 Mute Triangle + 81 Open Triangle + + */ + + return getid3_lib::EmbeddedLookup($instrumentid, $begin, __LINE__, __FILE__, 'GeneralMIDIpercussion'); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.mod.php b/campcaster/src/modules/getid3/var/module.audio.mod.php new file mode 100644 index 000000000..7f81ff360 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.mod.php @@ -0,0 +1,101 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.mod.php // +// module for analyzing MOD Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_mod +{ + + // new combined constructor + function getid3_mod(&$fd, &$ThisFileInfo, $option) { + + if ($option === 'mod') { + $this->getMODheaderFilepointer($fd, $ThisFileInfo); + } + elseif ($option === 'xm') { + $this->getXMheaderFilepointer($fd, $ThisFileInfo); + } + elseif ($option === 'it') { + $this->getITheaderFilepointer($fd, $ThisFileInfo); + } + elseif ($option === 's3m') { + $this->getS3MheaderFilepointer($fd, $ThisFileInfo); + } + } + + + function getMODheaderFilepointer(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'] + 1080); + $FormatID = fread($fd, 4); + if (!ereg('^(M.K.|[5-9]CHN|[1-3][0-9]CH)$', $FormatID)) { + $ThisFileInfo['error'][] = 'This is not a known type of MOD file'; + return false; + } + + $ThisFileInfo['fileformat'] = 'mod'; + + $ThisFileInfo['error'][] = 'MOD parsing not enabled in this version of getID3()'; + return false; + } + + function getXMheaderFilepointer(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset']); + $FormatID = fread($fd, 15); + if (!ereg('^Extended Module$', $FormatID)) { + $ThisFileInfo['error'][] = 'This is not a known type of XM-MOD file'; + return false; + } + + $ThisFileInfo['fileformat'] = 'xm'; + + $ThisFileInfo['error'][] = 'XM-MOD parsing not enabled in this version of getID3()'; + return false; + } + + function getS3MheaderFilepointer(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'] + 44); + $FormatID = fread($fd, 4); + if (!ereg('^SCRM$', $FormatID)) { + $ThisFileInfo['error'][] = 'This is not a ScreamTracker MOD file'; + return false; + } + + $ThisFileInfo['fileformat'] = 's3m'; + + $ThisFileInfo['error'][] = 'ScreamTracker parsing not enabled in this version of getID3()'; + return false; + } + + function getITheaderFilepointer(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset']); + $FormatID = fread($fd, 4); + if (!ereg('^IMPM$', $FormatID)) { + $ThisFileInfo['error'][] = 'This is not an ImpulseTracker MOD file'; + return false; + } + + $ThisFileInfo['fileformat'] = 'it'; + + $ThisFileInfo['error'][] = 'ImpulseTracker parsing not enabled in this version of getID3()'; + return false; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.monkey.php b/campcaster/src/modules/getid3/var/module.audio.monkey.php new file mode 100644 index 000000000..42382ad15 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.monkey.php @@ -0,0 +1,202 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.monkey.php // +// module for analyzing Monkey's Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_monkey +{ + + function getid3_monkey(&$fd, &$ThisFileInfo) { + // based loosely on code from TMonkey by Jurgen Faul + // http://jfaul.de/atl or http://j-faul.virtualave.net/atl/atl.html + + $ThisFileInfo['fileformat'] = 'mac'; + $ThisFileInfo['audio']['dataformat'] = 'mac'; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + $ThisFileInfo['audio']['lossless'] = true; + + $ThisFileInfo['monkeys_audio']['raw'] = array(); + $thisfile_monkeysaudio = &$ThisFileInfo['monkeys_audio']; + $thisfile_monkeysaudio_raw = &$thisfile_monkeysaudio['raw']; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $MACheaderData = fread($fd, 74); + + $thisfile_monkeysaudio_raw['magic'] = substr($MACheaderData, 0, 4); + if ($thisfile_monkeysaudio_raw['magic'] != 'MAC ') { + $ThisFileInfo['error'][] = 'Expecting "MAC" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$thisfile_monkeysaudio_raw['magic'].'"'; + unset($ThisFileInfo['fileformat']); + return false; + } + $thisfile_monkeysaudio_raw['nVersion'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 4, 2)); // appears to be uint32 in 3.98+ + + if ($thisfile_monkeysaudio_raw['nVersion'] < 3980) { + $thisfile_monkeysaudio_raw['nCompressionLevel'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 6, 2)); + $thisfile_monkeysaudio_raw['nFormatFlags'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 8, 2)); + $thisfile_monkeysaudio_raw['nChannels'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 10, 2)); + $thisfile_monkeysaudio_raw['nSampleRate'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 12, 4)); + $thisfile_monkeysaudio_raw['nHeaderDataBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 16, 4)); + $thisfile_monkeysaudio_raw['nWAVTerminatingBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 20, 4)); + $thisfile_monkeysaudio_raw['nTotalFrames'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 24, 4)); + $thisfile_monkeysaudio_raw['nFinalFrameSamples'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 28, 4)); + $thisfile_monkeysaudio_raw['nPeakLevel'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 32, 4)); + $thisfile_monkeysaudio_raw['nSeekElements'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, 38, 2)); + $offset = 8; + } else { + $offset = 8; + // APE_DESCRIPTOR + $thisfile_monkeysaudio_raw['nDescriptorBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nHeaderBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nSeekTableBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nHeaderDataBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nAPEFrameDataBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nAPEFrameDataBytesHigh'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nTerminatingDataBytes'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['cFileMD5'] = substr($MACheaderData, $offset, 16); + $offset += 16; + + // APE_HEADER + $thisfile_monkeysaudio_raw['nCompressionLevel'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 2)); + $offset += 2; + $thisfile_monkeysaudio_raw['nFormatFlags'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 2)); + $offset += 2; + $thisfile_monkeysaudio_raw['nBlocksPerFrame'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nFinalFrameBlocks'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nTotalFrames'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + $thisfile_monkeysaudio_raw['nBitsPerSample'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 2)); + $offset += 2; + $thisfile_monkeysaudio_raw['nChannels'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 2)); + $offset += 2; + $thisfile_monkeysaudio_raw['nSampleRate'] = getid3_lib::LittleEndian2Int(substr($MACheaderData, $offset, 4)); + $offset += 4; + } + + $thisfile_monkeysaudio['flags']['8-bit'] = (bool) ($thisfile_monkeysaudio_raw['nFormatFlags'] & 0x0001); + $thisfile_monkeysaudio['flags']['crc-32'] = (bool) ($thisfile_monkeysaudio_raw['nFormatFlags'] & 0x0002); + $thisfile_monkeysaudio['flags']['peak_level'] = (bool) ($thisfile_monkeysaudio_raw['nFormatFlags'] & 0x0004); + $thisfile_monkeysaudio['flags']['24-bit'] = (bool) ($thisfile_monkeysaudio_raw['nFormatFlags'] & 0x0008); + $thisfile_monkeysaudio['flags']['seek_elements'] = (bool) ($thisfile_monkeysaudio_raw['nFormatFlags'] & 0x0010); + $thisfile_monkeysaudio['flags']['no_wav_header'] = (bool) ($thisfile_monkeysaudio_raw['nFormatFlags'] & 0x0020); + $thisfile_monkeysaudio['version'] = $thisfile_monkeysaudio_raw['nVersion'] / 1000; + $thisfile_monkeysaudio['compression'] = $this->MonkeyCompressionLevelNameLookup($thisfile_monkeysaudio_raw['nCompressionLevel']); + if ($thisfile_monkeysaudio_raw['nVersion'] < 3980) { + $thisfile_monkeysaudio['samples_per_frame'] = $this->MonkeySamplesPerFrame($thisfile_monkeysaudio_raw['nVersion'], $thisfile_monkeysaudio_raw['nCompressionLevel']); + } + $thisfile_monkeysaudio['bits_per_sample'] = ($thisfile_monkeysaudio['flags']['24-bit'] ? 24 : ($thisfile_monkeysaudio['flags']['8-bit'] ? 8 : 16)); + $thisfile_monkeysaudio['channels'] = $thisfile_monkeysaudio_raw['nChannels']; + $ThisFileInfo['audio']['channels'] = $thisfile_monkeysaudio['channels']; + $thisfile_monkeysaudio['sample_rate'] = $thisfile_monkeysaudio_raw['nSampleRate']; + if ($thisfile_monkeysaudio['sample_rate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt MAC file: frequency == zero'; + return false; + } + $ThisFileInfo['audio']['sample_rate'] = $thisfile_monkeysaudio['sample_rate']; + if ($thisfile_monkeysaudio['flags']['peak_level']) { + $thisfile_monkeysaudio['peak_level'] = $thisfile_monkeysaudio_raw['nPeakLevel']; + $thisfile_monkeysaudio['peak_ratio'] = $thisfile_monkeysaudio['peak_level'] / pow(2, $thisfile_monkeysaudio['bits_per_sample'] - 1); + } + if ($thisfile_monkeysaudio_raw['nVersion'] >= 3980) { + $thisfile_monkeysaudio['samples'] = (($thisfile_monkeysaudio_raw['nTotalFrames'] - 1) * $thisfile_monkeysaudio_raw['nBlocksPerFrame']) + $thisfile_monkeysaudio_raw['nFinalFrameBlocks']; + } else { + $thisfile_monkeysaudio['samples'] = (($thisfile_monkeysaudio_raw['nTotalFrames'] - 1) * $thisfile_monkeysaudio['samples_per_frame']) + $thisfile_monkeysaudio_raw['nFinalFrameSamples']; + } + $thisfile_monkeysaudio['playtime'] = $thisfile_monkeysaudio['samples'] / $thisfile_monkeysaudio['sample_rate']; + if ($thisfile_monkeysaudio['playtime'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt MAC file: playtime == zero'; + return false; + } + $ThisFileInfo['playtime_seconds'] = $thisfile_monkeysaudio['playtime']; + $thisfile_monkeysaudio['compressed_size'] = $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']; + $thisfile_monkeysaudio['uncompressed_size'] = $thisfile_monkeysaudio['samples'] * $thisfile_monkeysaudio['channels'] * ($thisfile_monkeysaudio['bits_per_sample'] / 8); + if ($thisfile_monkeysaudio['uncompressed_size'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt MAC file: uncompressed_size == zero'; + return false; + } + $thisfile_monkeysaudio['compression_ratio'] = $thisfile_monkeysaudio['compressed_size'] / ($thisfile_monkeysaudio['uncompressed_size'] + $thisfile_monkeysaudio_raw['nHeaderDataBytes']); + $thisfile_monkeysaudio['bitrate'] = (($thisfile_monkeysaudio['samples'] * $thisfile_monkeysaudio['channels'] * $thisfile_monkeysaudio['bits_per_sample']) / $thisfile_monkeysaudio['playtime']) * $thisfile_monkeysaudio['compression_ratio']; + $ThisFileInfo['audio']['bitrate'] = $thisfile_monkeysaudio['bitrate']; + + // add size of MAC header to avdataoffset + if ($thisfile_monkeysaudio_raw['nVersion'] >= 3980) { + $ThisFileInfo['avdataoffset'] += $thisfile_monkeysaudio_raw['nDescriptorBytes']; + $ThisFileInfo['avdataoffset'] += $thisfile_monkeysaudio_raw['nHeaderBytes']; + $ThisFileInfo['avdataoffset'] += $thisfile_monkeysaudio_raw['nSeekTableBytes']; + $ThisFileInfo['avdataoffset'] += $thisfile_monkeysaudio_raw['nHeaderDataBytes']; + + $ThisFileInfo['avdataend'] -= $thisfile_monkeysaudio_raw['nTerminatingDataBytes']; + } else { + $ThisFileInfo['avdataoffset'] += $offset; + } + + if ($thisfile_monkeysaudio_raw['nVersion'] >= 3980) { + if ($thisfile_monkeysaudio_raw['cFileMD5'] === str_repeat("\x00", 16)) { + //$ThisFileInfo['warning'][] = 'cFileMD5 is null'; + } else { + $ThisFileInfo['md5_data_source'] = ''; + $md5 = $thisfile_monkeysaudio_raw['cFileMD5']; + for ($i = 0; $i < strlen($md5); $i++) { + $ThisFileInfo['md5_data_source'] .= str_pad(dechex(ord($md5{$i})), 2, '00', STR_PAD_LEFT); + } + if (!preg_match('/^[0-9a-f]{32}$/', $ThisFileInfo['md5_data_source'])) { + unset($ThisFileInfo['md5_data_source']); + } + } + } + + + + $ThisFileInfo['audio']['bits_per_sample'] = $thisfile_monkeysaudio['bits_per_sample']; + $ThisFileInfo['audio']['encoder'] = 'MAC v'.number_format($thisfile_monkeysaudio['version'], 2); + $ThisFileInfo['audio']['encoder_options'] = ucfirst($thisfile_monkeysaudio['compression']).' compression'; + + return true; + } + + function MonkeyCompressionLevelNameLookup($compressionlevel) { + static $MonkeyCompressionLevelNameLookup = array( + 0 => 'unknown', + 1000 => 'fast', + 2000 => 'normal', + 3000 => 'high', + 4000 => 'extra-high', + 5000 => 'insane' + ); + return (isset($MonkeyCompressionLevelNameLookup[$compressionlevel]) ? $MonkeyCompressionLevelNameLookup[$compressionlevel] : 'invalid'); + } + + function MonkeySamplesPerFrame($versionid, $compressionlevel) { + if ($versionid >= 3950) { + return 73728 * 4; + } elseif ($versionid >= 3900) { + return 73728; + } elseif (($versionid >= 3800) && ($compressionlevel == 4000)) { + return 73728; + } else { + return 9216; + } + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.mp3.php b/campcaster/src/modules/getid3/var/module.audio.mp3.php new file mode 100644 index 000000000..baff8387f --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.mp3.php @@ -0,0 +1,1937 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.mp3.php // +// module for analyzing MP3 files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +// number of frames to scan to determine if MPEG-audio sequence is valid +// Lower this number to 5-20 for faster scanning +// Increase this number to 50+ for most accurate detection of valid VBR/CBR +// mpeg-audio streams +define('GETID3_MP3_VALID_CHECK_FRAMES', 35); + + +class getid3_mp3 +{ + + var $allow_bruteforce = false; // forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow, unrecommended, but may provide data from otherwise-unusuable files + + function getid3_mp3(&$fd, &$ThisFileInfo) { + + if (!$this->getOnlyMPEGaudioInfo($fd, $ThisFileInfo, $ThisFileInfo['avdataoffset'])) { + if ($this->allow_bruteforce) { + $ThisFileInfo['error'][] = 'Rescanning file in BruteForce mode'; + $this->getOnlyMPEGaudioInfoBruteForce($fd, $ThisFileInfo); + } + } + + + if (isset($ThisFileInfo['mpeg']['audio']['bitrate_mode'])) { + $ThisFileInfo['audio']['bitrate_mode'] = strtolower($ThisFileInfo['mpeg']['audio']['bitrate_mode']); + } + + if (((isset($ThisFileInfo['id3v2']['headerlength']) && ($ThisFileInfo['avdataoffset'] > $ThisFileInfo['id3v2']['headerlength'])) || (!isset($ThisFileInfo['id3v2']) && ($ThisFileInfo['avdataoffset'] > 0)))) { + + $synchoffsetwarning = 'Unknown data before synch '; + if (isset($ThisFileInfo['id3v2']['headerlength'])) { + $synchoffsetwarning .= '(ID3v2 header ends at '.$ThisFileInfo['id3v2']['headerlength'].', then '.($ThisFileInfo['avdataoffset'] - $ThisFileInfo['id3v2']['headerlength']).' bytes garbage, '; + } else { + $synchoffsetwarning .= '(should be at beginning of file, '; + } + $synchoffsetwarning .= 'synch detected at '.$ThisFileInfo['avdataoffset'].')'; + if ($ThisFileInfo['audio']['bitrate_mode'] == 'cbr') { + + if (!empty($ThisFileInfo['id3v2']['headerlength']) && (($ThisFileInfo['avdataoffset'] - $ThisFileInfo['id3v2']['headerlength']) == $ThisFileInfo['mpeg']['audio']['framelength'])) { + + $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90-3.92) DLL in CBR mode.'; + $ThisFileInfo['audio']['codec'] = 'LAME'; + $CurrentDataLAMEversionString = 'LAME3.'; + + } elseif (empty($ThisFileInfo['id3v2']['headerlength']) && ($ThisFileInfo['avdataoffset'] == $ThisFileInfo['mpeg']['audio']['framelength'])) { + + $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90 - 3.92) DLL in CBR mode.'; + $ThisFileInfo['audio']['codec'] = 'LAME'; + $CurrentDataLAMEversionString = 'LAME3.'; + + } + + } + $ThisFileInfo['warning'][] = $synchoffsetwarning; + + } + + if (isset($ThisFileInfo['mpeg']['audio']['LAME'])) { + $ThisFileInfo['audio']['codec'] = 'LAME'; + if (!empty($ThisFileInfo['mpeg']['audio']['LAME']['long_version'])) { + $ThisFileInfo['audio']['encoder'] = rtrim($ThisFileInfo['mpeg']['audio']['LAME']['long_version'], "\x00"); + } elseif (!empty($ThisFileInfo['mpeg']['audio']['LAME']['short_version'])) { + $ThisFileInfo['audio']['encoder'] = rtrim($ThisFileInfo['mpeg']['audio']['LAME']['short_version'], "\x00"); + } + } + + $CurrentDataLAMEversionString = (!empty($CurrentDataLAMEversionString) ? $CurrentDataLAMEversionString : @$ThisFileInfo['audio']['encoder']); + if (!empty($CurrentDataLAMEversionString) && (substr($CurrentDataLAMEversionString, 0, 6) == 'LAME3.') && !preg_match('[0-9\)]', substr($CurrentDataLAMEversionString, -1))) { + // a version number of LAME that does not end with a number like "LAME3.92" + // or with a closing parenthesis like "LAME3.88 (alpha)" + // or a version of LAME with the LAMEtag-not-filled-in-DLL-mode bug (3.90-3.92) + + // not sure what the actual last frame length will be, but will be less than or equal to 1441 + $PossiblyLongerLAMEversion_FrameLength = 1441; + + // Not sure what version of LAME this is - look in padding of last frame for longer version string + $PossibleLAMEversionStringOffset = $ThisFileInfo['avdataend'] - $PossiblyLongerLAMEversion_FrameLength; + fseek($fd, $PossibleLAMEversionStringOffset); + $PossiblyLongerLAMEversion_Data = fread($fd, $PossiblyLongerLAMEversion_FrameLength); + switch (substr($CurrentDataLAMEversionString, -1)) { + case 'a': + case 'b': + // "LAME3.94a" will have a longer version string of "LAME3.94 (alpha)" for example + // need to trim off "a" to match longer string + $CurrentDataLAMEversionString = substr($CurrentDataLAMEversionString, 0, -1); + break; + } + if (($PossiblyLongerLAMEversion_String = strstr($PossiblyLongerLAMEversion_Data, $CurrentDataLAMEversionString)) !== false) { + if (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) { + $PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //"LAME3.90.3" "LAME3.87 (beta 1, Sep 27 2000)" "LAME3.88 (beta)" + if (strlen($PossiblyLongerLAMEversion_NewString) > strlen(@$ThisFileInfo['audio']['encoder'])) { + $ThisFileInfo['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString; + } + } + } + } + if (!empty($ThisFileInfo['audio']['encoder'])) { + $ThisFileInfo['audio']['encoder'] = rtrim($ThisFileInfo['audio']['encoder'], "\x00 "); + } + + switch (@$ThisFileInfo['mpeg']['audio']['layer']) { + case 1: + case 2: + $ThisFileInfo['audio']['dataformat'] = 'mp'.$ThisFileInfo['mpeg']['audio']['layer']; + break; + } + if ($ThisFileInfo['fileformat'] == 'mp3') { + switch ($ThisFileInfo['audio']['dataformat']) { + case 'mp1': + case 'mp2': + case 'mp3': + $ThisFileInfo['fileformat'] = $ThisFileInfo['audio']['dataformat']; + break; + + default: + $ThisFileInfo['warning'][] = 'Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$ThisFileInfo['audio']['dataformat'].'"'; + break; + } + } + + if (empty($ThisFileInfo['fileformat'])) { + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['audio']['bitrate_mode']); + unset($ThisFileInfo['avdataoffset']); + unset($ThisFileInfo['avdataend']); + return false; + } + + $ThisFileInfo['mime_type'] = 'audio/mpeg'; + $ThisFileInfo['audio']['lossless'] = false; + + // Calculate playtime + if (!isset($ThisFileInfo['playtime_seconds']) && isset($ThisFileInfo['audio']['bitrate']) && ($ThisFileInfo['audio']['bitrate'] > 0)) { + $ThisFileInfo['playtime_seconds'] = ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8 / $ThisFileInfo['audio']['bitrate']; + } + + $ThisFileInfo['audio']['encoder_options'] = $this->GuessEncoderOptions($ThisFileInfo); + + return true; + } + + + function GuessEncoderOptions(&$ThisFileInfo) { + // shortcuts + if (!empty($ThisFileInfo['mpeg']['audio'])) { + $thisfile_mpeg_audio = &$ThisFileInfo['mpeg']['audio']; + if (!empty($thisfile_mpeg_audio['LAME'])) { + $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; + } + } + + $encoder_options = ''; + static $NamedPresetBitrates = array(16, 24, 40, 56, 112, 128, 160, 192, 256); + + if ((@$thisfile_mpeg_audio['VBR_method'] == 'Fraunhofer') && !empty($thisfile_mpeg_audio['VBR_quality'])) { + + $encoder_options = 'VBR q'.$thisfile_mpeg_audio['VBR_quality']; + + } elseif (!empty($thisfile_mpeg_audio_lame['preset_used']) && (!in_array($thisfile_mpeg_audio_lame['preset_used_id'], $NamedPresetBitrates))) { + + $encoder_options = $thisfile_mpeg_audio_lame['preset_used']; + + } elseif (!empty($thisfile_mpeg_audio_lame['vbr_quality'])) { + + static $KnownEncoderValues = array(); + if (empty($KnownEncoderValues)) { + + //$KnownEncoderValues[abrbitrate_minbitrate][vbr_quality][raw_vbr_method][raw_noise_shaping][raw_stereo_mode][ath_type][lowpass_frequency] = 'preset name'; + $KnownEncoderValues[0xFF][58][1][1][3][2][20500] = '--alt-preset insane'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues[0xFF][58][1][1][3][2][20600] = '--alt-preset insane'; // 3.90.2, 3.90.3, 3.91 + $KnownEncoderValues[0xFF][57][1][1][3][4][20500] = '--alt-preset insane'; // 3.94, 3.95 + $KnownEncoderValues['**'][78][3][2][3][2][19500] = '--alt-preset extreme'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues['**'][78][3][2][3][2][19600] = '--alt-preset extreme'; // 3.90.2, 3.91 + $KnownEncoderValues['**'][78][3][1][3][2][19600] = '--alt-preset extreme'; // 3.90.3 + $KnownEncoderValues['**'][78][4][2][3][2][19500] = '--alt-preset fast extreme'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues['**'][78][4][2][3][2][19600] = '--alt-preset fast extreme'; // 3.90.2, 3.90.3, 3.91 + $KnownEncoderValues['**'][78][3][2][3][4][19000] = '--alt-preset standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues['**'][78][3][1][3][4][19000] = '--alt-preset standard'; // 3.90.3 + $KnownEncoderValues['**'][78][4][2][3][4][19000] = '--alt-preset fast standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues['**'][78][4][1][3][4][19000] = '--alt-preset fast standard'; // 3.90.3 + $KnownEncoderValues['**'][88][4][1][3][3][19500] = '--r3mix'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues['**'][88][4][1][3][3][19600] = '--r3mix'; // 3.90.2, 3.90.3, 3.91 + $KnownEncoderValues['**'][67][4][1][3][4][18000] = '--r3mix'; // 3.94, 3.95 + $KnownEncoderValues['**'][68][3][2][3][4][18000] = '--alt-preset medium'; // 3.90.3 + $KnownEncoderValues['**'][68][4][2][3][4][18000] = '--alt-preset fast medium'; // 3.90.3 + + $KnownEncoderValues[0xFF][99][1][1][1][2][0] = '--preset studio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0xFF][58][2][1][3][2][20600] = '--preset studio'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0xFF][58][2][1][3][2][20500] = '--preset studio'; // 3.93 + $KnownEncoderValues[0xFF][57][2][1][3][4][20500] = '--preset studio'; // 3.94, 3.95 + $KnownEncoderValues[0xC0][88][1][1][1][2][0] = '--preset cd'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0xC0][58][2][2][3][2][19600] = '--preset cd'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0xC0][58][2][2][3][2][19500] = '--preset cd'; // 3.93 + $KnownEncoderValues[0xC0][57][2][1][3][4][19500] = '--preset cd'; // 3.94, 3.95 + $KnownEncoderValues[0xA0][78][1][1][3][2][18000] = '--preset hifi'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0xA0][58][2][2][3][2][18000] = '--preset hifi'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0xA0][57][2][1][3][4][18000] = '--preset hifi'; // 3.94, 3.95 + $KnownEncoderValues[0x80][67][1][1][3][2][18000] = '--preset tape'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0x80][67][1][1][3][2][15000] = '--preset radio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0x70][67][1][1][3][2][15000] = '--preset fm'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0x70][58][2][2][3][2][16000] = '--preset tape/radio/fm'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0x70][57][2][1][3][4][16000] = '--preset tape/radio/fm'; // 3.94, 3.95 + $KnownEncoderValues[0x38][58][2][2][0][2][10000] = '--preset voice'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0x38][57][2][1][0][4][15000] = '--preset voice'; // 3.94, 3.95 + $KnownEncoderValues[0x38][57][2][1][0][4][16000] = '--preset voice'; // 3.94a14 + $KnownEncoderValues[0x28][65][1][1][0][2][7500] = '--preset mw-us'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues[0x28][65][1][1][0][2][7600] = '--preset mw-us'; // 3.90.2, 3.91 + $KnownEncoderValues[0x28][58][2][2][0][2][7000] = '--preset mw-us'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0x28][57][2][1][0][4][10500] = '--preset mw-us'; // 3.94, 3.95 + $KnownEncoderValues[0x28][57][2][1][0][4][11200] = '--preset mw-us'; // 3.94a14 + $KnownEncoderValues[0x28][57][2][1][0][4][8800] = '--preset mw-us'; // 3.94a15 + $KnownEncoderValues[0x18][58][2][2][0][2][4000] = '--preset phon+/lw/mw-eu/sw'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0x18][58][2][2][0][2][3900] = '--preset phon+/lw/mw-eu/sw'; // 3.93 + $KnownEncoderValues[0x18][57][2][1][0][4][5900] = '--preset phon+/lw/mw-eu/sw'; // 3.94, 3.95 + $KnownEncoderValues[0x18][57][2][1][0][4][6200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a14 + $KnownEncoderValues[0x18][57][2][1][0][4][3200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a15 + $KnownEncoderValues[0x10][58][2][2][0][2][3800] = '--preset phone'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0x10][58][2][2][0][2][3700] = '--preset phone'; // 3.93 + $KnownEncoderValues[0x10][57][2][1][0][4][5600] = '--preset phone'; // 3.94, 3.95 + } + + if (isset($KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { + + $encoder_options = $KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; + + } elseif (isset($KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { + + $encoder_options = $KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; + + } elseif ($ThisFileInfo['audio']['bitrate_mode'] == 'vbr') { + + // http://gabriel.mp3-tech.org/mp3infotag.html + // int Quality = (100 - 10 * gfp->VBR_q - gfp->quality)h + + + $LAME_V_value = 10 - ceil($thisfile_mpeg_audio_lame['vbr_quality'] / 10); + $LAME_q_value = 100 - $thisfile_mpeg_audio_lame['vbr_quality'] - ($LAME_V_value * 10); + $encoder_options = '-V'.$LAME_V_value.' -q'.$LAME_q_value; + + } elseif ($ThisFileInfo['audio']['bitrate_mode'] == 'cbr') { + + $encoder_options = strtoupper($ThisFileInfo['audio']['bitrate_mode']).ceil($ThisFileInfo['audio']['bitrate'] / 1000); + + } else { + + $encoder_options = strtoupper($ThisFileInfo['audio']['bitrate_mode']); + + } + + } elseif (!empty($thisfile_mpeg_audio_lame['bitrate_abr'])) { + + $encoder_options = 'ABR'.$thisfile_mpeg_audio_lame['bitrate_abr']; + + } elseif (!empty($ThisFileInfo['audio']['bitrate'])) { + + if ($ThisFileInfo['audio']['bitrate_mode'] == 'cbr') { + $encoder_options = strtoupper($ThisFileInfo['audio']['bitrate_mode']).ceil($ThisFileInfo['audio']['bitrate'] / 1000); + } else { + $encoder_options = strtoupper($ThisFileInfo['audio']['bitrate_mode']); + } + + } + if (!empty($thisfile_mpeg_audio_lame['bitrate_min'])) { + $encoder_options .= ' -b'.$thisfile_mpeg_audio_lame['bitrate_min']; + } + + if (@$thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev'] || @$thisfile_mpeg_audio_lame['encoding_flags']['nogap_next']) { + $encoder_options .= ' --nogap'; + } + + if (!empty($thisfile_mpeg_audio_lame['lowpass_frequency'])) { + $ExplodedOptions = explode(' ', $encoder_options, 4); + if ($ExplodedOptions[0] == '--r3mix') { + $ExplodedOptions[1] = 'r3mix'; + } + switch ($ExplodedOptions[0]) { + case '--preset': + case '--alt-preset': + case '--r3mix': + if ($ExplodedOptions[1] == 'fast') { + $ExplodedOptions[1] .= ' '.$ExplodedOptions[2]; + } + switch ($ExplodedOptions[1]) { + case 'portable': + case 'medium': + case 'standard': + case 'extreme': + case 'insane': + case 'fast portable': + case 'fast medium': + case 'fast standard': + case 'fast extreme': + case 'fast insane': + case 'r3mix': + static $ExpectedLowpass = array( + 'insane|20500' => 20500, + 'insane|20600' => 20600, // 3.90.2, 3.90.3, 3.91 + 'medium|18000' => 18000, + 'fast medium|18000' => 18000, + 'extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 + 'extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 + 'fast extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 + 'fast extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 + 'standard|19000' => 19000, + 'fast standard|19000' => 19000, + 'r3mix|19500' => 19500, // 3.90, 3.90.1, 3.92 + 'r3mix|19600' => 19600, // 3.90.2, 3.90.3, 3.91 + 'r3mix|18000' => 18000, // 3.94, 3.95 + ); + if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) { + $encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency']; + } + break; + + default: + break; + } + break; + } + } + + if (isset($thisfile_mpeg_audio_lame['raw']['source_sample_freq'])) { + if (($thisfile_mpeg_audio['sample_rate'] == 44100) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 1)) { + $encoder_options .= ' --resample 44100'; + } elseif (($thisfile_mpeg_audio['sample_rate'] == 48000) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 2)) { + $encoder_options .= ' --resample 48000'; + } elseif ($thisfile_mpeg_audio['sample_rate'] < 44100) { + switch ($thisfile_mpeg_audio_lame['raw']['source_sample_freq']) { + case 0: // <= 32000 + // may or may not be same as source frequency - ignore + break; + case 1: // 44100 + case 2: // 48000 + case 3: // 48000+ + $ExplodedOptions = explode(' ', $encoder_options, 4); + switch ($ExplodedOptions[0]) { + case '--preset': + case '--alt-preset': + switch ($ExplodedOptions[1]) { + case 'fast': + case 'portable': + case 'medium': + case 'standard': + case 'extreme': + case 'insane': + $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; + break; + + default: + static $ExpectedResampledRate = array( + 'phon+/lw/mw-eu/sw|16000' => 16000, + 'mw-us|24000' => 24000, // 3.95 + 'mw-us|32000' => 32000, // 3.93 + 'mw-us|16000' => 16000, // 3.92 + 'phone|16000' => 16000, + 'phone|11025' => 11025, // 3.94a15 + 'radio|32000' => 32000, // 3.94a15 + 'fm/radio|32000' => 32000, // 3.92 + 'fm|32000' => 32000, // 3.90 + 'voice|32000' => 32000); + if (!isset($ExpectedResampledRate[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio['sample_rate']])) { + $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; + } + break; + } + break; + + case '--r3mix': + default: + $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; + break; + } + break; + } + } + } + if (empty($encoder_options) && !empty($ThisFileInfo['audio']['bitrate']) && !empty($ThisFileInfo['audio']['bitrate_mode'])) { + //$encoder_options = strtoupper($ThisFileInfo['audio']['bitrate_mode']).ceil($ThisFileInfo['audio']['bitrate'] / 1000); + $encoder_options = strtoupper($ThisFileInfo['audio']['bitrate_mode']); + } + + return $encoder_options; + } + + + function decodeMPEGaudioHeader($fd, $offset, &$ThisFileInfo, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) { + + static $MPEGaudioVersionLookup; + static $MPEGaudioLayerLookup; + static $MPEGaudioBitrateLookup; + static $MPEGaudioFrequencyLookup; + static $MPEGaudioChannelModeLookup; + static $MPEGaudioModeExtensionLookup; + static $MPEGaudioEmphasisLookup; + if (empty($MPEGaudioVersionLookup)) { + $MPEGaudioVersionLookup = getid3_mp3::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = getid3_mp3::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = getid3_mp3::MPEGaudioBitrateArray(); + $MPEGaudioFrequencyLookup = getid3_mp3::MPEGaudioFrequencyArray(); + $MPEGaudioChannelModeLookup = getid3_mp3::MPEGaudioChannelModeArray(); + $MPEGaudioModeExtensionLookup = getid3_mp3::MPEGaudioModeExtensionArray(); + $MPEGaudioEmphasisLookup = getid3_mp3::MPEGaudioEmphasisArray(); + } + + if ($offset >= $ThisFileInfo['avdataend']) { + $ThisFileInfo['error'][] = 'end of file encounter looking for MPEG synch'; + return false; + } + fseek($fd, $offset, SEEK_SET); + //$headerstring = fread($fd, 1441); // worst-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame + $headerstring = fread($fd, 226); // LAME header at offset 36 + 190 bytes of Xing/LAME data + + // MP3 audio frame structure: + // $aa $aa $aa $aa [$bb $bb] $cc... + // where $aa..$aa is the four-byte mpeg-audio header (below) + // $bb $bb is the optional 2-byte CRC + // and $cc... is the audio data + + $head4 = substr($headerstring, 0, 4); + + static $MPEGaudioHeaderDecodeCache = array(); + if (isset($MPEGaudioHeaderDecodeCache[$head4])) { + $MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4]; + } else { + $MPEGheaderRawArray = getid3_mp3::MPEGaudioHeaderDecode($head4); + $MPEGaudioHeaderDecodeCache[$head4] = $MPEGheaderRawArray; + } + + static $MPEGaudioHeaderValidCache = array(); + + // Not in cache + if (!isset($MPEGaudioHeaderValidCache[$head4])) { + //$MPEGaudioHeaderValidCache[$head4] = getid3_mp3::MPEGaudioHeaderValid($MPEGheaderRawArray, false, true); // allow badly-formatted freeformat (from LAME 3.90 - 3.93.1) + $MPEGaudioHeaderValidCache[$head4] = getid3_mp3::MPEGaudioHeaderValid($MPEGheaderRawArray, false, false); + } + + // shortcut + if (!isset($ThisFileInfo['mpeg']['audio'])) { + $ThisFileInfo['mpeg']['audio'] = array(); + } + $thisfile_mpeg_audio = &$ThisFileInfo['mpeg']['audio']; + + + if ($MPEGaudioHeaderValidCache[$head4]) { + $thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray; + } else { + $ThisFileInfo['error'][] = 'Invalid MPEG audio header at offset '.$offset; + return false; + } + + if (!$FastMPEGheaderScan) { + + $thisfile_mpeg_audio['version'] = $MPEGaudioVersionLookup[$thisfile_mpeg_audio['raw']['version']]; + $thisfile_mpeg_audio['layer'] = $MPEGaudioLayerLookup[$thisfile_mpeg_audio['raw']['layer']]; + + $thisfile_mpeg_audio['channelmode'] = $MPEGaudioChannelModeLookup[$thisfile_mpeg_audio['raw']['channelmode']]; + $thisfile_mpeg_audio['channels'] = (($thisfile_mpeg_audio['channelmode'] == 'mono') ? 1 : 2); + $thisfile_mpeg_audio['sample_rate'] = $MPEGaudioFrequencyLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['raw']['sample_rate']]; + $thisfile_mpeg_audio['protection'] = !$thisfile_mpeg_audio['raw']['protection']; + $thisfile_mpeg_audio['private'] = (bool) $thisfile_mpeg_audio['raw']['private']; + $thisfile_mpeg_audio['modeextension'] = $MPEGaudioModeExtensionLookup[$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['modeextension']]; + $thisfile_mpeg_audio['copyright'] = (bool) $thisfile_mpeg_audio['raw']['copyright']; + $thisfile_mpeg_audio['original'] = (bool) $thisfile_mpeg_audio['raw']['original']; + $thisfile_mpeg_audio['emphasis'] = $MPEGaudioEmphasisLookup[$thisfile_mpeg_audio['raw']['emphasis']]; + + $ThisFileInfo['audio']['channels'] = $thisfile_mpeg_audio['channels']; + $ThisFileInfo['audio']['sample_rate'] = $thisfile_mpeg_audio['sample_rate']; + + if ($thisfile_mpeg_audio['protection']) { + $thisfile_mpeg_audio['crc'] = getid3_lib::BigEndian2Int(substr($headerstring, 4, 2)); + } + + } + + if ($thisfile_mpeg_audio['raw']['bitrate'] == 15) { + // http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0 + $ThisFileInfo['warning'][] = 'Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1'; + $thisfile_mpeg_audio['raw']['bitrate'] = 0; + } + $thisfile_mpeg_audio['padding'] = (bool) $thisfile_mpeg_audio['raw']['padding']; + $thisfile_mpeg_audio['bitrate'] = $MPEGaudioBitrateLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['bitrate']]; + + if (($thisfile_mpeg_audio['bitrate'] == 'free') && ($offset == $ThisFileInfo['avdataoffset'])) { + // only skip multiple frame check if free-format bitstream found at beginning of file + // otherwise is quite possibly simply corrupted data + $recursivesearch = false; + } + + // For Layer 2 there are some combinations of bitrate and mode which are not allowed. + if (!$FastMPEGheaderScan && ($thisfile_mpeg_audio['layer'] == '2')) { + + $ThisFileInfo['audio']['dataformat'] = 'mp2'; + switch ($thisfile_mpeg_audio['channelmode']) { + + case 'mono': + if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] <= 192000)) { + // these are ok + } else { + $ThisFileInfo['error'][] = $thisfile_mpeg_audio['bitrate'].'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'; + return false; + } + break; + + case 'stereo': + case 'joint stereo': + case 'dual channel': + if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] == 64000) || ($thisfile_mpeg_audio['bitrate'] >= 96000)) { + // these are ok + } else { + $ThisFileInfo['error'][] = intval(round($thisfile_mpeg_audio['bitrate'] / 1000)).'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'; + return false; + } + break; + + } + + } + + + if ($ThisFileInfo['audio']['sample_rate'] > 0) { + $thisfile_mpeg_audio['framelength'] = getid3_mp3::MPEGaudioFrameLength($thisfile_mpeg_audio['bitrate'], $thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['layer'], (int) $thisfile_mpeg_audio['padding'], $ThisFileInfo['audio']['sample_rate']); + } + + $nextframetestoffset = $offset + 1; + if ($thisfile_mpeg_audio['bitrate'] != 'free') { + + $ThisFileInfo['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; + + if (isset($thisfile_mpeg_audio['framelength'])) { + $nextframetestoffset = $offset + $thisfile_mpeg_audio['framelength']; + } else { + $ThisFileInfo['error'][] = 'Frame at offset('.$offset.') is has an invalid frame length.'; + return false; + } + + } + + $ExpectedNumberOfAudioBytes = 0; + + //////////////////////////////////////////////////////////////////////////////////// + // Variable-bitrate headers + + if (substr($headerstring, 4 + 32, 4) == 'VBRI') { + // Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36) + // specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html + + $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; + $thisfile_mpeg_audio['VBR_method'] = 'Fraunhofer'; + $ThisFileInfo['audio']['codec'] = 'Fraunhofer'; + + $SideInfoData = substr($headerstring, 4 + 2, 32); + + $FraunhoferVBROffset = 36; + + $thisfile_mpeg_audio['VBR_encoder_version'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 4, 2)); // VbriVersion + $thisfile_mpeg_audio['VBR_encoder_delay'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 6, 2)); // VbriDelay + $thisfile_mpeg_audio['VBR_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 8, 2)); // VbriQuality + $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); // VbriStreamBytes + $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); // VbriStreamFrames + $thisfile_mpeg_audio['VBR_seek_offsets'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); // VbriTableSize + $thisfile_mpeg_audio['VBR_seek_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 2)); // VbriTableScale + $thisfile_mpeg_audio['VBR_entry_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 22, 2)); // VbriEntryBytes + $thisfile_mpeg_audio['VBR_entry_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); // VbriEntryFrames + + $ExpectedNumberOfAudioBytes = $thisfile_mpeg_audio['VBR_bytes']; + + $previousbyteoffset = $offset; + for ($i = 0; $i < $thisfile_mpeg_audio['VBR_seek_offsets']; $i++) { + $Fraunhofer_OffsetN = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, $thisfile_mpeg_audio['VBR_entry_bytes'])); + $FraunhoferVBROffset += $thisfile_mpeg_audio['VBR_entry_bytes']; + $thisfile_mpeg_audio['VBR_offsets_relative'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']); + $thisfile_mpeg_audio['VBR_offsets_absolute'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']) + $previousbyteoffset; + $previousbyteoffset += $Fraunhofer_OffsetN; + } + + + } else { + + // Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36) + // depending on MPEG layer and number of channels + + $VBRidOffset = getid3_mp3::XingVBRidOffset($thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['channelmode']); + $SideInfoData = substr($headerstring, 4 + 2, $VBRidOffset - 4); + + if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) { + // 'Xing' is traditional Xing VBR frame + // 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.) + // 'Info' *can* legally be used to specify a VBR file as well, however. + + // http://www.multiweb.cz/twoinches/MP3inside.htm + //00..03 = "Xing" or "Info" + //04..07 = Flags: + // 0x01 Frames Flag set if value for number of frames in file is stored + // 0x02 Bytes Flag set if value for filesize in bytes is stored + // 0x04 TOC Flag set if values for TOC are stored + // 0x08 VBR Scale Flag set if values for VBR scale is stored + //08..11 Frames: Number of frames in file (including the first Xing/Info one) + //12..15 Bytes: File length in Bytes + //16..115 TOC (Table of Contents): + // Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file. + // Each Byte has a value according this formula: + // (TOC[i] / 256) * fileLenInBytes + // So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use: + // TOC[(60/240)*100] = TOC[25] + // and corresponding Byte in file is then approximately at: + // (TOC[25]/256) * 5000000 + //116..119 VBR Scale + + + // should be safe to leave this at 'vbr' and let it be overriden to 'cbr' if a CBR preset/mode is used by LAME +// if (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Xing') { + $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; + $thisfile_mpeg_audio['VBR_method'] = 'Xing'; +// } else { +// $ScanAsCBR = true; +// $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; +// } + + $thisfile_mpeg_audio['xing_flags_raw'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4)); + + $thisfile_mpeg_audio['xing_flags']['frames'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000001); + $thisfile_mpeg_audio['xing_flags']['bytes'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000002); + $thisfile_mpeg_audio['xing_flags']['toc'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000004); + $thisfile_mpeg_audio['xing_flags']['vbr_scale'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000008); + + if ($thisfile_mpeg_audio['xing_flags']['frames']) { + $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 8, 4)); + //$thisfile_mpeg_audio['VBR_frames']--; // don't count header Xing/Info frame + } + if ($thisfile_mpeg_audio['xing_flags']['bytes']) { + $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4)); + } + + //if (($thisfile_mpeg_audio['bitrate'] == 'free') && !empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { + if (!empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { + + $framelengthfloat = $thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']; + + if ($thisfile_mpeg_audio['layer'] == '1') { + // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 + //$ThisFileInfo['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; + $ThisFileInfo['audio']['bitrate'] = ($framelengthfloat / 4) * $thisfile_mpeg_audio['sample_rate'] * (2 / $ThisFileInfo['audio']['channels']) / 12; + } else { + // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 + //$ThisFileInfo['audio']['bitrate'] = (($framelengthfloat - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; + $ThisFileInfo['audio']['bitrate'] = $framelengthfloat * $thisfile_mpeg_audio['sample_rate'] * (2 / $ThisFileInfo['audio']['channels']) / 144; + } + $thisfile_mpeg_audio['framelength'] = floor($framelengthfloat); + } + + if ($thisfile_mpeg_audio['xing_flags']['toc']) { + $LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100); + for ($i = 0; $i < 100; $i++) { + $thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData{$i}); + } + } + if ($thisfile_mpeg_audio['xing_flags']['vbr_scale']) { + $thisfile_mpeg_audio['VBR_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4)); + } + + + // http://gabriel.mp3-tech.org/mp3infotag.html + if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') { + + // shortcut + $thisfile_mpeg_audio['LAME'] = array(); + $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; + + + $thisfile_mpeg_audio_lame['long_version'] = substr($headerstring, $VBRidOffset + 120, 20); + $thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9); + + if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') { + + // extra 11 chars are not part of version string when LAMEtag present + unset($thisfile_mpeg_audio_lame['long_version']); + + // It the LAME tag was only introduced in LAME v3.90 + // http://www.hydrogenaudio.org/?act=ST&f=15&t=9933 + + // Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html + // are assuming a 'Xing' identifier offset of 0x24, which is the case for + // MPEG-1 non-mono, but not for other combinations + $LAMEtagOffsetContant = $VBRidOffset - 0x24; + + // shortcuts + $thisfile_mpeg_audio_lame['RGAD'] = array('track'=>array(), 'album'=>array()); + $thisfile_mpeg_audio_lame_RGAD = &$thisfile_mpeg_audio_lame['RGAD']; + $thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track']; + $thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album']; + $thisfile_mpeg_audio_lame['raw'] = array(); + $thisfile_mpeg_audio_lame_raw = &$thisfile_mpeg_audio_lame['raw']; + + // byte $9B VBR Quality + // This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications. + // Actually overwrites original Xing bytes + unset($thisfile_mpeg_audio['VBR_scale']); + $thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1)); + + // bytes $9C-$A4 Encoder short VersionString + $thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9); + + // byte $A5 Info Tag revision + VBR method + $LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1)); + + $thisfile_mpeg_audio_lame['tag_revision'] = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4; + $thisfile_mpeg_audio_lame_raw['vbr_method'] = $LAMEtagRevisionVBRmethod & 0x0F; + $thisfile_mpeg_audio_lame['vbr_method'] = getid3_mp3::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']); + $thisfile_mpeg_audio['bitrate_mode'] = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr' + + // byte $A6 Lowpass filter value + $thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100; + + // bytes $A7-$AE Replay Gain + // http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html + // bytes $A7-$AA : 32 bit floating point "Peak signal amplitude" + if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') { + // LAME 3.94a16 and later - 9.23 fixed point + // ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375 + $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608); + } else { + // LAME 3.94a15 and earlier - 32-bit floating point + // Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15 + $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4)); + } + if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) { + unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); + } else { + $thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); + } + + $thisfile_mpeg_audio_lame_raw['RGAD_track'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2)); + $thisfile_mpeg_audio_lame_raw['RGAD_album'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2)); + + + if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) { + + $thisfile_mpeg_audio_lame_RGAD_track['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13; + $thisfile_mpeg_audio_lame_RGAD_track['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10; + $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9; + $thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF; + $thisfile_mpeg_audio_lame_RGAD_track['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']); + $thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']); + $thisfile_mpeg_audio_lame_RGAD_track['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']); + + if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { + $ThisFileInfo['replay_gain']['track']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; + } + $ThisFileInfo['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator']; + $ThisFileInfo['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db']; + } else { + unset($thisfile_mpeg_audio_lame_RGAD['track']); + } + if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) { + + $thisfile_mpeg_audio_lame_RGAD_album['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13; + $thisfile_mpeg_audio_lame_RGAD_album['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10; + $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9; + $thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF; + $thisfile_mpeg_audio_lame_RGAD_album['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']); + $thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']); + $thisfile_mpeg_audio_lame_RGAD_album['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']); + + if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { + $ThisFileInfo['replay_gain']['album']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; + } + $ThisFileInfo['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator']; + $ThisFileInfo['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db']; + } else { + unset($thisfile_mpeg_audio_lame_RGAD['album']); + } + if (empty($thisfile_mpeg_audio_lame_RGAD)) { + unset($thisfile_mpeg_audio_lame['RGAD']); + } + + + // byte $AF Encoding flags + ATH Type + $EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1)); + $thisfile_mpeg_audio_lame['encoding_flags']['nspsytune'] = (bool) ($EncodingFlagsATHtype & 0x10); + $thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20); + $thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'] = (bool) ($EncodingFlagsATHtype & 0x40); + $thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev'] = (bool) ($EncodingFlagsATHtype & 0x80); + $thisfile_mpeg_audio_lame['ath_type'] = $EncodingFlagsATHtype & 0x0F; + + // byte $B0 if ABR {specified bitrate} else {minimal bitrate} + $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1)); + if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR) + $thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; + } elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR) + // ignore + } elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate + $thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; + } + + // bytes $B1-$B3 Encoder delays + $EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3)); + $thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12; + $thisfile_mpeg_audio_lame['end_padding'] = $EncoderDelays & 0x000FFF; + + // byte $B4 Misc + $MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1)); + $thisfile_mpeg_audio_lame_raw['noise_shaping'] = ($MiscByte & 0x03); + $thisfile_mpeg_audio_lame_raw['stereo_mode'] = ($MiscByte & 0x1C) >> 2; + $thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5; + $thisfile_mpeg_audio_lame_raw['source_sample_freq'] = ($MiscByte & 0xC0) >> 6; + $thisfile_mpeg_audio_lame['noise_shaping'] = $thisfile_mpeg_audio_lame_raw['noise_shaping']; + $thisfile_mpeg_audio_lame['stereo_mode'] = getid3_mp3::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']); + $thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality']; + $thisfile_mpeg_audio_lame['source_sample_freq'] = getid3_mp3::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']); + + // byte $B5 MP3 Gain + $thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true); + $thisfile_mpeg_audio_lame['mp3_gain_db'] = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain']; + $thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6)); + + // bytes $B6-$B7 Preset and surround info + $PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2)); + // Reserved = ($PresetSurroundBytes & 0xC000); + $thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800); + $thisfile_mpeg_audio_lame['surround_info'] = getid3_mp3::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']); + $thisfile_mpeg_audio_lame['preset_used_id'] = ($PresetSurroundBytes & 0x07FF); + $thisfile_mpeg_audio_lame['preset_used'] = getid3_mp3::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame); + if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) { + $ThisFileInfo['warning'][] = 'Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org'; + } + if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) { + // this may change if 3.90.4 ever comes out + $thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3'; + } + + // bytes $B8-$BB MusicLength + $thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4)); + $ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']); + + // bytes $BC-$BD MusicCRC + $thisfile_mpeg_audio_lame['music_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2)); + + // bytes $BE-$BF CRC-16 of Info Tag + $thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2)); + + + // LAME CBR + if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { + + $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; + $thisfile_mpeg_audio['bitrate'] = getid3_mp3::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']); + $ThisFileInfo['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; + //if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) { + // $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min']; + //} + + } + + } + } + + } else { + + // not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header) + $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; + if ($recursivesearch) { + $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; + if (getid3_mp3::RecursiveFrameScanning($fd, $ThisFileInfo, $offset, $nextframetestoffset, true)) { + $recursivesearch = false; + $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; + } + if ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') { + $ThisFileInfo['warning'][] = 'VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.'; + } + } + + } + + } + + if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']))) { + if ($ExpectedNumberOfAudioBytes > ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])) { + if (($ExpectedNumberOfAudioBytes - ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])) == 1) { + $ThisFileInfo['warning'][] = 'Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)'; + } else { + $ThisFileInfo['warning'][] = 'Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])).' bytes)'; + } + } else { + if ((($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) - $ExpectedNumberOfAudioBytes) == 1) { + // $prenullbytefileoffset = ftell($fd); + // fseek($fd, $ThisFileInfo['avdataend'], SEEK_SET); + // $PossibleNullByte = fread($fd, 1); + // fseek($fd, $prenullbytefileoffset, SEEK_SET); + // if ($PossibleNullByte === "\x00") { + $ThisFileInfo['avdataend']--; + // $ThisFileInfo['warning'][] = 'Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'; + // } else { + // $ThisFileInfo['warning'][] = 'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' ('.(($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'; + // } + } else { + $ThisFileInfo['warning'][] = 'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' ('.(($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'; + } + } + } + + if (($thisfile_mpeg_audio['bitrate'] == 'free') && empty($ThisFileInfo['audio']['bitrate'])) { + if (($offset == $ThisFileInfo['avdataoffset']) && empty($thisfile_mpeg_audio['VBR_frames'])) { + $framebytelength = getid3_mp3::FreeFormatFrameLength($fd, $offset, $ThisFileInfo, true); + if ($framebytelength > 0) { + $thisfile_mpeg_audio['framelength'] = $framebytelength; + if ($thisfile_mpeg_audio['layer'] == '1') { + // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 + $ThisFileInfo['audio']['bitrate'] = ((($framebytelength / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; + } else { + // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 + $ThisFileInfo['audio']['bitrate'] = (($framebytelength - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; + } + } else { + $ThisFileInfo['error'][] = 'Error calculating frame length of free-format MP3 without Xing/LAME header'; + } + } + } + + if (!empty($thisfile_mpeg_audio['VBR_frames'])) { + switch ($thisfile_mpeg_audio['bitrate_mode']) { + case 'vbr': + case 'abr': + if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) { + $thisfile_mpeg_audio['VBR_bitrate'] = (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 384); + } elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) { + $thisfile_mpeg_audio['VBR_bitrate'] = (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 576); + } else { + $thisfile_mpeg_audio['VBR_bitrate'] = (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 1152); + } + if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) { + $ThisFileInfo['audio']['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; + $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion + } + break; + } + } + + // End variable-bitrate headers + //////////////////////////////////////////////////////////////////////////////////// + + if ($recursivesearch) { + + if (!getid3_mp3::RecursiveFrameScanning($fd, $ThisFileInfo, $offset, $nextframetestoffset, $ScanAsCBR)) { + return false; + } + + } + + + //if (false) { + // // experimental side info parsing section - not returning anything useful yet + // + // $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData); + // $SideInfoOffset = 0; + // + // if ($thisfile_mpeg_audio['version'] == '1') { + // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { + // // MPEG-1 (mono) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // $SideInfoOffset += 5; + // } else { + // // MPEG-1 (stereo, joint-stereo, dual-channel) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // $SideInfoOffset += 3; + // } + // } else { // 2 or 2.5 + // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { + // // MPEG-2, MPEG-2.5 (mono) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); + // $SideInfoOffset += 8; + // $SideInfoOffset += 1; + // } else { + // // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); + // $SideInfoOffset += 8; + // $SideInfoOffset += 2; + // } + // } + // + // if ($thisfile_mpeg_audio['version'] == '1') { + // for ($channel = 0; $channel < $ThisFileInfo['audio']['channels']; $channel++) { + // for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) { + // $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 2; + // } + // } + // } + // for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) { + // for ($channel = 0; $channel < $ThisFileInfo['audio']['channels']; $channel++) { + // $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12); + // $SideInfoOffset += 12; + // $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8); + // $SideInfoOffset += 8; + // if ($thisfile_mpeg_audio['version'] == '1') { + // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); + // $SideInfoOffset += 4; + // } else { + // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // } + // $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // + // if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') { + // + // $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2); + // $SideInfoOffset += 2; + // $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // + // for ($region = 0; $region < 2; $region++) { + // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); + // $SideInfoOffset += 5; + // } + // $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0; + // + // for ($window = 0; $window < 3; $window++) { + // $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3); + // $SideInfoOffset += 3; + // } + // + // } else { + // + // for ($region = 0; $region < 3; $region++) { + // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); + // $SideInfoOffset += 5; + // } + // + // $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); + // $SideInfoOffset += 4; + // $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3); + // $SideInfoOffset += 3; + // $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0; + // } + // + // if ($thisfile_mpeg_audio['version'] == '1') { + // $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // } + // $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // } + // } + //} + + return true; + } + + function RecursiveFrameScanning(&$fd, &$ThisFileInfo, &$offset, &$nextframetestoffset, $ScanAsCBR) { + for ($i = 0; $i < GETID3_MP3_VALID_CHECK_FRAMES; $i++) { + // check next GETID3_MP3_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch + if (($nextframetestoffset + 4) >= $ThisFileInfo['avdataend']) { + // end of file + return true; + } + + $nextframetestarray = array('error'=>'', 'warning'=>'', 'avdataend'=>$ThisFileInfo['avdataend'], 'avdataoffset'=>$ThisFileInfo['avdataoffset']); + if (getid3_mp3::decodeMPEGaudioHeader($fd, $nextframetestoffset, $nextframetestarray, false)) { + if ($ScanAsCBR) { + // force CBR mode, used for trying to pick out invalid audio streams with + // valid(?) VBR headers, or VBR streams with no VBR header + if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($ThisFileInfo['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $ThisFileInfo['mpeg']['audio']['bitrate'])) { + return false; + } + } + + + // next frame is OK, get ready to check the one after that + if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) { + $nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength']; + } else { + $ThisFileInfo['error'][] = 'Frame at offset ('.$offset.') is has an invalid frame length.'; + return false; + } + + } else { + + // next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence + $ThisFileInfo['error'][] = 'Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.'; + + return false; + } + } + return true; + } + + function FreeFormatFrameLength($fd, $offset, &$ThisFileInfo, $deepscan=false) { + fseek($fd, $offset, SEEK_SET); + $MPEGaudioData = fread($fd, 32768); + + $SyncPattern1 = substr($MPEGaudioData, 0, 4); + // may be different pattern due to padding + $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) | 0x02).$SyncPattern1{3}; + if ($SyncPattern2 === $SyncPattern1) { + $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) & 0xFD).$SyncPattern1{3}; + } + + $framelength = false; + $framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4); + $framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4); + if ($framelength1 > 4) { + $framelength = $framelength1; + } + if (($framelength2 > 4) && ($framelength2 < $framelength1)) { + $framelength = $framelength2; + } + if (!$framelength) { + + // LAME 3.88 has a different value for modeextension on the first frame vs the rest + $framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4); + $framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4); + + if ($framelength1 > 4) { + $framelength = $framelength1; + } + if (($framelength2 > 4) && ($framelength2 < $framelength1)) { + $framelength = $framelength2; + } + if (!$framelength) { + $ThisFileInfo['error'][] = 'Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset; + return false; + } else { + $ThisFileInfo['warning'][] = 'ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)'; + $ThisFileInfo['audio']['codec'] = 'LAME'; + $ThisFileInfo['audio']['encoder'] = 'LAME3.88'; + $SyncPattern1 = substr($SyncPattern1, 0, 3); + $SyncPattern2 = substr($SyncPattern2, 0, 3); + } + } + + if ($deepscan) { + + $ActualFrameLengthValues = array(); + $nextoffset = $offset + $framelength; + while ($nextoffset < ($ThisFileInfo['avdataend'] - 6)) { + fseek($fd, $nextoffset - 1, SEEK_SET); + $NextSyncPattern = fread($fd, 6); + if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) { + // good - found where expected + $ActualFrameLengthValues[] = $framelength; + } elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) { + // ok - found one byte earlier than expected (last frame wasn't padded, first frame was) + $ActualFrameLengthValues[] = ($framelength - 1); + $nextoffset--; + } elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) { + // ok - found one byte later than expected (last frame was padded, first frame wasn't) + $ActualFrameLengthValues[] = ($framelength + 1); + $nextoffset++; + } else { + $ThisFileInfo['error'][] = 'Did not find expected free-format sync pattern at offset '.$nextoffset; + return false; + } + $nextoffset += $framelength; + } + if (count($ActualFrameLengthValues) > 0) { + $framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues))); + } + } + return $framelength; + } + + function getOnlyMPEGaudioInfoBruteForce($fd, &$ThisFileInfo) { + + $MPEGaudioHeaderDecodeCache = array(); + $MPEGaudioHeaderValidCache = array(); + $MPEGaudioHeaderLengthCache = array(); + $MPEGaudioVersionLookup = getid3_mp3::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = getid3_mp3::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = getid3_mp3::MPEGaudioBitrateArray(); + $MPEGaudioFrequencyLookup = getid3_mp3::MPEGaudioFrequencyArray(); + $MPEGaudioChannelModeLookup = getid3_mp3::MPEGaudioChannelModeArray(); + $MPEGaudioModeExtensionLookup = getid3_mp3::MPEGaudioModeExtensionArray(); + $MPEGaudioEmphasisLookup = getid3_mp3::MPEGaudioEmphasisArray(); + $LongMPEGversionLookup = array(); + $LongMPEGlayerLookup = array(); + $LongMPEGbitrateLookup = array(); + $LongMPEGpaddingLookup = array(); + $LongMPEGfrequencyLookup = array(); + + $Distribution['bitrate'] = array(); + $Distribution['frequency'] = array(); + $Distribution['layer'] = array(); + $Distribution['version'] = array(); + $Distribution['padding'] = array(); + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + $previousvalidframe = $ThisFileInfo['avdataoffset']; + while (ftell($fd) < $ThisFileInfo['avdataend']) { + set_time_limit(30); + $head4 = fread($fd, 4); + if (strlen($head4) < 4) { + break; + } + if ($head4{0} != "\xFF") { + for ($i = 1; $i < 4; $i++) { + if ($head4{$i} == "\xFF") { + fseek($fd, $i - 4, SEEK_CUR); + continue 2; + } + } + continue; + } + if (!isset($MPEGaudioHeaderDecodeCache[$head4])) { + $MPEGaudioHeaderDecodeCache[$head4] = getid3_mp3::MPEGaudioHeaderDecode($head4); + } + if (!isset($MPEGaudioHeaderValidCache[$head4])) { + $MPEGaudioHeaderValidCache[$head4] = getid3_mp3::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false); + } + if ($MPEGaudioHeaderValidCache[$head4]) { + + if (!isset($MPEGaudioHeaderLengthCache[$head4])) { + $LongMPEGversionLookup[$head4] = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']]; + $LongMPEGlayerLookup[$head4] = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']]; + $LongMPEGbitrateLookup[$head4] = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']]; + $LongMPEGpaddingLookup[$head4] = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding']; + $LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']]; + $MPEGaudioHeaderLengthCache[$head4] = getid3_mp3::MPEGaudioFrameLength( + $LongMPEGbitrateLookup[$head4], + $LongMPEGversionLookup[$head4], + $LongMPEGlayerLookup[$head4], + $LongMPEGpaddingLookup[$head4], + $LongMPEGfrequencyLookup[$head4]); + } + if ($MPEGaudioHeaderLengthCache[$head4] > 4) { + $WhereWeWere = ftell($fd); + fseek($fd, $MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR); + $next4 = fread($fd, 4); + if ($next4{0} == "\xFF") { + if (!isset($MPEGaudioHeaderDecodeCache[$next4])) { + $MPEGaudioHeaderDecodeCache[$next4] = getid3_mp3::MPEGaudioHeaderDecode($next4); + } + if (!isset($MPEGaudioHeaderValidCache[$next4])) { + $MPEGaudioHeaderValidCache[$next4] = getid3_mp3::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false); + } + if ($MPEGaudioHeaderValidCache[$next4]) { + fseek($fd, -4, SEEK_CUR); + + @$Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]++; + @$Distribution['layer'][$LongMPEGlayerLookup[$head4]]++; + @$Distribution['version'][$LongMPEGversionLookup[$head4]]++; + @$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]++; + @$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]++; + continue; + } + } + unset($next4); + fseek($fd, $WhereWeWere - 3, SEEK_SET); + } + + } + } + foreach ($Distribution as $key => $value) { + ksort($Distribution[$key], SORT_NUMERIC); + } + ksort($Distribution['version'], SORT_STRING); + $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = $Distribution['bitrate']; + $ThisFileInfo['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency']; + $ThisFileInfo['mpeg']['audio']['layer_distribution'] = $Distribution['layer']; + $ThisFileInfo['mpeg']['audio']['version_distribution'] = $Distribution['version']; + $ThisFileInfo['mpeg']['audio']['padding_distribution'] = $Distribution['padding']; + if (count($Distribution['version']) > 1) { + $ThisFileInfo['error'][] = 'Corrupt file - more than one MPEG version detected'; + } + if (count($Distribution['layer']) > 1) { + $ThisFileInfo['error'][] = 'Corrupt file - more than one MPEG layer detected'; + } + if (count($Distribution['frequency']) > 1) { + $ThisFileInfo['error'][] = 'Corrupt file - more than one MPEG sample rate detected'; + } + + + $bittotal = 0; + foreach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) { + if ($bitratevalue != 'free') { + $bittotal += ($bitratevalue * $bitratecount); + } + } + $ThisFileInfo['mpeg']['audio']['frame_count'] = array_sum($Distribution['bitrate']); + if ($ThisFileInfo['mpeg']['audio']['frame_count'] == 0) { + $ThisFileInfo['error'][] = 'no MPEG audio frames found'; + return false; + } + $ThisFileInfo['mpeg']['audio']['bitrate'] = ($bittotal / $ThisFileInfo['mpeg']['audio']['frame_count']); + $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr'); + $ThisFileInfo['mpeg']['audio']['sample_rate'] = getid3_lib::array_max($Distribution['frequency'], true); + + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['bitrate']; + $ThisFileInfo['audio']['bitrate_mode'] = $ThisFileInfo['mpeg']['audio']['bitrate_mode']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate']; + $ThisFileInfo['audio']['dataformat'] = 'mp'.getid3_lib::array_max($Distribution['layer'], true); + $ThisFileInfo['fileformat'] = $ThisFileInfo['audio']['dataformat']; + + return true; + } + + + function getOnlyMPEGaudioInfo($fd, &$ThisFileInfo, $avdataoffset, $BitrateHistogram=false) { + // looks for synch, decodes MPEG audio header + + fseek($fd, $avdataoffset, SEEK_SET); + $header = ''; + $SynchSeekOffset = 0; + + static $MPEGaudioVersionLookup; + static $MPEGaudioLayerLookup; + static $MPEGaudioBitrateLookup; + if (empty($MPEGaudioVersionLookup)) { + $MPEGaudioVersionLookup = getid3_mp3::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = getid3_mp3::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = getid3_mp3::MPEGaudioBitrateArray(); + + } + + $header_len = strlen($header) - intval(round(GETID3_FREAD_BUFFER_SIZE / 2)); + while (true) { + + if (($SynchSeekOffset > $header_len) && (($avdataoffset + $SynchSeekOffset) < $ThisFileInfo['avdataend']) && !feof($fd)) { + + if ($SynchSeekOffset > 131072) { + // if a synch's not found within the first 128k bytes, then give up + $ThisFileInfo['error'][] = 'could not find valid MPEG audio synch within the first 128k bytes'; + if (isset($ThisFileInfo['audio']['bitrate'])) { + unset($ThisFileInfo['audio']['bitrate']); + } + if (isset($ThisFileInfo['mpeg']['audio'])) { + unset($ThisFileInfo['mpeg']['audio']); + } + if (empty($ThisFileInfo['mpeg'])) { + unset($ThisFileInfo['mpeg']); + } + return false; + + } elseif ($header .= fread($fd, GETID3_FREAD_BUFFER_SIZE)) { + + // great + $header_len = strlen($header) - intval(round(GETID3_FREAD_BUFFER_SIZE / 2)); + + } else { + + $ThisFileInfo['error'][] = 'could not find valid MPEG audio synch before end of file'; + if (isset($ThisFileInfo['audio']['bitrate'])) { + unset($ThisFileInfo['audio']['bitrate']); + } + if (isset($ThisFileInfo['mpeg']['audio'])) { + unset($ThisFileInfo['mpeg']['audio']); + } + if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || (count($ThisFileInfo['mpeg']) == 0))) { + unset($ThisFileInfo['mpeg']); + } + return false; + + } + } + + if (($SynchSeekOffset + 1) >= strlen($header)) { + $ThisFileInfo['error'][] = 'could not find valid MPEG synch before end of file'; + return false; + } + + if (($header{$SynchSeekOffset} == "\xFF") && ($header{($SynchSeekOffset + 1)} > "\xE0")) { // synch detected + + if (!isset($FirstFrameThisfileInfo) && !isset($ThisFileInfo['mpeg']['audio'])) { + $FirstFrameThisfileInfo = $ThisFileInfo; + $FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset; + if (!getid3_mp3::decodeMPEGaudioHeader($fd, $avdataoffset + $SynchSeekOffset, $FirstFrameThisfileInfo, false)) { + // if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's + // garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below + unset($FirstFrameThisfileInfo); + } + } + + $dummy = $ThisFileInfo; // only overwrite real data if valid header found + if (getid3_mp3::decodeMPEGaudioHeader($fd, $avdataoffset + $SynchSeekOffset, $dummy, true)) { + $ThisFileInfo = $dummy; + $ThisFileInfo['avdataoffset'] = $avdataoffset + $SynchSeekOffset; + switch ($ThisFileInfo['fileformat']) { + case '': + case 'id3': + case 'ape': + case 'mp3': + $ThisFileInfo['fileformat'] = 'mp3'; + $ThisFileInfo['audio']['dataformat'] = 'mp3'; + break; + } + if (isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) { + if (!(abs($ThisFileInfo['audio']['bitrate'] - $FirstFrameThisfileInfo['audio']['bitrate']) <= 1)) { + // If there is garbage data between a valid VBR header frame and a sequence + // of valid MPEG-audio frames the VBR data is no longer discarded. + $ThisFileInfo = $FirstFrameThisfileInfo; + $ThisFileInfo['avdataoffset'] = $FirstFrameAVDataOffset; + $ThisFileInfo['fileformat'] = 'mp3'; + $ThisFileInfo['audio']['dataformat'] = 'mp3'; + $dummy = $ThisFileInfo; + unset($dummy['mpeg']['audio']); + $GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength']; + $GarbageOffsetEnd = $avdataoffset + $SynchSeekOffset; + if (getid3_mp3::decodeMPEGaudioHeader($fd, $GarbageOffsetEnd, $dummy, true, true)) { + + $ThisFileInfo = $dummy; + $ThisFileInfo['avdataoffset'] = $GarbageOffsetEnd; + $ThisFileInfo['warning'][] = 'apparently-valid VBR header not used because could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd; + + } else { + + $ThisFileInfo['warning'][] = 'using data from VBR header even though could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')'; + + } + } + } + if (isset($ThisFileInfo['mpeg']['audio']['bitrate_mode']) && ($ThisFileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($ThisFileInfo['mpeg']['audio']['VBR_method'])) { + // VBR file with no VBR header + $BitrateHistogram = true; + } + + if ($BitrateHistogram) { + + $ThisFileInfo['mpeg']['audio']['stereo_distribution'] = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0); + $ThisFileInfo['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0); + + if ($ThisFileInfo['mpeg']['audio']['version'] == '1') { + if ($ThisFileInfo['mpeg']['audio']['layer'] == 3) { + $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0); + } elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 2) { + $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0, 384000=>0); + } elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 1) { + $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 64000=>0, 96000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 288000=>0, 320000=>0, 352000=>0, 384000=>0, 416000=>0, 448000=>0); + } + } elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 1) { + $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0, 176000=>0, 192000=>0, 224000=>0, 256000=>0); + } else { + $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8000=>0, 16000=>0, 24000=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0); + } + + $dummy = array('error'=>$ThisFileInfo['error'], 'warning'=>$ThisFileInfo['warning'], 'avdataend'=>$ThisFileInfo['avdataend'], 'avdataoffset'=>$ThisFileInfo['avdataoffset']); + $synchstartoffset = $ThisFileInfo['avdataoffset']; + + $FastMode = false; + $SynchErrorsFound = 0; + while (getid3_mp3::decodeMPEGaudioHeader($fd, $synchstartoffset, $dummy, false, false, $FastMode)) { + $FastMode = true; + $thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']]; + + if (empty($dummy['mpeg']['audio']['framelength'])) { + $SynchErrorsFound++; + } else { + $ThisFileInfo['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]++; + $ThisFileInfo['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]++; + $ThisFileInfo['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]++; + + $synchstartoffset += $dummy['mpeg']['audio']['framelength']; + } + } + if ($SynchErrorsFound > 0) { + $ThisFileInfo['warning'][] = 'Found '.$SynchErrorsFound.' synch errors in histogram analysis'; + //return false; + } + + $bittotal = 0; + $framecounter = 0; + foreach ($ThisFileInfo['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) { + $framecounter += $bitratecount; + if ($bitratevalue != 'free') { + $bittotal += ($bitratevalue * $bitratecount); + } + } + if ($framecounter == 0) { + $ThisFileInfo['error'][] = 'Corrupt MP3 file: framecounter == zero'; + return false; + } + $ThisFileInfo['mpeg']['audio']['frame_count'] = $framecounter; + $ThisFileInfo['mpeg']['audio']['bitrate'] = ($bittotal / $framecounter); + + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['bitrate']; + + + // Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently + $distinct_bitrates = 0; + foreach ($ThisFileInfo['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) { + if ($bitrate_count > 0) { + $distinct_bitrates++; + } + } + if ($distinct_bitrates > 1) { + $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr'; + } else { + $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr'; + } + $ThisFileInfo['audio']['bitrate_mode'] = $ThisFileInfo['mpeg']['audio']['bitrate_mode']; + + } + + break; // exit while() + } + } + + $SynchSeekOffset++; + if (($avdataoffset + $SynchSeekOffset) >= $ThisFileInfo['avdataend']) { + // end of file/data + + if (empty($ThisFileInfo['mpeg']['audio'])) { + + $ThisFileInfo['error'][] = 'could not find valid MPEG synch before end of file'; + if (isset($ThisFileInfo['audio']['bitrate'])) { + unset($ThisFileInfo['audio']['bitrate']); + } + if (isset($ThisFileInfo['mpeg']['audio'])) { + unset($ThisFileInfo['mpeg']['audio']); + } + if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || empty($ThisFileInfo['mpeg']))) { + unset($ThisFileInfo['mpeg']); + } + return false; + + } + break; + } + + } + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['mpeg']['audio']['channels']; + $ThisFileInfo['audio']['channelmode'] = $ThisFileInfo['mpeg']['audio']['channelmode']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate']; + return true; + } + + + function MPEGaudioVersionArray() { + static $MPEGaudioVersion = array('2.5', false, '2', '1'); + return $MPEGaudioVersion; + } + + function MPEGaudioLayerArray() { + static $MPEGaudioLayer = array(false, 3, 2, 1); + return $MPEGaudioLayer; + } + + function MPEGaudioBitrateArray() { + static $MPEGaudioBitrate; + if (empty($MPEGaudioBitrate)) { + $MPEGaudioBitrate = array ( + '1' => array (1 => array('free', 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000), + 2 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000), + 3 => array('free', 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000) + ), + + '2' => array (1 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000), + 2 => array('free', 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000), + ) + ); + $MPEGaudioBitrate['2'][3] = $MPEGaudioBitrate['2'][2]; + $MPEGaudioBitrate['2.5'] = $MPEGaudioBitrate['2']; + } + return $MPEGaudioBitrate; + } + + function MPEGaudioFrequencyArray() { + static $MPEGaudioFrequency; + if (empty($MPEGaudioFrequency)) { + $MPEGaudioFrequency = array ( + '1' => array(44100, 48000, 32000), + '2' => array(22050, 24000, 16000), + '2.5' => array(11025, 12000, 8000) + ); + } + return $MPEGaudioFrequency; + } + + function MPEGaudioChannelModeArray() { + static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono'); + return $MPEGaudioChannelMode; + } + + function MPEGaudioModeExtensionArray() { + static $MPEGaudioModeExtension; + if (empty($MPEGaudioModeExtension)) { + $MPEGaudioModeExtension = array ( + 1 => array('4-31', '8-31', '12-31', '16-31'), + 2 => array('4-31', '8-31', '12-31', '16-31'), + 3 => array('', 'IS', 'MS', 'IS+MS') + ); + } + return $MPEGaudioModeExtension; + } + + function MPEGaudioEmphasisArray() { + static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17'); + return $MPEGaudioEmphasis; + } + + function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) { + return getid3_mp3::MPEGaudioHeaderValid(getid3_mp3::MPEGaudioHeaderDecode($head4), false, $allowBitrate15); + } + + function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) { + if (($rawarray['synch'] & 0x0FFE) != 0x0FFE) { + return false; + } + + static $MPEGaudioVersionLookup; + static $MPEGaudioLayerLookup; + static $MPEGaudioBitrateLookup; + static $MPEGaudioFrequencyLookup; + static $MPEGaudioChannelModeLookup; + static $MPEGaudioModeExtensionLookup; + static $MPEGaudioEmphasisLookup; + if (empty($MPEGaudioVersionLookup)) { + $MPEGaudioVersionLookup = getid3_mp3::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = getid3_mp3::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = getid3_mp3::MPEGaudioBitrateArray(); + $MPEGaudioFrequencyLookup = getid3_mp3::MPEGaudioFrequencyArray(); + $MPEGaudioChannelModeLookup = getid3_mp3::MPEGaudioChannelModeArray(); + $MPEGaudioModeExtensionLookup = getid3_mp3::MPEGaudioModeExtensionArray(); + $MPEGaudioEmphasisLookup = getid3_mp3::MPEGaudioEmphasisArray(); + } + + if (isset($MPEGaudioVersionLookup[$rawarray['version']])) { + $decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']]; + } else { + echo ($echoerrors ? "\n".'invalid Version ('.$rawarray['version'].')' : ''); + return false; + } + if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) { + $decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']]; + } else { + echo ($echoerrors ? "\n".'invalid Layer ('.$rawarray['layer'].')' : ''); + return false; + } + if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) { + echo ($echoerrors ? "\n".'invalid Bitrate ('.$rawarray['bitrate'].')' : ''); + if ($rawarray['bitrate'] == 15) { + // known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0 + // let it go through here otherwise file will not be identified + if (!$allowBitrate15) { + return false; + } + } else { + return false; + } + } + if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) { + echo ($echoerrors ? "\n".'invalid Frequency ('.$rawarray['sample_rate'].')' : ''); + return false; + } + if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) { + echo ($echoerrors ? "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')' : ''); + return false; + } + if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) { + echo ($echoerrors ? "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')' : ''); + return false; + } + if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) { + echo ($echoerrors ? "\n".'invalid Emphasis ('.$rawarray['emphasis'].')' : ''); + return false; + } + // These are just either set or not set, you can't mess that up :) + // $rawarray['protection']; + // $rawarray['padding']; + // $rawarray['private']; + // $rawarray['copyright']; + // $rawarray['original']; + + return true; + } + + function MPEGaudioHeaderDecode($Header4Bytes) { + // AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM + // A - Frame sync (all bits set) + // B - MPEG Audio version ID + // C - Layer description + // D - Protection bit + // E - Bitrate index + // F - Sampling rate frequency index + // G - Padding bit + // H - Private bit + // I - Channel Mode + // J - Mode extension (Only if Joint stereo) + // K - Copyright + // L - Original + // M - Emphasis + + if (strlen($Header4Bytes) != 4) { + return false; + } + + $MPEGrawHeader['synch'] = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4; + $MPEGrawHeader['version'] = (ord($Header4Bytes{1}) & 0x18) >> 3; // BB + $MPEGrawHeader['layer'] = (ord($Header4Bytes{1}) & 0x06) >> 1; // CC + $MPEGrawHeader['protection'] = (ord($Header4Bytes{1}) & 0x01); // D + $MPEGrawHeader['bitrate'] = (ord($Header4Bytes{2}) & 0xF0) >> 4; // EEEE + $MPEGrawHeader['sample_rate'] = (ord($Header4Bytes{2}) & 0x0C) >> 2; // FF + $MPEGrawHeader['padding'] = (ord($Header4Bytes{2}) & 0x02) >> 1; // G + $MPEGrawHeader['private'] = (ord($Header4Bytes{2}) & 0x01); // H + $MPEGrawHeader['channelmode'] = (ord($Header4Bytes{3}) & 0xC0) >> 6; // II + $MPEGrawHeader['modeextension'] = (ord($Header4Bytes{3}) & 0x30) >> 4; // JJ + $MPEGrawHeader['copyright'] = (ord($Header4Bytes{3}) & 0x08) >> 3; // K + $MPEGrawHeader['original'] = (ord($Header4Bytes{3}) & 0x04) >> 2; // L + $MPEGrawHeader['emphasis'] = (ord($Header4Bytes{3}) & 0x03); // MM + + return $MPEGrawHeader; + } + + function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) { + static $AudioFrameLengthCache = array(); + + if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) { + $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false; + if ($bitrate != 'free') { + + if ($version == '1') { + + if ($layer == '1') { + + // For Layer I slot is 32 bits long + $FrameLengthCoefficient = 48; + $SlotLength = 4; + + } else { // Layer 2 / 3 + + // for Layer 2 and Layer 3 slot is 8 bits long. + $FrameLengthCoefficient = 144; + $SlotLength = 1; + + } + + } else { // MPEG-2 / MPEG-2.5 + + if ($layer == '1') { + + // For Layer I slot is 32 bits long + $FrameLengthCoefficient = 24; + $SlotLength = 4; + + } elseif ($layer == '2') { + + // for Layer 2 and Layer 3 slot is 8 bits long. + $FrameLengthCoefficient = 144; + $SlotLength = 1; + + } else { // layer 3 + + // for Layer 2 and Layer 3 slot is 8 bits long. + $FrameLengthCoefficient = 72; + $SlotLength = 1; + + } + + } + + // FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding + if ($samplerate > 0) { + $NewFramelength = ($FrameLengthCoefficient * $bitrate) / $samplerate; + $NewFramelength = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer 2/3, 4 bytes for Layer I) + if ($padding) { + $NewFramelength += $SlotLength; + } + $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength; + } + } + } + return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate]; + } + + function ClosestStandardMP3Bitrate($bitrate) { + static $StandardBitrates = array(320000, 256000, 224000, 192000, 160000, 128000, 112000, 96000, 80000, 64000, 56000, 48000, 40000, 32000, 24000, 16000, 8000); + static $BitrateTable = array(0=>'-'); + $roundbitrate = intval(round($bitrate, -3)); + if (!isset($BitrateTable[$roundbitrate])) { + if ($roundbitrate > 320000) { + $BitrateTable[$roundbitrate] = round($bitrate, -4); + } else { + $LastBitrate = 320000; + foreach ($StandardBitrates as $StandardBitrate) { + $BitrateTable[$roundbitrate] = $StandardBitrate; + if ($roundbitrate >= $StandardBitrate - (($LastBitrate - $StandardBitrate) / 2)) { + break; + } + $LastBitrate = $StandardBitrate; + } + } + } + return $BitrateTable[$roundbitrate]; + } + + function XingVBRidOffset($version, $channelmode) { + static $XingVBRidOffsetCache = array(); + if (empty($XingVBRidOffset)) { + $XingVBRidOffset = array ( + '1' => array ('mono' => 0x15, // 4 + 17 = 21 + 'stereo' => 0x24, // 4 + 32 = 36 + 'joint stereo' => 0x24, + 'dual channel' => 0x24 + ), + + '2' => array ('mono' => 0x0D, // 4 + 9 = 13 + 'stereo' => 0x15, // 4 + 17 = 21 + 'joint stereo' => 0x15, + 'dual channel' => 0x15 + ), + + '2.5' => array ('mono' => 0x15, + 'stereo' => 0x15, + 'joint stereo' => 0x15, + 'dual channel' => 0x15 + ) + ); + } + return $XingVBRidOffset[$version][$channelmode]; + } + + function LAMEvbrMethodLookup($VBRmethodID) { + static $LAMEvbrMethodLookup = array( + 0x00 => 'unknown', + 0x01 => 'cbr', + 0x02 => 'abr', + 0x03 => 'vbr-old / vbr-rh', + 0x04 => 'vbr-new / vbr-mtrh', + 0x05 => 'vbr-mt', + 0x06 => 'Full VBR Method 4', + 0x08 => 'constant bitrate 2 pass', + 0x09 => 'abr 2 pass', + 0x0F => 'reserved' + ); + return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : ''); + } + + function LAMEmiscStereoModeLookup($StereoModeID) { + static $LAMEmiscStereoModeLookup = array( + 0 => 'mono', + 1 => 'stereo', + 2 => 'dual mono', + 3 => 'joint stereo', + 4 => 'forced stereo', + 5 => 'auto', + 6 => 'intensity stereo', + 7 => 'other' + ); + return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : ''); + } + + function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) { + static $LAMEmiscSourceSampleFrequencyLookup = array( + 0 => '<= 32 kHz', + 1 => '44.1 kHz', + 2 => '48 kHz', + 3 => '> 48kHz' + ); + return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : ''); + } + + function LAMEsurroundInfoLookup($SurroundInfoID) { + static $LAMEsurroundInfoLookup = array( + 0 => 'no surround info', + 1 => 'DPL encoding', + 2 => 'DPL2 encoding', + 3 => 'Ambisonic encoding' + ); + return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved'); + } + + function LAMEpresetUsedLookup($LAMEtag) { + + if ($LAMEtag['preset_used_id'] == 0) { + // no preset used (LAME >=3.93) + // no preset recorded (LAME <3.93) + return ''; + } + $LAMEpresetUsedLookup = array(); + + ///// THIS PART CANNOT BE STATIC . + for ($i = 8; $i <= 320; $i++) { + switch ($LAMEtag['vbr_method']) { + case 'cbr': + $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i; + break; + case 'abr': + default: // other VBR modes shouldn't be here(?) + $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i; + break; + } + } + + // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions() + + // named alt-presets + $LAMEpresetUsedLookup[1000] = '--r3mix'; + $LAMEpresetUsedLookup[1001] = '--alt-preset standard'; + $LAMEpresetUsedLookup[1002] = '--alt-preset extreme'; + $LAMEpresetUsedLookup[1003] = '--alt-preset insane'; + $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard'; + $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme'; + $LAMEpresetUsedLookup[1006] = '--alt-preset medium'; + $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium'; + + // LAME 3.94 additions/changes + $LAMEpresetUsedLookup[1010] = '--preset portable'; // 3.94a15 Oct 21 2003 + $LAMEpresetUsedLookup[1015] = '--preset radio'; // 3.94a15 Oct 21 2003 + + $LAMEpresetUsedLookup[320] = '--preset insane'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[410] = '-V9'; + $LAMEpresetUsedLookup[420] = '-V8'; + $LAMEpresetUsedLookup[440] = '-V6'; + $LAMEpresetUsedLookup[430] = '--preset radio'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[450] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[460] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[470] = '--r3mix'; // 3.94b1 Dec 18 2003 + $LAMEpresetUsedLookup[480] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[490] = '-V1'; + $LAMEpresetUsedLookup[500] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme'; // 3.94a15 Nov 12 2003 + + return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org'); + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.mpc.php b/campcaster/src/modules/getid3/var/module.audio.mpc.php new file mode 100644 index 000000000..d0a7202f9 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.mpc.php @@ -0,0 +1,296 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.mpc.php // +// module for analyzing Musepack/MPEG+ Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_mpc +{ + + function getid3_mpc(&$fd, &$ThisFileInfo) { + // http://www.uni-jena.de/~pfk/mpp/sv8/header.html + + $ThisFileInfo['mpc']['header'] = array(); + $thisfile_mpc_header = &$ThisFileInfo['mpc']['header']; + + $ThisFileInfo['fileformat'] = 'mpc'; + $ThisFileInfo['audio']['dataformat'] = 'mpc'; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + $ThisFileInfo['audio']['channels'] = 2; // the format appears to be hardcoded for stereo only + $ThisFileInfo['audio']['lossless'] = false; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + $thisfile_mpc_header['size'] = 28; + $MPCheaderData = fread($fd, $thisfile_mpc_header['size']); + $offset = 0; + + if (substr($MPCheaderData, $offset, 3) == 'MP+') { + + // great, this is SV7+ + $thisfile_mpc_header['raw']['preamble'] = substr($MPCheaderData, $offset, 3); // should be 'MP+' + $offset += 3; + + } elseif (preg_match('/^[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0]/s', substr($MPCheaderData, 0, 4))) { + + // this is SV4 - SV6, handle seperately + $thisfile_mpc_header['size'] = 8; + + // add size of file header to avdataoffset - calc bitrate correctly + MD5 data + $ThisFileInfo['avdataoffset'] += $thisfile_mpc_header['size']; + + // Most of this code adapted from Jurgen Faul's MPEGplus source code - thanks Jurgen! :) + $HeaderDWORD[0] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, 0, 4)); + $HeaderDWORD[1] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, 4, 4)); + + + // DDDD DDDD CCCC CCCC BBBB BBBB AAAA AAAA + // aaaa aaaa abcd dddd dddd deee eeff ffff + // + // a = bitrate = anything + // b = IS = anything + // c = MS = anything + // d = streamversion = 0000000004 or 0000000005 or 0000000006 + // e = maxband = anything + // f = blocksize = 000001 for SV5+, anything(?) for SV4 + + $thisfile_mpc_header['target_bitrate'] = (($HeaderDWORD[0] & 0xFF800000) >> 23); + $thisfile_mpc_header['intensity_stereo'] = (bool) (($HeaderDWORD[0] & 0x00400000) >> 22); + $thisfile_mpc_header['mid-side_stereo'] = (bool) (($HeaderDWORD[0] & 0x00200000) >> 21); + $thisfile_mpc_header['stream_major_version'] = ($HeaderDWORD[0] & 0x001FF800) >> 11; + $thisfile_mpc_header['stream_minor_version'] = 0; // no sub-version numbers before SV7 + $thisfile_mpc_header['max_band'] = ($HeaderDWORD[0] & 0x000007C0) >> 6; // related to lowpass frequency, not sure how it translates exactly + $thisfile_mpc_header['block_size'] = ($HeaderDWORD[0] & 0x0000003F); + + switch ($thisfile_mpc_header['stream_major_version']) { + case 4: + $thisfile_mpc_header['frame_count'] = ($HeaderDWORD[1] >> 16); + break; + + case 5: + case 6: + $thisfile_mpc_header['frame_count'] = $HeaderDWORD[1]; + break; + + default: + $ThisFileInfo['error'] = 'Expecting 4, 5 or 6 in version field, found '.$thisfile_mpc_header['stream_major_version'].' instead'; + unset($ThisFileInfo['mpc']); + return false; + break; + } + + if (($thisfile_mpc_header['stream_major_version'] > 4) && ($thisfile_mpc_header['block_size'] != 1)) { + $ThisFileInfo['warning'][] = 'Block size expected to be 1, actual value found: '.$thisfile_mpc_header['block_size']; + } + + $thisfile_mpc_header['sample_rate'] = 44100; // AB: used by all files up to SV7 + $ThisFileInfo['audio']['sample_rate'] = $thisfile_mpc_header['sample_rate']; + $thisfile_mpc_header['samples'] = $thisfile_mpc_header['frame_count'] * 1152 * $ThisFileInfo['audio']['channels']; + + if ($thisfile_mpc_header['target_bitrate'] == 0) { + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + } else { + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + } + + $ThisFileInfo['mpc']['bitrate'] = ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8 * 44100 / $thisfile_mpc_header['frame_count'] / 1152; + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['mpc']['bitrate']; + $ThisFileInfo['audio']['encoder'] = 'SV'.$thisfile_mpc_header['stream_major_version']; + + return true; + + } else { + + $ThisFileInfo['error'][] = 'Expecting "MP+" at offset '.$ThisFileInfo['avdataoffset'].', found "'.substr($MPCheaderData, $offset, 3).'"'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['mpc']); + return false; + + } + + // Continue with SV7+ handling + $StreamVersionByte = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 1)); + $offset += 1; + $thisfile_mpc_header['stream_major_version'] = ($StreamVersionByte & 0x0F); + $thisfile_mpc_header['stream_minor_version'] = ($StreamVersionByte & 0xF0) >> 4; + $thisfile_mpc_header['frame_count'] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 4)); + $offset += 4; + + switch ($thisfile_mpc_header['stream_major_version']) { + case 7: + //$ThisFileInfo['fileformat'] = 'SV7'; + break; + + default: + $ThisFileInfo['error'][] = 'Only Musepack SV7 supported'; + return false; + } + + $FlagsDWORD1 = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 4)); + $offset += 4; + $thisfile_mpc_header['intensity_stereo'] = (bool) (($FlagsDWORD1 & 0x80000000) >> 31); + $thisfile_mpc_header['mid_side_stereo'] = (bool) (($FlagsDWORD1 & 0x40000000) >> 30); + $thisfile_mpc_header['max_subband'] = ($FlagsDWORD1 & 0x3F000000) >> 24; + $thisfile_mpc_header['raw']['profile'] = ($FlagsDWORD1 & 0x00F00000) >> 20; + $thisfile_mpc_header['begin_loud'] = (bool) (($FlagsDWORD1 & 0x00080000) >> 19); + $thisfile_mpc_header['end_loud'] = (bool) (($FlagsDWORD1 & 0x00040000) >> 18); + $thisfile_mpc_header['raw']['sample_rate'] = ($FlagsDWORD1 & 0x00030000) >> 16; + $thisfile_mpc_header['max_level'] = ($FlagsDWORD1 & 0x0000FFFF); + + $thisfile_mpc_header['raw']['title_peak'] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 2)); + $offset += 2; + $thisfile_mpc_header['raw']['title_gain'] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 2), true); + $offset += 2; + + $thisfile_mpc_header['raw']['album_peak'] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 2)); + $offset += 2; + $thisfile_mpc_header['raw']['album_gain'] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 2), true); + $offset += 2; + + $FlagsDWORD2 = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 4)); + $offset += 4; + $thisfile_mpc_header['true_gapless'] = (bool) (($FlagsDWORD2 & 0x80000000) >> 31); + $thisfile_mpc_header['last_frame_length'] = ($FlagsDWORD2 & 0x7FF00000) >> 20; + + + $thisfile_mpc_header['raw']['not_sure_what'] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 3)); + $offset += 3; + $thisfile_mpc_header['raw']['encoder_version'] = getid3_lib::LittleEndian2Int(substr($MPCheaderData, $offset, 1)); + $offset += 1; + + $thisfile_mpc_header['profile'] = $this->MPCprofileNameLookup($thisfile_mpc_header['raw']['profile']); + $thisfile_mpc_header['sample_rate'] = $this->MPCfrequencyLookup($thisfile_mpc_header['raw']['sample_rate']); + if ($thisfile_mpc_header['sample_rate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt MPC file: frequency == zero'; + return false; + } + $ThisFileInfo['audio']['sample_rate'] = $thisfile_mpc_header['sample_rate']; + $thisfile_mpc_header['samples'] = ((($thisfile_mpc_header['frame_count'] - 1) * 1152) + $thisfile_mpc_header['last_frame_length']) * $ThisFileInfo['audio']['channels']; + + $ThisFileInfo['playtime_seconds'] = ($thisfile_mpc_header['samples'] / $ThisFileInfo['audio']['channels']) / $ThisFileInfo['audio']['sample_rate']; + if ($ThisFileInfo['playtime_seconds'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt MPC file: playtime_seconds == zero'; + return false; + } + + // add size of file header to avdataoffset - calc bitrate correctly + MD5 data + $ThisFileInfo['avdataoffset'] += $thisfile_mpc_header['size']; + + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + + $thisfile_mpc_header['title_peak'] = $thisfile_mpc_header['raw']['title_peak']; + $thisfile_mpc_header['title_peak_db'] = $this->MPCpeakDBLookup($thisfile_mpc_header['title_peak']); + if ($thisfile_mpc_header['raw']['title_gain'] < 0) { + $thisfile_mpc_header['title_gain_db'] = (float) (32768 + $thisfile_mpc_header['raw']['title_gain']) / -100; + } else { + $thisfile_mpc_header['title_gain_db'] = (float) $thisfile_mpc_header['raw']['title_gain'] / 100; + } + + $thisfile_mpc_header['album_peak'] = $thisfile_mpc_header['raw']['album_peak']; + $thisfile_mpc_header['album_peak_db'] = $this->MPCpeakDBLookup($thisfile_mpc_header['album_peak']); + if ($thisfile_mpc_header['raw']['album_gain'] < 0) { + $thisfile_mpc_header['album_gain_db'] = (float) (32768 + $thisfile_mpc_header['raw']['album_gain']) / -100; + } else { + $thisfile_mpc_header['album_gain_db'] = (float) $thisfile_mpc_header['raw']['album_gain'] / 100;; + } + $thisfile_mpc_header['encoder_version'] = $this->MPCencoderVersionLookup($thisfile_mpc_header['raw']['encoder_version']); + + $ThisFileInfo['replay_gain']['track']['adjustment'] = $thisfile_mpc_header['title_gain_db']; + $ThisFileInfo['replay_gain']['album']['adjustment'] = $thisfile_mpc_header['album_gain_db']; + + if ($thisfile_mpc_header['title_peak'] > 0) { + $ThisFileInfo['replay_gain']['track']['peak'] = $thisfile_mpc_header['title_peak']; + } elseif (round($thisfile_mpc_header['max_level'] * 1.18) > 0) { + $ThisFileInfo['replay_gain']['track']['peak'] = getid3_lib::CastAsInt(round($thisfile_mpc_header['max_level'] * 1.18)); // why? I don't know - see mppdec.c + } + if ($thisfile_mpc_header['album_peak'] > 0) { + $ThisFileInfo['replay_gain']['album']['peak'] = $thisfile_mpc_header['album_peak']; + } + + //$ThisFileInfo['audio']['encoder'] = 'SV'.$thisfile_mpc_header['stream_major_version'].'.'.$thisfile_mpc_header['stream_minor_version'].', '.$thisfile_mpc_header['encoder_version']; + $ThisFileInfo['audio']['encoder'] = $thisfile_mpc_header['encoder_version']; + $ThisFileInfo['audio']['encoder_options'] = $thisfile_mpc_header['profile']; + + return true; + } + + function MPCprofileNameLookup($profileid) { + static $MPCprofileNameLookup = array( + 0 => 'no profile', + 1 => 'Experimental', + 2 => 'unused', + 3 => 'unused', + 4 => 'unused', + 5 => 'below Telephone (q = 0.0)', + 6 => 'below Telephone (q = 1.0)', + 7 => 'Telephone (q = 2.0)', + 8 => 'Thumb (q = 3.0)', + 9 => 'Radio (q = 4.0)', + 10 => 'Standard (q = 5.0)', + 11 => 'Extreme (q = 6.0)', + 12 => 'Insane (q = 7.0)', + 13 => 'BrainDead (q = 8.0)', + 14 => 'above BrainDead (q = 9.0)', + 15 => 'above BrainDead (q = 10.0)' + ); + return (isset($MPCprofileNameLookup[$profileid]) ? $MPCprofileNameLookup[$profileid] : 'invalid'); + } + + function MPCfrequencyLookup($frequencyid) { + static $MPCfrequencyLookup = array( + 0 => 44100, + 1 => 48000, + 2 => 37800, + 3 => 32000 + ); + return (isset($MPCfrequencyLookup[$frequencyid]) ? $MPCfrequencyLookup[$frequencyid] : 'invalid'); + } + + function MPCpeakDBLookup($intvalue) { + if ($intvalue > 0) { + return ((log10($intvalue) / log10(2)) - 15) * 6; + } + return false; + } + + function MPCencoderVersionLookup($encoderversion) { + //Encoder version * 100 (106 = 1.06) + //EncoderVersion % 10 == 0 Release (1.0) + //EncoderVersion % 2 == 0 Beta (1.06) + //EncoderVersion % 2 == 1 Alpha (1.05a...z) + + if ($encoderversion == 0) { + // very old version, not known exactly which + return 'Buschmann v1.7.0-v1.7.9 or Klemm v0.90-v1.05'; + } + + if (($encoderversion % 10) == 0) { + + // release version + return number_format($encoderversion / 100, 2); + + } elseif (($encoderversion % 2) == 0) { + + // beta version + return number_format($encoderversion / 100, 2).' beta'; + + } + + // alpha version + return number_format($encoderversion / 100, 2).' alpha'; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.ogg.php b/campcaster/src/modules/getid3/var/module.audio.ogg.php new file mode 100644 index 000000000..f722b33c5 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.ogg.php @@ -0,0 +1,543 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.ogg.php // +// module for analyzing Ogg Vorbis, OggFLAC and Speex files // +// dependencies: module.audio.flac.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true); + +class getid3_ogg +{ + + function getid3_ogg(&$fd, &$ThisFileInfo) { + + $ThisFileInfo['fileformat'] = 'ogg'; + + // Warn about illegal tags - only vorbiscomments are allowed + if (isset($ThisFileInfo['id3v2'])) { + $ThisFileInfo['warning'][] = 'Illegal ID3v2 tag present.'; + } + if (isset($ThisFileInfo['id3v1'])) { + $ThisFileInfo['warning'][] = 'Illegal ID3v1 tag present.'; + } + if (isset($ThisFileInfo['ape'])) { + $ThisFileInfo['warning'][] = 'Illegal APE tag present.'; + } + + + // Page 1 - Stream Header + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + $oggpageinfo = getid3_ogg::ParseOggPageHeader($fd); + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + if (ftell($fd) >= GETID3_FREAD_BUFFER_SIZE) { + $ThisFileInfo['error'][] = 'Could not find start of Ogg page in the first '.GETID3_FREAD_BUFFER_SIZE.' bytes (this might not be an Ogg-Vorbis file?)'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['ogg']); + return false; + } + + $filedata = fread($fd, $oggpageinfo['page_length']); + $filedataoffset = 0; + + if (substr($filedata, 0, 4) == 'fLaC') { + + $ThisFileInfo['audio']['dataformat'] = 'flac'; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + $ThisFileInfo['audio']['lossless'] = true; + + } elseif (substr($filedata, 1, 6) == 'vorbis') { + + $ThisFileInfo['audio']['dataformat'] = 'vorbis'; + $ThisFileInfo['audio']['lossless'] = false; + + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis' + $filedataoffset += 6; + $ThisFileInfo['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['ogg']['numberofchannels']; + $ThisFileInfo['ogg']['samplerate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + if ($ThisFileInfo['ogg']['samplerate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt Ogg file: sample rate == zero'; + return false; + } + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['ogg']['samplerate']; + $ThisFileInfo['ogg']['samples'] = 0; // filled in later + $ThisFileInfo['ogg']['bitrate_average'] = 0; // filled in later + $ThisFileInfo['ogg']['bitrate_max'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['bitrate_nominal'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['bitrate_min'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['blocksize_small'] = pow(2, getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F); + $ThisFileInfo['ogg']['blocksize_large'] = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4); + $ThisFileInfo['ogg']['stop_bit'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet + + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr + if ($ThisFileInfo['ogg']['bitrate_max'] == 0xFFFFFFFF) { + unset($ThisFileInfo['ogg']['bitrate_max']); + $ThisFileInfo['audio']['bitrate_mode'] = 'abr'; + } + if ($ThisFileInfo['ogg']['bitrate_nominal'] == 0xFFFFFFFF) { + unset($ThisFileInfo['ogg']['bitrate_nominal']); + } + if ($ThisFileInfo['ogg']['bitrate_min'] == 0xFFFFFFFF) { + unset($ThisFileInfo['ogg']['bitrate_min']); + $ThisFileInfo['audio']['bitrate_mode'] = 'abr'; + } + + } elseif (substr($filedata, 0, 8) == 'Speex ') { + + // http://www.speex.org/manual/node10.html + + $ThisFileInfo['audio']['dataformat'] = 'speex'; + $ThisFileInfo['mime_type'] = 'audio/speex'; + $ThisFileInfo['audio']['bitrate_mode'] = 'abr'; + $ThisFileInfo['audio']['lossless'] = false; + + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex ' + $filedataoffset += 8; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version'] = substr($filedata, $filedataoffset, 20); + $filedataoffset += 20; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + + $ThisFileInfo['speex']['speex_version'] = trim($ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']); + $ThisFileInfo['speex']['sample_rate'] = $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']; + $ThisFileInfo['speex']['channels'] = $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']; + $ThisFileInfo['speex']['vbr'] = (bool) $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']; + $ThisFileInfo['speex']['band_type'] = getid3_ogg::SpeexBandModeLookup($ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']); + + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['speex']['sample_rate']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['speex']['channels']; + if ($ThisFileInfo['speex']['vbr']) { + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + } + + } else { + + $ThisFileInfo['error'][] = 'Expecting either "Speex " or "vorbis" identifier strings, found neither'; + unset($ThisFileInfo['ogg']); + unset($ThisFileInfo['mime_type']); + return false; + + } + + + // Page 2 - Comment Header + + $oggpageinfo = getid3_ogg::ParseOggPageHeader($fd); + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + switch ($ThisFileInfo['audio']['dataformat']) { + + case 'vorbis': + $filedata = fread($fd, $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1)); + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 1, 6); // hard-coded to 'vorbis' + + getid3_ogg::ParseVorbisCommentsFilepointer($fd, $ThisFileInfo); + break; + + case 'flac': + if (!getid3_flac::FLACparseMETAdata($fd, $ThisFileInfo)) { + $ThisFileInfo['error'][] = 'Failed to parse FLAC headers'; + return false; + } + break; + + case 'speex': + fseek($fd, $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR); + getid3_ogg::ParseVorbisCommentsFilepointer($fd, $ThisFileInfo); + break; + + } + + + + // Last Page - Number of Samples + + fseek($fd, max($ThisFileInfo['avdataend'] - GETID3_FREAD_BUFFER_SIZE, 0), SEEK_SET); + $LastChunkOfOgg = strrev(fread($fd, GETID3_FREAD_BUFFER_SIZE)); + if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) { + fseek($fd, $ThisFileInfo['avdataend'] - ($LastOggSpostion + strlen('SggO')), SEEK_SET); + $ThisFileInfo['avdataend'] = ftell($fd); + $ThisFileInfo['ogg']['pageheader']['eos'] = getid3_ogg::ParseOggPageHeader($fd); + $ThisFileInfo['ogg']['samples'] = $ThisFileInfo['ogg']['pageheader']['eos']['pcm_abs_position']; + if ($ThisFileInfo['ogg']['samples'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt Ogg file: eos.number of samples == zero'; + return false; + } + $ThisFileInfo['ogg']['bitrate_average'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / ($ThisFileInfo['ogg']['samples'] / $ThisFileInfo['audio']['sample_rate']); + } + + if (!empty($ThisFileInfo['ogg']['bitrate_average'])) { + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['ogg']['bitrate_average']; + } elseif (!empty($ThisFileInfo['ogg']['bitrate_nominal'])) { + $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['ogg']['bitrate_nominal']; + } elseif (!empty($ThisFileInfo['ogg']['bitrate_min']) && !empty($ThisFileInfo['ogg']['bitrate_max'])) { + $ThisFileInfo['audio']['bitrate'] = ($ThisFileInfo['ogg']['bitrate_min'] + $ThisFileInfo['ogg']['bitrate_max']) / 2; + } + if (isset($ThisFileInfo['audio']['bitrate']) && !isset($ThisFileInfo['playtime_seconds'])) { + if ($ThisFileInfo['audio']['bitrate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt Ogg file: bitrate_audio == zero'; + return false; + } + $ThisFileInfo['playtime_seconds'] = (float) ((($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['audio']['bitrate']); + } + + if (isset($ThisFileInfo['ogg']['vendor'])) { + $ThisFileInfo['audio']['encoder'] = preg_replace('/^Encoded with /', '', $ThisFileInfo['ogg']['vendor']); + + // Vorbis only + if ($ThisFileInfo['audio']['dataformat'] == 'vorbis') { + + // Vorbis 1.0 starts with Xiph.Org + if (preg_match('/^Xiph.Org/', $ThisFileInfo['audio']['encoder'])) { + + if ($ThisFileInfo['audio']['bitrate_mode'] == 'abr') { + + // Set -b 128 on abr files + $ThisFileInfo['audio']['encoder_options'] = '-b '.round($ThisFileInfo['ogg']['bitrate_nominal'] / 1000); + + } elseif (($ThisFileInfo['audio']['bitrate_mode'] == 'vbr') && ($ThisFileInfo['audio']['channels'] == 2) && ($ThisFileInfo['audio']['sample_rate'] >= 44100) && ($ThisFileInfo['audio']['sample_rate'] <= 48000)) { + // Set -q N on vbr files + $ThisFileInfo['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($ThisFileInfo['ogg']['bitrate_nominal']); + + } + } + + if (empty($ThisFileInfo['audio']['encoder_options']) && !empty($ThisFileInfo['ogg']['bitrate_nominal'])) { + $ThisFileInfo['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($ThisFileInfo['ogg']['bitrate_nominal'] / 1000)).'kbps'; + } + } + } + + return true; + } + + + function ParseOggPageHeader(&$fd) { + // http://xiph.org/ogg/vorbis/doc/framing.html + $oggheader['page_start_offset'] = ftell($fd); // where we started from in the file + + $filedata = fread($fd, GETID3_FREAD_BUFFER_SIZE); + $filedataoffset = 0; + while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) { + if ((ftell($fd) - $oggheader['page_start_offset']) >= GETID3_FREAD_BUFFER_SIZE) { + // should be found before here + return false; + } + if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) { + if (feof($fd) || (($filedata .= fread($fd, GETID3_FREAD_BUFFER_SIZE)) === false)) { + // get some more data, unless eof, in which case fail + return false; + } + } + } + $filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS' + + $oggheader['stream_structver'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['flags_raw'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['flags']['fresh'] = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet + $oggheader['flags']['bos'] = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos) + $oggheader['flags']['eos'] = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos) + + $oggheader['pcm_abs_position'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $oggheader['stream_serialno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $oggheader['page_seqno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $oggheader['page_checksum'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $oggheader['page_segments'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['page_length'] = 0; + for ($i = 0; $i < $oggheader['page_segments']; $i++) { + $oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['page_length'] += $oggheader['segment_table'][$i]; + } + $oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset; + $oggheader['page_end_offset'] = $oggheader['header_end_offset'] + $oggheader['page_length']; + fseek($fd, $oggheader['header_end_offset'], SEEK_SET); + + return $oggheader; + } + + + function ParseVorbisCommentsFilepointer(&$fd, &$ThisFileInfo) { + + $OriginalOffset = ftell($fd); + $CommentStartOffset = $OriginalOffset; + $commentdataoffset = 0; + $VorbisCommentPage = 1; + + switch ($ThisFileInfo['audio']['dataformat']) { + case 'vorbis': + $CommentStartOffset = $ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset']; // Second Ogg page, after header block + fseek($fd, $CommentStartOffset, SEEK_SET); + $commentdataoffset = 27 + $ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage]['page_segments']; + $commentdata = fread($fd, getid3_ogg::OggPageSegmentLength($ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset); + + $commentdataoffset += (strlen('vorbis') + 1); + break; + + case 'flac': + fseek($fd, $ThisFileInfo['flac']['VORBIS_COMMENT']['raw']['offset'] + 4, SEEK_SET); + $commentdata = fread($fd, $ThisFileInfo['flac']['VORBIS_COMMENT']['raw']['block_length']); + break; + + case 'speex': + $CommentStartOffset = $ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset']; // Second Ogg page, after header block + fseek($fd, $CommentStartOffset, SEEK_SET); + $commentdataoffset = 27 + $ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage]['page_segments']; + $commentdata = fread($fd, getid3_ogg::OggPageSegmentLength($ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset); + break; + + default: + return false; + break; + } + + $VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); + $commentdataoffset += 4; + + $ThisFileInfo['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize); + $commentdataoffset += $VendorSize; + + $CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); + $commentdataoffset += 4; + $ThisFileInfo['avdataoffset'] = $CommentStartOffset + $commentdataoffset; + + $basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT'); + for ($i = 0; $i < $CommentsCount; $i++) { + + $ThisFileInfo['ogg']['comments_raw'][$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset; + + if (ftell($fd) < ($ThisFileInfo['ogg']['comments_raw'][$i]['dataoffset'] + 4)) { + $VorbisCommentPage++; + + $oggpageinfo = getid3_ogg::ParseOggPageHeader($fd); + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + // First, save what we haven't read yet + $AsYetUnusedData = substr($commentdata, $commentdataoffset); + + // Then take that data off the end + $commentdata = substr($commentdata, 0, $commentdataoffset); + + // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct + $commentdata .= str_repeat("\x00", 27 + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + $commentdataoffset += (27 + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + + // Finally, stick the unused data back on the end + $commentdata .= $AsYetUnusedData; + + //$commentdata .= fread($fd, $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); + $commentdata .= fread($fd, getid3_ogg::OggPageSegmentLength($ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage], 1)); + + } + $ThisFileInfo['ogg']['comments_raw'][$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); + + // replace avdataoffset with position just after the last vorbiscomment + $ThisFileInfo['avdataoffset'] = $ThisFileInfo['ogg']['comments_raw'][$i]['dataoffset'] + $ThisFileInfo['ogg']['comments_raw'][$i]['size'] + 4; + + $commentdataoffset += 4; + while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo['ogg']['comments_raw'][$i]['size']) { + if (($ThisFileInfo['ogg']['comments_raw'][$i]['size'] > $ThisFileInfo['avdataend']) || ($ThisFileInfo['ogg']['comments_raw'][$i]['size'] < 0)) { + $ThisFileInfo['error'][] = 'Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo['ogg']['comments_raw'][$i]['size']).' bytes) - aborting reading comments'; + break 2; + } + + $VorbisCommentPage++; + + $oggpageinfo = getid3_ogg::ParseOggPageHeader($fd); + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + // First, save what we haven't read yet + $AsYetUnusedData = substr($commentdata, $commentdataoffset); + + // Then take that data off the end + $commentdata = substr($commentdata, 0, $commentdataoffset); + + // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct + $commentdata .= str_repeat("\x00", 27 + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + $commentdataoffset += (27 + $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + + // Finally, stick the unused data back on the end + $commentdata .= $AsYetUnusedData; + + //$commentdata .= fread($fd, $ThisFileInfo['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); + $commentdata .= fread($fd, getid3_ogg::OggPageSegmentLength($ThisFileInfo['ogg']['pageheader'][$VorbisCommentPage], 1)); + + //$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset']; + } + $commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo['ogg']['comments_raw'][$i]['size']); + $commentdataoffset += $ThisFileInfo['ogg']['comments_raw'][$i]['size']; + + if (!$commentstring) { + + // no comment? + $ThisFileInfo['warning'][] = 'Blank Ogg comment ['.$i.']'; + + } elseif (strstr($commentstring, '=')) { + + $commentexploded = explode('=', $commentstring, 2); + $ThisFileInfo['ogg']['comments_raw'][$i]['key'] = strtoupper($commentexploded[0]); + $ThisFileInfo['ogg']['comments_raw'][$i]['value'] = @$commentexploded[1]; + $ThisFileInfo['ogg']['comments_raw'][$i]['data'] = base64_decode($ThisFileInfo['ogg']['comments_raw'][$i]['value']); + + $ThisFileInfo['ogg']['comments'][strtolower($ThisFileInfo['ogg']['comments_raw'][$i]['key'])][] = $ThisFileInfo['ogg']['comments_raw'][$i]['value']; + + $imagechunkcheck = getid3_lib::GetDataImageSize($ThisFileInfo['ogg']['comments_raw'][$i]['data']); + $ThisFileInfo['ogg']['comments_raw'][$i]['image_mime'] = getid3_lib::image_type_to_mime_type($imagechunkcheck[2]); + if (!$ThisFileInfo['ogg']['comments_raw'][$i]['image_mime'] || ($ThisFileInfo['ogg']['comments_raw'][$i]['image_mime'] == 'application/octet-stream')) { + unset($ThisFileInfo['ogg']['comments_raw'][$i]['image_mime']); + unset($ThisFileInfo['ogg']['comments_raw'][$i]['data']); + } + + } else { + + $ThisFileInfo['warning'][] = '[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring; + + } + } + + + // Replay Gain Adjustment + // http://privatewww.essex.ac.uk/~djmrob/replaygain/ + if (isset($ThisFileInfo['ogg']['comments']) && is_array($ThisFileInfo['ogg']['comments'])) { + foreach ($ThisFileInfo['ogg']['comments'] as $index => $commentvalue) { + switch ($index) { + case 'rg_audiophile': + case 'replaygain_album_gain': + $ThisFileInfo['replay_gain']['album']['adjustment'] = (double) $commentvalue[0]; + unset($ThisFileInfo['ogg']['comments'][$index]); + break; + + case 'rg_radio': + case 'replaygain_track_gain': + $ThisFileInfo['replay_gain']['track']['adjustment'] = (double) $commentvalue[0]; + unset($ThisFileInfo['ogg']['comments'][$index]); + break; + + case 'replaygain_album_peak': + $ThisFileInfo['replay_gain']['album']['peak'] = (double) $commentvalue[0]; + unset($ThisFileInfo['ogg']['comments'][$index]); + break; + + case 'rg_peak': + case 'replaygain_track_peak': + $ThisFileInfo['replay_gain']['track']['peak'] = (double) $commentvalue[0]; + unset($ThisFileInfo['ogg']['comments'][$index]); + break; + + + default: + // do nothing + break; + } + } + } + + fseek($fd, $OriginalOffset, SEEK_SET); + + return true; + } + + function SpeexBandModeLookup($mode) { + static $SpeexBandModeLookup = array(); + if (empty($SpeexBandModeLookup)) { + $SpeexBandModeLookup[0] = 'narrow'; + $SpeexBandModeLookup[1] = 'wide'; + $SpeexBandModeLookup[2] = 'ultra-wide'; + } + return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null); + } + + + function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) { + for ($i = 0; $i < $SegmentNumber; $i++) { + $segmentlength = 0; + foreach ($OggInfoArray['segment_table'] as $key => $value) { + $segmentlength += $value; + if ($value < 255) { + break; + } + } + } + return $segmentlength; + } + + + function get_quality_from_nominal_bitrate($nominal_bitrate) { + + // decrease precision + $nominal_bitrate = $nominal_bitrate / 1000; + + if ($nominal_bitrate < 128) { + // q-1 to q4 + $qval = ($nominal_bitrate - 64) / 16; + } elseif ($nominal_bitrate < 256) { + // q4 to q8 + $qval = $nominal_bitrate / 32; + } elseif ($nominal_bitrate < 320) { + // q8 to q9 + $qval = ($nominal_bitrate + 256) / 64; + } else { + // q9 to q10 + $qval = ($nominal_bitrate + 1300) / 180; + } + //return $qval; // 5.031324 + //return intval($qval); // 5 + return round($qval, 1); // 5 or 4.9 + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.optimfrog.php b/campcaster/src/modules/getid3/var/module.audio.optimfrog.php new file mode 100644 index 000000000..3c2dfb0bd --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.optimfrog.php @@ -0,0 +1,408 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.optimfrog.php // +// module for analyzing OptimFROG audio files // +// dependencies: module.audio.riff.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + +class getid3_optimfrog +{ + + function getid3_optimfrog(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'ofr'; + $ThisFileInfo['audio']['dataformat'] = 'ofr'; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + $ThisFileInfo['audio']['lossless'] = true; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $OFRheader = fread($fd, 8); + if (substr($OFRheader, 0, 5) == '*RIFF') { + + return $this->ParseOptimFROGheader42($fd, $ThisFileInfo); + + } elseif (substr($OFRheader, 0, 3) == 'OFR') { + + return $this->ParseOptimFROGheader45($fd, $ThisFileInfo); + + } + + $ThisFileInfo['error'][] = 'Expecting "*RIFF" or "OFR " at offset '.$ThisFileInfo['avdataoffset'].', found "'.$OFRheader.'"'; + unset($ThisFileInfo['fileformat']); + return false; + } + + + function ParseOptimFROGheader42(&$fd, &$ThisFileInfo) { + // for fileformat of v4.21 and older + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $OptimFROGheaderData = fread($fd, 45); + $ThisFileInfo['avdataoffset'] = 45; + + $OptimFROGencoderVersion_raw = getid3_lib::LittleEndian2Int(substr($OptimFROGheaderData, 0, 1)); + $OptimFROGencoderVersion_major = floor($OptimFROGencoderVersion_raw / 10); + $OptimFROGencoderVersion_minor = $OptimFROGencoderVersion_raw - ($OptimFROGencoderVersion_major * 10); + $RIFFdata = substr($OptimFROGheaderData, 1, 44); + $OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 4, 4)) + 8; + $OrignalRIFFdataSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44; + + if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) { + $ThisFileInfo['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize); + fseek($fd, $ThisFileInfo['avdataend'], SEEK_SET); + $RIFFdata .= fread($fd, $OrignalRIFFheaderSize - $OrignalRIFFdataSize); + } + + // move the data chunk after all other chunks (if any) + // so that the RIFF parser doesn't see EOF when trying + // to skip over the data chunk + $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8); + getid3_riff::ParseRIFFdata($RIFFdata, $ThisFileInfo); + + $ThisFileInfo['audio']['encoder'] = 'OptimFROG '.$OptimFROGencoderVersion_major.'.'.$OptimFROGencoderVersion_minor; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['riff']['audio'][0]['channels']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['riff']['audio'][0]['sample_rate']; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['riff']['audio'][0]['bits_per_sample']; + $ThisFileInfo['playtime_seconds'] = $OrignalRIFFdataSize / ($ThisFileInfo['audio']['channels'] * $ThisFileInfo['audio']['sample_rate'] * ($ThisFileInfo['audio']['bits_per_sample'] / 8)); + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + + return true; + } + + + function ParseOptimFROGheader45(&$fd, &$ThisFileInfo) { + // for fileformat of v4.50a and higher + + $RIFFdata = ''; + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + while (!feof($fd) && (ftell($fd) < $ThisFileInfo['avdataend'])) { + $BlockOffset = ftell($fd); + $BlockData = fread($fd, 8); + $offset = 8; + $BlockName = substr($BlockData, 0, 4); + $BlockSize = getid3_lib::LittleEndian2Int(substr($BlockData, 4, 4)); + + if ($BlockName == 'OFRX') { + $BlockName = 'OFR '; + } + if (!isset($ThisFileInfo['ofr'][$BlockName])) { + $ThisFileInfo['ofr'][$BlockName] = array(); + } + $thisfile_ofr_thisblock = &$ThisFileInfo['ofr'][$BlockName]; + + switch ($BlockName) { + case 'OFR ': + + // shortcut + $thisfile_ofr_thisblock['offset'] = $BlockOffset; + $thisfile_ofr_thisblock['size'] = $BlockSize; + + $ThisFileInfo['audio']['encoder'] = 'OptimFROG 4.50 alpha'; + switch ($BlockSize) { + case 12: + case 15: + // good + break; + + default: + $ThisFileInfo['warning'][] = '"'.$BlockName.'" contains more data than expected (expected 12 or 15 bytes, found '.$BlockSize.' bytes)'; + break; + } + $BlockData .= fread($fd, $BlockSize); + + $thisfile_ofr_thisblock['total_samples'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 6)); + $offset += 6; + $thisfile_ofr_thisblock['raw']['sample_type'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 1)); + $thisfile_ofr_thisblock['sample_type'] = $this->OptimFROGsampleTypeLookup($thisfile_ofr_thisblock['raw']['sample_type']); + $offset += 1; + $thisfile_ofr_thisblock['channel_config'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 1)); + $thisfile_ofr_thisblock['channels'] = $thisfile_ofr_thisblock['channel_config']; + $offset += 1; + $thisfile_ofr_thisblock['sample_rate'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 4)); + $offset += 4; + + if ($BlockSize > 12) { + + // OFR 4.504b or higher + $thisfile_ofr_thisblock['channels'] = $this->OptimFROGchannelConfigNumChannelsLookup($thisfile_ofr_thisblock['channel_config']); + $thisfile_ofr_thisblock['raw']['encoder_id'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 2)); + $thisfile_ofr_thisblock['encoder'] = $this->OptimFROGencoderNameLookup($thisfile_ofr_thisblock['raw']['encoder_id']); + $offset += 2; + $thisfile_ofr_thisblock['raw']['compression'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 1)); + $thisfile_ofr_thisblock['compression'] = $this->OptimFROGcompressionLookup($thisfile_ofr_thisblock['raw']['compression']); + $thisfile_ofr_thisblock['speedup'] = $this->OptimFROGspeedupLookup($thisfile_ofr_thisblock['raw']['compression']); + $offset += 1; + + $ThisFileInfo['audio']['encoder'] = 'OptimFROG '.$thisfile_ofr_thisblock['encoder']; + $ThisFileInfo['audio']['encoder_options'] = '--mode '.$thisfile_ofr_thisblock['compression']; + + if ((($thisfile_ofr_thisblock['raw']['encoder_id'] & 0xF0) >> 4) == 7) { // v4.507 + if (strtolower(getid3_lib::fileextension($ThisFileInfo['filename'])) == 'ofs') { + // OptimFROG DualStream format is lossy, but as of v4.507 there is no way to tell the difference + // between lossless and lossy other than the file extension. + $ThisFileInfo['audio']['dataformat'] = 'ofs'; + $ThisFileInfo['audio']['lossless'] = true; + } + } + + } + + $ThisFileInfo['audio']['channels'] = $thisfile_ofr_thisblock['channels']; + $ThisFileInfo['audio']['sample_rate'] = $thisfile_ofr_thisblock['sample_rate']; + $ThisFileInfo['audio']['bits_per_sample'] = $this->OptimFROGbitsPerSampleTypeLookup($thisfile_ofr_thisblock['raw']['sample_type']); + break; + + + case 'COMP': + // unlike other block types, there CAN be multiple COMP blocks + + $COMPdata['offset'] = $BlockOffset; + $COMPdata['size'] = $BlockSize; + + if ($ThisFileInfo['avdataoffset'] == 0) { + $ThisFileInfo['avdataoffset'] = $BlockOffset; + } + + // Only interested in first 14 bytes (only first 12 needed for v4.50 alpha), not actual audio data + $BlockData .= fread($fd, 14); + fseek($fd, $BlockSize - 14, SEEK_CUR); + + $COMPdata['crc_32'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 4)); + $offset += 4; + $COMPdata['sample_count'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 4)); + $offset += 4; + $COMPdata['raw']['sample_type'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 1)); + $COMPdata['sample_type'] = $this->OptimFROGsampleTypeLookup($COMPdata['raw']['sample_type']); + $offset += 1; + $COMPdata['raw']['channel_configuration'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 1)); + $COMPdata['channel_configuration'] = $this->OptimFROGchannelConfigurationLookup($COMPdata['raw']['channel_configuration']); + $offset += 1; + $COMPdata['raw']['algorithm_id'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 2)); + //$COMPdata['algorithm'] = OptimFROGalgorithmNameLookup($COMPdata['raw']['algorithm_id']); + $offset += 2; + + if ($ThisFileInfo['ofr']['OFR ']['size'] > 12) { + + // OFR 4.504b or higher + $COMPdata['raw']['encoder_id'] = getid3_lib::LittleEndian2Int(substr($BlockData, $offset, 2)); + $COMPdata['encoder'] = $this->OptimFROGencoderNameLookup($COMPdata['raw']['encoder_id']); + $offset += 2; + + } + + if ($COMPdata['crc_32'] == 0x454E4F4E) { + // ASCII value of 'NONE' - placeholder value in v4.50a + $COMPdata['crc_32'] = false; + } + + $thisfile_ofr_thisblock[] = $COMPdata; + break; + + case 'HEAD': + $thisfile_ofr_thisblock['offset'] = $BlockOffset; + $thisfile_ofr_thisblock['size'] = $BlockSize; + + $RIFFdata .= fread($fd, $BlockSize); + break; + + case 'TAIL': + $thisfile_ofr_thisblock['offset'] = $BlockOffset; + $thisfile_ofr_thisblock['size'] = $BlockSize; + + if ($BlockSize > 0) { + $RIFFdata .= fread($fd, $BlockSize); + } + break; + + case 'RECV': + // block contains no useful meta data - simply note and skip + + $thisfile_ofr_thisblock['offset'] = $BlockOffset; + $thisfile_ofr_thisblock['size'] = $BlockSize; + + fseek($fd, $BlockSize, SEEK_CUR); + break; + + + case 'APET': + // APEtag v2 + + $thisfile_ofr_thisblock['offset'] = $BlockOffset; + $thisfile_ofr_thisblock['size'] = $BlockSize; + $ThisFileInfo['warning'][] = 'APEtag processing inside OptimFROG not supported in this version ('.GETID3_VERSION.') of getID3()'; + + fseek($fd, $BlockSize, SEEK_CUR); + break; + + + case 'MD5 ': + // APEtag v2 + + $thisfile_ofr_thisblock['offset'] = $BlockOffset; + $thisfile_ofr_thisblock['size'] = $BlockSize; + + if ($BlockSize == 16) { + + $thisfile_ofr_thisblock['md5_binary'] = fread($fd, $BlockSize); + $thisfile_ofr_thisblock['md5_string'] = getid3_lib::PrintHexBytes($thisfile_ofr_thisblock['md5_binary'], true, false, false); + $ThisFileInfo['md5_data_source'] = $thisfile_ofr_thisblock['md5_string']; + + } else { + + $ThisFileInfo['warning'][] = 'Expecting block size of 16 in "MD5 " chunk, found '.$BlockSize.' instead'; + fseek($fd, $BlockSize, SEEK_CUR); + + } + break; + + + default: + $thisfile_ofr_thisblock['offset'] = $BlockOffset; + $thisfile_ofr_thisblock['size'] = $BlockSize; + + $ThisFileInfo['warning'][] = 'Unhandled OptimFROG block type "'.$BlockName.'" at offset '.$thisfile_ofr_thisblock['offset']; + fseek($fd, $BlockSize, SEEK_CUR); + break; + } + } + if (isset($ThisFileInfo['ofr']['TAIL']['offset'])) { + $ThisFileInfo['avdataend'] = $ThisFileInfo['ofr']['TAIL']['offset']; + } + + $ThisFileInfo['playtime_seconds'] = (float) $ThisFileInfo['ofr']['OFR ']['total_samples'] / ($ThisFileInfo['audio']['channels'] * $ThisFileInfo['audio']['sample_rate']); + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + + // move the data chunk after all other chunks (if any) + // so that the RIFF parser doesn't see EOF when trying + // to skip over the data chunk + $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8); + getid3_riff::ParseRIFFdata($RIFFdata, $ThisFileInfo); + + return true; + } + + + function OptimFROGsampleTypeLookup($SampleType) { + static $OptimFROGsampleTypeLookup = array( + 0 => 'unsigned int (8-bit)', + 1 => 'signed int (8-bit)', + 2 => 'unsigned int (16-bit)', + 3 => 'signed int (16-bit)', + 4 => 'unsigned int (24-bit)', + 5 => 'signed int (24-bit)', + 6 => 'unsigned int (32-bit)', + 7 => 'signed int (32-bit)', + 8 => 'float 0.24 (32-bit)', + 9 => 'float 16.8 (32-bit)', + 10 => 'float 24.0 (32-bit)' + ); + return (isset($OptimFROGsampleTypeLookup[$SampleType]) ? $OptimFROGsampleTypeLookup[$SampleType] : false); + } + + function OptimFROGbitsPerSampleTypeLookup($SampleType) { + static $OptimFROGbitsPerSampleTypeLookup = array( + 0 => 8, + 1 => 8, + 2 => 16, + 3 => 16, + 4 => 24, + 5 => 24, + 6 => 32, + 7 => 32, + 8 => 32, + 9 => 32, + 10 => 32 + ); + return (isset($OptimFROGbitsPerSampleTypeLookup[$SampleType]) ? $OptimFROGbitsPerSampleTypeLookup[$SampleType] : false); + } + + function OptimFROGchannelConfigurationLookup($ChannelConfiguration) { + static $OptimFROGchannelConfigurationLookup = array( + 0 => 'mono', + 1 => 'stereo' + ); + return (isset($OptimFROGchannelConfigurationLookup[$ChannelConfiguration]) ? $OptimFROGchannelConfigurationLookup[$ChannelConfiguration] : false); + } + + function OptimFROGchannelConfigNumChannelsLookup($ChannelConfiguration) { + static $OptimFROGchannelConfigNumChannelsLookup = array( + 0 => 1, + 1 => 2 + ); + return (isset($OptimFROGchannelConfigNumChannelsLookup[$ChannelConfiguration]) ? $OptimFROGchannelConfigNumChannelsLookup[$ChannelConfiguration] : false); + } + + + + // function OptimFROGalgorithmNameLookup($AlgorithID) { + // static $OptimFROGalgorithmNameLookup = array(); + // return (isset($OptimFROGalgorithmNameLookup[$AlgorithID]) ? $OptimFROGalgorithmNameLookup[$AlgorithID] : false); + // } + + + function OptimFROGencoderNameLookup($EncoderID) { + // version = (encoderID >> 4) + 4500 + // system = encoderID & 0xF + + $EncoderVersion = number_format(((($EncoderID & 0xF0) >> 4) + 4500) / 1000, 3); + $EncoderSystemID = ($EncoderID & 0x0F); + + static $OptimFROGencoderSystemLookup = array( + 0x00 => 'Windows console', + 0x01 => 'Linux console', + 0x0F => 'unknown' + ); + return $EncoderVersion.' ('.(isset($OptimFROGencoderSystemLookup[$EncoderSystemID]) ? $OptimFROGencoderSystemLookup[$EncoderSystemID] : 'undefined encoder type (0x'.dechex($EncoderSystemID).')').')'; + } + + function OptimFROGcompressionLookup($CompressionID) { + // mode = compression >> 3 + // speedup = compression & 0x07 + + $CompressionModeID = ($CompressionID & 0xF8) >> 3; + //$CompressionSpeedupID = ($CompressionID & 0x07); + + static $OptimFROGencoderModeLookup = array( + 0x00 => 'fast', + 0x01 => 'normal', + 0x02 => 'high', + 0x03 => 'extra', // extranew (some versions) + 0x04 => 'best', // bestnew (some versions) + 0x05 => 'ultra', + 0x06 => 'insane', + 0x07 => 'highnew', + 0x08 => 'extranew', + 0x09 => 'bestnew' + ); + return (isset($OptimFROGencoderModeLookup[$CompressionModeID]) ? $OptimFROGencoderModeLookup[$CompressionModeID] : 'undefined mode (0x'.str_pad(dechex($CompressionModeID), 2, '0', STR_PAD_LEFT).')'); + } + + function OptimFROGspeedupLookup($CompressionID) { + // mode = compression >> 3 + // speedup = compression & 0x07 + + //$CompressionModeID = ($CompressionID & 0xF8) >> 3; + $CompressionSpeedupID = ($CompressionID & 0x07); + + static $OptimFROGencoderSpeedupLookup = array( + 0x00 => '1x', + 0x01 => '2x', + 0x02 => '4x' + ); + + return (isset($OptimFROGencoderSpeedupLookup[$CompressionSpeedupID]) ? $OptimFROGencoderSpeedupLookup[$CompressionSpeedupID] : 'undefined mode (0x'.dechex($CompressionSpeedupID)); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.rkau.php b/campcaster/src/modules/getid3/var/module.audio.rkau.php new file mode 100644 index 000000000..0e344d43e --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.rkau.php @@ -0,0 +1,92 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.shorten.php // +// module for analyzing Shorten Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_rkau +{ + + function getid3_rkau(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $RKAUHeader = fread($fd, 20); + if (substr($RKAUHeader, 0, 3) != 'RKA') { + $ThisFileInfo['error'][] = 'Expecting "RKA" at offset '.$ThisFileInfo['avdataoffset'].', found "'.substr($RKAUHeader, 0, 3).'"'; + return false; + } + + $ThisFileInfo['fileformat'] = 'rkau'; + $ThisFileInfo['audio']['dataformat'] = 'rkau'; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + + $ThisFileInfo['rkau']['raw']['version'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 3, 1)); + $ThisFileInfo['rkau']['version'] = '1.'.str_pad($ThisFileInfo['rkau']['raw']['version'] & 0x0F, 2, '0', STR_PAD_LEFT); + if (($ThisFileInfo['rkau']['version'] > 1.07) || ($ThisFileInfo['rkau']['version'] < 1.06)) { + $ThisFileInfo['error'][] = 'This version of getID3() can only parse RKAU files v1.06 and 1.07 (this file is v'.$ThisFileInfo['rkau']['version'].')'; + unset($ThisFileInfo['rkau']); + return false; + } + + $ThisFileInfo['rkau']['source_bytes'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 4, 4)); + $ThisFileInfo['rkau']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 8, 4)); + $ThisFileInfo['rkau']['channels'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 12, 1)); + $ThisFileInfo['rkau']['bits_per_sample'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 13, 1)); + + $ThisFileInfo['rkau']['raw']['quality'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 14, 1)); + $this->RKAUqualityLookup($ThisFileInfo['rkau']); + + $ThisFileInfo['rkau']['raw']['flags'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 15, 1)); + $ThisFileInfo['rkau']['flags']['joint_stereo'] = (bool) (!($ThisFileInfo['rkau']['raw']['flags'] & 0x01)); + $ThisFileInfo['rkau']['flags']['streaming'] = (bool) ($ThisFileInfo['rkau']['raw']['flags'] & 0x02); + $ThisFileInfo['rkau']['flags']['vrq_lossy_mode'] = (bool) ($ThisFileInfo['rkau']['raw']['flags'] & 0x04); + + if ($ThisFileInfo['rkau']['flags']['streaming']) { + $ThisFileInfo['avdataoffset'] += 20; + $ThisFileInfo['rkau']['compressed_bytes'] = getid3_lib::LittleEndian2Int(substr($RKAUHeader, 16, 4)); + } else { + $ThisFileInfo['avdataoffset'] += 16; + $ThisFileInfo['rkau']['compressed_bytes'] = $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'] - 1; + } + // Note: compressed_bytes does not always equal what appears to be the actual number of compressed bytes, + // sometimes it's more, sometimes less. No idea why(?) + + $ThisFileInfo['audio']['lossless'] = $ThisFileInfo['rkau']['lossless']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['rkau']['channels']; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['rkau']['bits_per_sample']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['rkau']['sample_rate']; + + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['rkau']['source_bytes'] / ($ThisFileInfo['rkau']['sample_rate'] * $ThisFileInfo['rkau']['channels'] * ($ThisFileInfo['rkau']['bits_per_sample'] / 8)); + $ThisFileInfo['audio']['bitrate'] = ($ThisFileInfo['rkau']['compressed_bytes'] * 8) / $ThisFileInfo['playtime_seconds']; + + return true; + + } + + + function RKAUqualityLookup(&$RKAUdata) { + $level = ($RKAUdata['raw']['quality'] & 0xF0) >> 4; + $quality = $RKAUdata['raw']['quality'] & 0x0F; + + $RKAUdata['lossless'] = (($quality == 0) ? true : false); + $RKAUdata['compression_level'] = $level + 1; + if (!$RKAUdata['lossless']) { + $RKAUdata['quality_setting'] = $quality; + } + + return true; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.shorten.php b/campcaster/src/modules/getid3/var/module.audio.shorten.php new file mode 100644 index 000000000..3a09bdd82 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.shorten.php @@ -0,0 +1,179 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.shorten.php // +// module for analyzing Shorten Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_shorten +{ + + function getid3_shorten(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + $ShortenHeader = fread($fd, 8); + if (substr($ShortenHeader, 0, 4) != 'ajkg') { + $ThisFileInfo['error'][] = 'Expecting "ajkg" at offset '.$ThisFileInfo['avdataoffset'].', found "'.substr($ShortenHeader, 0, 4).'"'; + return false; + } + $ThisFileInfo['fileformat'] = 'shn'; + $ThisFileInfo['audio']['dataformat'] = 'shn'; + $ThisFileInfo['audio']['lossless'] = true; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + + $ThisFileInfo['shn']['version'] = getid3_lib::LittleEndian2Int(substr($ShortenHeader, 4, 1)); + + fseek($fd, $ThisFileInfo['avdataend'] - 12, SEEK_SET); + $SeekTableSignatureTest = fread($fd, 12); + $ThisFileInfo['shn']['seektable']['present'] = (bool) (substr($SeekTableSignatureTest, 4, 8) == 'SHNAMPSK'); + if ($ThisFileInfo['shn']['seektable']['present']) { + $ThisFileInfo['shn']['seektable']['length'] = getid3_lib::LittleEndian2Int(substr($SeekTableSignatureTest, 0, 4)); + $ThisFileInfo['shn']['seektable']['offset'] = $ThisFileInfo['avdataend'] - $ThisFileInfo['shn']['seektable']['length']; + fseek($fd, $ThisFileInfo['shn']['seektable']['offset'], SEEK_SET); + $SeekTableMagic = fread($fd, 4); + if ($SeekTableMagic != 'SEEK') { + + $ThisFileInfo['error'][] = 'Expecting "SEEK" at offset '.$ThisFileInfo['shn']['seektable']['offset'].', found "'.$SeekTableMagic.'"'; + return false; + + } else { + + // typedef struct tag_TSeekEntry + // { + // unsigned long SampleNumber; + // unsigned long SHNFileByteOffset; + // unsigned long SHNLastBufferReadPosition; + // unsigned short SHNByteGet; + // unsigned short SHNBufferOffset; + // unsigned short SHNFileBitOffset; + // unsigned long SHNGBuffer; + // unsigned short SHNBitShift; + // long CBuf0[3]; + // long CBuf1[3]; + // long Offset0[4]; + // long Offset1[4]; + // }TSeekEntry; + + $SeekTableData = fread($fd, $ThisFileInfo['shn']['seektable']['length'] - 16); + $ThisFileInfo['shn']['seektable']['entry_count'] = floor(strlen($SeekTableData) / 80); + //$ThisFileInfo['shn']['seektable']['entries'] = array(); + //$SeekTableOffset = 0; + //for ($i = 0; $i < $ThisFileInfo['shn']['seektable']['entry_count']; $i++) { + // $SeekTableEntry['sample_number'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // $SeekTableEntry['shn_file_byte_offset'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // $SeekTableEntry['shn_last_buffer_read_position'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // $SeekTableEntry['shn_byte_get'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 2)); + // $SeekTableOffset += 2; + // $SeekTableEntry['shn_buffer_offset'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 2)); + // $SeekTableOffset += 2; + // $SeekTableEntry['shn_file_bit_offset'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 2)); + // $SeekTableOffset += 2; + // $SeekTableEntry['shn_gbuffer'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // $SeekTableEntry['shn_bit_shift'] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 2)); + // $SeekTableOffset += 2; + // for ($j = 0; $j < 3; $j++) { + // $SeekTableEntry['cbuf0'][$j] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // } + // for ($j = 0; $j < 3; $j++) { + // $SeekTableEntry['cbuf1'][$j] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // } + // for ($j = 0; $j < 4; $j++) { + // $SeekTableEntry['offset0'][$j] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // } + // for ($j = 0; $j < 4; $j++) { + // $SeekTableEntry['offset1'][$j] = getid3_lib::LittleEndian2Int(substr($SeekTableData, $SeekTableOffset, 4)); + // $SeekTableOffset += 4; + // } + // + // $ThisFileInfo['shn']['seektable']['entries'][] = $SeekTableEntry; + //} + + } + + } + + if ((bool) ini_get('safe_mode')) { + $ThisFileInfo['error'][] = 'PHP running in Safe Mode - backtick operator not available, cannot run shntool to analyze Shorten files'; + return false; + } + + if (GETID3_OS_ISWINDOWS) { + + $RequiredFiles = array('shorten.exe', 'cygwin1.dll', 'head.exe'); + foreach ($RequiredFiles as $required_file) { + if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) { + $ThisFileInfo['error'][] = GETID3_HELPERAPPSDIR.$required_file.' does not exist'; + return false; + } + } + $commandline = GETID3_HELPERAPPSDIR.'shorten.exe -x "'.$ThisFileInfo['filenamepath'].'" - | '.GETID3_HELPERAPPSDIR.'head.exe -c 44'; + $commandline = str_replace('/', '\\', $commandline); + + } else { + + static $shorten_present; + if (!isset($shorten_present)) { + $shorten_present = file_exists('/usr/local/bin/shorten') || `which shorten`; + } + if (!$shorten_present) { + $ThisFileInfo['error'][] = 'shorten binary was not found in path or /usr/local/bin'; + return false; + } + $commandline = (file_exists('/usr/local/bin/shorten') ? '/usr/local/bin/' : '' ) . 'shorten -x '.escapeshellarg($ThisFileInfo['filenamepath']).' - | head -c 44'; + + } + + $output = `$commandline`; + + if (!empty($output) && (substr($output, 12, 4) == 'fmt ')) { + + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + + $DecodedWAVFORMATEX = getid3_riff::RIFFparseWAVEFORMATex(substr($output, 20, 16)); + $ThisFileInfo['audio']['channels'] = $DecodedWAVFORMATEX['channels']; + $ThisFileInfo['audio']['bits_per_sample'] = $DecodedWAVFORMATEX['bits_per_sample']; + $ThisFileInfo['audio']['sample_rate'] = $DecodedWAVFORMATEX['sample_rate']; + + if (substr($output, 36, 4) == 'data') { + + $ThisFileInfo['playtime_seconds'] = getid3_lib::LittleEndian2Int(substr($output, 40, 4)) / $DecodedWAVFORMATEX['raw']['nAvgBytesPerSec']; + + } else { + + $ThisFileInfo['error'][] = 'shorten failed to decode DATA chunk to expected location, cannot determine playtime'; + return false; + + } + + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) / $ThisFileInfo['playtime_seconds']) * 8; + + } else { + + $ThisFileInfo['error'][] = 'shorten failed to decode file to WAV for parsing'; + return false; + + } + + return true; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.tta.php b/campcaster/src/modules/getid3/var/module.audio.tta.php new file mode 100644 index 000000000..903de6bf4 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.tta.php @@ -0,0 +1,107 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.tta.php // +// module for analyzing TTA Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_tta +{ + + function getid3_tta(&$fd, &$ThisFileInfo) { + + $ThisFileInfo['fileformat'] = 'tta'; + $ThisFileInfo['audio']['dataformat'] = 'tta'; + $ThisFileInfo['audio']['lossless'] = true; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $ttaheader = fread($fd, 26); + + $ThisFileInfo['tta']['magic'] = substr($ttaheader, 0, 3); + if ($ThisFileInfo['tta']['magic'] != 'TTA') { + $ThisFileInfo['error'][] = 'Expecting "TTA" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$ThisFileInfo['tta']['magic'].'"'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['audio']); + unset($ThisFileInfo['tta']); + return false; + } + + switch ($ttaheader{3}) { + case "\x01": // TTA v1.x + case "\x02": // TTA v1.x + case "\x03": // TTA v1.x + // "It was the demo-version of the TTA encoder. There is no released format with such header. TTA encoder v1 is not supported about a year." + $ThisFileInfo['tta']['major_version'] = 1; + $ThisFileInfo['avdataoffset'] += 16; + + $ThisFileInfo['tta']['compression_level'] = ord($ttaheader{3}); + $ThisFileInfo['tta']['channels'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 4, 2)); + $ThisFileInfo['tta']['bits_per_sample'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 6, 2)); + $ThisFileInfo['tta']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 8, 4)); + $ThisFileInfo['tta']['samples_per_channel'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 12, 4)); + + $ThisFileInfo['audio']['encoder_options'] = '-e'.$ThisFileInfo['tta']['compression_level']; + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['tta']['samples_per_channel'] / $ThisFileInfo['tta']['sample_rate']; + break; + + case '2': // TTA v2.x + // "I have hurried to release the TTA 2.0 encoder. Format documentation is removed from our site. This format still in development. Please wait the TTA2 format, encoder v4." + $ThisFileInfo['tta']['major_version'] = 2; + $ThisFileInfo['avdataoffset'] += 20; + + $ThisFileInfo['tta']['compression_level'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 4, 2)); + $ThisFileInfo['tta']['audio_format'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 6, 2)); + $ThisFileInfo['tta']['channels'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 8, 2)); + $ThisFileInfo['tta']['bits_per_sample'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 10, 2)); + $ThisFileInfo['tta']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 12, 4)); + $ThisFileInfo['tta']['data_length'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 16, 4)); + + $ThisFileInfo['audio']['encoder_options'] = '-e'.$ThisFileInfo['tta']['compression_level']; + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['tta']['data_length'] / $ThisFileInfo['tta']['sample_rate']; + break; + + case '1': // TTA v3.x + // "This is a first stable release of the TTA format. It will be supported by the encoders v3 or higher." + $ThisFileInfo['tta']['major_version'] = 3; + $ThisFileInfo['avdataoffset'] += 26; + + $ThisFileInfo['tta']['audio_format'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 4, 2)); // getid3_riff::RIFFwFormatTagLookup() + $ThisFileInfo['tta']['channels'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 6, 2)); + $ThisFileInfo['tta']['bits_per_sample'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 8, 2)); + $ThisFileInfo['tta']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 10, 4)); + $ThisFileInfo['tta']['data_length'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 14, 4)); + $ThisFileInfo['tta']['crc32_footer'] = substr($ttaheader, 18, 4); + $ThisFileInfo['tta']['seek_point'] = getid3_lib::LittleEndian2Int(substr($ttaheader, 22, 4)); + + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['tta']['data_length'] / $ThisFileInfo['tta']['sample_rate']; + break; + + default: + $ThisFileInfo['error'][] = 'This version of getID3() only knows how to handle TTA v1 and v2 - it may not work correctly with this file which appears to be TTA v'.$ttaheader{3}; + return false; + break; + } + + $ThisFileInfo['audio']['encoder'] = 'TTA v'.$ThisFileInfo['tta']['major_version']; + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['tta']['bits_per_sample']; + $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['tta']['sample_rate']; + $ThisFileInfo['audio']['channels'] = $ThisFileInfo['tta']['channels']; + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + + return true; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.voc.php b/campcaster/src/modules/getid3/var/module.audio.voc.php new file mode 100644 index 000000000..e93b44fa6 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.voc.php @@ -0,0 +1,205 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.voc.php // +// module for analyzing Creative VOC Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_voc +{ + + function getid3_voc(&$fd, &$ThisFileInfo) { + + $OriginalAVdataOffset = $ThisFileInfo['avdataoffset']; + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $VOCheader = fread($fd, 26); + + if (substr($VOCheader, 0, 19) != 'Creative Voice File') { + $ThisFileInfo['error'][] = 'Expecting "Creative Voice File" at offset '.$ThisFileInfo['avdataoffset'].', found "'.substr($VOCheader, 0, 19).'"'; + return false; + } + + // shortcuts + $thisfile_audio = &$ThisFileInfo['audio']; + $ThisFileInfo['voc'] = array(); + $thisfile_voc = &$ThisFileInfo['voc']; + + $ThisFileInfo['fileformat'] = 'voc'; + $thisfile_audio['dataformat'] = 'voc'; + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio['lossless'] = true; + $thisfile_audio['channels'] = 1; // might be overriden below + $thisfile_audio['bits_per_sample'] = 8; // might be overriden below + + // byte # Description + // ------ ------------------------------------------ + // 00-12 'Creative Voice File' + // 13 1A (eof to abort printing of file) + // 14-15 Offset of first datablock in .voc file (std 1A 00 in Intel Notation) + // 16-17 Version number (minor,major) (VOC-HDR puts 0A 01) + // 18-19 2's Comp of Ver. # + 1234h (VOC-HDR puts 29 11) + + $thisfile_voc['header']['datablock_offset'] = getid3_lib::LittleEndian2Int(substr($VOCheader, 20, 2)); + $thisfile_voc['header']['minor_version'] = getid3_lib::LittleEndian2Int(substr($VOCheader, 22, 1)); + $thisfile_voc['header']['major_version'] = getid3_lib::LittleEndian2Int(substr($VOCheader, 23, 1)); + + do { + + $BlockOffset = ftell($fd); + $BlockData = fread($fd, 4); + $BlockType = ord($BlockData{0}); + $BlockSize = getid3_lib::LittleEndian2Int(substr($BlockData, 1, 3)); + $ThisBlock = array(); + + @$thisfile_voc['blocktypes'][$BlockType]++; + switch ($BlockType) { + case 0: // Terminator + // do nothing, we'll break out of the loop down below + break; + + case 1: // Sound data + $BlockData .= fread($fd, 2); + if ($ThisFileInfo['avdataoffset'] <= $OriginalAVdataOffset) { + $ThisFileInfo['avdataoffset'] = ftell($fd); + } + fseek($fd, $BlockSize - 2, SEEK_CUR); + + $ThisBlock['sample_rate_id'] = getid3_lib::LittleEndian2Int(substr($BlockData, 4, 1)); + $ThisBlock['compression_type'] = getid3_lib::LittleEndian2Int(substr($BlockData, 5, 1)); + + $ThisBlock['compression_name'] = $this->VOCcompressionTypeLookup($ThisBlock['compression_type']); + if ($ThisBlock['compression_type'] <= 3) { + $thisfile_voc['compressed_bits_per_sample'] = getid3_lib::CastAsInt(str_replace('-bit', '', $ThisBlock['compression_name'])); + } + + // Less accurate sample_rate calculation than the Extended block (#8) data (but better than nothing if Extended Block is not available) + if (empty($thisfile_audio['sample_rate'])) { + // SR byte = 256 - (1000000 / sample_rate) + $thisfile_audio['sample_rate'] = getid3_lib::trunc((1000000 / (256 - $ThisBlock['sample_rate_id'])) / $thisfile_audio['channels']); + } + break; + + case 2: // Sound continue + case 3: // Silence + case 4: // Marker + case 6: // Repeat + case 7: // End repeat + // nothing useful, just skip + fseek($fd, $BlockSize, SEEK_CUR); + break; + + case 8: // Extended + $BlockData .= fread($fd, 4); + + //00-01 Time Constant: + // Mono: 65536 - (256000000 / sample_rate) + // Stereo: 65536 - (256000000 / (sample_rate * 2)) + $ThisBlock['time_constant'] = getid3_lib::LittleEndian2Int(substr($BlockData, 4, 2)); + $ThisBlock['pack_method'] = getid3_lib::LittleEndian2Int(substr($BlockData, 6, 1)); + $ThisBlock['stereo'] = (bool) getid3_lib::LittleEndian2Int(substr($BlockData, 7, 1)); + + $thisfile_audio['channels'] = ($ThisBlock['stereo'] ? 2 : 1); + $thisfile_audio['sample_rate'] = getid3_lib::trunc((256000000 / (65536 - $ThisBlock['time_constant'])) / $thisfile_audio['channels']); + break; + + case 9: // data block that supersedes blocks 1 and 8. Used for stereo, 16 bit + $BlockData .= fread($fd, 12); + if ($ThisFileInfo['avdataoffset'] <= $OriginalAVdataOffset) { + $ThisFileInfo['avdataoffset'] = ftell($fd); + } + fseek($fd, $BlockSize - 12, SEEK_CUR); + + $ThisBlock['sample_rate'] = getid3_lib::LittleEndian2Int(substr($BlockData, 4, 4)); + $ThisBlock['bits_per_sample'] = getid3_lib::LittleEndian2Int(substr($BlockData, 8, 1)); + $ThisBlock['channels'] = getid3_lib::LittleEndian2Int(substr($BlockData, 9, 1)); + $ThisBlock['wFormat'] = getid3_lib::LittleEndian2Int(substr($BlockData, 10, 2)); + + $ThisBlock['compression_name'] = $this->VOCwFormatLookup($ThisBlock['wFormat']); + if ($this->VOCwFormatActualBitsPerSampleLookup($ThisBlock['wFormat'])) { + $thisfile_voc['compressed_bits_per_sample'] = $this->VOCwFormatActualBitsPerSampleLookup($ThisBlock['wFormat']); + } + + $thisfile_audio['sample_rate'] = $ThisBlock['sample_rate']; + $thisfile_audio['bits_per_sample'] = $ThisBlock['bits_per_sample']; + $thisfile_audio['channels'] = $ThisBlock['channels']; + break; + + default: + $ThisFileInfo['warning'][] = 'Unhandled block type "'.$BlockType.'" at offset '.$BlockOffset; + fseek($fd, $BlockSize, SEEK_CUR); + break; + } + + if (!empty($ThisBlock)) { + $ThisBlock['block_offset'] = $BlockOffset; + $ThisBlock['block_size'] = $BlockSize; + $ThisBlock['block_type_id'] = $BlockType; + $thisfile_voc['blocks'][] = $ThisBlock; + } + + } while (!feof($fd) && ($BlockType != 0)); + + // Terminator block doesn't have size field, so seek back 3 spaces + fseek($fd, -3, SEEK_CUR); + + ksort($thisfile_voc['blocktypes']); + + if (!empty($thisfile_voc['compressed_bits_per_sample'])) { + $ThisFileInfo['playtime_seconds'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / ($thisfile_voc['compressed_bits_per_sample'] * $thisfile_audio['channels'] * $thisfile_audio['sample_rate']); + $thisfile_audio['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + } + + return true; + } + + function VOCcompressionTypeLookup($index) { + static $VOCcompressionTypeLookup = array( + 0 => '8-bit', + 1 => '4-bit', + 2 => '2.6-bit', + 3 => '2-bit' + ); + return (isset($VOCcompressionTypeLookup[$index]) ? $VOCcompressionTypeLookup[$index] : 'Multi DAC ('.($index - 3).') channels'); + } + + function VOCwFormatLookup($index) { + static $VOCwFormatLookup = array( + 0x0000 => '8-bit unsigned PCM', + 0x0001 => 'Creative 8-bit to 4-bit ADPCM', + 0x0002 => 'Creative 8-bit to 3-bit ADPCM', + 0x0003 => 'Creative 8-bit to 2-bit ADPCM', + 0x0004 => '16-bit signed PCM', + 0x0006 => 'CCITT a-Law', + 0x0007 => 'CCITT u-Law', + 0x2000 => 'Creative 16-bit to 4-bit ADPCM' + ); + return (isset($VOCwFormatLookup[$index]) ? $VOCwFormatLookup[$index] : false); + } + + function VOCwFormatActualBitsPerSampleLookup($index) { + static $VOCwFormatLookup = array( + 0x0000 => 8, + 0x0001 => 4, + 0x0002 => 3, + 0x0003 => 2, + 0x0004 => 16, + 0x0006 => 8, + 0x0007 => 8, + 0x2000 => 4 + ); + return (isset($VOCwFormatLookup[$index]) ? $VOCwFormatLookup[$index] : false); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.vqf.php b/campcaster/src/modules/getid3/var/module.audio.vqf.php new file mode 100644 index 000000000..49d4e8510 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.vqf.php @@ -0,0 +1,159 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.vqf.php // +// module for analyzing VQF audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_vqf +{ + function getid3_vqf(&$fd, &$ThisFileInfo) { + // based loosely on code from TTwinVQ by Jurgen Faul + // http://jfaul.de/atl or http://j-faul.virtualave.net/atl/atl.html + + $ThisFileInfo['fileformat'] = 'vqf'; + $ThisFileInfo['audio']['dataformat'] = 'vqf'; + $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; + $ThisFileInfo['audio']['lossless'] = false; + + // shortcut + $ThisFileInfo['vqf']['raw'] = array(); + $thisfile_vqf = &$ThisFileInfo['vqf']; + $thisfile_vqf_raw = &$thisfile_vqf['raw']; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $VQFheaderData = fread($fd, 16); + + $offset = 0; + $thisfile_vqf_raw['header_tag'] = substr($VQFheaderData, $offset, 4); + if ($thisfile_vqf_raw['header_tag'] != 'TWIN') { + $ThisFileInfo['error'][] = 'Expecting "TWIN" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$thisfile_vqf_raw['header_tag'].'"'; + unset($ThisFileInfo['vqf']); + unset($ThisFileInfo['fileformat']); + return false; + } + $offset += 4; + $thisfile_vqf_raw['version'] = substr($VQFheaderData, $offset, 8); + $offset += 8; + $thisfile_vqf_raw['size'] = getid3_lib::BigEndian2Int(substr($VQFheaderData, $offset, 4)); + $offset += 4; + + while (ftell($fd) < $ThisFileInfo['avdataend']) { + + $ChunkBaseOffset = ftell($fd); + $chunkoffset = 0; + $ChunkData = fread($fd, 8); + $ChunkName = substr($ChunkData, $chunkoffset, 4); + if ($ChunkName == 'DATA') { + $ThisFileInfo['avdataoffset'] = $ChunkBaseOffset; + break; + } + $chunkoffset += 4; + $ChunkSize = getid3_lib::BigEndian2Int(substr($ChunkData, $chunkoffset, 4)); + $chunkoffset += 4; + if ($ChunkSize > ($ThisFileInfo['avdataend'] - ftell($fd))) { + $ThisFileInfo['error'][] = 'Invalid chunk size ('.$ChunkSize.') for chunk "'.$ChunkName.'" at offset '.$ChunkBaseOffset; + break; + } + if ($ChunkSize > 0) { + $ChunkData .= fread($fd, $ChunkSize); + } + + switch ($ChunkName) { + case 'COMM': + // shortcut + $thisfile_vqf['COMM'] = array(); + $thisfile_vqf_COMM = &$thisfile_vqf['COMM']; + + $thisfile_vqf_COMM['channel_mode'] = getid3_lib::BigEndian2Int(substr($ChunkData, $chunkoffset, 4)); + $chunkoffset += 4; + $thisfile_vqf_COMM['bitrate'] = getid3_lib::BigEndian2Int(substr($ChunkData, $chunkoffset, 4)); + $chunkoffset += 4; + $thisfile_vqf_COMM['sample_rate'] = getid3_lib::BigEndian2Int(substr($ChunkData, $chunkoffset, 4)); + $chunkoffset += 4; + $thisfile_vqf_COMM['security_level'] = getid3_lib::BigEndian2Int(substr($ChunkData, $chunkoffset, 4)); + $chunkoffset += 4; + + $ThisFileInfo['audio']['channels'] = $thisfile_vqf_COMM['channel_mode'] + 1; + $ThisFileInfo['audio']['sample_rate'] = $this->VQFchannelFrequencyLookup($thisfile_vqf_COMM['sample_rate']); + $ThisFileInfo['audio']['bitrate'] = $thisfile_vqf_COMM['bitrate'] * 1000; + $ThisFileInfo['audio']['encoder_options'] = 'CBR' . ceil($ThisFileInfo['audio']['bitrate']/1000); + + if ($ThisFileInfo['audio']['bitrate'] == 0) { + $ThisFileInfo['error'][] = 'Corrupt VQF file: bitrate_audio == zero'; + return false; + } + break; + + case 'NAME': + case 'AUTH': + case '(c) ': + case 'FILE': + case 'COMT': + case 'ALBM': + $thisfile_vqf['comments'][$this->VQFcommentNiceNameLookup($ChunkName)][] = trim(substr($ChunkData, 8)); + break; + + case 'DSIZ': + $thisfile_vqf['DSIZ'] = getid3_lib::BigEndian2Int(substr($ChunkData, 8, 4)); + break; + + default: + $ThisFileInfo['warning'][] = 'Unhandled chunk type "'.$ChunkName.'" at offset '.$ChunkBaseOffset; + break; + } + } + + $ThisFileInfo['playtime_seconds'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['audio']['bitrate']; + + if (isset($thisfile_vqf['DSIZ']) && (($thisfile_vqf['DSIZ'] != ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'] - strlen('DATA'))))) { + switch ($thisfile_vqf['DSIZ']) { + case 0: + case 1: + $ThisFileInfo['warning'][] = 'Invalid DSIZ value "'.$thisfile_vqf['DSIZ'].'". This is known to happen with VQF files encoded by Ahead Nero, and seems to be its way of saying this is TwinVQF v'.($thisfile_vqf['DSIZ'] + 1).'.0'; + $ThisFileInfo['audio']['encoder'] = 'Ahead Nero'; + break; + + default: + $ThisFileInfo['warning'][] = 'Probable corrupted file - should be '.$thisfile_vqf['DSIZ'].' bytes, actually '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'] - strlen('DATA')); + break; + } + } + + return true; + } + + function VQFchannelFrequencyLookup($frequencyid) { + static $VQFchannelFrequencyLookup = array( + 11 => 11025, + 22 => 22050, + 44 => 44100 + ); + return (isset($VQFchannelFrequencyLookup[$frequencyid]) ? $VQFchannelFrequencyLookup[$frequencyid] : $frequencyid * 1000); + } + + function VQFcommentNiceNameLookup($shortname) { + static $VQFcommentNiceNameLookup = array( + 'NAME' => 'title', + 'AUTH' => 'artist', + '(c) ' => 'copyright', + 'FILE' => 'filename', + 'COMT' => 'comment', + 'ALBM' => 'album' + ); + return (isset($VQFcommentNiceNameLookup[$shortname]) ? $VQFcommentNiceNameLookup[$shortname] : $shortname); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.audio.wavpack.php b/campcaster/src/modules/getid3/var/module.audio.wavpack.php new file mode 100644 index 000000000..0435f08d8 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.audio.wavpack.php @@ -0,0 +1,372 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.wavpack.php // +// module for analyzing WavPack v4.0+ Audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_wavpack +{ + + function getid3_wavpack(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + while (true) { + + $wavpackheader = fread($fd, 32); + + if (ftell($fd) >= $ThisFileInfo['avdataend']) { + break; + } elseif (feof($fd)) { + break; + } elseif ( + (@$ThisFileInfo['wavpack']['blockheader']['total_samples'] > 0) && + (@$ThisFileInfo['wavpack']['blockheader']['block_samples'] > 0) && + (!isset($ThisFileInfo['wavpack']['riff_trailer_size']) || ($ThisFileInfo['wavpack']['riff_trailer_size'] <= 0)) && + ((@$ThisFileInfo['wavpack']['config_flags']['md5_checksum'] === false) || !empty($ThisFileInfo['md5_data_source']))) { + break; + } + + $blockheader_offset = ftell($fd) - 32; + $blockheader_magic = substr($wavpackheader, 0, 4); + $blockheader_size = getid3_lib::LittleEndian2Int(substr($wavpackheader, 4, 4)); + + if ($blockheader_magic != 'wvpk') { + $ThisFileInfo['error'][] = 'Expecting "wvpk" at offset '.$blockheader_offset.', found "'.$blockheader_magic.'"'; + if ((@$ThisFileInfo['audio']['dataformat'] != 'wavpack') && (@$ThisFileInfo['audio']['dataformat'] != 'wvc')) { + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['audio']); + unset($ThisFileInfo['wavpack']); + } + return false; + } + + + if ((@$ThisFileInfo['wavpack']['blockheader']['block_samples'] <= 0) || + (@$ThisFileInfo['wavpack']['blockheader']['total_samples'] <= 0)) { + // Also, it is possible that the first block might not have + // any samples (block_samples == 0) and in this case you should skip blocks + // until you find one with samples because the other information (like + // total_samples) are not guaranteed to be correct until (block_samples > 0) + + // Finally, I have defined a format for files in which the length is not known + // (for example when raw files are created using pipes). In these cases + // total_samples will be -1 and you must seek to the final block to determine + // the total number of samples. + + + $ThisFileInfo['audio']['dataformat'] = 'wavpack'; + $ThisFileInfo['fileformat'] = 'wavpack'; + $ThisFileInfo['audio']['lossless'] = true; + $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; + + $ThisFileInfo['wavpack']['blockheader']['offset'] = $blockheader_offset; + $ThisFileInfo['wavpack']['blockheader']['magic'] = $blockheader_magic; + $ThisFileInfo['wavpack']['blockheader']['size'] = $blockheader_size; + + if ($ThisFileInfo['wavpack']['blockheader']['size'] >= 0x100000) { + $ThisFileInfo['error'][] = 'Expecting WavPack block size less than "0x100000", found "'.$ThisFileInfo['wavpack']['blockheader']['size'].'" at offset '.$ThisFileInfo['wavpack']['blockheader']['offset']; + if ((@$ThisFileInfo['audio']['dataformat'] != 'wavpack') && (@$ThisFileInfo['audio']['dataformat'] != 'wvc')) { + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['audio']); + unset($ThisFileInfo['wavpack']); + } + return false; + } + + $ThisFileInfo['wavpack']['blockheader']['minor_version'] = ord($wavpackheader{8}); + $ThisFileInfo['wavpack']['blockheader']['major_version'] = ord($wavpackheader{9}); + + if (($ThisFileInfo['wavpack']['blockheader']['major_version'] != 4) || + (($ThisFileInfo['wavpack']['blockheader']['minor_version'] < 4) && + ($ThisFileInfo['wavpack']['blockheader']['minor_version'] > 16))) { + $ThisFileInfo['error'][] = 'Expecting WavPack version between "4.2" and "4.16", found version "'.$ThisFileInfo['wavpack']['blockheader']['major_version'].'.'.$ThisFileInfo['wavpack']['blockheader']['minor_version'].'" at offset '.$ThisFileInfo['wavpack']['blockheader']['offset']; + if ((@$ThisFileInfo['audio']['dataformat'] != 'wavpack') && (@$ThisFileInfo['audio']['dataformat'] != 'wvc')) { + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['audio']); + unset($ThisFileInfo['wavpack']); + } + return false; + } + + $ThisFileInfo['wavpack']['blockheader']['track_number'] = ord($wavpackheader{10}); // unused + $ThisFileInfo['wavpack']['blockheader']['index_number'] = ord($wavpackheader{11}); // unused + $ThisFileInfo['wavpack']['blockheader']['total_samples'] = getid3_lib::LittleEndian2Int(substr($wavpackheader, 12, 4)); + $ThisFileInfo['wavpack']['blockheader']['block_index'] = getid3_lib::LittleEndian2Int(substr($wavpackheader, 16, 4)); + $ThisFileInfo['wavpack']['blockheader']['block_samples'] = getid3_lib::LittleEndian2Int(substr($wavpackheader, 20, 4)); + $ThisFileInfo['wavpack']['blockheader']['flags_raw'] = getid3_lib::LittleEndian2Int(substr($wavpackheader, 24, 4)); + $ThisFileInfo['wavpack']['blockheader']['crc'] = getid3_lib::LittleEndian2Int(substr($wavpackheader, 28, 4)); + + $ThisFileInfo['wavpack']['blockheader']['flags']['bytes_per_sample'] = 1 + ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000003); + $ThisFileInfo['wavpack']['blockheader']['flags']['mono'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000004); + $ThisFileInfo['wavpack']['blockheader']['flags']['hybrid'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000008); + $ThisFileInfo['wavpack']['blockheader']['flags']['joint_stereo'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000010); + $ThisFileInfo['wavpack']['blockheader']['flags']['cross_decorrelation'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000020); + $ThisFileInfo['wavpack']['blockheader']['flags']['hybrid_noiseshape'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000040); + $ThisFileInfo['wavpack']['blockheader']['flags']['ieee_32bit_float'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000080); + $ThisFileInfo['wavpack']['blockheader']['flags']['int_32bit'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000100); + $ThisFileInfo['wavpack']['blockheader']['flags']['hybrid_bitrate_noise'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000200); + $ThisFileInfo['wavpack']['blockheader']['flags']['hybrid_balance_noise'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000400); + $ThisFileInfo['wavpack']['blockheader']['flags']['multichannel_initial'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00000800); + $ThisFileInfo['wavpack']['blockheader']['flags']['multichannel_final'] = (bool) ($ThisFileInfo['wavpack']['blockheader']['flags_raw'] & 0x00001000); + + $ThisFileInfo['audio']['lossless'] = !$ThisFileInfo['wavpack']['blockheader']['flags']['hybrid']; + } + + while (!feof($fd) && (ftell($fd) < ($blockheader_offset + $blockheader_size + 8))) { + + $metablock = array('offset'=>ftell($fd)); + $metablockheader = fread($fd, 2); + if (feof($fd)) { + break; + } + $metablock['id'] = ord($metablockheader{0}); + $metablock['function_id'] = ($metablock['id'] & 0x3F); + $metablock['function_name'] = $this->WavPackMetablockNameLookup($metablock['function_id']); + + // The 0x20 bit in the id of the meta subblocks (which is defined as + // ID_OPTIONAL_DATA) is a permanent part of the id. The idea is that + // if a decoder encounters an id that it does not know about, it uses + // that "ID_OPTIONAL_DATA" flag to determine what to do. If it is set + // then the decoder simply ignores the metadata, but if it is zero + // then the decoder should quit because it means that an understanding + // of the metadata is required to correctly decode the audio. + $metablock['non_decoder'] = (bool) ($metablock['id'] & 0x20); + + $metablock['padded_data'] = (bool) ($metablock['id'] & 0x40); + $metablock['large_block'] = (bool) ($metablock['id'] & 0x80); + if ($metablock['large_block']) { + $metablockheader .= fread($fd, 2); + } + $metablock['size'] = getid3_lib::LittleEndian2Int(substr($metablockheader, 1)) * 2; // size is stored in words + $metablock['data'] = null; + + if ($metablock['size'] > 0) { + + switch ($metablock['function_id']) { + case 0x21: // ID_RIFF_HEADER + case 0x22: // ID_RIFF_TRAILER + case 0x23: // ID_REPLAY_GAIN + case 0x24: // ID_CUESHEET + case 0x25: // ID_CONFIG_BLOCK + case 0x26: // ID_MD5_CHECKSUM + $metablock['data'] = fread($fd, $metablock['size']); + + if ($metablock['padded_data']) { + // padded to the nearest even byte + $metablock['size']--; + $metablock['data'] = substr($metablock['data'], 0, -1); + } + break; + + case 0x00: // ID_DUMMY + case 0x01: // ID_ENCODER_INFO + case 0x02: // ID_DECORR_TERMS + case 0x03: // ID_DECORR_WEIGHTS + case 0x04: // ID_DECORR_SAMPLES + case 0x05: // ID_ENTROPY_VARS + case 0x06: // ID_HYBRID_PROFILE + case 0x07: // ID_SHAPING_WEIGHTS + case 0x08: // ID_FLOAT_INFO + case 0x09: // ID_INT32_INFO + case 0x0A: // ID_WV_BITSTREAM + case 0x0B: // ID_WVC_BITSTREAM + case 0x0C: // ID_WVX_BITSTREAM + case 0x0D: // ID_CHANNEL_INFO + fseek($fd, $metablock['offset'] + ($metablock['large_block'] ? 4 : 2) + $metablock['size'], SEEK_SET); + break; + + default: + $ThisFileInfo['warning'][] = 'Unexpected metablock type "0x'.str_pad(dechex($metablock['function_id']), 2, '0', STR_PAD_LEFT).'" at offset '.$metablock['offset']; + fseek($fd, $metablock['offset'] + ($metablock['large_block'] ? 4 : 2) + $metablock['size'], SEEK_SET); + break; + } + + switch ($metablock['function_id']) { + case 0x21: // ID_RIFF_HEADER + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + $original_wav_filesize = getid3_lib::LittleEndian2Int(substr($metablock['data'], 4, 4)); + getid3_riff::ParseRIFFdata($metablock['data'], $ParsedRIFFheader); + $metablock['riff'] = $ParsedRIFFheader['riff']; + $metablock['riff']['original_filesize'] = $original_wav_filesize; + $ThisFileInfo['wavpack']['riff_trailer_size'] = $original_wav_filesize - $metablock['riff']['WAVE']['data'][0]['size'] - $metablock['riff']['header_size']; + + $ThisFileInfo['audio']['sample_rate'] = $ParsedRIFFheader['riff']['raw']['fmt ']['nSamplesPerSec']; + $ThisFileInfo['playtime_seconds'] = $ThisFileInfo['wavpack']['blockheader']['total_samples'] / $ThisFileInfo['audio']['sample_rate']; + + // Safe RIFF header in case there's a RIFF footer later + $metablockRIFFheader = $metablock['data']; + break; + + + case 0x22: // ID_RIFF_TRAILER + $metablockRIFFfooter = $metablockRIFFheader.$metablock['data']; + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + + $ftell_old = ftell($fd); + $startoffset = $metablock['offset'] + ($metablock['large_block'] ? 4 : 2); + $ParsedRIFFfooter = array('avdataend'=>$ThisFileInfo['avdataend'], 'fileformat'=>'riff', 'error'=>array(), 'warning'=>array()); + $metablock['riff'] = getid3_riff::ParseRIFF($fd, $startoffset, $startoffset + $metablock['size'], $ParsedRIFFfooter); + fseek($fd, $ftell_old, SEEK_SET); + + if (!empty($metablock['riff']['INFO'])) { + getid3_riff::RIFFcommentsParse($metablock['riff']['INFO'], $metablock['comments']); + $ThisFileInfo['tags']['riff'] = $metablock['comments']; + } + break; + + + case 0x23: // ID_REPLAY_GAIN + $ThisFileInfo['warning'][] = 'WavPack "Replay Gain" contents not yet handled by getID3() in metablock at offset '.$metablock['offset']; + break; + + + case 0x24: // ID_CUESHEET + $ThisFileInfo['warning'][] = 'WavPack "Cuesheet" contents not yet handled by getID3() in metablock at offset '.$metablock['offset']; + break; + + + case 0x25: // ID_CONFIG_BLOCK + $metablock['flags_raw'] = getid3_lib::LittleEndian2Int(substr($metablock['data'], 0, 3)); + + $metablock['flags']['adobe_mode'] = (bool) ($metablock['flags_raw'] & 0x000001); // "adobe" mode for 32-bit floats + $metablock['flags']['fast_flag'] = (bool) ($metablock['flags_raw'] & 0x000002); // fast mode + $metablock['flags']['very_fast_flag'] = (bool) ($metablock['flags_raw'] & 0x000004); // double fast + $metablock['flags']['high_flag'] = (bool) ($metablock['flags_raw'] & 0x000008); // high quality mode + $metablock['flags']['very_high_flag'] = (bool) ($metablock['flags_raw'] & 0x000010); // double high (not used yet) + $metablock['flags']['bitrate_kbps'] = (bool) ($metablock['flags_raw'] & 0x000020); // bitrate is kbps, not bits / sample + $metablock['flags']['auto_shaping'] = (bool) ($metablock['flags_raw'] & 0x000040); // automatic noise shaping + $metablock['flags']['shape_override'] = (bool) ($metablock['flags_raw'] & 0x000080); // shaping mode specified + $metablock['flags']['joint_override'] = (bool) ($metablock['flags_raw'] & 0x000100); // joint-stereo mode specified + $metablock['flags']['copy_time'] = (bool) ($metablock['flags_raw'] & 0x000200); // copy file-time from source + $metablock['flags']['create_exe'] = (bool) ($metablock['flags_raw'] & 0x000400); // create executable + $metablock['flags']['create_wvc'] = (bool) ($metablock['flags_raw'] & 0x000800); // create correction file + $metablock['flags']['optimize_wvc'] = (bool) ($metablock['flags_raw'] & 0x001000); // maximize bybrid compression + $metablock['flags']['quality_mode'] = (bool) ($metablock['flags_raw'] & 0x002000); // psychoacoustic quality mode + $metablock['flags']['raw_flag'] = (bool) ($metablock['flags_raw'] & 0x004000); // raw mode (not implemented yet) + $metablock['flags']['calc_noise'] = (bool) ($metablock['flags_raw'] & 0x008000); // calc noise in hybrid mode + $metablock['flags']['lossy_mode'] = (bool) ($metablock['flags_raw'] & 0x010000); // obsolete (for information) + $metablock['flags']['extra_mode'] = (bool) ($metablock['flags_raw'] & 0x020000); // extra processing mode + $metablock['flags']['skip_wvx'] = (bool) ($metablock['flags_raw'] & 0x040000); // no wvx stream w/ floats & big ints + $metablock['flags']['md5_checksum'] = (bool) ($metablock['flags_raw'] & 0x080000); // compute & store MD5 signature + $metablock['flags']['quiet_mode'] = (bool) ($metablock['flags_raw'] & 0x100000); // don't report progress % + + $ThisFileInfo['wavpack']['config_flags'] = $metablock['flags']; + + + if ($ThisFileInfo['wavpack']['blockheader']['flags']['hybrid']) { + @$ThisFileInfo['audio']['encoder_options'] .= ' -b???'; + } + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['adobe_mode'] ? ' -a' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['optimize_wvc'] ? ' -cc' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['create_exe'] ? ' -e' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['fast_flag'] ? ' -f' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['joint_override'] ? ' -j?' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['high_flag'] ? ' -h' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['md5_checksum'] ? ' -m' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['calc_noise'] ? ' -n' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['shape_override'] ? ' -s?' : ''); + @$ThisFileInfo['audio']['encoder_options'] .= ($metablock['flags']['extra_mode'] ? ' -x?' : ''); + if (@$ThisFileInfo['audio']['encoder_options']) { + $ThisFileInfo['audio']['encoder_options'] = trim(@$ThisFileInfo['audio']['encoder_options']); + } + elseif (isset($ThisFileInfo['audio']['encoder_options'])) { + unset($ThisFileInfo['audio']['encoder_options']); + } + break; + + + case 0x26: // ID_MD5_CHECKSUM + if (strlen($metablock['data']) == 16) { + $ThisFileInfo['md5_data_source'] = strtolower(getid3_lib::PrintHexBytes($metablock['data'], true, false, false)); + } else { + $ThisFileInfo['warning'][] = 'Expecting 16 bytes of WavPack "MD5 Checksum" in metablock at offset '.$metablock['offset'].', but found '.strlen($metablock['data']).' bytes'; + } + break; + + + case 0x00: // ID_DUMMY + case 0x01: // ID_ENCODER_INFO + case 0x02: // ID_DECORR_TERMS + case 0x03: // ID_DECORR_WEIGHTS + case 0x04: // ID_DECORR_SAMPLES + case 0x05: // ID_ENTROPY_VARS + case 0x06: // ID_HYBRID_PROFILE + case 0x07: // ID_SHAPING_WEIGHTS + case 0x08: // ID_FLOAT_INFO + case 0x09: // ID_INT32_INFO + case 0x0A: // ID_WV_BITSTREAM + case 0x0B: // ID_WVC_BITSTREAM + case 0x0C: // ID_WVX_BITSTREAM + case 0x0D: // ID_CHANNEL_INFO + unset($metablock); + break; + } + + } + if (!empty($metablock)) { + $ThisFileInfo['wavpack']['metablocks'][] = $metablock; + } + + } + + } + + $ThisFileInfo['audio']['encoder'] = 'WavPack v'.$ThisFileInfo['wavpack']['blockheader']['major_version'].'.'.str_pad($ThisFileInfo['wavpack']['blockheader']['minor_version'], 2, '0', STR_PAD_LEFT); + $ThisFileInfo['audio']['bits_per_sample'] = $ThisFileInfo['wavpack']['blockheader']['flags']['bytes_per_sample'] * 8; + $ThisFileInfo['audio']['channels'] = ($ThisFileInfo['wavpack']['blockheader']['flags']['mono'] ? 1 : 2); + + if (@$ThisFileInfo['playtime_seconds']) { + + $ThisFileInfo['audio']['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds']; + + } else { + + $ThisFileInfo['audio']['dataformat'] = 'wvc'; + + } + + return true; + } + + + function WavPackMetablockNameLookup(&$id) { + static $WavPackMetablockNameLookup = array( + 0x00 => 'Dummy', + 0x01 => 'Encoder Info', + 0x02 => 'Decorrelation Terms', + 0x03 => 'Decorrelation Weights', + 0x04 => 'Decorrelation Samples', + 0x05 => 'Entropy Variables', + 0x06 => 'Hybrid Profile', + 0x07 => 'Shaping Weights', + 0x08 => 'Float Info', + 0x09 => 'Int32 Info', + 0x0A => 'WV Bitstream', + 0x0B => 'WVC Bitstream', + 0x0C => 'WVX Bitstream', + 0x0D => 'Channel Info', + 0x21 => 'RIFF header', + 0x22 => 'RIFF trailer', + 0x23 => 'Replay Gain', + 0x24 => 'Cuesheet', + 0x25 => 'Config Block', + 0x26 => 'MD5 Checksum', + ); + return (@$WavPackMetablockNameLookup[$id]); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.graphic.bmp.php b/campcaster/src/modules/getid3/var/module.graphic.bmp.php new file mode 100644 index 000000000..dc6d733ce --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.graphic.bmp.php @@ -0,0 +1,683 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.graphic.bmp.php // +// module for analyzing BMP Image files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_bmp +{ + + function getid3_bmp(&$fd, &$ThisFileInfo, $ExtractPalette=false, $ExtractData=false) { + + // shortcuts + $ThisFileInfo['bmp']['header']['raw'] = array(); + $thisfile_bmp = &$ThisFileInfo['bmp']; + $thisfile_bmp_header = &$thisfile_bmp['header']; + $thisfile_bmp_header_raw = &$thisfile_bmp_header['raw']; + + // BITMAPFILEHEADER [14 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp + // all versions + // WORD bfType; + // DWORD bfSize; + // WORD bfReserved1; + // WORD bfReserved2; + // DWORD bfOffBits; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $offset = 0; + $BMPheader = fread($fd, 14 + 40); + + $thisfile_bmp_header_raw['identifier'] = substr($BMPheader, $offset, 2); + $offset += 2; + + if ($thisfile_bmp_header_raw['identifier'] != 'BM') { + $ThisFileInfo['error'][] = 'Expecting "BM" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$thisfile_bmp_header_raw['identifier'].'"'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['bmp']); + return false; + } + + $thisfile_bmp_header_raw['filesize'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['reserved1'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['reserved2'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['data_offset'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['header_size'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + + + // check if the hardcoded-to-1 "planes" is at offset 22 or 26 + $planes22 = getid3_lib::LittleEndian2Int(substr($BMPheader, 22, 2)); + $planes26 = getid3_lib::LittleEndian2Int(substr($BMPheader, 26, 2)); + if (($planes22 == 1) && ($planes26 != 1)) { + $thisfile_bmp['type_os'] = 'OS/2'; + $thisfile_bmp['type_version'] = 1; + } elseif (($planes26 == 1) && ($planes22 != 1)) { + $thisfile_bmp['type_os'] = 'Windows'; + $thisfile_bmp['type_version'] = 1; + } elseif ($thisfile_bmp_header_raw['header_size'] == 12) { + $thisfile_bmp['type_os'] = 'OS/2'; + $thisfile_bmp['type_version'] = 1; + } elseif ($thisfile_bmp_header_raw['header_size'] == 40) { + $thisfile_bmp['type_os'] = 'Windows'; + $thisfile_bmp['type_version'] = 1; + } elseif ($thisfile_bmp_header_raw['header_size'] == 84) { + $thisfile_bmp['type_os'] = 'Windows'; + $thisfile_bmp['type_version'] = 4; + } elseif ($thisfile_bmp_header_raw['header_size'] == 100) { + $thisfile_bmp['type_os'] = 'Windows'; + $thisfile_bmp['type_version'] = 5; + } else { + $ThisFileInfo['error'][] = 'Unknown BMP subtype (or not a BMP file)'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['bmp']); + return false; + } + + $ThisFileInfo['fileformat'] = 'bmp'; + $ThisFileInfo['video']['dataformat'] = 'bmp'; + $ThisFileInfo['video']['lossless'] = true; + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + + if ($thisfile_bmp['type_os'] == 'OS/2') { + + // OS/2-format BMP + // http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm + + // DWORD Size; /* Size of this structure in bytes */ + // DWORD Width; /* Bitmap width in pixels */ + // DWORD Height; /* Bitmap height in pixel */ + // WORD NumPlanes; /* Number of bit planes (color depth) */ + // WORD BitsPerPixel; /* Number of bits per pixel per plane */ + + $thisfile_bmp_header_raw['width'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['height'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['planes'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['bits_per_pixel'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + + $ThisFileInfo['video']['resolution_x'] = $thisfile_bmp_header_raw['width']; + $ThisFileInfo['video']['resolution_y'] = $thisfile_bmp_header_raw['height']; + $ThisFileInfo['video']['codec'] = 'BI_RGB '.$thisfile_bmp_header_raw['bits_per_pixel'].'-bit'; + $ThisFileInfo['video']['bits_per_sample'] = $thisfile_bmp_header_raw['bits_per_pixel']; + + if ($thisfile_bmp['type_version'] >= 2) { + // DWORD Compression; /* Bitmap compression scheme */ + // DWORD ImageDataSize; /* Size of bitmap data in bytes */ + // DWORD XResolution; /* X resolution of display device */ + // DWORD YResolution; /* Y resolution of display device */ + // DWORD ColorsUsed; /* Number of color table indices used */ + // DWORD ColorsImportant; /* Number of important color indices */ + // WORD Units; /* Type of units used to measure resolution */ + // WORD Reserved; /* Pad structure to 4-byte boundary */ + // WORD Recording; /* Recording algorithm */ + // WORD Rendering; /* Halftoning algorithm used */ + // DWORD Size1; /* Reserved for halftoning algorithm use */ + // DWORD Size2; /* Reserved for halftoning algorithm use */ + // DWORD ColorEncoding; /* Color model used in bitmap */ + // DWORD Identifier; /* Reserved for application use */ + + $thisfile_bmp_header_raw['compression'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['bmp_data_size'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['resolution_h'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['resolution_v'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['colors_used'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['colors_important'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['resolution_units'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['reserved1'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['recording'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['rendering'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['size1'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['size2'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['color_encoding'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['identifier'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + + $thisfile_bmp_header['compression'] = $this->BMPcompressionOS2Lookup($thisfile_bmp_header_raw['compression']); + + $ThisFileInfo['video']['codec'] = $thisfile_bmp_header['compression'].' '.$thisfile_bmp_header_raw['bits_per_pixel'].'-bit'; + } + + } elseif ($thisfile_bmp['type_os'] == 'Windows') { + + // Windows-format BMP + + // BITMAPINFOHEADER - [40 bytes] http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp + // all versions + // DWORD biSize; + // LONG biWidth; + // LONG biHeight; + // WORD biPlanes; + // WORD biBitCount; + // DWORD biCompression; + // DWORD biSizeImage; + // LONG biXPelsPerMeter; + // LONG biYPelsPerMeter; + // DWORD biClrUsed; + // DWORD biClrImportant; + + $thisfile_bmp_header_raw['width'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4), true); + $offset += 4; + $thisfile_bmp_header_raw['height'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4), true); + $offset += 4; + $thisfile_bmp_header_raw['planes'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['bits_per_pixel'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 2)); + $offset += 2; + $thisfile_bmp_header_raw['compression'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['bmp_data_size'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['resolution_h'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4), true); + $offset += 4; + $thisfile_bmp_header_raw['resolution_v'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4), true); + $offset += 4; + $thisfile_bmp_header_raw['colors_used'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['colors_important'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + + $thisfile_bmp_header['compression'] = $this->BMPcompressionWindowsLookup($thisfile_bmp_header_raw['compression']); + $ThisFileInfo['video']['resolution_x'] = $thisfile_bmp_header_raw['width']; + $ThisFileInfo['video']['resolution_y'] = $thisfile_bmp_header_raw['height']; + $ThisFileInfo['video']['codec'] = $thisfile_bmp_header['compression'].' '.$thisfile_bmp_header_raw['bits_per_pixel'].'-bit'; + $ThisFileInfo['video']['bits_per_sample'] = $thisfile_bmp_header_raw['bits_per_pixel']; + + if (($thisfile_bmp['type_version'] >= 4) || ($thisfile_bmp_header_raw['compression'] == 3)) { + // should only be v4+, but BMPs with type_version==1 and BI_BITFIELDS compression have been seen + $BMPheader .= fread($fd, 44); + + // BITMAPV4HEADER - [44 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_2k1e.asp + // Win95+, WinNT4.0+ + // DWORD bV4RedMask; + // DWORD bV4GreenMask; + // DWORD bV4BlueMask; + // DWORD bV4AlphaMask; + // DWORD bV4CSType; + // CIEXYZTRIPLE bV4Endpoints; + // DWORD bV4GammaRed; + // DWORD bV4GammaGreen; + // DWORD bV4GammaBlue; + $thisfile_bmp_header_raw['red_mask'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['green_mask'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['blue_mask'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['alpha_mask'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['cs_type'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['ciexyz_red'] = substr($BMPheader, $offset, 4); + $offset += 4; + $thisfile_bmp_header_raw['ciexyz_green'] = substr($BMPheader, $offset, 4); + $offset += 4; + $thisfile_bmp_header_raw['ciexyz_blue'] = substr($BMPheader, $offset, 4); + $offset += 4; + $thisfile_bmp_header_raw['gamma_red'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['gamma_green'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['gamma_blue'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + + $thisfile_bmp_header['ciexyz_red'] = getid3_lib::FixedPoint2_30(strrev($thisfile_bmp_header_raw['ciexyz_red'])); + $thisfile_bmp_header['ciexyz_green'] = getid3_lib::FixedPoint2_30(strrev($thisfile_bmp_header_raw['ciexyz_green'])); + $thisfile_bmp_header['ciexyz_blue'] = getid3_lib::FixedPoint2_30(strrev($thisfile_bmp_header_raw['ciexyz_blue'])); + } + + if ($thisfile_bmp['type_version'] >= 5) { + $BMPheader .= fread($fd, 16); + + // BITMAPV5HEADER - [16 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_7c36.asp + // Win98+, Win2000+ + // DWORD bV5Intent; + // DWORD bV5ProfileData; + // DWORD bV5ProfileSize; + // DWORD bV5Reserved; + $thisfile_bmp_header_raw['intent'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['profile_data_offset'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['profile_data_size'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + $thisfile_bmp_header_raw['reserved3'] = getid3_lib::LittleEndian2Int(substr($BMPheader, $offset, 4)); + $offset += 4; + } + + } else { + + $ThisFileInfo['error'][] = 'Unknown BMP format in header.'; + return false; + + } + + + if ($ExtractPalette || $ExtractData) { + $PaletteEntries = 0; + if ($thisfile_bmp_header_raw['bits_per_pixel'] < 16) { + $PaletteEntries = pow(2, $thisfile_bmp_header_raw['bits_per_pixel']); + } elseif (isset($thisfile_bmp_header_raw['colors_used']) && ($thisfile_bmp_header_raw['colors_used'] > 0) && ($thisfile_bmp_header_raw['colors_used'] <= 256)) { + $PaletteEntries = $thisfile_bmp_header_raw['colors_used']; + } + if ($PaletteEntries > 0) { + $BMPpalette = fread($fd, 4 * $PaletteEntries); + $paletteoffset = 0; + for ($i = 0; $i < $PaletteEntries; $i++) { + // RGBQUAD - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_5f8y.asp + // BYTE rgbBlue; + // BYTE rgbGreen; + // BYTE rgbRed; + // BYTE rgbReserved; + $blue = getid3_lib::LittleEndian2Int(substr($BMPpalette, $paletteoffset++, 1)); + $green = getid3_lib::LittleEndian2Int(substr($BMPpalette, $paletteoffset++, 1)); + $red = getid3_lib::LittleEndian2Int(substr($BMPpalette, $paletteoffset++, 1)); + if (($thisfile_bmp['type_os'] == 'OS/2') && ($thisfile_bmp['type_version'] == 1)) { + // no padding byte + } else { + $paletteoffset++; // padding byte + } + $thisfile_bmp['palette'][$i] = (($red << 16) | ($green << 8) | $blue); + } + } + } + + if ($ExtractData) { + fseek($fd, $thisfile_bmp_header_raw['data_offset'], SEEK_SET); + $RowByteLength = ceil(($thisfile_bmp_header_raw['width'] * ($thisfile_bmp_header_raw['bits_per_pixel'] / 8)) / 4) * 4; // round up to nearest DWORD boundry + $BMPpixelData = fread($fd, $thisfile_bmp_header_raw['height'] * $RowByteLength); + $pixeldataoffset = 0; + switch (@$thisfile_bmp_header_raw['compression']) { + + case 0: // BI_RGB + switch ($thisfile_bmp_header_raw['bits_per_pixel']) { + case 1: + for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) { + for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col = $col) { + $paletteindexbyte = ord($BMPpixelData{$pixeldataoffset++}); + for ($i = 7; $i >= 0; $i--) { + $paletteindex = ($paletteindexbyte & (0x01 << $i)) >> $i; + $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex]; + $col++; + } + } + while (($pixeldataoffset % 4) != 0) { + // lines are padded to nearest DWORD + $pixeldataoffset++; + } + } + break; + + case 4: + for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) { + for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col = $col) { + $paletteindexbyte = ord($BMPpixelData{$pixeldataoffset++}); + for ($i = 1; $i >= 0; $i--) { + $paletteindex = ($paletteindexbyte & (0x0F << (4 * $i))) >> (4 * $i); + $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex]; + $col++; + } + } + while (($pixeldataoffset % 4) != 0) { + // lines are padded to nearest DWORD + $pixeldataoffset++; + } + } + break; + + case 8: + for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) { + for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col++) { + $paletteindex = ord($BMPpixelData{$pixeldataoffset++}); + $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex]; + } + while (($pixeldataoffset % 4) != 0) { + // lines are padded to nearest DWORD + $pixeldataoffset++; + } + } + break; + + case 24: + for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) { + for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col++) { + $thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData{$pixeldataoffset+2}) << 16) | (ord($BMPpixelData{$pixeldataoffset+1}) << 8) | ord($BMPpixelData{$pixeldataoffset}); + $pixeldataoffset += 3; + } + while (($pixeldataoffset % 4) != 0) { + // lines are padded to nearest DWORD + $pixeldataoffset++; + } + } + break; + + case 32: + for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) { + for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col++) { + $thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData{$pixeldataoffset+3}) << 24) | (ord($BMPpixelData{$pixeldataoffset+2}) << 16) | (ord($BMPpixelData{$pixeldataoffset+1}) << 8) | ord($BMPpixelData{$pixeldataoffset}); + $pixeldataoffset += 4; + } + while (($pixeldataoffset % 4) != 0) { + // lines are padded to nearest DWORD + $pixeldataoffset++; + } + } + break; + + case 16: + // ? + break; + + default: + $ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data'; + break; + } + break; + + + case 1: // BI_RLE8 - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_6x0u.asp + switch ($thisfile_bmp_header_raw['bits_per_pixel']) { + case 8: + $pixelcounter = 0; + while ($pixeldataoffset < strlen($BMPpixelData)) { + $firstbyte = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $secondbyte = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + if ($firstbyte == 0) { + + // escaped/absolute mode - the first byte of the pair can be set to zero to + // indicate an escape character that denotes the end of a line, the end of + // a bitmap, or a delta, depending on the value of the second byte. + switch ($secondbyte) { + case 0: + // end of line + // no need for special processing, just ignore + break; + + case 1: + // end of bitmap + $pixeldataoffset = strlen($BMPpixelData); // force to exit loop just in case + break; + + case 2: + // delta - The 2 bytes following the escape contain unsigned values + // indicating the horizontal and vertical offsets of the next pixel + // from the current position. + $colincrement = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $rowincrement = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $col = ($pixelcounter % $thisfile_bmp_header_raw['width']) + $colincrement; + $row = ($thisfile_bmp_header_raw['height'] - 1 - (($pixelcounter - $col) / $thisfile_bmp_header_raw['width'])) - $rowincrement; + $pixelcounter = ($row * $thisfile_bmp_header_raw['width']) + $col; + break; + + default: + // In absolute mode, the first byte is zero and the second byte is a + // value in the range 03H through FFH. The second byte represents the + // number of bytes that follow, each of which contains the color index + // of a single pixel. Each run must be aligned on a word boundary. + for ($i = 0; $i < $secondbyte; $i++) { + $paletteindex = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $col = $pixelcounter % $thisfile_bmp_header_raw['width']; + $row = $thisfile_bmp_header_raw['height'] - 1 - (($pixelcounter - $col) / $thisfile_bmp_header_raw['width']); + $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex]; + $pixelcounter++; + } + while (($pixeldataoffset % 2) != 0) { + // Each run must be aligned on a word boundary. + $pixeldataoffset++; + } + break; + } + + } else { + + // encoded mode - the first byte specifies the number of consecutive pixels + // to be drawn using the color index contained in the second byte. + for ($i = 0; $i < $firstbyte; $i++) { + $col = $pixelcounter % $thisfile_bmp_header_raw['width']; + $row = $thisfile_bmp_header_raw['height'] - 1 - (($pixelcounter - $col) / $thisfile_bmp_header_raw['width']); + $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$secondbyte]; + $pixelcounter++; + } + + } + } + break; + + default: + $ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data'; + break; + } + break; + + + + case 2: // BI_RLE4 - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_6x0u.asp + switch ($thisfile_bmp_header_raw['bits_per_pixel']) { + case 4: + $pixelcounter = 0; + while ($pixeldataoffset < strlen($BMPpixelData)) { + $firstbyte = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $secondbyte = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + if ($firstbyte == 0) { + + // escaped/absolute mode - the first byte of the pair can be set to zero to + // indicate an escape character that denotes the end of a line, the end of + // a bitmap, or a delta, depending on the value of the second byte. + switch ($secondbyte) { + case 0: + // end of line + // no need for special processing, just ignore + break; + + case 1: + // end of bitmap + $pixeldataoffset = strlen($BMPpixelData); // force to exit loop just in case + break; + + case 2: + // delta - The 2 bytes following the escape contain unsigned values + // indicating the horizontal and vertical offsets of the next pixel + // from the current position. + $colincrement = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $rowincrement = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $col = ($pixelcounter % $thisfile_bmp_header_raw['width']) + $colincrement; + $row = ($thisfile_bmp_header_raw['height'] - 1 - (($pixelcounter - $col) / $thisfile_bmp_header_raw['width'])) - $rowincrement; + $pixelcounter = ($row * $thisfile_bmp_header_raw['width']) + $col; + break; + + default: + // In absolute mode, the first byte is zero. The second byte contains the number + // of color indexes that follow. Subsequent bytes contain color indexes in their + // high- and low-order 4 bits, one color index for each pixel. In absolute mode, + // each run must be aligned on a word boundary. + unset($paletteindexes); + for ($i = 0; $i < ceil($secondbyte / 2); $i++) { + $paletteindexbyte = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset++, 1)); + $paletteindexes[] = ($paletteindexbyte & 0xF0) >> 4; + $paletteindexes[] = ($paletteindexbyte & 0x0F); + } + while (($pixeldataoffset % 2) != 0) { + // Each run must be aligned on a word boundary. + $pixeldataoffset++; + } + + foreach ($paletteindexes as $paletteindex) { + $col = $pixelcounter % $thisfile_bmp_header_raw['width']; + $row = $thisfile_bmp_header_raw['height'] - 1 - (($pixelcounter - $col) / $thisfile_bmp_header_raw['width']); + $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex]; + $pixelcounter++; + } + break; + } + + } else { + + // encoded mode - the first byte of the pair contains the number of pixels to be + // drawn using the color indexes in the second byte. The second byte contains two + // color indexes, one in its high-order 4 bits and one in its low-order 4 bits. + // The first of the pixels is drawn using the color specified by the high-order + // 4 bits, the second is drawn using the color in the low-order 4 bits, the third + // is drawn using the color in the high-order 4 bits, and so on, until all the + // pixels specified by the first byte have been drawn. + $paletteindexes[0] = ($secondbyte & 0xF0) >> 4; + $paletteindexes[1] = ($secondbyte & 0x0F); + for ($i = 0; $i < $firstbyte; $i++) { + $col = $pixelcounter % $thisfile_bmp_header_raw['width']; + $row = $thisfile_bmp_header_raw['height'] - 1 - (($pixelcounter - $col) / $thisfile_bmp_header_raw['width']); + $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindexes[($i % 2)]]; + $pixelcounter++; + } + + } + } + break; + + default: + $ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data'; + break; + } + break; + + + case 3: // BI_BITFIELDS + switch ($thisfile_bmp_header_raw['bits_per_pixel']) { + case 16: + case 32: + $redshift = 0; + $greenshift = 0; + $blueshift = 0; + while ((($thisfile_bmp_header_raw['red_mask'] >> $redshift) & 0x01) == 0) { + $redshift++; + } + while ((($thisfile_bmp_header_raw['green_mask'] >> $greenshift) & 0x01) == 0) { + $greenshift++; + } + while ((($thisfile_bmp_header_raw['blue_mask'] >> $blueshift) & 0x01) == 0) { + $blueshift++; + } + for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) { + for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col++) { + $pixelvalue = getid3_lib::LittleEndian2Int(substr($BMPpixelData, $pixeldataoffset, $thisfile_bmp_header_raw['bits_per_pixel'] / 8)); + $pixeldataoffset += $thisfile_bmp_header_raw['bits_per_pixel'] / 8; + + $red = intval(round(((($pixelvalue & $thisfile_bmp_header_raw['red_mask']) >> $redshift) / ($thisfile_bmp_header_raw['red_mask'] >> $redshift)) * 255)); + $green = intval(round(((($pixelvalue & $thisfile_bmp_header_raw['green_mask']) >> $greenshift) / ($thisfile_bmp_header_raw['green_mask'] >> $greenshift)) * 255)); + $blue = intval(round(((($pixelvalue & $thisfile_bmp_header_raw['blue_mask']) >> $blueshift) / ($thisfile_bmp_header_raw['blue_mask'] >> $blueshift)) * 255)); + $thisfile_bmp['data'][$row][$col] = (($red << 16) | ($green << 8) | ($blue)); + } + while (($pixeldataoffset % 4) != 0) { + // lines are padded to nearest DWORD + $pixeldataoffset++; + } + } + break; + + default: + $ThisFileInfo['error'][] = 'Unknown bits-per-pixel value ('.$thisfile_bmp_header_raw['bits_per_pixel'].') - cannot read pixel data'; + break; + } + break; + + + default: // unhandled compression type + $ThisFileInfo['error'][] = 'Unknown/unhandled compression type value ('.$thisfile_bmp_header_raw['compression'].') - cannot decompress pixel data'; + break; + } + } + + return true; + } + + + function PlotBMP(&$BMPinfo) { + $starttime = time(); + if (!isset($BMPinfo['bmp']['data']) || !is_array($BMPinfo['bmp']['data'])) { + echo 'ERROR: no pixel data
    '; + return false; + } + set_time_limit(intval(round($BMPinfo['resolution_x'] * $BMPinfo['resolution_y'] / 10000))); + if ($im = ImageCreateTrueColor($BMPinfo['resolution_x'], $BMPinfo['resolution_y'])) { + for ($row = 0; $row < $BMPinfo['resolution_y']; $row++) { + for ($col = 0; $col < $BMPinfo['resolution_x']; $col++) { + if (isset($BMPinfo['bmp']['data'][$row][$col])) { + $red = ($BMPinfo['bmp']['data'][$row][$col] & 0x00FF0000) >> 16; + $green = ($BMPinfo['bmp']['data'][$row][$col] & 0x0000FF00) >> 8; + $blue = ($BMPinfo['bmp']['data'][$row][$col] & 0x000000FF); + $pixelcolor = ImageColorAllocate($im, $red, $green, $blue); + ImageSetPixel($im, $col, $row, $pixelcolor); + } else { + //echo 'ERROR: no data for pixel '.$row.' x '.$col.'
    '; + //return false; + } + } + } + if (headers_sent()) { + echo 'plotted '.($BMPinfo['resolution_x'] * $BMPinfo['resolution_y']).' pixels in '.(time() - $starttime).' seconds
    '; + ImageDestroy($im); + exit; + } else { + header('Content-type: image/png'); + ImagePNG($im); + ImageDestroy($im); + return true; + } + } + return false; + } + + function BMPcompressionWindowsLookup($compressionid) { + static $BMPcompressionWindowsLookup = array( + 0 => 'BI_RGB', + 1 => 'BI_RLE8', + 2 => 'BI_RLE4', + 3 => 'BI_BITFIELDS', + 4 => 'BI_JPEG', + 5 => 'BI_PNG' + ); + return (isset($BMPcompressionWindowsLookup[$compressionid]) ? $BMPcompressionWindowsLookup[$compressionid] : 'invalid'); + } + + function BMPcompressionOS2Lookup($compressionid) { + static $BMPcompressionOS2Lookup = array( + 0 => 'BI_RGB', + 1 => 'BI_RLE8', + 2 => 'BI_RLE4', + 3 => 'Huffman 1D', + 4 => 'BI_RLE24', + ); + return (isset($BMPcompressionOS2Lookup[$compressionid]) ? $BMPcompressionOS2Lookup[$compressionid] : 'invalid'); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.graphic.gif.php b/campcaster/src/modules/getid3/var/module.graphic.gif.php new file mode 100644 index 000000000..986ada30a --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.graphic.gif.php @@ -0,0 +1,183 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.graphic.gif.php // +// module for analyzing GIF Image files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_gif +{ + + function getid3_gif(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'gif'; + $ThisFileInfo['video']['dataformat'] = 'gif'; + $ThisFileInfo['video']['lossless'] = true; + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $GIFheader = fread($fd, 13); + $offset = 0; + + $ThisFileInfo['gif']['header']['raw']['identifier'] = substr($GIFheader, $offset, 3); + $offset += 3; + + if ($ThisFileInfo['gif']['header']['raw']['identifier'] != 'GIF') { + $ThisFileInfo['error'][] = 'Expecting "GIF" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$ThisFileInfo['gif']['header']['raw']['identifier'].'"'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['gif']); + return false; + } + + $ThisFileInfo['gif']['header']['raw']['version'] = substr($GIFheader, $offset, 3); + $offset += 3; + $ThisFileInfo['gif']['header']['raw']['width'] = getid3_lib::LittleEndian2Int(substr($GIFheader, $offset, 2)); + $offset += 2; + $ThisFileInfo['gif']['header']['raw']['height'] = getid3_lib::LittleEndian2Int(substr($GIFheader, $offset, 2)); + $offset += 2; + $ThisFileInfo['gif']['header']['raw']['flags'] = getid3_lib::LittleEndian2Int(substr($GIFheader, $offset, 1)); + $offset += 1; + $ThisFileInfo['gif']['header']['raw']['bg_color_index'] = getid3_lib::LittleEndian2Int(substr($GIFheader, $offset, 1)); + $offset += 1; + $ThisFileInfo['gif']['header']['raw']['aspect_ratio'] = getid3_lib::LittleEndian2Int(substr($GIFheader, $offset, 1)); + $offset += 1; + + $ThisFileInfo['video']['resolution_x'] = $ThisFileInfo['gif']['header']['raw']['width']; + $ThisFileInfo['video']['resolution_y'] = $ThisFileInfo['gif']['header']['raw']['height']; + $ThisFileInfo['gif']['version'] = $ThisFileInfo['gif']['header']['raw']['version']; + $ThisFileInfo['gif']['header']['flags']['global_color_table'] = (bool) ($ThisFileInfo['gif']['header']['raw']['flags'] & 0x80); + if ($ThisFileInfo['gif']['header']['raw']['flags'] & 0x80) { + // Number of bits per primary color available to the original image, minus 1 + $ThisFileInfo['gif']['header']['bits_per_pixel'] = 3 * ((($ThisFileInfo['gif']['header']['raw']['flags'] & 0x70) >> 4) + 1); + } else { + $ThisFileInfo['gif']['header']['bits_per_pixel'] = 0; + } + $ThisFileInfo['gif']['header']['flags']['global_color_sorted'] = (bool) ($ThisFileInfo['gif']['header']['raw']['flags'] & 0x40); + if ($ThisFileInfo['gif']['header']['flags']['global_color_table']) { + // the number of bytes contained in the Global Color Table. To determine that + // actual size of the color table, raise 2 to [the value of the field + 1] + $ThisFileInfo['gif']['header']['global_color_size'] = pow(2, ($ThisFileInfo['gif']['header']['raw']['flags'] & 0x07) + 1); + $ThisFileInfo['video']['bits_per_sample'] = ($ThisFileInfo['gif']['header']['raw']['flags'] & 0x07) + 1; + } else { + $ThisFileInfo['gif']['header']['global_color_size'] = 0; + } + if ($ThisFileInfo['gif']['header']['raw']['aspect_ratio'] != 0) { + // Aspect Ratio = (Pixel Aspect Ratio + 15) / 64 + $ThisFileInfo['gif']['header']['aspect_ratio'] = ($ThisFileInfo['gif']['header']['raw']['aspect_ratio'] + 15) / 64; + } + +// if ($ThisFileInfo['gif']['header']['flags']['global_color_table']) { +// $GIFcolorTable = fread($fd, 3 * $ThisFileInfo['gif']['header']['global_color_size']); +// $offset = 0; +// for ($i = 0; $i < $ThisFileInfo['gif']['header']['global_color_size']; $i++) { +// $red = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1)); +// $green = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1)); +// $blue = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1)); +// $ThisFileInfo['gif']['global_color_table'][$i] = (($red << 16) | ($green << 8) | ($blue)); +// } +// } +// +// // Image Descriptor +// while (!feof($fd)) { +// $NextBlockTest = fread($fd, 1); +// switch ($NextBlockTest) { +// +// case ',': // ',' - Image separator character +// +// $ImageDescriptorData = $NextBlockTest.fread($fd, 9); +// $ImageDescriptor = array(); +// $ImageDescriptor['image_left'] = getid3_lib::LittleEndian2Int(substr($ImageDescriptorData, 1, 2)); +// $ImageDescriptor['image_top'] = getid3_lib::LittleEndian2Int(substr($ImageDescriptorData, 3, 2)); +// $ImageDescriptor['image_width'] = getid3_lib::LittleEndian2Int(substr($ImageDescriptorData, 5, 2)); +// $ImageDescriptor['image_height'] = getid3_lib::LittleEndian2Int(substr($ImageDescriptorData, 7, 2)); +// $ImageDescriptor['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ImageDescriptorData, 9, 1)); +// $ImageDescriptor['flags']['use_local_color_map'] = (bool) ($ImageDescriptor['flags_raw'] & 0x80); +// $ImageDescriptor['flags']['image_interlaced'] = (bool) ($ImageDescriptor['flags_raw'] & 0x40); +// $ThisFileInfo['gif']['image_descriptor'][] = $ImageDescriptor; +// +// if ($ImageDescriptor['flags']['use_local_color_map']) { +// +// $ThisFileInfo['warning'][] = 'This version of getID3() cannot parse local color maps for GIFs'; +// return true; +// +// } +//echo 'Start of raster data: '.ftell($fd).'
    '; +// $RasterData = array(); +// $RasterData['code_size'] = getid3_lib::LittleEndian2Int(fread($fd, 1)); +// $RasterData['block_byte_count'] = getid3_lib::LittleEndian2Int(fread($fd, 1)); +// $ThisFileInfo['gif']['raster_data'][count($ThisFileInfo['gif']['image_descriptor']) - 1] = $RasterData; +// +// $CurrentCodeSize = $RasterData['code_size'] + 1; +// for ($i = 0; $i < pow(2, $RasterData['code_size']); $i++) { +// $DefaultDataLookupTable[$i] = chr($i); +// } +// $DefaultDataLookupTable[pow(2, $RasterData['code_size']) + 0] = ''; // Clear Code +// $DefaultDataLookupTable[pow(2, $RasterData['code_size']) + 1] = ''; // End Of Image Code +// +// +// $NextValue = $this->GetLSBits($fd, $CurrentCodeSize); +// echo 'Clear Code: '.$NextValue.'
    '; +// +// $NextValue = $this->GetLSBits($fd, $CurrentCodeSize); +// echo 'First Color: '.$NextValue.'
    '; +// +// $Prefix = $NextValue; +//$i = 0; +// while ($i++ < 20) { +// $NextValue = $this->GetLSBits($fd, $CurrentCodeSize); +// echo $NextValue.'
    '; +// } +//return true; +// break; +// +// case '!': +// // GIF Extension Block +// $ExtensionBlockData = $NextBlockTest.fread($fd, 2); +// $ExtensionBlock = array(); +// $ExtensionBlock['function_code'] = getid3_lib::LittleEndian2Int(substr($ExtensionBlockData, 1, 1)); +// $ExtensionBlock['byte_length'] = getid3_lib::LittleEndian2Int(substr($ExtensionBlockData, 2, 1)); +// $ExtensionBlock['data'] = fread($fd, $ExtensionBlock['byte_length']); +// $ThisFileInfo['gif']['extension_blocks'][] = $ExtensionBlock; +// break; +// +// case ';': +// $ThisFileInfo['gif']['terminator_offset'] = ftell($fd) - 1; +// // GIF Terminator +// break; +// +// default: +// break; +// +// +// } +// } + + return true; + } + + + function GetLSBits($fd, $bits) { + static $bitbuffer = ''; + while (strlen($bitbuffer) < $bits) { +//echo 'Read another byte: '.ftell($fd).'
    '; + $bitbuffer = str_pad(decbin(ord(fread($fd, 1))), 8, '0', STR_PAD_LEFT).$bitbuffer; + } + + $value = bindec(substr($bitbuffer, 0 - $bits)); + $bitbuffer = substr($bitbuffer, 0, 0 - $bits); + + return $value; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.graphic.jpg.php b/campcaster/src/modules/getid3/var/module.graphic.jpg.php new file mode 100644 index 000000000..0cd305ce4 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.graphic.jpg.php @@ -0,0 +1,72 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.graphic.jpg.php // +// module for analyzing JPEG Image files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_jpg +{ + + + function getid3_jpg(&$fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'jpg'; + $ThisFileInfo['video']['dataformat'] = 'jpg'; + $ThisFileInfo['video']['lossless'] = false; + $ThisFileInfo['video']['bits_per_sample'] = 24; + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + list($width, $height, $type) = getid3_lib::GetDataImageSize(fread($fd, $ThisFileInfo['filesize'])); + if ($type == 2) { + + $ThisFileInfo['video']['resolution_x'] = $width; + $ThisFileInfo['video']['resolution_y'] = $height; + + if (version_compare(phpversion(), '4.2.0', '>=')) { + + if (function_exists('exif_read_data')) { + + ob_start(); + $ThisFileInfo['jpg']['exif'] = exif_read_data($ThisFileInfo['filenamepath'], '', true, false); + $errors = ob_get_contents(); + if ($errors) { + $ThisFileInfo['error'][] = strip_tags($errors); + unset($ThisFileInfo['jpg']['exif']); + } + ob_end_clean(); + + } else { + + $ThisFileInfo['warning'][] = 'EXIF parsing only available when '.(GETID3_OS_ISWINDOWS ? 'php_exif.dll enabled' : 'compiled with --enable-exif'); + + } + + } else { + + $ThisFileInfo['warning'][] = 'EXIF parsing only available in PHP v4.2.0 and higher compiled with --enable-exif (or php_exif.dll enabled for Windows). You are using PHP v'.phpversion(); + + } + + return true; + + } + + unset($ThisFileInfo['fileformat']); + return false; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.graphic.pcd.php b/campcaster/src/modules/getid3/var/module.graphic.pcd.php new file mode 100644 index 000000000..60efabdf6 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.graphic.pcd.php @@ -0,0 +1,130 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.graphic.pcd.php // +// module for analyzing PhotoCD (PCD) Image files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_pcd +{ + function getid3_pcd(&$fd, &$ThisFileInfo, $ExtractData=0) { + $ThisFileInfo['fileformat'] = 'pcd'; + $ThisFileInfo['video']['dataformat'] = 'pcd'; + $ThisFileInfo['video']['lossless'] = false; + + + fseek($fd, $ThisFileInfo['avdataoffset'] + 72, SEEK_SET); + + $PCDflags = fread($fd, 1); + $PCDisVertical = ((ord($PCDflags) & 0x01) ? true : false); + + + if ($PCDisVertical) { + $ThisFileInfo['video']['resolution_x'] = 3072; + $ThisFileInfo['video']['resolution_y'] = 2048; + } else { + $ThisFileInfo['video']['resolution_x'] = 2048; + $ThisFileInfo['video']['resolution_y'] = 3072; + } + + + if ($ExtractData > 3) { + + $ThisFileInfo['error'][] = 'Cannot extract PSD image data for detail levels above BASE (3)'; + + } elseif ($ExtractData > 0) { + + $PCD_levels[1] = array( 192, 128, 0x02000); // BASE/16 + $PCD_levels[2] = array( 384, 256, 0x0B800); // BASE/4 + $PCD_levels[3] = array( 768, 512, 0x30000); // BASE + //$PCD_levels[4] = array(1536, 1024, ??); // BASE*4 - encrypted with Kodak-proprietary compression/encryption + //$PCD_levels[5] = array(3072, 2048, ??); // BASE*16 - encrypted with Kodak-proprietary compression/encryption + //$PCD_levels[6] = array(6144, 4096, ??); // BASE*64 - encrypted with Kodak-proprietary compression/encryption; PhotoCD-Pro only + + list($PCD_width, $PCD_height, $PCD_dataOffset) = $PCD_levels[3]; + + fseek($fd, $ThisFileInfo['avdataoffset'] + $PCD_dataOffset, SEEK_SET); + + for ($y = 0; $y < $PCD_height; $y += 2) { + // The image-data of these subtypes start at the respective offsets of 02000h, 0b800h and 30000h. + // To decode the YcbYr to the more usual RGB-code, three lines of data have to be read, each + // consisting of w bytes, where w is the width of the image-subtype. The first w bytes and + // the first half of the third w bytes contain data for the first RGB-line, the second w bytes + // and the second half of the third w bytes contain data for a second RGB-line. + + $PCD_data_Y1 = fread($fd, $PCD_width); + $PCD_data_Y2 = fread($fd, $PCD_width); + $PCD_data_Cb = fread($fd, intval(round($PCD_width / 2))); + $PCD_data_Cr = fread($fd, intval(round($PCD_width / 2))); + + for ($x = 0; $x < $PCD_width; $x++) { + if ($PCDisVertical) { + $ThisFileInfo['pcd']['data'][$PCD_width - $x][$y] = $this->YCbCr2RGB(ord($PCD_data_Y1{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)})); + $ThisFileInfo['pcd']['data'][$PCD_width - $x][$y + 1] = $this->YCbCr2RGB(ord($PCD_data_Y2{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)})); + } else { + $ThisFileInfo['pcd']['data'][$y][$x] = $this->YCbCr2RGB(ord($PCD_data_Y1{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)})); + $ThisFileInfo['pcd']['data'][$y + 1][$x] = $this->YCbCr2RGB(ord($PCD_data_Y2{$x}), ord($PCD_data_Cb{floor($x / 2)}), ord($PCD_data_Cr{floor($x / 2)})); + } + } + } + + // Example for plotting extracted data + //getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true); + //if ($PCDisVertical) { + // $BMPinfo['resolution_x'] = $PCD_height; + // $BMPinfo['resolution_y'] = $PCD_width; + //} else { + // $BMPinfo['resolution_x'] = $PCD_width; + // $BMPinfo['resolution_y'] = $PCD_height; + //} + //$BMPinfo['bmp']['data'] = $ThisFileInfo['pcd']['data']; + //getid3_bmp::PlotBMP($BMPinfo); + //exit; + + } + + } + + function YCbCr2RGB($Y, $Cb, $Cr) { + static $YCbCr_constants = array(); + if (empty($YCbCr_constants)) { + $YCbCr_constants['red']['Y'] = 0.0054980 * 256; + $YCbCr_constants['red']['Cb'] = 0.0000000 * 256; + $YCbCr_constants['red']['Cr'] = 0.0051681 * 256; + $YCbCr_constants['green']['Y'] = 0.0054980 * 256; + $YCbCr_constants['green']['Cb'] = -0.0015446 * 256; + $YCbCr_constants['green']['Cr'] = -0.0026325 * 256; + $YCbCr_constants['blue']['Y'] = 0.0054980 * 256; + $YCbCr_constants['blue']['Cb'] = 0.0079533 * 256; + $YCbCr_constants['blue']['Cr'] = 0.0000000 * 256; + } + + $RGBcolor = array('red'=>0, 'green'=>0, 'blue'=>0); + foreach ($RGBcolor as $rgbname => $dummy) { + $RGBcolor[$rgbname] = max(0, + min(255, + intval( + round( + ($YCbCr_constants[$rgbname]['Y'] * $Y) + + ($YCbCr_constants[$rgbname]['Cb'] * ($Cb - 156)) + + ($YCbCr_constants[$rgbname]['Cr'] * ($Cr - 137)) + ) + ) + ) + ); + } + return (($RGBcolor['red'] * 65536) + ($RGBcolor['green'] * 256) + $RGBcolor['blue']); + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.graphic.png.php b/campcaster/src/modules/getid3/var/module.graphic.png.php new file mode 100644 index 000000000..7d82b8499 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.graphic.png.php @@ -0,0 +1,519 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.graphic.png.php // +// module for analyzing PNG Image files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_png +{ + + function getid3_png(&$fd, &$ThisFileInfo) { + + // shortcut + $ThisFileInfo['png'] = array(); + $thisfile_png = &$ThisFileInfo['png']; + + $ThisFileInfo['fileformat'] = 'png'; + $ThisFileInfo['video']['dataformat'] = 'png'; + $ThisFileInfo['video']['lossless'] = false; + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $PNGfiledata = fread($fd, GETID3_FREAD_BUFFER_SIZE); + $offset = 0; + + $PNGidentifier = substr($PNGfiledata, $offset, 8); // $89 $50 $4E $47 $0D $0A $1A $0A + $offset += 8; + + if ($PNGidentifier != "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") { + $ThisFileInfo['error'][] = 'First 8 bytes of file ('.getid3_lib::PrintHexBytes($PNGidentifier).') did not match expected PNG identifier'; + unset($ThisFileInfo['fileformat']); + return false; + } + + while (((ftell($fd) - (strlen($PNGfiledata) - $offset)) < $ThisFileInfo['filesize'])) { + $chunk['data_length'] = getid3_lib::BigEndian2Int(substr($PNGfiledata, $offset, 4)); + $offset += 4; + while (((strlen($PNGfiledata) - $offset) < ($chunk['data_length'] + 4)) && (ftell($fd) < $ThisFileInfo['filesize'])) { + $PNGfiledata .= fread($fd, GETID3_FREAD_BUFFER_SIZE); + } + $chunk['type_text'] = substr($PNGfiledata, $offset, 4); + $offset += 4; + $chunk['type_raw'] = getid3_lib::BigEndian2Int($chunk['type_text']); + $chunk['data'] = substr($PNGfiledata, $offset, $chunk['data_length']); + $offset += $chunk['data_length']; + $chunk['crc'] = getid3_lib::BigEndian2Int(substr($PNGfiledata, $offset, 4)); + $offset += 4; + + $chunk['flags']['ancilliary'] = (bool) ($chunk['type_raw'] & 0x20000000); + $chunk['flags']['private'] = (bool) ($chunk['type_raw'] & 0x00200000); + $chunk['flags']['reserved'] = (bool) ($chunk['type_raw'] & 0x00002000); + $chunk['flags']['safe_to_copy'] = (bool) ($chunk['type_raw'] & 0x00000020); + + // shortcut + $thisfile_png[$chunk['type_text']] = array(); + $thisfile_png_chunk_type_text = &$thisfile_png[$chunk['type_text']]; + + switch ($chunk['type_text']) { + + case 'IHDR': // Image Header + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['width'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 4)); + $thisfile_png_chunk_type_text['height'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 4)); + $thisfile_png_chunk_type_text['raw']['bit_depth'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 8, 1)); + $thisfile_png_chunk_type_text['raw']['color_type'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 9, 1)); + $thisfile_png_chunk_type_text['raw']['compression_method'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 10, 1)); + $thisfile_png_chunk_type_text['raw']['filter_method'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 11, 1)); + $thisfile_png_chunk_type_text['raw']['interlace_method'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 12, 1)); + + $thisfile_png_chunk_type_text['compression_method_text'] = $this->PNGcompressionMethodLookup($thisfile_png_chunk_type_text['raw']['compression_method']); + $thisfile_png_chunk_type_text['color_type']['palette'] = (bool) ($thisfile_png_chunk_type_text['raw']['color_type'] & 0x01); + $thisfile_png_chunk_type_text['color_type']['true_color'] = (bool) ($thisfile_png_chunk_type_text['raw']['color_type'] & 0x02); + $thisfile_png_chunk_type_text['color_type']['alpha'] = (bool) ($thisfile_png_chunk_type_text['raw']['color_type'] & 0x04); + + $ThisFileInfo['video']['resolution_x'] = $thisfile_png_chunk_type_text['width']; + $ThisFileInfo['video']['resolution_y'] = $thisfile_png_chunk_type_text['height']; + + $ThisFileInfo['video']['bits_per_sample'] = $this->IHDRcalculateBitsPerSample($thisfile_png_chunk_type_text['raw']['color_type'], $thisfile_png_chunk_type_text['raw']['bit_depth']); + break; + + + case 'PLTE': // Palette + $thisfile_png_chunk_type_text['header'] = $chunk; + $paletteoffset = 0; + for ($i = 0; $i <= 255; $i++) { + //$thisfile_png_chunk_type_text['red'][$i] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1)); + //$thisfile_png_chunk_type_text['green'][$i] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1)); + //$thisfile_png_chunk_type_text['blue'][$i] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1)); + $red = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1)); + $green = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1)); + $blue = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1)); + $thisfile_png_chunk_type_text[$i] = (($red << 16) | ($green << 8) | ($blue)); + } + break; + + + case 'tRNS': // Transparency + $thisfile_png_chunk_type_text['header'] = $chunk; + switch ($thisfile_png['IHDR']['raw']['color_type']) { + case 0: + $thisfile_png_chunk_type_text['transparent_color_gray'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 2)); + break; + + case 2: + $thisfile_png_chunk_type_text['transparent_color_red'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 2)); + $thisfile_png_chunk_type_text['transparent_color_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 2)); + $thisfile_png_chunk_type_text['transparent_color_blue'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 2)); + break; + + case 3: + for ($i = 0; $i < strlen($thisfile_png_chunk_type_text['header']['data']); $i++) { + $thisfile_png_chunk_type_text['palette_opacity'][$i] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $i, 1)); + } + break; + + case 4: + case 6: + $ThisFileInfo['error'][] = 'Invalid color_type in tRNS chunk: '.$thisfile_png['IHDR']['raw']['color_type']; + + default: + $ThisFileInfo['warning'][] = 'Unhandled color_type in tRNS chunk: '.$thisfile_png['IHDR']['raw']['color_type']; + break; + } + break; + + + case 'gAMA': // Image Gamma + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['gamma'] = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']) / 100000; + break; + + + case 'cHRM': // Primary Chromaticities + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['white_x'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 4)) / 100000; + $thisfile_png_chunk_type_text['white_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 4)) / 100000; + $thisfile_png_chunk_type_text['red_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 8, 4)) / 100000; + $thisfile_png_chunk_type_text['red_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 12, 4)) / 100000; + $thisfile_png_chunk_type_text['green_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 16, 4)) / 100000; + $thisfile_png_chunk_type_text['green_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 20, 4)) / 100000; + $thisfile_png_chunk_type_text['blue_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 24, 4)) / 100000; + $thisfile_png_chunk_type_text['blue_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 28, 4)) / 100000; + break; + + + case 'sRGB': // Standard RGB Color Space + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['reindering_intent'] = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']); + $thisfile_png_chunk_type_text['reindering_intent_text'] = $this->PNGsRGBintentLookup($thisfile_png_chunk_type_text['reindering_intent']); + break; + + + case 'iCCP': // Embedded ICC Profile + $thisfile_png_chunk_type_text['header'] = $chunk; + list($profilename, $compressiondata) = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2); + $thisfile_png_chunk_type_text['profile_name'] = $profilename; + $thisfile_png_chunk_type_text['compression_method'] = getid3_lib::BigEndian2Int(substr($compressiondata, 0, 1)); + $thisfile_png_chunk_type_text['compression_profile'] = substr($compressiondata, 1); + + $thisfile_png_chunk_type_text['compression_method_text'] = $this->PNGcompressionMethodLookup($thisfile_png_chunk_type_text['compression_method']); + break; + + + case 'tEXt': // Textual Data + $thisfile_png_chunk_type_text['header'] = $chunk; + list($keyword, $text) = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2); + $thisfile_png_chunk_type_text['keyword'] = $keyword; + $thisfile_png_chunk_type_text['text'] = $text; + + $thisfile_png['comments'][$thisfile_png_chunk_type_text['keyword']][] = $thisfile_png_chunk_type_text['text']; + break; + + + case 'zTXt': // Compressed Textual Data + $thisfile_png_chunk_type_text['header'] = $chunk; + list($keyword, $otherdata) = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2); + $thisfile_png_chunk_type_text['keyword'] = $keyword; + $thisfile_png_chunk_type_text['compression_method'] = getid3_lib::BigEndian2Int(substr($otherdata, 0, 1)); + $thisfile_png_chunk_type_text['compressed_text'] = substr($otherdata, 1); + $thisfile_png_chunk_type_text['compression_method_text'] = $this->PNGcompressionMethodLookup($thisfile_png_chunk_type_text['compression_method']); + switch ($thisfile_png_chunk_type_text['compression_method']) { + case 0: + $thisfile_png_chunk_type_text['text'] = gzuncompress($thisfile_png_chunk_type_text['compressed_text']); + break; + + default: + // unknown compression method + break; + } + + if (isset($thisfile_png_chunk_type_text['text'])) { + $thisfile_png['comments'][$thisfile_png_chunk_type_text['keyword']][] = $thisfile_png_chunk_type_text['text']; + } + break; + + + case 'iTXt': // International Textual Data + $thisfile_png_chunk_type_text['header'] = $chunk; + list($keyword, $otherdata) = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2); + $thisfile_png_chunk_type_text['keyword'] = $keyword; + $thisfile_png_chunk_type_text['compression'] = (bool) getid3_lib::BigEndian2Int(substr($otherdata, 0, 1)); + $thisfile_png_chunk_type_text['compression_method'] = getid3_lib::BigEndian2Int(substr($otherdata, 1, 1)); + $thisfile_png_chunk_type_text['compression_method_text'] = $this->PNGcompressionMethodLookup($thisfile_png_chunk_type_text['compression_method']); + list($languagetag, $translatedkeyword, $text) = explode("\x00", substr($otherdata, 2), 3); + $thisfile_png_chunk_type_text['language_tag'] = $languagetag; + $thisfile_png_chunk_type_text['translated_keyword'] = $translatedkeyword; + + if ($thisfile_png_chunk_type_text['compression']) { + + switch ($thisfile_png_chunk_type_text['compression_method']) { + case 0: + $thisfile_png_chunk_type_text['text'] = gzuncompress($text); + break; + + default: + // unknown compression method + break; + } + + } else { + + $thisfile_png_chunk_type_text['text'] = $text; + + } + + if (isset($thisfile_png_chunk_type_text['text'])) { + $thisfile_png['comments'][$thisfile_png_chunk_type_text['keyword']][] = $thisfile_png_chunk_type_text['text']; + } + break; + + + case 'bKGD': // Background Color + $thisfile_png_chunk_type_text['header'] = $chunk; + switch ($thisfile_png['IHDR']['raw']['color_type']) { + case 0: + case 4: + $thisfile_png_chunk_type_text['background_gray'] = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']); + break; + + case 2: + case 6: + $thisfile_png_chunk_type_text['background_red'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth'])); + $thisfile_png_chunk_type_text['background_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth'])); + $thisfile_png_chunk_type_text['background_blue'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth'])); + break; + + case 3: + $thisfile_png_chunk_type_text['background_index'] = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']); + break; + + default: + break; + } + break; + + + case 'pHYs': // Physical Pixel Dimensions + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['pixels_per_unit_x'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 4)); + $thisfile_png_chunk_type_text['pixels_per_unit_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 4)); + $thisfile_png_chunk_type_text['unit_specifier'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 8, 1)); + $thisfile_png_chunk_type_text['unit'] = $this->PNGpHYsUnitLookup($thisfile_png_chunk_type_text['unit_specifier']); + break; + + + case 'sBIT': // Significant Bits + $thisfile_png_chunk_type_text['header'] = $chunk; + switch ($thisfile_png['IHDR']['raw']['color_type']) { + case 0: + $thisfile_png_chunk_type_text['significant_bits_gray'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1)); + break; + + case 2: + case 3: + $thisfile_png_chunk_type_text['significant_bits_red'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1)); + $thisfile_png_chunk_type_text['significant_bits_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1)); + $thisfile_png_chunk_type_text['significant_bits_blue'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 1)); + break; + + case 4: + $thisfile_png_chunk_type_text['significant_bits_gray'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1)); + $thisfile_png_chunk_type_text['significant_bits_alpha'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1)); + break; + + case 6: + $thisfile_png_chunk_type_text['significant_bits_red'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1)); + $thisfile_png_chunk_type_text['significant_bits_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1)); + $thisfile_png_chunk_type_text['significant_bits_blue'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 1)); + $thisfile_png_chunk_type_text['significant_bits_alpha'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 3, 1)); + break; + + default: + break; + } + break; + + + case 'sPLT': // Suggested Palette + $thisfile_png_chunk_type_text['header'] = $chunk; + list($palettename, $otherdata) = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2); + $thisfile_png_chunk_type_text['palette_name'] = $palettename; + $sPLToffset = 0; + $thisfile_png_chunk_type_text['sample_depth_bits'] = getid3_lib::BigEndian2Int(substr($otherdata, $sPLToffset, 1)); + $sPLToffset += 1; + $thisfile_png_chunk_type_text['sample_depth_bytes'] = $thisfile_png_chunk_type_text['sample_depth_bits'] / 8; + $paletteCounter = 0; + while ($sPLToffset < strlen($otherdata)) { + $thisfile_png_chunk_type_text['red'][$paletteCounter] = getid3_lib::BigEndian2Int(substr($otherdata, $sPLToffset, $thisfile_png_chunk_type_text['sample_depth_bytes'])); + $sPLToffset += $thisfile_png_chunk_type_text['sample_depth_bytes']; + $thisfile_png_chunk_type_text['green'][$paletteCounter] = getid3_lib::BigEndian2Int(substr($otherdata, $sPLToffset, $thisfile_png_chunk_type_text['sample_depth_bytes'])); + $sPLToffset += $thisfile_png_chunk_type_text['sample_depth_bytes']; + $thisfile_png_chunk_type_text['blue'][$paletteCounter] = getid3_lib::BigEndian2Int(substr($otherdata, $sPLToffset, $thisfile_png_chunk_type_text['sample_depth_bytes'])); + $sPLToffset += $thisfile_png_chunk_type_text['sample_depth_bytes']; + $thisfile_png_chunk_type_text['alpha'][$paletteCounter] = getid3_lib::BigEndian2Int(substr($otherdata, $sPLToffset, $thisfile_png_chunk_type_text['sample_depth_bytes'])); + $sPLToffset += $thisfile_png_chunk_type_text['sample_depth_bytes']; + $thisfile_png_chunk_type_text['frequency'][$paletteCounter] = getid3_lib::BigEndian2Int(substr($otherdata, $sPLToffset, 2)); + $sPLToffset += 2; + $paletteCounter++; + } + break; + + + case 'hIST': // Palette Histogram + $thisfile_png_chunk_type_text['header'] = $chunk; + $hISTcounter = 0; + while ($hISTcounter < strlen($thisfile_png_chunk_type_text['header']['data'])) { + $thisfile_png_chunk_type_text[$hISTcounter] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $hISTcounter / 2, 2)); + $hISTcounter += 2; + } + break; + + + case 'tIME': // Image Last-Modification Time + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['year'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 2)); + $thisfile_png_chunk_type_text['month'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 1)); + $thisfile_png_chunk_type_text['day'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 3, 1)); + $thisfile_png_chunk_type_text['hour'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 1)); + $thisfile_png_chunk_type_text['minute'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 5, 1)); + $thisfile_png_chunk_type_text['second'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 6, 1)); + $thisfile_png_chunk_type_text['unix'] = gmmktime($thisfile_png_chunk_type_text['hour'], $thisfile_png_chunk_type_text['minute'], $thisfile_png_chunk_type_text['second'], $thisfile_png_chunk_type_text['month'], $thisfile_png_chunk_type_text['day'], $thisfile_png_chunk_type_text['year']); + break; + + + case 'oFFs': // Image Offset + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['position_x'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 4), false, true); + $thisfile_png_chunk_type_text['position_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 4), false, true); + $thisfile_png_chunk_type_text['unit_specifier'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 8, 1)); + $thisfile_png_chunk_type_text['unit'] = $this->PNGoFFsUnitLookup($thisfile_png_chunk_type_text['unit_specifier']); + break; + + + case 'pCAL': // Calibration Of Pixel Values + $thisfile_png_chunk_type_text['header'] = $chunk; + list($calibrationname, $otherdata) = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2); + $thisfile_png_chunk_type_text['calibration_name'] = $calibrationname; + $pCALoffset = 0; + $thisfile_png_chunk_type_text['original_zero'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 4), false, true); + $pCALoffset += 4; + $thisfile_png_chunk_type_text['original_max'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 4), false, true); + $pCALoffset += 4; + $thisfile_png_chunk_type_text['equation_type'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 1)); + $pCALoffset += 1; + $thisfile_png_chunk_type_text['equation_type_text'] = $this->PNGpCALequationTypeLookup($thisfile_png_chunk_type_text['equation_type']); + $thisfile_png_chunk_type_text['parameter_count'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 1)); + $pCALoffset += 1; + $thisfile_png_chunk_type_text['parameters'] = explode("\x00", substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset)); + break; + + + case 'sCAL': // Physical Scale Of Image Subject + $thisfile_png_chunk_type_text['header'] = $chunk; + $thisfile_png_chunk_type_text['unit_specifier'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1)); + $thisfile_png_chunk_type_text['unit'] = $this->PNGsCALUnitLookup($thisfile_png_chunk_type_text['unit_specifier']); + list($pixelwidth, $pixelheight) = explode("\x00", substr($thisfile_png_chunk_type_text['header']['data'], 1)); + $thisfile_png_chunk_type_text['pixel_width'] = $pixelwidth; + $thisfile_png_chunk_type_text['pixel_height'] = $pixelheight; + break; + + + case 'gIFg': // GIF Graphic Control Extension + $gIFgCounter = 0; + if (isset($thisfile_png_chunk_type_text) && is_array($thisfile_png_chunk_type_text)) { + $gIFgCounter = count($thisfile_png_chunk_type_text); + } + $thisfile_png_chunk_type_text[$gIFgCounter]['header'] = $chunk; + $thisfile_png_chunk_type_text[$gIFgCounter]['disposal_method'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1)); + $thisfile_png_chunk_type_text[$gIFgCounter]['user_input_flag'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1)); + $thisfile_png_chunk_type_text[$gIFgCounter]['delay_time'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 2)); + break; + + + case 'gIFx': // GIF Application Extension + $gIFxCounter = 0; + if (isset($thisfile_png_chunk_type_text) && is_array($thisfile_png_chunk_type_text)) { + $gIFxCounter = count($thisfile_png_chunk_type_text); + } + $thisfile_png_chunk_type_text[$gIFxCounter]['header'] = $chunk; + $thisfile_png_chunk_type_text[$gIFxCounter]['application_identifier'] = substr($thisfile_png_chunk_type_text['header']['data'], 0, 8); + $thisfile_png_chunk_type_text[$gIFxCounter]['authentication_code'] = substr($thisfile_png_chunk_type_text['header']['data'], 8, 3); + $thisfile_png_chunk_type_text[$gIFxCounter]['application_data'] = substr($thisfile_png_chunk_type_text['header']['data'], 11); + break; + + + case 'IDAT': // Image Data + $idatinformationfieldindex = 0; + if (isset($thisfile_png['IDAT']) && is_array($thisfile_png['IDAT'])) { + $idatinformationfieldindex = count($thisfile_png['IDAT']); + } + unset($chunk['data']); + $thisfile_png_chunk_type_text[$idatinformationfieldindex]['header'] = $chunk; + break; + + + case 'IEND': // Image Trailer + $thisfile_png_chunk_type_text['header'] = $chunk; + break; + + + default: + //unset($chunk['data']); + $thisfile_png_chunk_type_text['header'] = $chunk; + $ThisFileInfo['warning'][] = 'Unhandled chunk type: '.$chunk['type_text']; + break; + } + } + + return true; + } + + function PNGsRGBintentLookup($sRGB) { + static $PNGsRGBintentLookup = array( + 0 => 'Perceptual', + 1 => 'Relative colorimetric', + 2 => 'Saturation', + 3 => 'Absolute colorimetric' + ); + return (isset($PNGsRGBintentLookup[$sRGB]) ? $PNGsRGBintentLookup[$sRGB] : 'invalid'); + } + + function PNGcompressionMethodLookup($compressionmethod) { + static $PNGcompressionMethodLookup = array( + 0 => 'deflate/inflate' + ); + return (isset($PNGcompressionMethodLookup[$compressionmethod]) ? $PNGcompressionMethodLookup[$compressionmethod] : 'invalid'); + } + + function PNGpHYsUnitLookup($unitid) { + static $PNGpHYsUnitLookup = array( + 0 => 'unknown', + 1 => 'meter' + ); + return (isset($PNGpHYsUnitLookup[$unitid]) ? $PNGpHYsUnitLookup[$unitid] : 'invalid'); + } + + function PNGoFFsUnitLookup($unitid) { + static $PNGoFFsUnitLookup = array( + 0 => 'pixel', + 1 => 'micrometer' + ); + return (isset($PNGoFFsUnitLookup[$unitid]) ? $PNGoFFsUnitLookup[$unitid] : 'invalid'); + } + + function PNGpCALequationTypeLookup($equationtype) { + static $PNGpCALequationTypeLookup = array( + 0 => 'Linear mapping', + 1 => 'Base-e exponential mapping', + 2 => 'Arbitrary-base exponential mapping', + 3 => 'Hyperbolic mapping' + ); + return (isset($PNGpCALequationTypeLookup[$equationtype]) ? $PNGpCALequationTypeLookup[$equationtype] : 'invalid'); + } + + function PNGsCALUnitLookup($unitid) { + static $PNGsCALUnitLookup = array( + 0 => 'meter', + 1 => 'radian' + ); + return (isset($PNGsCALUnitLookup[$unitid]) ? $PNGsCALUnitLookup[$unitid] : 'invalid'); + } + + function IHDRcalculateBitsPerSample($color_type, $bit_depth) { + switch ($color_type) { + case 0: // Each pixel is a grayscale sample. + return $bit_depth; + break; + + case 2: // Each pixel is an R,G,B triple + return 3 * $bit_depth; + break; + + case 3: // Each pixel is a palette index; a PLTE chunk must appear. + return $bit_depth; + break; + + case 4: // Each pixel is a grayscale sample, followed by an alpha sample. + return 2 * $bit_depth; + break; + + case 6: // Each pixel is an R,G,B triple, followed by an alpha sample. + return 4 * $bit_depth; + break; + } + return false; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.graphic.svg.php b/campcaster/src/modules/getid3/var/module.graphic.svg.php new file mode 100644 index 000000000..e4471456c --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.graphic.svg.php @@ -0,0 +1,52 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.graphic.svg.php // +// module for analyzing SVG Image files // +// dependencies: NONE // +// author: Bryce Harrington // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_svg +{ + + + function getid3_svg(&$fd, &$ThisFileInfo) { + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + + // I'm making this up, please modify as appropriate + $SVGheader = fread($fd, 32); + $ThisFileInfo['svg']['magic'] = substr($SVGheader, 0, 4); + if ($ThisFileInfo['svg']['magic'] == 'aBcD') { + + $ThisFileInfo['fileformat'] = 'svg'; + $ThisFileInfo['video']['dataformat'] = 'svg'; + $ThisFileInfo['video']['lossless'] = true; + $ThisFileInfo['video']['bits_per_sample'] = 24; + $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1; + + $ThisFileInfo['svg']['width'] = getid3_lib::LittleEndian2Int(substr($fileData, 4, 4)); + $ThisFileInfo['svg']['height'] = getid3_lib::LittleEndian2Int(substr($fileData, 8, 4)); + + $ThisFileInfo['video']['resolution_x'] = $ThisFileInfo['svg']['width']; + $ThisFileInfo['video']['resolution_y'] = $ThisFileInfo['svg']['height']; + + return true; + } + $ThisFileInfo['error'][] = 'Did not find SVG magic bytes "aBcD" at '.$ThisFileInfo['avdataoffset']; + unset($ThisFileInfo['fileformat']); + return false; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.graphic.tiff.php b/campcaster/src/modules/getid3/var/module.graphic.tiff.php new file mode 100644 index 000000000..ae57cd6ad --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.graphic.tiff.php @@ -0,0 +1,221 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.archive.tiff.php // +// module for analyzing TIFF files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_tiff +{ + + function getid3_tiff(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $TIFFheader = fread($fd, 4); + + switch (substr($TIFFheader, 0, 2)) { + case 'II': + $ThisFileInfo['tiff']['byte_order'] = 'Intel'; + break; + case 'MM': + $ThisFileInfo['tiff']['byte_order'] = 'Motorola'; + break; + default: + $ThisFileInfo['error'][] = 'Invalid TIFF byte order identifier ('.substr($TIFFheader, 0, 2).') at offset '.$ThisFileInfo['avdataoffset']; + return false; + break; + } + + $ThisFileInfo['fileformat'] = 'tiff'; + $ThisFileInfo['video']['dataformat'] = 'tiff'; + $ThisFileInfo['video']['lossless'] = true; + $ThisFileInfo['tiff']['ifd'] = array(); + $CurrentIFD = array(); + + $FieldTypeByteLength = array(1=>1, 2=>1, 3=>2, 4=>4, 5=>8); + + $nextIFDoffset = $this->TIFFendian2Int(fread($fd, 4), $ThisFileInfo['tiff']['byte_order']); + + while ($nextIFDoffset > 0) { + + $CurrentIFD['offset'] = $nextIFDoffset; + + fseek($fd, $ThisFileInfo['avdataoffset'] + $nextIFDoffset, SEEK_SET); + $CurrentIFD['fieldcount'] = $this->TIFFendian2Int(fread($fd, 2), $ThisFileInfo['tiff']['byte_order']); + + for ($i = 0; $i < $CurrentIFD['fieldcount']; $i++) { + $CurrentIFD['fields'][$i]['raw']['tag'] = $this->TIFFendian2Int(fread($fd, 2), $ThisFileInfo['tiff']['byte_order']); + $CurrentIFD['fields'][$i]['raw']['type'] = $this->TIFFendian2Int(fread($fd, 2), $ThisFileInfo['tiff']['byte_order']); + $CurrentIFD['fields'][$i]['raw']['length'] = $this->TIFFendian2Int(fread($fd, 4), $ThisFileInfo['tiff']['byte_order']); + $CurrentIFD['fields'][$i]['raw']['offset'] = fread($fd, 4); + + switch ($CurrentIFD['fields'][$i]['raw']['type']) { + case 1: // BYTE An 8-bit unsigned integer. + if ($CurrentIFD['fields'][$i]['raw']['length'] <= 4) { + $CurrentIFD['fields'][$i]['value'] = $this->TIFFendian2Int(substr($CurrentIFD['fields'][$i]['raw']['offset'], 0, 1), $ThisFileInfo['tiff']['byte_order']); + } else { + $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $ThisFileInfo['tiff']['byte_order']); + } + break; + + case 2: // ASCII 8-bit bytes that store ASCII codes; the last byte must be null. + if ($CurrentIFD['fields'][$i]['raw']['length'] <= 4) { + $CurrentIFD['fields'][$i]['value'] = substr($CurrentIFD['fields'][$i]['raw']['offset'], 3); + } else { + $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $ThisFileInfo['tiff']['byte_order']); + } + break; + + case 3: // SHORT A 16-bit (2-byte) unsigned integer. + if ($CurrentIFD['fields'][$i]['raw']['length'] <= 2) { + $CurrentIFD['fields'][$i]['value'] = $this->TIFFendian2Int(substr($CurrentIFD['fields'][$i]['raw']['offset'], 0, 2), $ThisFileInfo['tiff']['byte_order']); + } else { + $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $ThisFileInfo['tiff']['byte_order']); + } + break; + + case 4: // LONG A 32-bit (4-byte) unsigned integer. + if ($CurrentIFD['fields'][$i]['raw']['length'] <= 1) { + $CurrentIFD['fields'][$i]['value'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $ThisFileInfo['tiff']['byte_order']); + } else { + $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $ThisFileInfo['tiff']['byte_order']); + } + break; + + case 5: // RATIONAL Two LONG_s: the first represents the numerator of a fraction, the second the denominator. + break; + } + } + + $ThisFileInfo['tiff']['ifd'][] = $CurrentIFD; + $CurrentIFD = array(); + $nextIFDoffset = $this->TIFFendian2Int(fread($fd, 4), $ThisFileInfo['tiff']['byte_order']); + + } + + foreach ($ThisFileInfo['tiff']['ifd'] as $IFDid => $IFDarray) { + foreach ($IFDarray['fields'] as $key => $fieldarray) { + switch ($fieldarray['raw']['tag']) { + case 256: // ImageWidth + case 257: // ImageLength + case 258: // BitsPerSample + case 259: // Compression + if (!isset($fieldarray['value'])) { + fseek($fd, $fieldarray['offset'], SEEK_SET); + $ThisFileInfo['tiff']['ifd'][$IFDid]['fields'][$key]['raw']['data'] = fread($fd, $fieldarray['raw']['length'] * $FieldTypeByteLength[$fieldarray['raw']['type']]); + + } + break; + + case 270: // ImageDescription + case 271: // Make + case 272: // Model + case 305: // Software + case 306: // DateTime + case 315: // Artist + case 316: // HostComputer + if (isset($fieldarray['value'])) { + $ThisFileInfo['tiff']['ifd'][$IFDid]['fields'][$key]['raw']['data'] = $fieldarray['value']; + } else { + fseek($fd, $fieldarray['offset'], SEEK_SET); + $ThisFileInfo['tiff']['ifd'][$IFDid]['fields'][$key]['raw']['data'] = fread($fd, $fieldarray['raw']['length'] * $FieldTypeByteLength[$fieldarray['raw']['type']]); + + } + break; + } + switch ($fieldarray['raw']['tag']) { + case 256: // ImageWidth + $ThisFileInfo['video']['resolution_x'] = $fieldarray['value']; + break; + + case 257: // ImageLength + $ThisFileInfo['video']['resolution_y'] = $fieldarray['value']; + break; + + case 258: // BitsPerSample + if (isset($fieldarray['value'])) { + $ThisFileInfo['video']['bits_per_sample'] = $fieldarray['value']; + } else { + $ThisFileInfo['video']['bits_per_sample'] = 0; + for ($i = 0; $i < $fieldarray['raw']['length']; $i++) { + $ThisFileInfo['video']['bits_per_sample'] += $this->TIFFendian2Int(substr($ThisFileInfo['tiff']['ifd'][$IFDid]['fields'][$key]['raw']['data'], $i * $FieldTypeByteLength[$fieldarray['raw']['type']], $FieldTypeByteLength[$fieldarray['raw']['type']]), $ThisFileInfo['tiff']['byte_order']); + } + } + break; + + case 259: // Compression + $ThisFileInfo['video']['codec'] = $this->TIFFcompressionMethod($fieldarray['value']); + break; + + case 270: // ImageDescription + case 271: // Make + case 272: // Model + case 305: // Software + case 306: // DateTime + case 315: // Artist + case 316: // HostComputer + @$ThisFileInfo['tiff']['comments'][$this->TIFFcommentName($fieldarray['raw']['tag'])][] = $ThisFileInfo['tiff']['ifd'][$IFDid]['fields'][$key]['raw']['data']; + break; + + default: + break; + } + } + } + + return true; + } + + + function TIFFendian2Int($bytestring, $byteorder) { + if ($byteorder == 'Intel') { + return getid3_lib::LittleEndian2Int($bytestring); + } elseif ($byteorder == 'Motorola') { + return getid3_lib::BigEndian2Int($bytestring); + } + return false; + } + + function TIFFcompressionMethod($id) { + static $TIFFcompressionMethod = array(); + if (empty($TIFFcompressionMethod)) { + $TIFFcompressionMethod = array( + 1 => 'Uncompressed', + 2 => 'Huffman', + 3 => 'Fax - CCITT 3', + 5 => 'LZW', + 32773 => 'PackBits', + ); + } + return (isset($TIFFcompressionMethod[$id]) ? $TIFFcompressionMethod[$id] : 'unknown/invalid ('.$id.')'); + } + + function TIFFcommentName($id) { + static $TIFFcommentName = array(); + if (empty($TIFFcommentName)) { + $TIFFcommentName = array( + 270 => 'imagedescription', + 271 => 'make', + 272 => 'model', + 305 => 'software', + 306 => 'datetime', + 315 => 'artist', + 316 => 'hostcomputer', + ); + } + return (isset($TIFFcommentName[$id]) ? $TIFFcommentName[$id] : 'unknown/invalid ('.$id.')'); + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.misc.exe.php b/campcaster/src/modules/getid3/var/module.misc.exe.php new file mode 100644 index 000000000..8c6bfcf99 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.misc.exe.php @@ -0,0 +1,59 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.misc.exe.php // +// module for analyzing EXE files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_exe +{ + + function getid3_exe(&$fd, &$ThisFileInfo) { + + fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); + $EXEheader = fread($fd, 28); + + if (substr($EXEheader, 0, 2) != 'MZ') { + $ThisFileInfo['error'][] = 'Expecting "MZ" at offset '.$ThisFileInfo['avdataoffset'].', found "'.substr($EXEheader, 0, 2).'" instead.'; + return false; + } + + $ThisFileInfo['fileformat'] = 'exe'; + $ThisFileInfo['exe']['mz']['magic'] = 'MZ'; + + $ThisFileInfo['exe']['mz']['raw']['last_page_size'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 2, 2)); + $ThisFileInfo['exe']['mz']['raw']['page_count'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 4, 2)); + $ThisFileInfo['exe']['mz']['raw']['relocation_count'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 6, 2)); + $ThisFileInfo['exe']['mz']['raw']['header_paragraphs'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 8, 2)); + $ThisFileInfo['exe']['mz']['raw']['min_memory_paragraphs'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 10, 2)); + $ThisFileInfo['exe']['mz']['raw']['max_memory_paragraphs'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 12, 2)); + $ThisFileInfo['exe']['mz']['raw']['initial_ss'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 14, 2)); + $ThisFileInfo['exe']['mz']['raw']['initial_sp'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 16, 2)); + $ThisFileInfo['exe']['mz']['raw']['checksum'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 18, 2)); + $ThisFileInfo['exe']['mz']['raw']['cs_ip'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 20, 4)); + $ThisFileInfo['exe']['mz']['raw']['relocation_table_offset'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 24, 2)); + $ThisFileInfo['exe']['mz']['raw']['overlay_number'] = getid3_lib::LittleEndian2Int(substr($EXEheader, 26, 2)); + + $ThisFileInfo['exe']['mz']['byte_size'] = (($ThisFileInfo['exe']['mz']['raw']['page_count'] - 1)) * 512 + $ThisFileInfo['exe']['mz']['raw']['last_page_size']; + $ThisFileInfo['exe']['mz']['header_size'] = $ThisFileInfo['exe']['mz']['raw']['header_paragraphs'] * 16; + $ThisFileInfo['exe']['mz']['memory_minimum'] = $ThisFileInfo['exe']['mz']['raw']['min_memory_paragraphs'] * 16; + $ThisFileInfo['exe']['mz']['memory_recommended'] = $ThisFileInfo['exe']['mz']['raw']['max_memory_paragraphs'] * 16; + +$ThisFileInfo['error'][] = 'EXE parsing not enabled in this version of getID3()'; +return false; + + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.misc.iso.php b/campcaster/src/modules/getid3/var/module.misc.iso.php new file mode 100644 index 000000000..94df9294f --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.misc.iso.php @@ -0,0 +1,386 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.misc.iso.php // +// module for analyzing ISO files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_iso +{ + + function getid3_iso($fd, &$ThisFileInfo) { + $ThisFileInfo['fileformat'] = 'iso'; + + for ($i = 16; $i <= 19; $i++) { + fseek($fd, 2048 * $i, SEEK_SET); + $ISOheader = fread($fd, 2048); + if (substr($ISOheader, 1, 5) == 'CD001') { + switch (ord($ISOheader{0})) { + case 1: + $ThisFileInfo['iso']['primary_volume_descriptor']['offset'] = 2048 * $i; + $this->ParsePrimaryVolumeDescriptor($ISOheader, $ThisFileInfo); + break; + + case 2: + $ThisFileInfo['iso']['supplementary_volume_descriptor']['offset'] = 2048 * $i; + $this->ParseSupplementaryVolumeDescriptor($ISOheader, $ThisFileInfo); + break; + + default: + // skip + break; + } + } + } + + $this->ParsePathTable($fd, $ThisFileInfo); + + $ThisFileInfo['iso']['files'] = array(); + foreach ($ThisFileInfo['iso']['path_table']['directories'] as $directorynum => $directorydata) { + + $ThisFileInfo['iso']['directories'][$directorynum] = $this->ParseDirectoryRecord($fd, $directorydata, $ThisFileInfo); + + } + + return true; + + } + + + function ParsePrimaryVolumeDescriptor(&$ISOheader, &$ThisFileInfo) { + // ISO integer values are stored *BOTH* Little-Endian AND Big-Endian format!! + // ie 12345 == 0x3039 is stored as $39 $30 $30 $39 in a 4-byte field + + // shortcuts + $ThisFileInfo['iso']['primary_volume_descriptor']['raw'] = array(); + $thisfile_iso_primaryVD = &$ThisFileInfo['iso']['primary_volume_descriptor']; + $thisfile_iso_primaryVD_raw = &$thisfile_iso_primaryVD['raw']; + + $thisfile_iso_primaryVD_raw['volume_descriptor_type'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 0, 1)); + $thisfile_iso_primaryVD_raw['standard_identifier'] = substr($ISOheader, 1, 5); + if ($thisfile_iso_primaryVD_raw['standard_identifier'] != 'CD001') { + $ThisFileInfo['error'][] = 'Expected "CD001" at offset ('.($thisfile_iso_primaryVD['offset'] + 1).'), found "'.$thisfile_iso_primaryVD_raw['standard_identifier'].'" instead'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['iso']); + return false; + } + + + $thisfile_iso_primaryVD_raw['volume_descriptor_version'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 6, 1)); + //$thisfile_iso_primaryVD_raw['unused_1'] = substr($ISOheader, 7, 1); + $thisfile_iso_primaryVD_raw['system_identifier'] = substr($ISOheader, 8, 32); + $thisfile_iso_primaryVD_raw['volume_identifier'] = substr($ISOheader, 40, 32); + //$thisfile_iso_primaryVD_raw['unused_2'] = substr($ISOheader, 72, 8); + $thisfile_iso_primaryVD_raw['volume_space_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 80, 4)); + //$thisfile_iso_primaryVD_raw['unused_3'] = substr($ISOheader, 88, 32); + $thisfile_iso_primaryVD_raw['volume_set_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 120, 2)); + $thisfile_iso_primaryVD_raw['volume_sequence_number'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 124, 2)); + $thisfile_iso_primaryVD_raw['logical_block_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 128, 2)); + $thisfile_iso_primaryVD_raw['path_table_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 132, 4)); + $thisfile_iso_primaryVD_raw['path_table_l_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 140, 2)); + $thisfile_iso_primaryVD_raw['path_table_l_opt_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 144, 2)); + $thisfile_iso_primaryVD_raw['path_table_m_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 148, 2)); + $thisfile_iso_primaryVD_raw['path_table_m_opt_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 152, 2)); + $thisfile_iso_primaryVD_raw['root_directory_record'] = substr($ISOheader, 156, 34); + $thisfile_iso_primaryVD_raw['volume_set_identifier'] = substr($ISOheader, 190, 128); + $thisfile_iso_primaryVD_raw['publisher_identifier'] = substr($ISOheader, 318, 128); + $thisfile_iso_primaryVD_raw['data_preparer_identifier'] = substr($ISOheader, 446, 128); + $thisfile_iso_primaryVD_raw['application_identifier'] = substr($ISOheader, 574, 128); + $thisfile_iso_primaryVD_raw['copyright_file_identifier'] = substr($ISOheader, 702, 37); + $thisfile_iso_primaryVD_raw['abstract_file_identifier'] = substr($ISOheader, 739, 37); + $thisfile_iso_primaryVD_raw['bibliographic_file_identifier'] = substr($ISOheader, 776, 37); + $thisfile_iso_primaryVD_raw['volume_creation_date_time'] = substr($ISOheader, 813, 17); + $thisfile_iso_primaryVD_raw['volume_modification_date_time'] = substr($ISOheader, 830, 17); + $thisfile_iso_primaryVD_raw['volume_expiration_date_time'] = substr($ISOheader, 847, 17); + $thisfile_iso_primaryVD_raw['volume_effective_date_time'] = substr($ISOheader, 864, 17); + $thisfile_iso_primaryVD_raw['file_structure_version'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 881, 1)); + //$thisfile_iso_primaryVD_raw['unused_4'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 882, 1)); + $thisfile_iso_primaryVD_raw['application_data'] = substr($ISOheader, 883, 512); + //$thisfile_iso_primaryVD_raw['unused_5'] = substr($ISOheader, 1395, 653); + + $thisfile_iso_primaryVD['system_identifier'] = trim($thisfile_iso_primaryVD_raw['system_identifier']); + $thisfile_iso_primaryVD['volume_identifier'] = trim($thisfile_iso_primaryVD_raw['volume_identifier']); + $thisfile_iso_primaryVD['volume_set_identifier'] = trim($thisfile_iso_primaryVD_raw['volume_set_identifier']); + $thisfile_iso_primaryVD['publisher_identifier'] = trim($thisfile_iso_primaryVD_raw['publisher_identifier']); + $thisfile_iso_primaryVD['data_preparer_identifier'] = trim($thisfile_iso_primaryVD_raw['data_preparer_identifier']); + $thisfile_iso_primaryVD['application_identifier'] = trim($thisfile_iso_primaryVD_raw['application_identifier']); + $thisfile_iso_primaryVD['copyright_file_identifier'] = trim($thisfile_iso_primaryVD_raw['copyright_file_identifier']); + $thisfile_iso_primaryVD['abstract_file_identifier'] = trim($thisfile_iso_primaryVD_raw['abstract_file_identifier']); + $thisfile_iso_primaryVD['bibliographic_file_identifier'] = trim($thisfile_iso_primaryVD_raw['bibliographic_file_identifier']); + $thisfile_iso_primaryVD['volume_creation_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_primaryVD_raw['volume_creation_date_time']); + $thisfile_iso_primaryVD['volume_modification_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_primaryVD_raw['volume_modification_date_time']); + $thisfile_iso_primaryVD['volume_expiration_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_primaryVD_raw['volume_expiration_date_time']); + $thisfile_iso_primaryVD['volume_effective_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_primaryVD_raw['volume_effective_date_time']); + + if (($thisfile_iso_primaryVD_raw['volume_space_size'] * 2048) > $ThisFileInfo['filesize']) { + $ThisFileInfo['error'][] = 'Volume Space Size ('.($thisfile_iso_primaryVD_raw['volume_space_size'] * 2048).' bytes) is larger than the file size ('.$ThisFileInfo['filesize'].' bytes) (truncated file?)'; + } + + return true; + } + + + function ParseSupplementaryVolumeDescriptor(&$ISOheader, &$ThisFileInfo) { + // ISO integer values are stored Both-Endian format!! + // ie 12345 == 0x3039 is stored as $39 $30 $30 $39 in a 4-byte field + + // shortcuts + $ThisFileInfo['iso']['supplementary_volume_descriptor']['raw'] = array(); + $thisfile_iso_supplementaryVD = &$ThisFileInfo['iso']['supplementary_volume_descriptor']; + $thisfile_iso_supplementaryVD_raw = &$thisfile_iso_supplementaryVD['raw']; + + $thisfile_iso_supplementaryVD_raw['volume_descriptor_type'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 0, 1)); + $thisfile_iso_supplementaryVD_raw['standard_identifier'] = substr($ISOheader, 1, 5); + if ($thisfile_iso_supplementaryVD_raw['standard_identifier'] != 'CD001') { + $ThisFileInfo['error'][] = 'Expected "CD001" at offset ('.($thisfile_iso_supplementaryVD['offset'] + 1).'), found "'.$thisfile_iso_supplementaryVD_raw['standard_identifier'].'" instead'; + unset($ThisFileInfo['fileformat']); + unset($ThisFileInfo['iso']); + return false; + } + + $thisfile_iso_supplementaryVD_raw['volume_descriptor_version'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 6, 1)); + //$thisfile_iso_supplementaryVD_raw['unused_1'] = substr($ISOheader, 7, 1); + $thisfile_iso_supplementaryVD_raw['system_identifier'] = substr($ISOheader, 8, 32); + $thisfile_iso_supplementaryVD_raw['volume_identifier'] = substr($ISOheader, 40, 32); + //$thisfile_iso_supplementaryVD_raw['unused_2'] = substr($ISOheader, 72, 8); + $thisfile_iso_supplementaryVD_raw['volume_space_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 80, 4)); + if ($thisfile_iso_supplementaryVD_raw['volume_space_size'] == 0) { + // Supplementary Volume Descriptor not used + //unset($thisfile_iso_supplementaryVD); + //return false; + } + + //$thisfile_iso_supplementaryVD_raw['unused_3'] = substr($ISOheader, 88, 32); + $thisfile_iso_supplementaryVD_raw['volume_set_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 120, 2)); + $thisfile_iso_supplementaryVD_raw['volume_sequence_number'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 124, 2)); + $thisfile_iso_supplementaryVD_raw['logical_block_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 128, 2)); + $thisfile_iso_supplementaryVD_raw['path_table_size'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 132, 4)); + $thisfile_iso_supplementaryVD_raw['path_table_l_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 140, 2)); + $thisfile_iso_supplementaryVD_raw['path_table_l_opt_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 144, 2)); + $thisfile_iso_supplementaryVD_raw['path_table_m_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 148, 2)); + $thisfile_iso_supplementaryVD_raw['path_table_m_opt_location'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 152, 2)); + $thisfile_iso_supplementaryVD_raw['root_directory_record'] = substr($ISOheader, 156, 34); + $thisfile_iso_supplementaryVD_raw['volume_set_identifier'] = substr($ISOheader, 190, 128); + $thisfile_iso_supplementaryVD_raw['publisher_identifier'] = substr($ISOheader, 318, 128); + $thisfile_iso_supplementaryVD_raw['data_preparer_identifier'] = substr($ISOheader, 446, 128); + $thisfile_iso_supplementaryVD_raw['application_identifier'] = substr($ISOheader, 574, 128); + $thisfile_iso_supplementaryVD_raw['copyright_file_identifier'] = substr($ISOheader, 702, 37); + $thisfile_iso_supplementaryVD_raw['abstract_file_identifier'] = substr($ISOheader, 739, 37); + $thisfile_iso_supplementaryVD_raw['bibliographic_file_identifier'] = substr($ISOheader, 776, 37); + $thisfile_iso_supplementaryVD_raw['volume_creation_date_time'] = substr($ISOheader, 813, 17); + $thisfile_iso_supplementaryVD_raw['volume_modification_date_time'] = substr($ISOheader, 830, 17); + $thisfile_iso_supplementaryVD_raw['volume_expiration_date_time'] = substr($ISOheader, 847, 17); + $thisfile_iso_supplementaryVD_raw['volume_effective_date_time'] = substr($ISOheader, 864, 17); + $thisfile_iso_supplementaryVD_raw['file_structure_version'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 881, 1)); + //$thisfile_iso_supplementaryVD_raw['unused_4'] = getid3_lib::LittleEndian2Int(substr($ISOheader, 882, 1)); + $thisfile_iso_supplementaryVD_raw['application_data'] = substr($ISOheader, 883, 512); + //$thisfile_iso_supplementaryVD_raw['unused_5'] = substr($ISOheader, 1395, 653); + + $thisfile_iso_supplementaryVD['system_identifier'] = trim($thisfile_iso_supplementaryVD_raw['system_identifier']); + $thisfile_iso_supplementaryVD['volume_identifier'] = trim($thisfile_iso_supplementaryVD_raw['volume_identifier']); + $thisfile_iso_supplementaryVD['volume_set_identifier'] = trim($thisfile_iso_supplementaryVD_raw['volume_set_identifier']); + $thisfile_iso_supplementaryVD['publisher_identifier'] = trim($thisfile_iso_supplementaryVD_raw['publisher_identifier']); + $thisfile_iso_supplementaryVD['data_preparer_identifier'] = trim($thisfile_iso_supplementaryVD_raw['data_preparer_identifier']); + $thisfile_iso_supplementaryVD['application_identifier'] = trim($thisfile_iso_supplementaryVD_raw['application_identifier']); + $thisfile_iso_supplementaryVD['copyright_file_identifier'] = trim($thisfile_iso_supplementaryVD_raw['copyright_file_identifier']); + $thisfile_iso_supplementaryVD['abstract_file_identifier'] = trim($thisfile_iso_supplementaryVD_raw['abstract_file_identifier']); + $thisfile_iso_supplementaryVD['bibliographic_file_identifier'] = trim($thisfile_iso_supplementaryVD_raw['bibliographic_file_identifier']); + $thisfile_iso_supplementaryVD['volume_creation_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_supplementaryVD_raw['volume_creation_date_time']); + $thisfile_iso_supplementaryVD['volume_modification_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_supplementaryVD_raw['volume_modification_date_time']); + $thisfile_iso_supplementaryVD['volume_expiration_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_supplementaryVD_raw['volume_expiration_date_time']); + $thisfile_iso_supplementaryVD['volume_effective_date_time'] = $this->ISOtimeText2UNIXtime($thisfile_iso_supplementaryVD_raw['volume_effective_date_time']); + + if (($thisfile_iso_supplementaryVD_raw['volume_space_size'] * $thisfile_iso_supplementaryVD_raw['logical_block_size']) > $ThisFileInfo['filesize']) { + $ThisFileInfo['error'][] = 'Volume Space Size ('.($thisfile_iso_supplementaryVD_raw['volume_space_size'] * $thisfile_iso_supplementaryVD_raw['logical_block_size']).' bytes) is larger than the file size ('.$ThisFileInfo['filesize'].' bytes) (truncated file?)'; + } + + return true; + } + + + function ParsePathTable($fd, &$ThisFileInfo) { + if (!isset($ThisFileInfo['iso']['supplementary_volume_descriptor']['raw']['path_table_l_location']) && !isset($ThisFileInfo['iso']['primary_volume_descriptor']['raw']['path_table_l_location'])) { + return false; + } + if (isset($ThisFileInfo['iso']['supplementary_volume_descriptor']['raw']['path_table_l_location'])) { + $PathTableLocation = $ThisFileInfo['iso']['supplementary_volume_descriptor']['raw']['path_table_l_location']; + $PathTableSize = $ThisFileInfo['iso']['supplementary_volume_descriptor']['raw']['path_table_size']; + $TextEncoding = 'UTF-16BE'; // Big-Endian Unicode + } else { + $PathTableLocation = $ThisFileInfo['iso']['primary_volume_descriptor']['raw']['path_table_l_location']; + $PathTableSize = $ThisFileInfo['iso']['primary_volume_descriptor']['raw']['path_table_size']; + $TextEncoding = 'ISO-8859-1'; // Latin-1 + } + + if (($PathTableLocation * 2048) > $ThisFileInfo['filesize']) { + $ThisFileInfo['error'][] = 'Path Table Location specifies an offset ('.($PathTableLocation * 2048).') beyond the end-of-file ('.$ThisFileInfo['filesize'].')'; + return false; + } + + $ThisFileInfo['iso']['path_table']['offset'] = $PathTableLocation * 2048; + fseek($fd, $ThisFileInfo['iso']['path_table']['offset'], SEEK_SET); + $ThisFileInfo['iso']['path_table']['raw'] = fread($fd, $PathTableSize); + + $offset = 0; + $pathcounter = 1; + while ($offset < $PathTableSize) { + // shortcut + $ThisFileInfo['iso']['path_table']['directories'][$pathcounter] = array(); + $thisfile_iso_pathtable_directories_current = &$ThisFileInfo['iso']['path_table']['directories'][$pathcounter]; + + $thisfile_iso_pathtable_directories_current['length'] = getid3_lib::LittleEndian2Int(substr($ThisFileInfo['iso']['path_table']['raw'], $offset, 1)); + $offset += 1; + $thisfile_iso_pathtable_directories_current['extended_length'] = getid3_lib::LittleEndian2Int(substr($ThisFileInfo['iso']['path_table']['raw'], $offset, 1)); + $offset += 1; + $thisfile_iso_pathtable_directories_current['location_logical'] = getid3_lib::LittleEndian2Int(substr($ThisFileInfo['iso']['path_table']['raw'], $offset, 4)); + $offset += 4; + $thisfile_iso_pathtable_directories_current['parent_directory'] = getid3_lib::LittleEndian2Int(substr($ThisFileInfo['iso']['path_table']['raw'], $offset, 2)); + $offset += 2; + $thisfile_iso_pathtable_directories_current['name'] = substr($ThisFileInfo['iso']['path_table']['raw'], $offset, $thisfile_iso_pathtable_directories_current['length']); + $offset += $thisfile_iso_pathtable_directories_current['length'] + ($thisfile_iso_pathtable_directories_current['length'] % 2); + + $thisfile_iso_pathtable_directories_current['name_ascii'] = getid3_lib::iconv_fallback($TextEncoding, $ThisFileInfo['encoding'], $thisfile_iso_pathtable_directories_current['name']); + + $thisfile_iso_pathtable_directories_current['location_bytes'] = $thisfile_iso_pathtable_directories_current['location_logical'] * 2048; + if ($pathcounter == 1) { + $thisfile_iso_pathtable_directories_current['full_path'] = '/'; + } else { + $thisfile_iso_pathtable_directories_current['full_path'] = $ThisFileInfo['iso']['path_table']['directories'][$thisfile_iso_pathtable_directories_current['parent_directory']]['full_path'].$thisfile_iso_pathtable_directories_current['name_ascii'].'/'; + } + $FullPathArray[] = $thisfile_iso_pathtable_directories_current['full_path']; + + $pathcounter++; + } + + return true; + } + + + function ParseDirectoryRecord(&$fd, $directorydata, &$ThisFileInfo) { + if (isset($ThisFileInfo['iso']['supplementary_volume_descriptor'])) { + $TextEncoding = 'UTF-16BE'; // Big-Endian Unicode + } else { + $TextEncoding = 'ISO-8859-1'; // Latin-1 + } + + fseek($fd, $directorydata['location_bytes'], SEEK_SET); + $DirectoryRecordData = fread($fd, 1); + + while (ord($DirectoryRecordData{0}) > 33) { + + $DirectoryRecordData .= fread($fd, ord($DirectoryRecordData{0}) - 1); + + $ThisDirectoryRecord['raw']['length'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 0, 1)); + $ThisDirectoryRecord['raw']['extended_attribute_length'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 1, 1)); + $ThisDirectoryRecord['raw']['offset_logical'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 2, 4)); + $ThisDirectoryRecord['raw']['filesize'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 10, 4)); + $ThisDirectoryRecord['raw']['recording_date_time'] = substr($DirectoryRecordData, 18, 7); + $ThisDirectoryRecord['raw']['file_flags'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 25, 1)); + $ThisDirectoryRecord['raw']['file_unit_size'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 26, 1)); + $ThisDirectoryRecord['raw']['interleave_gap_size'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 27, 1)); + $ThisDirectoryRecord['raw']['volume_sequence_number'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 28, 2)); + $ThisDirectoryRecord['raw']['file_identifier_length'] = getid3_lib::LittleEndian2Int(substr($DirectoryRecordData, 32, 1)); + $ThisDirectoryRecord['raw']['file_identifier'] = substr($DirectoryRecordData, 33, $ThisDirectoryRecord['raw']['file_identifier_length']); + + $ThisDirectoryRecord['file_identifier_ascii'] = getid3_lib::iconv_fallback($TextEncoding, $ThisFileInfo['encoding'], $ThisDirectoryRecord['raw']['file_identifier']); + + $ThisDirectoryRecord['filesize'] = $ThisDirectoryRecord['raw']['filesize']; + $ThisDirectoryRecord['offset_bytes'] = $ThisDirectoryRecord['raw']['offset_logical'] * 2048; + $ThisDirectoryRecord['file_flags']['hidden'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x01); + $ThisDirectoryRecord['file_flags']['directory'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x02); + $ThisDirectoryRecord['file_flags']['associated'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x04); + $ThisDirectoryRecord['file_flags']['extended'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x08); + $ThisDirectoryRecord['file_flags']['permissions'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x10); + $ThisDirectoryRecord['file_flags']['multiple'] = (bool) ($ThisDirectoryRecord['raw']['file_flags'] & 0x80); + $ThisDirectoryRecord['recording_timestamp'] = $this->ISOtime2UNIXtime($ThisDirectoryRecord['raw']['recording_date_time']); + + if ($ThisDirectoryRecord['file_flags']['directory']) { + $ThisDirectoryRecord['filename'] = $directorydata['full_path']; + } else { + $ThisDirectoryRecord['filename'] = $directorydata['full_path'].$this->ISOstripFilenameVersion($ThisDirectoryRecord['file_identifier_ascii']); + $ThisFileInfo['iso']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['iso']['files'], getid3_lib::CreateDeepArray($ThisDirectoryRecord['filename'], '/', $ThisDirectoryRecord['filesize'])); + } + + $DirectoryRecord[] = $ThisDirectoryRecord; + $DirectoryRecordData = fread($fd, 1); + } + + return $DirectoryRecord; + } + + function ISOstripFilenameVersion($ISOfilename) { + // convert 'filename.ext;1' to 'filename.ext' + if (!strstr($ISOfilename, ';')) { + return $ISOfilename; + } else { + return substr($ISOfilename, 0, strpos($ISOfilename, ';')); + } + } + + function ISOtimeText2UNIXtime($ISOtime) { + + $UNIXyear = (int) substr($ISOtime, 0, 4); + $UNIXmonth = (int) substr($ISOtime, 4, 2); + $UNIXday = (int) substr($ISOtime, 6, 2); + $UNIXhour = (int) substr($ISOtime, 8, 2); + $UNIXminute = (int) substr($ISOtime, 10, 2); + $UNIXsecond = (int) substr($ISOtime, 12, 2); + + if (!$UNIXyear) { + return false; + } + return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear); + } + + function ISOtime2UNIXtime($ISOtime) { + // Represented by seven bytes: + // 1: Number of years since 1900 + // 2: Month of the year from 1 to 12 + // 3: Day of the Month from 1 to 31 + // 4: Hour of the day from 0 to 23 + // 5: Minute of the hour from 0 to 59 + // 6: second of the minute from 0 to 59 + // 7: Offset from Greenwich Mean Time in number of 15 minute intervals from -48 (West) to +52 (East) + + $UNIXyear = ord($ISOtime{0}) + 1900; + $UNIXmonth = ord($ISOtime{1}); + $UNIXday = ord($ISOtime{2}); + $UNIXhour = ord($ISOtime{3}); + $UNIXminute = ord($ISOtime{4}); + $UNIXsecond = ord($ISOtime{5}); + $GMToffset = $this->TwosCompliment2Decimal(ord($ISOtime{5})); + + return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear); + } + + function TwosCompliment2Decimal($BinaryValue) { + // http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html + // First check if the number is negative or positive by looking at the sign bit. + // If it is positive, simply convert it to decimal. + // If it is negative, make it positive by inverting the bits and adding one. + // Then, convert the result to decimal. + // The negative of this number is the value of the original binary. + + if ($BinaryValue & 0x80) { + + // negative number + return (0 - ((~$BinaryValue & 0xFF) + 1)); + } else { + // positive number + return $BinaryValue; + } + } + + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.tag.apetag.php b/campcaster/src/modules/getid3/var/module.tag.apetag.php new file mode 100644 index 000000000..6ea801094 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.tag.apetag.php @@ -0,0 +1,284 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.tag.apetag.php // +// module for analyzing APE tags // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + +class getid3_apetag +{ + + function getid3_apetag(&$fd, &$ThisFileInfo, $overrideendoffset=0) { + $id3v1tagsize = 128; + $apetagheadersize = 32; + $lyrics3tagsize = 10; + + if ($overrideendoffset == 0) { + + fseek($fd, 0 - $id3v1tagsize - $apetagheadersize - $lyrics3tagsize, SEEK_END); + $APEfooterID3v1 = fread($fd, $id3v1tagsize + $apetagheadersize + $lyrics3tagsize); + + //if (preg_match('/APETAGEX.{24}TAG.{125}$/i', $APEfooterID3v1)) { + if (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $id3v1tagsize - $apetagheadersize, 8) == 'APETAGEX') { + + // APE tag found before ID3v1 + $ThisFileInfo['ape']['tag_offset_end'] = $ThisFileInfo['filesize'] - $id3v1tagsize; + + //} elseif (preg_match('/APETAGEX.{24}$/i', $APEfooterID3v1)) { + } elseif (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $apetagheadersize, 8) == 'APETAGEX') { + + // APE tag found, no ID3v1 + $ThisFileInfo['ape']['tag_offset_end'] = $ThisFileInfo['filesize']; + + } + + } else { + + fseek($fd, $overrideendoffset - $apetagheadersize, SEEK_SET); + if (fread($fd, 8) == 'APETAGEX') { + $ThisFileInfo['ape']['tag_offset_end'] = $overrideendoffset; + } + + } + if (!isset($ThisFileInfo['ape']['tag_offset_end'])) { + + // APE tag not found + unset($ThisFileInfo['ape']); + return false; + + } + + // shortcut + $thisfile_ape = &$ThisFileInfo['ape']; + + fseek($fd, $thisfile_ape['tag_offset_end'] - $apetagheadersize, SEEK_SET); + $APEfooterData = fread($fd, 32); + if (!($thisfile_ape['footer'] = $this->parseAPEheaderFooter($APEfooterData))) { + $ThisFileInfo['error'][] = 'Error parsing APE footer at offset '.$thisfile_ape['tag_offset_end']; + return false; + } + + if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { + fseek($fd, $thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'] - $apetagheadersize, SEEK_SET); + $thisfile_ape['tag_offset_start'] = ftell($fd); + $APEtagData = fread($fd, $thisfile_ape['footer']['raw']['tagsize'] + $apetagheadersize); + } else { + $thisfile_ape['tag_offset_start'] = $thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize']; + fseek($fd, $thisfile_ape['tag_offset_start'], SEEK_SET); + $APEtagData = fread($fd, $thisfile_ape['footer']['raw']['tagsize']); + } + $ThisFileInfo['avdataend'] = $thisfile_ape['tag_offset_start']; + + if (isset($ThisFileInfo['id3v1']['tag_offset_start']) && ($ThisFileInfo['id3v1']['tag_offset_start'] < $thisfile_ape['tag_offset_end'])) { + $ThisFileInfo['warning'][] = 'ID3v1 tag information ignored since it appears to be a false synch in APEtag data'; + unset($ThisFileInfo['id3v1']); + foreach ($ThisFileInfo['warning'] as $key => $value) { + if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { + unset($ThisFileInfo['warning'][$key]); + sort($ThisFileInfo['warning']); + break; + } + } + } + + $offset = 0; + if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { + if ($thisfile_ape['header'] = $this->parseAPEheaderFooter(substr($APEtagData, 0, $apetagheadersize))) { + $offset += $apetagheadersize; + } else { + $ThisFileInfo['error'][] = 'Error parsing APE header at offset '.$thisfile_ape['tag_offset_start']; + return false; + } + } + + // shortcut + $ThisFileInfo['replay_gain'] = array(); + $thisfile_replaygain = &$ThisFileInfo['replay_gain']; + + for ($i = 0; $i < $thisfile_ape['footer']['raw']['tag_items']; $i++) { + $value_size = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); + $offset += 4; + $item_flags = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); + $offset += 4; + if (strstr(substr($APEtagData, $offset), "\x00") === false) { + $ThisFileInfo['error'][] = 'Cannot find null-byte (0x00) seperator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset); + return false; + } + $ItemKeyLength = strpos($APEtagData, "\x00", $offset) - $offset; + $item_key = strtolower(substr($APEtagData, $offset, $ItemKeyLength)); + + // shortcut + $thisfile_ape['items'][$item_key] = array(); + $thisfile_ape_items_current = &$thisfile_ape['items'][$item_key]; + + $offset += ($ItemKeyLength + 1); // skip 0x00 terminator + $thisfile_ape_items_current['data'] = substr($APEtagData, $offset, $value_size); + $offset += $value_size; + + $thisfile_ape_items_current['flags'] = $this->parseAPEtagFlags($item_flags); + switch ($thisfile_ape_items_current['flags']['item_contents_raw']) { + case 0: // UTF-8 + case 3: // Locator (URL, filename, etc), UTF-8 encoded + $thisfile_ape_items_current['data'] = explode("\x00", trim($thisfile_ape_items_current['data'])); + break; + + default: // binary data + break; + } + + switch (strtolower($item_key)) { + case 'replaygain_track_gain': + $thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! + $thisfile_replaygain['track']['originator'] = 'unspecified'; + break; + + case 'replaygain_track_peak': + $thisfile_replaygain['track']['peak'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! + $thisfile_replaygain['track']['originator'] = 'unspecified'; + if ($thisfile_replaygain['track']['peak'] <= 0) { + $ThisFileInfo['warning'][] = 'ReplayGain Track peak from APEtag appears invalid: '.$thisfile_replaygain['track']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'; + } + break; + + case 'replaygain_album_gain': + $thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! + $thisfile_replaygain['album']['originator'] = 'unspecified'; + break; + + case 'replaygain_album_peak': + $thisfile_replaygain['album']['peak'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! + $thisfile_replaygain['album']['originator'] = 'unspecified'; + if ($thisfile_replaygain['album']['peak'] <= 0) { + $ThisFileInfo['warning'][] = 'ReplayGain Album peak from APEtag appears invalid: '.$thisfile_replaygain['album']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'; + } + break; + + case 'mp3gain_undo': + list($mp3gain_undo_left, $mp3gain_undo_right, $mp3gain_undo_wrap) = explode(',', $thisfile_ape_items_current['data'][0]); + $thisfile_replaygain['mp3gain']['undo_left'] = intval($mp3gain_undo_left); + $thisfile_replaygain['mp3gain']['undo_right'] = intval($mp3gain_undo_right); + $thisfile_replaygain['mp3gain']['undo_wrap'] = (($mp3gain_undo_wrap == 'Y') ? true : false); + break; + + case 'mp3gain_minmax': + list($mp3gain_globalgain_min, $mp3gain_globalgain_max) = explode(',', $thisfile_ape_items_current['data'][0]); + $thisfile_replaygain['mp3gain']['globalgain_track_min'] = intval($mp3gain_globalgain_min); + $thisfile_replaygain['mp3gain']['globalgain_track_max'] = intval($mp3gain_globalgain_max); + break; + + case 'mp3gain_album_minmax': + list($mp3gain_globalgain_album_min, $mp3gain_globalgain_album_max) = explode(',', $thisfile_ape_items_current['data'][0]); + $thisfile_replaygain['mp3gain']['globalgain_album_min'] = intval($mp3gain_globalgain_album_min); + $thisfile_replaygain['mp3gain']['globalgain_album_max'] = intval($mp3gain_globalgain_album_max); + break; + + case 'tracknumber': + foreach ($thisfile_ape_items_current['data'] as $comment) { + $thisfile_ape['comments']['track'][] = $comment; + } + break; + + default: + foreach ($thisfile_ape_items_current['data'] as $comment) { + $thisfile_ape['comments'][strtolower($item_key)][] = $comment; + } + break; + } + + } + if (empty($thisfile_replaygain)) { + unset($ThisFileInfo['replay_gain']); + } + + return true; + } + + function parseAPEheaderFooter($APEheaderFooterData) { + // http://www.uni-jena.de/~pfk/mpp/sv8/apeheader.html + + // shortcut + $headerfooterinfo['raw'] = array(); + $headerfooterinfo_raw = &$headerfooterinfo['raw']; + + $headerfooterinfo_raw['footer_tag'] = substr($APEheaderFooterData, 0, 8); + if ($headerfooterinfo_raw['footer_tag'] != 'APETAGEX') { + return false; + } + $headerfooterinfo_raw['version'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 8, 4)); + $headerfooterinfo_raw['tagsize'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 12, 4)); + $headerfooterinfo_raw['tag_items'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 16, 4)); + $headerfooterinfo_raw['global_flags'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 20, 4)); + $headerfooterinfo_raw['reserved'] = substr($APEheaderFooterData, 24, 8); + + $headerfooterinfo['tag_version'] = $headerfooterinfo_raw['version'] / 1000; + if ($headerfooterinfo['tag_version'] >= 2) { + $headerfooterinfo['flags'] = $this->parseAPEtagFlags($headerfooterinfo_raw['global_flags']); + } + return $headerfooterinfo; + } + + function parseAPEtagFlags($rawflagint) { + // "Note: APE Tags 1.0 do not use any of the APE Tag flags. + // All are set to zero on creation and ignored on reading." + // http://www.uni-jena.de/~pfk/mpp/sv8/apetagflags.html + $flags['header'] = (bool) ($rawflagint & 0x80000000); + $flags['footer'] = (bool) ($rawflagint & 0x40000000); + $flags['this_is_header'] = (bool) ($rawflagint & 0x20000000); + $flags['item_contents_raw'] = ($rawflagint & 0x00000006) >> 1; + $flags['read_only'] = (bool) ($rawflagint & 0x00000001); + + $flags['item_contents'] = $this->APEcontentTypeFlagLookup($flags['item_contents_raw']); + + return $flags; + } + + function APEcontentTypeFlagLookup($contenttypeid) { + static $APEcontentTypeFlagLookup = array( + 0 => 'utf-8', + 1 => 'binary', + 2 => 'external', + 3 => 'reserved' + ); + return (isset($APEcontentTypeFlagLookup[$contenttypeid]) ? $APEcontentTypeFlagLookup[$contenttypeid] : 'invalid'); + } + + function APEtagItemIsUTF8Lookup($itemkey) { + static $APEtagItemIsUTF8Lookup = array( + 'title', + 'subtitle', + 'artist', + 'album', + 'debut album', + 'publisher', + 'conductor', + 'track', + 'composer', + 'comment', + 'copyright', + 'publicationright', + 'file', + 'year', + 'record date', + 'record location', + 'genre', + 'media', + 'related', + 'isrc', + 'abstract', + 'language', + 'bibliography' + ); + return in_array(strtolower($itemkey), $APEtagItemIsUTF8Lookup); + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.tag.id3v1.php b/campcaster/src/modules/getid3/var/module.tag.id3v1.php new file mode 100644 index 000000000..dd9b47b1f --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.tag.id3v1.php @@ -0,0 +1,356 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.tag.id3v1.php // +// module for analyzing ID3v1 tags // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_id3v1 +{ + + function getid3_id3v1(&$fd, &$ThisFileInfo) { + + fseek($fd, -256, SEEK_END); + $preid3v1 = fread($fd, 128); + $id3v1tag = fread($fd, 128); + + if (substr($id3v1tag, 0, 3) == 'TAG') { + + $ThisFileInfo['avdataend'] = $ThisFileInfo['filesize'] - 128; + + $ParsedID3v1['title'] = $this->cutfield(substr($id3v1tag, 3, 30)); + $ParsedID3v1['artist'] = $this->cutfield(substr($id3v1tag, 33, 30)); + $ParsedID3v1['album'] = $this->cutfield(substr($id3v1tag, 63, 30)); + $ParsedID3v1['year'] = $this->cutfield(substr($id3v1tag, 93, 4)); + $ParsedID3v1['comment'] = substr($id3v1tag, 97, 30); // can't remove nulls yet, track detection depends on them + $ParsedID3v1['genreid'] = ord(substr($id3v1tag, 127, 1)); + + // If second-last byte of comment field is null and last byte of comment field is non-null + // then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number + if (($id3v1tag{125} === "\x00") && ($id3v1tag{126} !== "\x00")) { + $ParsedID3v1['track'] = ord(substr($ParsedID3v1['comment'], 29, 1)); + $ParsedID3v1['comment'] = substr($ParsedID3v1['comment'], 0, 28); + } + $ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']); + + $ParsedID3v1['genre'] = $this->LookupGenreName($ParsedID3v1['genreid']); + if (!empty($ParsedID3v1['genre'])) { + unset($ParsedID3v1['genreid']); + } + if (empty($ParsedID3v1['genre']) || (@$ParsedID3v1['genre'] == 'Unknown')) { + unset($ParsedID3v1['genre']); + } + + foreach ($ParsedID3v1 as $key => $value) { + $ParsedID3v1['comments'][$key][0] = $value; + } + + // ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces + $GoodFormatID3v1tag = $this->GenerateID3v1Tag( + $ParsedID3v1['title'], + $ParsedID3v1['artist'], + $ParsedID3v1['album'], + $ParsedID3v1['year'], + $this->LookupGenreID(@$ParsedID3v1['genre']), + $ParsedID3v1['comment'], + @$ParsedID3v1['track']); + $ParsedID3v1['padding_valid'] = true; + if ($id3v1tag !== $GoodFormatID3v1tag) { + $ParsedID3v1['padding_valid'] = false; + $ThisFileInfo['warning'][] = 'Some ID3v1 fields do not use NULL characters for padding'; + } + + $ParsedID3v1['tag_offset_end'] = $ThisFileInfo['filesize']; + $ParsedID3v1['tag_offset_start'] = $ParsedID3v1['tag_offset_end'] - 128; + + $ThisFileInfo['id3v1'] = $ParsedID3v1; + } + + if (substr($preid3v1, 0, 3) == 'TAG') { + // The way iTunes handles tags is, well, brain-damaged. + // It completely ignores v1 if ID3v2 is present. + // This goes as far as adding a new v1 tag *even if there already is one* + + // A suspected double-ID3v1 tag has been detected, but it could be that + // the "TAG" identifier is a legitimate part of an APE or Lyrics3 tag + if (substr($preid3v1, 96, 8) == 'APETAGEX') { + // an APE tag footer was found before the last ID3v1, assume false "TAG" synch + } elseif (substr($preid3v1, 119, 6) == 'LYRICS') { + // a Lyrics3 tag footer was found before the last ID3v1, assume false "TAG" synch + } else { + // APE and Lyrics3 footers not found - assume double ID3v1 + $ThisFileInfo['warning'][] = 'Duplicate ID3v1 tag detected - this has been known to happen with iTunes'; + $ThisFileInfo['avdataend'] -= 128; + } + } + + return true; + } + + function cutfield($str) { + return trim(substr($str, 0, strcspn($str, "\x00"))); + } + + function ArrayOfGenres($allowSCMPXextended=false) { + static $GenreLookup = array( + 0 => 'Blues', + 1 => 'Classic Rock', + 2 => 'Country', + 3 => 'Dance', + 4 => 'Disco', + 5 => 'Funk', + 6 => 'Grunge', + 7 => 'Hip-Hop', + 8 => 'Jazz', + 9 => 'Metal', + 10 => 'New Age', + 11 => 'Oldies', + 12 => 'Other', + 13 => 'Pop', + 14 => 'R&B', + 15 => 'Rap', + 16 => 'Reggae', + 17 => 'Rock', + 18 => 'Techno', + 19 => 'Industrial', + 20 => 'Alternative', + 21 => 'Ska', + 22 => 'Death Metal', + 23 => 'Pranks', + 24 => 'Soundtrack', + 25 => 'Euro-Techno', + 26 => 'Ambient', + 27 => 'Trip-Hop', + 28 => 'Vocal', + 29 => 'Jazz+Funk', + 30 => 'Fusion', + 31 => 'Trance', + 32 => 'Classical', + 33 => 'Instrumental', + 34 => 'Acid', + 35 => 'House', + 36 => 'Game', + 37 => 'Sound Clip', + 38 => 'Gospel', + 39 => 'Noise', + 40 => 'Alt. Rock', + 41 => 'Bass', + 42 => 'Soul', + 43 => 'Punk', + 44 => 'Space', + 45 => 'Meditative', + 46 => 'Instrumental Pop', + 47 => 'Instrumental Rock', + 48 => 'Ethnic', + 49 => 'Gothic', + 50 => 'Darkwave', + 51 => 'Techno-Industrial', + 52 => 'Electronic', + 53 => 'Pop-Folk', + 54 => 'Eurodance', + 55 => 'Dream', + 56 => 'Southern Rock', + 57 => 'Comedy', + 58 => 'Cult', + 59 => 'Gangsta Rap', + 60 => 'Top 40', + 61 => 'Christian Rap', + 62 => 'Pop/Funk', + 63 => 'Jungle', + 64 => 'Native American', + 65 => 'Cabaret', + 66 => 'New Wave', + 67 => 'Psychedelic', + 68 => 'Rave', + 69 => 'Showtunes', + 70 => 'Trailer', + 71 => 'Lo-Fi', + 72 => 'Tribal', + 73 => 'Acid Punk', + 74 => 'Acid Jazz', + 75 => 'Polka', + 76 => 'Retro', + 77 => 'Musical', + 78 => 'Rock & Roll', + 79 => 'Hard Rock', + 80 => 'Folk', + 81 => 'Folk/Rock', + 82 => 'National Folk', + 83 => 'Swing', + 84 => 'Fast-Fusion', + 85 => 'Bebob', + 86 => 'Latin', + 87 => 'Revival', + 88 => 'Celtic', + 89 => 'Bluegrass', + 90 => 'Avantgarde', + 91 => 'Gothic Rock', + 92 => 'Progressive Rock', + 93 => 'Psychedelic Rock', + 94 => 'Symphonic Rock', + 95 => 'Slow Rock', + 96 => 'Big Band', + 97 => 'Chorus', + 98 => 'Easy Listening', + 99 => 'Acoustic', + 100 => 'Humour', + 101 => 'Speech', + 102 => 'Chanson', + 103 => 'Opera', + 104 => 'Chamber Music', + 105 => 'Sonata', + 106 => 'Symphony', + 107 => 'Booty Bass', + 108 => 'Primus', + 109 => 'Porn Groove', + 110 => 'Satire', + 111 => 'Slow Jam', + 112 => 'Club', + 113 => 'Tango', + 114 => 'Samba', + 115 => 'Folklore', + 116 => 'Ballad', + 117 => 'Power Ballad', + 118 => 'Rhythmic Soul', + 119 => 'Freestyle', + 120 => 'Duet', + 121 => 'Punk Rock', + 122 => 'Drum Solo', + 123 => 'A Cappella', + 124 => 'Euro-House', + 125 => 'Dance Hall', + 126 => 'Goa', + 127 => 'Drum & Bass', + 128 => 'Club-House', + 129 => 'Hardcore', + 130 => 'Terror', + 131 => 'Indie', + 132 => 'BritPop', + 133 => 'Negerpunk', + 134 => 'Polsk Punk', + 135 => 'Beat', + 136 => 'Christian Gangsta Rap', + 137 => 'Heavy Metal', + 138 => 'Black Metal', + 139 => 'Crossover', + 140 => 'Contemporary Christian', + 141 => 'Christian Rock', + 142 => 'Merengue', + 143 => 'Salsa', + 144 => 'Trash Metal', + 145 => 'Anime', + 146 => 'JPop', + 147 => 'Synthpop', + + 255 => 'Unknown', + + 'CR' => 'Cover', + 'RX' => 'Remix' + ); + + static $GenreLookupSCMPX = array(); + if ($allowSCMPXextended && empty($GenreLookupSCMPX)) { + $GenreLookupSCMPX = $GenreLookup; + // http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended + // Extended ID3v1 genres invented by SCMPX + // Note that 255 "Japanese Anime" conflicts with standard "Unknown" + $GenreLookupSCMPX[240] = 'Sacred'; + $GenreLookupSCMPX[241] = 'Northern Europe'; + $GenreLookupSCMPX[242] = 'Irish & Scottish'; + $GenreLookupSCMPX[243] = 'Scotland'; + $GenreLookupSCMPX[244] = 'Ethnic Europe'; + $GenreLookupSCMPX[245] = 'Enka'; + $GenreLookupSCMPX[246] = 'Children\'s Song'; + $GenreLookupSCMPX[247] = 'Japanese Sky'; + $GenreLookupSCMPX[248] = 'Japanese Heavy Rock'; + $GenreLookupSCMPX[249] = 'Japanese Doom Rock'; + $GenreLookupSCMPX[250] = 'Japanese J-POP'; + $GenreLookupSCMPX[251] = 'Japanese Seiyu'; + $GenreLookupSCMPX[252] = 'Japanese Ambient Techno'; + $GenreLookupSCMPX[253] = 'Japanese Moemoe'; + $GenreLookupSCMPX[254] = 'Japanese Tokusatsu'; + //$GenreLookupSCMPX[255] = 'Japanese Anime'; + } + + return ($allowSCMPXextended ? $GenreLookupSCMPX : $GenreLookup); + } + + function LookupGenreName($genreid, $allowSCMPXextended=true) { + switch ($genreid) { + case 'RX': + case 'CR': + break; + default: + $genreid = intval($genreid); // to handle 3 or '3' or '03' + break; + } + $GenreLookup = getid3_id3v1::ArrayOfGenres($allowSCMPXextended); + return (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false); + } + + function LookupGenreID($genre, $allowSCMPXextended=false) { + $GenreLookup = getid3_id3v1::ArrayOfGenres($allowSCMPXextended); + $LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre)); + foreach ($GenreLookup as $key => $value) { + foreach ($GenreLookup as $key => $value) { + if (strtolower(str_replace(' ', '', $value)) == $LowerCaseNoSpaceSearchTerm) { + return $key; + } + } + return false; + } + return (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false); + } + + function StandardiseID3v1GenreName($OriginalGenre) { + if (($GenreID = getid3_id3v1::LookupGenreID($OriginalGenre)) !== false) { + return getid3_id3v1::LookupGenreName($GenreID); + } + return $OriginalGenre; + } + + function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') { + $ID3v1Tag = 'TAG'; + $ID3v1Tag .= str_pad(trim(substr($title, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= str_pad(trim(substr($artist, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= str_pad(trim(substr($album, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= str_pad(trim(substr($year, 0, 4)), 4, "\x00", STR_PAD_LEFT); + if (!empty($track) && ($track > 0) && ($track <= 255)) { + $ID3v1Tag .= str_pad(trim(substr($comment, 0, 28)), 28, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= "\x00"; + if (gettype($track) == 'string') { + $track = (int) $track; + } + $ID3v1Tag .= chr($track); + } else { + $ID3v1Tag .= str_pad(trim(substr($comment, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + } + if (($genreid < 0) || ($genreid > 147)) { + $genreid = 255; // 'unknown' genre + } + switch (gettype($genreid)) { + case 'string': + case 'integer': + $ID3v1Tag .= chr(intval($genreid)); + break; + default: + $ID3v1Tag .= chr(255); // 'unknown' genre + break; + } + + return $ID3v1Tag; + } + +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/module.tag.id3v2.php b/campcaster/src/modules/getid3/var/module.tag.id3v2.php new file mode 100644 index 000000000..16f517e8a --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.tag.id3v2.php @@ -0,0 +1,3130 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +/// // +// module.tag.id3v2.php // +// module for analyzing ID3v2 tags // +// dependencies: module.tag.id3v1.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); + +class getid3_id3v2 +{ + + function getid3_id3v2(&$fd, &$ThisFileInfo, $StartingOffset=0) { + // Overall tag structure: + // +-----------------------------+ + // | Header (10 bytes) | + // +-----------------------------+ + // | Extended Header | + // | (variable length, OPTIONAL) | + // +-----------------------------+ + // | Frames (variable length) | + // +-----------------------------+ + // | Padding | + // | (variable length, OPTIONAL) | + // +-----------------------------+ + // | Footer (10 bytes, OPTIONAL) | + // +-----------------------------+ + + // Header + // ID3v2/file identifier "ID3" + // ID3v2 version $04 00 + // ID3v2 flags (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x) + // ID3v2 size 4 * %0xxxxxxx + + + // shortcuts + $ThisFileInfo['id3v2']['header'] = true; + $thisfile_id3v2 = &$ThisFileInfo['id3v2']; + $thisfile_id3v2['flags'] = array(); + $thisfile_id3v2_flags = &$thisfile_id3v2['flags']; + + + fseek($fd, $StartingOffset, SEEK_SET); + $header = fread($fd, 10); + if (substr($header, 0, 3) == 'ID3') { + + $thisfile_id3v2['majorversion'] = ord($header{3}); + $thisfile_id3v2['minorversion'] = ord($header{4}); + + // shortcut + $id3v2_majorversion = &$thisfile_id3v2['majorversion']; + + } else { + + unset($ThisFileInfo['id3v2']); + return false; + + } + + if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists) + + $ThisFileInfo['error'][] = 'this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion']; + return false; + + } + + $id3_flags = ord($header{5}); + switch ($id3v2_majorversion) { + case 2: + // %ab000000 in v2.2 + $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation + $thisfile_id3v2_flags['compression'] = (bool) ($id3_flags & 0x40); // b - Compression + break; + + case 3: + // %abc00000 in v2.3 + $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation + $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header + $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator + break; + + case 4: + // %abcd0000 in v2.4 + $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation + $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header + $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator + $thisfile_id3v2_flags['isfooter'] = (bool) ($id3_flags & 0x10); // d - Footer present + break; + } + + $thisfile_id3v2['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length + + $thisfile_id3v2['tag_offset_start'] = $StartingOffset; + $thisfile_id3v2['tag_offset_end'] = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength']; + + // Extended Header + if (isset($thisfile_id3v2_flags['exthead']) && $thisfile_id3v2_flags['exthead']) { + // Extended header size 4 * %0xxxxxxx + // Number of flag bytes $01 + // Extended Flags $xx + // Where the 'Extended header size' is the size of the whole extended header, stored as a 32 bit synchsafe integer. + $thisfile_id3v2['exthead_length'] = getid3_lib::BigEndian2Int(fread($fd, 4), 1); + + $thisfile_id3v2['exthead_flag_bytes'] = ord(fread($fd, 1)); + if ($thisfile_id3v2['exthead_flag_bytes'] == 1) { + // The extended flags field, with its size described by 'number of flag bytes', is defined as: + // %0bcd0000 + // b - Tag is an update + // Flag data length $00 + // c - CRC data present + // Flag data length $05 + // Total frame CRC 5 * %0xxxxxxx + // d - Tag restrictions + // Flag data length $01 + $extheaderflags = fread($fd, $thisfile_id3v2['exthead_flag_bytes']); + $id3_exthead_flags = getid3_lib::BigEndian2Bin(substr($header, 5, 1)); + $thisfile_id3v2['exthead_flags']['update'] = substr($id3_exthead_flags, 1, 1); + $thisfile_id3v2['exthead_flags']['CRC'] = substr($id3_exthead_flags, 2, 1); + if ($thisfile_id3v2['exthead_flags']['CRC']) { + $extheaderrawCRC = fread($fd, 5); + $thisfile_id3v2['exthead_flags']['CRC'] = getid3_lib::BigEndian2Int($extheaderrawCRC, 1); + } + $thisfile_id3v2['exthead_flags']['restrictions'] = substr($id3_exthead_flags, 3, 1); + if ($thisfile_id3v2['exthead_flags']['restrictions']) { + // Restrictions %ppqrrstt + $extheaderrawrestrictions = fread($fd, 1); + $thisfile_id3v2['exthead_flags']['restrictions_tagsize'] = (bindec('11000000') & ord($extheaderrawrestrictions)) >> 6; // p - Tag size restrictions + $thisfile_id3v2['exthead_flags']['restrictions_textenc'] = (bindec('00100000') & ord($extheaderrawrestrictions)) >> 5; // q - Text encoding restrictions + $thisfile_id3v2['exthead_flags']['restrictions_textsize'] = (bindec('00011000') & ord($extheaderrawrestrictions)) >> 3; // r - Text fields size restrictions + $thisfile_id3v2['exthead_flags']['restrictions_imgenc'] = (bindec('00000100') & ord($extheaderrawrestrictions)) >> 2; // s - Image encoding restrictions + $thisfile_id3v2['exthead_flags']['restrictions_imgsize'] = (bindec('00000011') & ord($extheaderrawrestrictions)) >> 0; // t - Image size restrictions + } + } else { + $ThisFileInfo['warning'][] = '$thisfile_id3v2[exthead_flag_bytes] = "'.$thisfile_id3v2['exthead_flag_bytes'].'" (expecting "1")'; + fseek($fd, $thisfile_id3v2['exthead_length'] - 1, SEEK_CUR); + //return false; + } + } // end extended header + + + // create 'encoding' key - used by getid3::HandleAllTags() + // in ID3v2 every field can have it's own encoding type + // so force everything to UTF-8 so it can be handled consistantly + $thisfile_id3v2['encoding'] = 'UTF-8'; + + + // Frames + + // All ID3v2 frames consists of one frame header followed by one or more + // fields containing the actual information. The header is always 10 + // bytes and laid out as follows: + // + // Frame ID $xx xx xx xx (four characters) + // Size 4 * %0xxxxxxx + // Flags $xx xx + + $sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header + if (@$thisfile_id3v2['exthead_length']) { + $sizeofframes -= ($thisfile_id3v2['exthead_length'] + 4); + } + if (@$thisfile_id3v2_flags['isfooter']) { + $sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio + } + if ($sizeofframes > 0) { + + $framedata = fread($fd, $sizeofframes); // read all frames from file into $framedata variable + + // if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x) + if (@$thisfile_id3v2_flags['unsynch'] && ($id3v2_majorversion <= 3)) { + $framedata = $this->DeUnsynchronise($framedata); + } + // [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead + // of on tag level, making it easier to skip frames, increasing the streamability + // of the tag. The unsynchronisation flag in the header [S:3.1] indicates that + // there exists an unsynchronised frame, while the new unsynchronisation flag in + // the frame header [S:4.1.2] indicates unsynchronisation. + + $framedataoffset = 10 + (@$thisfile_id3v2['exthead_length'] ? $thisfile_id3v2['exthead_length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present) + while (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse + if (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) { + // insufficient room left in ID3v2 header for actual data - must be padding + $thisfile_id3v2['padding']['start'] = $framedataoffset; + $thisfile_id3v2['padding']['length'] = strlen($framedata); + $thisfile_id3v2['padding']['valid'] = true; + for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) { + if ($framedata{$i} != "\x00") { + $thisfile_id3v2['padding']['valid'] = false; + $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; + $ThisFileInfo['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'; + break; + } + } + break; // skip rest of ID3v2 header + } + if ($id3v2_majorversion == 2) { + // Frame ID $xx xx xx (three characters) + // Size $xx xx xx (24-bit integer) + // Flags $xx xx + + $frame_header = substr($framedata, 0, 6); // take next 6 bytes for header + $framedata = substr($framedata, 6); // and leave the rest in $framedata + $frame_name = substr($frame_header, 0, 3); + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 3, 3), 0); + $frame_flags = 0; // not used for anything in ID3v2.2, just set to avoid E_NOTICEs + + } elseif ($id3v2_majorversion > 2) { + + // Frame ID $xx xx xx xx (four characters) + // Size $xx xx xx xx (32-bit integer in v2.3, 28-bit synchsafe in v2.4+) + // Flags $xx xx + + $frame_header = substr($framedata, 0, 10); // take next 10 bytes for header + $framedata = substr($framedata, 10); // and leave the rest in $framedata + + $frame_name = substr($frame_header, 0, 4); + if ($id3v2_majorversion == 3) { + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer + } else { // ID3v2.4+ + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 1); // 32-bit synchsafe integer (28-bit value) + } + + if ($frame_size < (strlen($framedata) + 4)) { + $nextFrameID = substr($framedata, $frame_size, 4); + if ($this->IsValidID3v2FrameName($nextFrameID, $id3v2_majorversion)) { + // next frame is OK + } elseif (($frame_name == "\x00".'MP3') || ($frame_name == "\x00\x00".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) { + // MP3ext known broken frames - "ok" for the purposes of this test + } elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) { + $ThisFileInfo['warning'][] = 'ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3'; + $id3v2_majorversion = 3; + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer + } + } + + + $frame_flags = getid3_lib::BigEndian2Int(substr($frame_header, 8, 2)); + } + + if ((($id3v2_majorversion == 2) && ($frame_name == "\x00\x00\x00")) || ($frame_name == "\x00\x00\x00\x00")) { + // padding encountered + + $thisfile_id3v2['padding']['start'] = $framedataoffset; + $thisfile_id3v2['padding']['length'] = strlen($framedata); + $thisfile_id3v2['padding']['valid'] = true; + for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) { + if ($framedata{$i} != "\x00") { + $thisfile_id3v2['padding']['valid'] = false; + $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; + $ThisFileInfo['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'; + break; + } + } + break; // skip rest of ID3v2 header + } + + if ($frame_name == 'COM ') { + $ThisFileInfo['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably others too)]'; + $frame_name = 'COMM'; + } + if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) { + + unset($parsedFrame); + $parsedFrame['frame_name'] = $frame_name; + $parsedFrame['frame_flags_raw'] = $frame_flags; + $parsedFrame['data'] = substr($framedata, 0, $frame_size); + $parsedFrame['datalength'] = getid3_lib::CastAsInt($frame_size); + $parsedFrame['dataoffset'] = $framedataoffset; + + $this->ParseID3v2Frame($parsedFrame, $ThisFileInfo); + $thisfile_id3v2[$frame_name][] = $parsedFrame; + + $framedata = substr($framedata, $frame_size); + + } else { // invalid frame length or FrameID + + if ($frame_size <= strlen($framedata)) { + + if ($this->IsValidID3v2FrameName(substr($framedata, $frame_size, 4), $id3v2_majorversion)) { + + // next frame is valid, just skip the current frame + $framedata = substr($framedata, $frame_size); + $ThisFileInfo['warning'][] = 'Next ID3v2 frame is valid, skipping current frame.'; + + } else { + + // next frame is invalid too, abort processing + //unset($framedata); + $framedata = null; + $ThisFileInfo['error'][] = 'Next ID3v2 frame is also invalid, aborting processing.'; + + } + + } elseif ($frame_size == strlen($framedata)) { + + // this is the last frame, just skip + $ThisFileInfo['warning'][] = 'This was the last ID3v2 frame.'; + + } else { + + // next frame is invalid too, abort processing + //unset($framedata); + $framedata = null; + $ThisFileInfo['warning'][] = 'Invalid ID3v2 frame size, aborting.'; + + } + if (!$this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion)) { + + switch ($frame_name) { + case "\x00\x00".'MP': + case "\x00".'MP3': + case ' MP3': + case 'MP3e': + case "\x00".'MP': + case ' MP': + case 'MP3': + $ThisFileInfo['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]'; + break; + + default: + $ThisFileInfo['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).'; + break; + } + + } elseif ($frame_size > strlen($framedata)){ + + $ThisFileInfo['error'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.strlen($framedata).')).'; + + } else { + + $ThisFileInfo['error'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).'; + + } + + } + $framedataoffset += ($frame_size + $this->ID3v2HeaderLength($id3v2_majorversion)); + + } + + } + + + // Footer + + // The footer is a copy of the header, but with a different identifier. + // ID3v2 identifier "3DI" + // ID3v2 version $04 00 + // ID3v2 flags %abcd0000 + // ID3v2 size 4 * %0xxxxxxx + + if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) { + $footer = fread($fd, 10); + if (substr($footer, 0, 3) == '3DI') { + $thisfile_id3v2['footer'] = true; + $thisfile_id3v2['majorversion_footer'] = ord($footer{3}); + $thisfile_id3v2['minorversion_footer'] = ord($footer{4}); + } + if ($thisfile_id3v2['majorversion_footer'] <= 4) { + $id3_flags = ord(substr($footer{5})); + $thisfile_id3v2_flags['unsynch_footer'] = (bool) ($id3_flags & 0x80); + $thisfile_id3v2_flags['extfoot_footer'] = (bool) ($id3_flags & 0x40); + $thisfile_id3v2_flags['experim_footer'] = (bool) ($id3_flags & 0x20); + $thisfile_id3v2_flags['isfooter_footer'] = (bool) ($id3_flags & 0x10); + + $thisfile_id3v2['footerlength'] = getid3_lib::BigEndian2Int(substr($footer, 6, 4), 1); + } + } // end footer + + if (isset($thisfile_id3v2['comments']['genre'])) { + foreach ($thisfile_id3v2['comments']['genre'] as $key => $value) { + unset($thisfile_id3v2['comments']['genre'][$key]); + $thisfile_id3v2['comments'] = getid3_lib::array_merge_noclobber($thisfile_id3v2['comments'], $this->ParseID3v2GenreString($value)); + } + } + + if (isset($thisfile_id3v2['comments']['track'])) { + foreach ($thisfile_id3v2['comments']['track'] as $key => $value) { + if (strstr($value, '/')) { + list($thisfile_id3v2['comments']['tracknum'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track'][$key]); + } + } + } + + if (!isset($thisfile_id3v2['comments']['year']) && ereg('^([0-9]{4})', trim(@$thisfile_id3v2['comments']['recording_time'][0]), $matches)) { + $thisfile_id3v2['comments']['year'] = array($matches[1]); + } + + + // Set avdataoffset + $ThisFileInfo['avdataoffset'] = $thisfile_id3v2['headerlength']; + if (isset($thisfile_id3v2['footer'])) { + $ThisFileInfo['avdataoffset'] += 10; + } + + return true; + } + + + function ParseID3v2GenreString($genrestring) { + // Parse genres into arrays of genreName and genreID + // ID3v2.2.x, ID3v2.3.x: '(21)' or '(4)Eurodisco' or '(51)(39)' or '(55)((I think...)' + // ID3v2.4.x: '21' $00 'Eurodisco' $00 + + $genrestring = trim($genrestring); + $returnarray = array(); + if (strpos($genrestring, "\x00") !== false) { + $unprocessed = trim($genrestring); // trailing nulls will cause an infinite loop. + $genrestring = ''; + while (strpos($unprocessed, "\x00") !== false) { + // convert null-seperated v2.4-format into v2.3 ()-seperated format + $endpos = strpos($unprocessed, "\x00"); + $genrestring .= '('.substr($unprocessed, 0, $endpos).')'; + $unprocessed = substr($unprocessed, $endpos + 1); + } + unset($unprocessed); + } + if (getid3_id3v1::LookupGenreID($genrestring)) { + + $returnarray['genre'][] = $genrestring; + + } else { + + while (strpos($genrestring, '(') !== false) { + + $startpos = strpos($genrestring, '('); + $endpos = strpos($genrestring, ')'); + if (substr($genrestring, $startpos + 1, 1) == '(') { + $genrestring = substr($genrestring, 0, $startpos).substr($genrestring, $startpos + 1); + $endpos--; + } + $element = substr($genrestring, $startpos + 1, $endpos - ($startpos + 1)); + $genrestring = substr($genrestring, 0, $startpos).substr($genrestring, $endpos + 1); + if (getid3_id3v1::LookupGenreName($element)) { // $element is a valid genre id/abbreviation + + if (empty($returnarray['genre']) || !in_array(getid3_id3v1::LookupGenreName($element), $returnarray['genre'])) { // avoid duplicate entires + $returnarray['genre'][] = getid3_id3v1::LookupGenreName($element); + } + + } else { + + if (empty($returnarray['genre']) || !in_array($element, $returnarray['genre'])) { // avoid duplicate entires + $returnarray['genre'][] = $element; + } + + } + } + } + if ($genrestring) { + if (empty($returnarray['genre']) || !in_array($genrestring, $returnarray['genre'])) { // avoid duplicate entires + $returnarray['genre'][] = $genrestring; + } + } + + return $returnarray; + } + + + function ParseID3v2Frame(&$parsedFrame, &$ThisFileInfo) { + + // shortcuts + $id3v2_majorversion = $ThisFileInfo['id3v2']['majorversion']; + + $parsedFrame['framenamelong'] = $this->FrameNameLongLookup($parsedFrame['frame_name']); + if (empty($parsedFrame['framenamelong'])) { + unset($parsedFrame['framenamelong']); + } + $parsedFrame['framenameshort'] = $this->FrameNameShortLookup($parsedFrame['frame_name']); + if (empty($parsedFrame['framenameshort'])) { + unset($parsedFrame['framenameshort']); + } + + if ($id3v2_majorversion >= 3) { // frame flags are not part of the ID3v2.2 standard + if ($id3v2_majorversion == 3) { + // Frame Header Flags + // %abc00000 %ijk00000 + $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000); // a - Tag alter preservation + $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // b - File alter preservation + $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // c - Read only + $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080); // i - Compression + $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // j - Encryption + $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020); // k - Grouping identity + + } elseif ($id3v2_majorversion == 4) { + // Frame Header Flags + // %0abc0000 %0h00kmnp + $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // a - Tag alter preservation + $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // b - File alter preservation + $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000); // c - Read only + $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // h - Grouping identity + $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008); // k - Compression + $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004); // m - Encryption + $parsedFrame['flags']['Unsynchronisation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002); // n - Unsynchronisation + $parsedFrame['flags']['DataLengthIndicator'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001); // p - Data length indicator + + // Frame-level de-unsynchronisation - ID3v2.4 + if ($parsedFrame['flags']['Unsynchronisation']) { + $parsedFrame['data'] = $this->DeUnsynchronise($parsedFrame['data']); + } + } + + // Frame-level de-compression + if ($parsedFrame['flags']['compression']) { + $parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4)); + if (!function_exists('gzuncompress')) { + $ThisFileInfo['warning'][] = 'gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"'; + } elseif ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) { + $parsedFrame['data'] = $decompresseddata; + } else { + $ThisFileInfo['warning'][] = 'gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"'; + } + } + } + + if (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) { + + $warning = 'Frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset'].' has no data portion'; + switch ($parsedFrame['frame_name']) { + case 'WCOM': + $warning .= ' (this is known to happen with files tagged by RioPort)'; + break; + + default: + break; + } + $ThisFileInfo['warning'][] = $warning; + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1 UFID Unique file identifier + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) { // 4.1 UFI Unique file identifier + // There may be more than one 'UFID' frame in a tag, + // but only one with the same 'Owner identifier'. + //
    + // Owner identifier $00 + // Identifier + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00"); + $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos); + $parsedFrame['ownerid'] = $frame_idstring; + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) || // 4.2.2 TXXX User defined text information frame + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) { // 4.2.2 TXX User defined text information frame + // There may be more than one 'TXXX' frame in each tag, + // but only one with the same description. + //
    + // Text encoding $xx + // Description $00 (00) + // Value + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['description'] = $frame_description; + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding))); + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data'])); + } + unset($parsedFrame['data']); + + + } elseif ($parsedFrame['frame_name']{0} == 'T') { // 4.2. T??[?] Text information frame + // There may only be one text information frame of its kind in an tag. + //
    + // Text encoding $xx + // Information + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']); + } + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) || // 4.3.2 WXXX User defined URL link frame + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) { // 4.3.2 WXX User defined URL link frame + // There may be more than one 'WXXX' frame in each tag, + // but only one with the same description + //
    + // Text encoding $xx + // Description $00 (00) + // URL + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding))); + + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding)); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + if ($frame_terminatorpos) { + // there are null bytes after the data - this is not according to spec + // only use data up to first null byte + $frame_urldata = (string) substr($parsedFrame['data'], 0, $frame_terminatorpos); + } else { + // no null bytes following data, just use all data + $frame_urldata = (string) $parsedFrame['data']; + } + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['url'] = $frame_urldata; + $parsedFrame['description'] = $frame_description; + if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['url']); + } + unset($parsedFrame['data']); + + + } elseif ($parsedFrame['frame_name']{0} == 'W') { // 4.3. W??? URL link frames + // There may only be one URL link frame of its kind in a tag, + // except when stated otherwise in the frame description + //
    + // URL + + $parsedFrame['url'] = trim($parsedFrame['data']); + if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['url']; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) || // 4.4 IPLS Involved people list (ID3v2.3 only) + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) { // 4.4 IPL Involved people list (ID3v2.2 only) + // There may only be one 'IPL' frame in each tag + //
    + // Text encoding $xx + // People list strings + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($parsedFrame['encodingid']); + + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']); + } + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) || // 4.4 MCDI Music CD identifier + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) { // 4.5 MCI Music CD identifier + // There may only be one 'MCDI' frame in each tag + //
    + // CD TOC + + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; + } + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5 ETCO Event timing codes + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) { // 4.6 ETC Event timing codes + // There may only be one 'ETCO' frame in each tag + //
    + // Time stamp format $xx + // Where time stamp format is: + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + // Followed by a list of key events in the following format: + // Type of event $xx + // Time stamp $xx (xx ...) + // The 'Time stamp' is set to zero if directly at the beginning of the sound + // or after the previous event. All events MUST be sorted in chronological order. + + $frame_offset = 0; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + + while ($frame_offset < strlen($parsedFrame['data'])) { + $parsedFrame['typeid'] = substr($parsedFrame['data'], $frame_offset++, 1); + $parsedFrame['type'] = $this->ETCOEventLookup($parsedFrame['typeid']); + $parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) || // 4.6 MLLT MPEG location lookup table + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) { // 4.7 MLL MPEG location lookup table + // There may only be one 'MLLT' frame in each tag + //
    + // MPEG frames between reference $xx xx + // Bytes between reference $xx xx xx + // Milliseconds between reference $xx xx xx + // Bits for bytes deviation $xx + // Bits for milliseconds dev. $xx + // Then for every reference the following data is included; + // Deviation in bytes %xxx.... + // Deviation in milliseconds %xxx.... + + $frame_offset = 0; + $parsedFrame['framesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 2)); + $parsedFrame['bytesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 2, 3)); + $parsedFrame['msbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 5, 3)); + $parsedFrame['bitsforbytesdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 8, 1)); + $parsedFrame['bitsformsdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 9, 1)); + $parsedFrame['data'] = substr($parsedFrame['data'], 10); + while ($frame_offset < strlen($parsedFrame['data'])) { + $deviationbitstream .= getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); + } + $reference_counter = 0; + while (strlen($deviationbitstream) > 0) { + $parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation'])); + $parsedFrame[$reference_counter]['msdeviation'] = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation'])); + $deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']); + $reference_counter++; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7 SYTC Synchronised tempo codes + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) { // 4.8 STC Synchronised tempo codes + // There may only be one 'SYTC' frame in each tag + //
    + // Time stamp format $xx + // Tempo data + // Where time stamp format is: + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + + $frame_offset = 0; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $timestamp_counter = 0; + while ($frame_offset < strlen($parsedFrame['data'])) { + $parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ($parsedFrame[$timestamp_counter]['tempo'] == 255) { + $parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1)); + } + $parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $timestamp_counter++; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8 USLT Unsynchronised lyric/text transcription + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) { // 4.9 ULT Unsynchronised lyric/text transcription + // There may be more than one 'Unsynchronised lyrics/text transcription' frame + // in each tag, but only one with the same language and content descriptor. + //
    + // Text encoding $xx + // Language $xx xx xx + // Content descriptor $00 (00) + // Lyrics/text + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding))); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['data'] = $parsedFrame['data']; + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + $parsedFrame['description'] = $frame_description; + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']); + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9 SYLT Synchronised lyric/text + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) { // 4.10 SLT Synchronised lyric/text + // There may be more than one 'SYLT' frame in each tag, + // but only one with the same language and content descriptor. + //
    + // Text encoding $xx + // Language $xx xx xx + // Time stamp format $xx + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + // Content type $xx + // Content descriptor $00 (00) + // Terminated text to be synced (typically a syllable) + // Sync identifier (terminator to above string) $00 (00) + // Time stamp $xx (xx ...) + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['contenttypeid'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['contenttype'] = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + + $timestampindex = 0; + $frame_remainingdata = substr($parsedFrame['data'], $frame_offset); + while (strlen($frame_remainingdata)) { + $frame_offset = 0; + $frame_terminatorpos = strpos($frame_remainingdata, $this->TextEncodingTerminatorLookup($frame_textencoding)); + if ($frame_terminatorpos === false) { + $frame_remainingdata = ''; + } else { + if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset); + + $frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding))); + if (($timestampindex == 0) && (ord($frame_remainingdata{0}) != 0)) { + // timestamp probably omitted for first data item + } else { + $parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4)); + $frame_remainingdata = substr($frame_remainingdata, 4); + } + $timestampindex++; + } + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10 COMM Comments + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) { // 4.11 COM Comments + // There may be more than one comment frame in each tag, + // but only one with the same language and content descriptor. + //
    + // Text encoding $xx + // Language $xx xx xx + // Short content descrip. $00 (00) + // The actual text + + if (strlen($parsedFrame['data']) < 5) { + + $ThisFileInfo['warning'][] = 'Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset']; + + } else { + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding))); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + $parsedFrame['description'] = $frame_description; + $parsedFrame['data'] = $frame_text; + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']); + } + + } + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11 RVA2 Relative volume adjustment (2) (ID3v2.4+ only) + // There may be more than one 'RVA2' frame in each tag, + // but only one with the same identification string + //
    + // Identification $00 + // The 'identification' string is used to identify the situation and/or + // device where this adjustment should apply. The following is then + // repeated for every channel: + // Type of channel $xx + // Volume adjustment $xx xx + // Bits representing peak $xx + // Peak volume $xx (xx ...) + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00"); + $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos); + if (ord($frame_idstring) === 0) { + $frame_idstring = ''; + } + $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); + $parsedFrame['description'] = $frame_idstring; + while (strlen($frame_remainingdata)) { + $frame_offset = 0; + $frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1)); + $parsedFrame[$frame_channeltypeid]['channeltypeid'] = $frame_channeltypeid; + $parsedFrame[$frame_channeltypeid]['channeltype'] = $this->RVA2ChannelTypeLookup($frame_channeltypeid); + $parsedFrame[$frame_channeltypeid]['volumeadjust'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed + $frame_offset += 2; + $parsedFrame[$frame_channeltypeid]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1)); + $frame_bytespeakvolume = ceil($parsedFrame[$frame_channeltypeid]['bitspeakvolume'] / 8); + $parsedFrame[$frame_channeltypeid]['peakvolume'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume)); + $frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume); + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12 RVAD Relative volume adjustment (ID3v2.3 only) + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) { // 4.12 RVA Relative volume adjustment (ID3v2.2 only) + // There may only be one 'RVA' frame in each tag + //
    + // ID3v2.2 => Increment/decrement %000000ba + // ID3v2.3 => Increment/decrement %00fedcba + // Bits used for volume descr. $xx + // Relative volume change, right $xx xx (xx ...) // a + // Relative volume change, left $xx xx (xx ...) // b + // Peak volume right $xx xx (xx ...) + // Peak volume left $xx xx (xx ...) + // ID3v2.3 only, optional (not present in ID3v2.2): + // Relative volume change, right back $xx xx (xx ...) // c + // Relative volume change, left back $xx xx (xx ...) // d + // Peak volume right back $xx xx (xx ...) + // Peak volume left back $xx xx (xx ...) + // ID3v2.3 only, optional (not present in ID3v2.2): + // Relative volume change, center $xx xx (xx ...) // e + // Peak volume center $xx xx (xx ...) + // ID3v2.3 only, optional (not present in ID3v2.2): + // Relative volume change, bass $xx xx (xx ...) // f + // Peak volume bass $xx xx (xx ...) + + $frame_offset = 0; + $frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1); + $parsedFrame['incdec']['left'] = (bool) substr($frame_incrdecrflags, 7, 1); + $parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8); + $parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['right'] === false) { + $parsedFrame['volumechange']['right'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['volumechange']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['left'] === false) { + $parsedFrame['volumechange']['left'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + if ($id3v2_majorversion == 3) { + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); + if (strlen($parsedFrame['data']) > 0) { + $parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1); + $parsedFrame['incdec']['leftrear'] = (bool) substr($frame_incrdecrflags, 5, 1); + $parsedFrame['volumechange']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['rightrear'] === false) { + $parsedFrame['volumechange']['rightrear'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['volumechange']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['leftrear'] === false) { + $parsedFrame['volumechange']['leftrear'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + } + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); + if (strlen($parsedFrame['data']) > 0) { + $parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1); + $parsedFrame['volumechange']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['center'] === false) { + $parsedFrame['volumechange']['center'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + } + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); + if (strlen($parsedFrame['data']) > 0) { + $parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1); + $parsedFrame['volumechange']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['bass'] === false) { + $parsedFrame['volumechange']['bass'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + } + } + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) { // 4.12 EQU2 Equalisation (2) (ID3v2.4+ only) + // There may be more than one 'EQU2' frame in each tag, + // but only one with the same identification string + //
    + // Interpolation method $xx + // $00 Band + // $01 Linear + // Identification $00 + // The following is then repeated for every adjustment point + // Frequency $xx xx + // Volume adjustment $xx xx + + $frame_offset = 0; + $frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_idstring) === 0) { + $frame_idstring = ''; + } + $parsedFrame['description'] = $frame_idstring; + $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); + while (strlen($frame_remainingdata)) { + $frame_frequency = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 2)) / 2; + $parsedFrame['data'][$frame_frequency] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, 2), false, true); + $frame_remainingdata = substr($frame_remainingdata, 4); + } + $parsedFrame['interpolationmethod'] = $frame_interpolationmethod; + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) || // 4.12 EQUA Equalisation (ID3v2.3 only) + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) { // 4.13 EQU Equalisation (ID3v2.2 only) + // There may only be one 'EQUA' frame in each tag + //
    + // Adjustment bits $xx + // This is followed by 2 bytes + ('adjustment bits' rounded up to the + // nearest byte) for every equalisation band in the following format, + // giving a frequency range of 0 - 32767Hz: + // Increment/decrement %x (MSB of the Frequency) + // Frequency (lower 15 bits) + // Adjustment $xx (xx ...) + + $frame_offset = 0; + $parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1); + $frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8); + + $frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset); + while (strlen($frame_remainingdata) > 0) { + $frame_frequencystr = getid3_lib::BigEndian2Bin(substr($frame_remainingdata, 0, 2)); + $frame_incdec = (bool) substr($frame_frequencystr, 0, 1); + $frame_frequency = bindec(substr($frame_frequencystr, 1, 15)); + $parsedFrame[$frame_frequency]['incdec'] = $frame_incdec; + $parsedFrame[$frame_frequency]['adjustment'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes)); + if ($parsedFrame[$frame_frequency]['incdec'] === false) { + $parsedFrame[$frame_frequency]['adjustment'] *= -1; + } + $frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes); + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) || // 4.13 RVRB Reverb + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) { // 4.14 REV Reverb + // There may only be one 'RVRB' frame in each tag. + //
    + // Reverb left (ms) $xx xx + // Reverb right (ms) $xx xx + // Reverb bounces, left $xx + // Reverb bounces, right $xx + // Reverb feedback, left to left $xx + // Reverb feedback, left to right $xx + // Reverb feedback, right to right $xx + // Reverb feedback, right to left $xx + // Premix left to right $xx + // Premix right to left $xx + + $frame_offset = 0; + $parsedFrame['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['bouncesL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['bouncesR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackLL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackRR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['premixLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['premixRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) || // 4.14 APIC Attached picture + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) { // 4.15 PIC Attached picture + // There may be several pictures attached to one file, + // each in their individual 'APIC' frame, but only one + // with the same content descriptor + //
    + // Text encoding $xx + // ID3v2.3+ => MIME type $00 + // ID3v2.2 => Image format $xx xx xx + // Picture type $xx + // Description $00 (00) + // Picture data + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + + if ($id3v2_majorversion == 2) { + $frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3); + if (strtolower($frame_imagetype) == 'ima') { + // complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted + // MIME type instead of 3-char ID3v2.2-format image type (thanks xbhoffpacbell*net) + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_mimetype) === 0) { + $frame_mimetype = ''; + } + $frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype))); + if ($frame_imagetype == 'JPEG') { + $frame_imagetype = 'JPG'; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + } else { + $frame_offset += 3; + } + } + if ($id3v2_majorversion > 2) { + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_mimetype) === 0) { + $frame_mimetype = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + } + + $frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + if ($id3v2_majorversion == 2) { + $parsedFrame['imagetype'] = $frame_imagetype; + } else { + $parsedFrame['mime'] = $frame_mimetype; + } + $parsedFrame['picturetypeid'] = $frame_picturetype; + $parsedFrame['picturetype'] = $this->APICPictureTypeLookup($frame_picturetype); + $parsedFrame['description'] = $frame_description; + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding))); + + $imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data']); + if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { + $parsedFrame['image_mime'] = 'image/'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]); + if ($imagechunkcheck[0]) { + $parsedFrame['image_width'] = $imagechunkcheck[0]; + } + if ($imagechunkcheck[1]) { + $parsedFrame['image_height'] = $imagechunkcheck[1]; + } + $parsedFrame['image_bytes'] = strlen($parsedFrame['data']); + } + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15 GEOB General encapsulated object + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) { // 4.16 GEO General encapsulated object + // There may be more than one 'GEOB' frame in each tag, + // but only one with the same content descriptor + //
    + // Text encoding $xx + // MIME type $00 + // Filename $00 (00) + // Content description $00 (00) + // Encapsulated object + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_mimetype) === 0) { + $frame_mimetype = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_filename) === 0) { + $frame_filename = ''; + } + $frame_offset = $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)); + + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $frame_offset = $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)); + + $parsedFrame['objectdata'] = (string) substr($parsedFrame['data'], $frame_offset); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['mime'] = $frame_mimetype; + $parsedFrame['filename'] = $frame_filename; + $parsedFrame['description'] = $frame_description; + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) || // 4.16 PCNT Play counter + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) { // 4.17 CNT Play counter + // There may only be one 'PCNT' frame in each tag. + // When the counter reaches all one's, one byte is inserted in + // front of the counter thus making the counter eight bits bigger + //
    + // Counter $xx xx xx xx (xx ...) + + $parsedFrame['data'] = getid3_lib::BigEndian2Int($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) || // 4.17 POPM Popularimeter + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) { // 4.18 POP Popularimeter + // There may be more than one 'POPM' frame in each tag, + // but only one with the same email address + //
    + // Email to user $00 + // Rating $xx + // Counter $xx xx xx xx (xx ...) + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_emailaddress) === 0) { + $frame_emailaddress = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['data'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); + $parsedFrame['email'] = $frame_emailaddress; + $parsedFrame['rating'] = $frame_rating; + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) || // 4.18 RBUF Recommended buffer size + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) { // 4.19 BUF Recommended buffer size + // There may only be one 'RBUF' frame in each tag + //
    + // Buffer size $xx xx xx + // Embedded info flag %0000000x + // Offset to next tag $xx xx xx xx + + $frame_offset = 0; + $parsedFrame['buffersize'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 3)); + $frame_offset += 3; + + $frame_embeddedinfoflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1); + $parsedFrame['nexttagoffset'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) { // 4.20 Encrypted meta frame (ID3v2.2 only) + // There may be more than one 'CRM' frame in a tag, + // but only one with the same 'owner identifier' + //
    + // Owner identifier $00 (00) + // Content/explanation $00 (00) + // Encrypted datablock + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + $parsedFrame['description'] = $frame_description; + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) || // 4.19 AENC Audio encryption + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) { // 4.21 CRA Audio encryption + // There may be more than one 'AENC' frames in a tag, + // but only one with the same 'Owner identifier' + //
    + // Owner identifier $00 + // Preview start $xx xx + // Preview length $xx xx + // Encryption info + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid == ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['previewstart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['previewlength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset); + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) || // 4.20 LINK Linked information + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) { // 4.22 LNK Linked information + // There may be more than one 'LINK' frame in a tag, + // but only one with the same contents + //
    + // ID3v2.3+ => Frame identifier $xx xx xx xx + // ID3v2.2 => Frame identifier $xx xx xx + // URL $00 + // ID and additional data + + $frame_offset = 0; + if ($id3v2_majorversion == 2) { + $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + } else { + $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4); + $frame_offset += 4; + } + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_url) === 0) { + $frame_url = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $parsedFrame['url'] = $frame_url; + + $parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset); + if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['url']); + } + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) { // 4.21 POSS Position synchronisation frame (ID3v2.3+ only) + // There may only be one 'POSS' frame in each tag + // + // Time stamp format $xx + // Position $xx (xx ...) + + $frame_offset = 0; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['position'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) { // 4.22 USER Terms of use (ID3v2.3+ only) + // There may be more than one 'Terms of use' frame in a tag, + // but only one with the same 'Language' + //
    + // Text encoding $xx + // Language $xx xx xx + // The actual text + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']); + } + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) { // 4.23 OWNE Ownership frame (ID3v2.3+ only) + // There may only be one 'OWNE' frame in a tag + //
    + // Text encoding $xx + // Price paid $00 + // Date of purch. + // Seller + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3); + $parsedFrame['pricepaid']['currency'] = $this->LookupCurrencyUnits($parsedFrame['pricepaid']['currencyid']); + $parsedFrame['pricepaid']['value'] = substr($frame_pricepaid, 3); + + $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8); + if (!$this->IsValidDateStampString($parsedFrame['purchasedate'])) { + $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4)); + } + $frame_offset += 8; + + $parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset); + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) { // 4.24 COMR Commercial frame (ID3v2.3+ only) + // There may be more than one 'commercial frame' in a tag, + // but no two may be identical + //
    + // Text encoding $xx + // Price string $00 + // Valid until + // Contact URL $00 + // Received as $xx + // Name of seller $00 (00) + // Description $00 (00) + // Picture MIME type $00 + // Seller logo + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; + } + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $frame_rawpricearray = explode('/', $frame_pricestring); + foreach ($frame_rawpricearray as $key => $val) { + $frame_currencyid = substr($val, 0, 3); + $parsedFrame['price'][$frame_currencyid]['currency'] = $this->LookupCurrencyUnits($frame_currencyid); + $parsedFrame['price'][$frame_currencyid]['value'] = substr($val, 3); + } + + $frame_datestring = substr($parsedFrame['data'], $frame_offset, 8); + $frame_offset += 8; + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_sellername) === 0) { + $frame_sellername = ''; + } + $frame_offset = $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)); + + $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_description) === 0) { + $frame_description = ''; + } + $frame_offset = $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)); + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_sellerlogo = substr($parsedFrame['data'], $frame_offset); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['pricevaliduntil'] = $frame_datestring; + $parsedFrame['contacturl'] = $frame_contacturl; + $parsedFrame['receivedasid'] = $frame_receivedasid; + $parsedFrame['receivedas'] = $this->COMRReceivedAsLookup($frame_receivedasid); + $parsedFrame['sellername'] = $frame_sellername; + $parsedFrame['description'] = $frame_description; + $parsedFrame['mime'] = $frame_mimetype; + $parsedFrame['logo'] = $frame_sellerlogo; + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) { // 4.25 ENCR Encryption method registration (ID3v2.3+ only) + // There may be several 'ENCR' frames in a tag, + // but only one containing the same symbol + // and only one containing the same owner identifier + //
    + // Owner identifier $00 + // Method symbol $xx + // Encryption data + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) { // 4.26 GRID Group identification registration (ID3v2.3+ only) + + // There may be several 'GRID' frames in a tag, + // but only one containing the same symbol + // and only one containing the same owner identifier + //
    + // Owner identifier $00 + // Group symbol $xx + // Group dependent data + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) { // 4.27 PRIV Private frame (ID3v2.3+ only) + // The tag may contain more than one 'PRIV' frame + // but only with different contents + //
    + // Owner identifier $00 + // The private data + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) { // 4.28 SIGN Signature frame (ID3v2.4+ only) + // There may be more than one 'signature frame' in a tag, + // but no two may be identical + //
    + // Group symbol $xx + // Signature + + $frame_offset = 0; + $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) { // 4.29 SEEK Seek frame (ID3v2.4+ only) + // There may only be one 'seek frame' in a tag + //
    + // Minimum offset to next tag $xx xx xx xx + + $frame_offset = 0; + $parsedFrame['data'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) { // 4.30 ASPI Audio seek point index (ID3v2.4+ only) + // There may only be one 'audio seek point index' frame in a tag + //
    + // Indexed data start (S) $xx xx xx xx + // Indexed data length (L) $xx xx xx xx + // Number of index points (N) $xx xx + // Bits per index point (b) $xx + // Then for every index point the following data is included: + // Fraction at index (Fi) $xx (xx) + + $frame_offset = 0; + $parsedFrame['datastart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $parsedFrame['indexeddatalength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $parsedFrame['indexpoints'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8); + for ($i = 0; $i < $frame_indexpoints; $i++) { + $parsedFrame['indexes'][$i] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesperpoint)); + $frame_offset += $frame_bytesperpoint; + } + unset($parsedFrame['data']); + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) { // Replay Gain Adjustment + // http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html + // There may only be one 'RGAD' frame in a tag + //
    + // Peak Amplitude $xx $xx $xx $xx + // Radio Replay Gain Adjustment %aaabbbcd %dddddddd + // Audiophile Replay Gain Adjustment %aaabbbcd %dddddddd + // a - name code + // b - originator code + // c - sign bit + // d - replay gain adjustment + + $frame_offset = 0; + $parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $rg_track_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $rg_album_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['raw']['track']['name'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3)); + $parsedFrame['raw']['track']['originator'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3)); + $parsedFrame['raw']['track']['signbit'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1)); + $parsedFrame['raw']['track']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9)); + $parsedFrame['raw']['album']['name'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3)); + $parsedFrame['raw']['album']['originator'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3)); + $parsedFrame['raw']['album']['signbit'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1)); + $parsedFrame['raw']['album']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9)); + $parsedFrame['track']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']); + $parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']); + $parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']); + $parsedFrame['album']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['album']['name']); + $parsedFrame['album']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['album']['originator']); + $parsedFrame['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['album']['adjustment'], $parsedFrame['raw']['album']['signbit']); + + $ThisFileInfo['replay_gain']['track']['peak'] = $parsedFrame['peakamplitude']; + $ThisFileInfo['replay_gain']['track']['originator'] = $parsedFrame['track']['originator']; + $ThisFileInfo['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment']; + $ThisFileInfo['replay_gain']['album']['originator'] = $parsedFrame['album']['originator']; + $ThisFileInfo['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment']; + + unset($parsedFrame['data']); + + } + + return true; + } + + + function DeUnsynchronise($data) { + return str_replace("\xFF\x00", "\xFF", $data); + } + + function LookupCurrencyUnits($currencyid) { + + $begin = __LINE__; + + /** This is not a comment! + + + AED Dirhams + AFA Afghanis + ALL Leke + AMD Drams + ANG Guilders + AOA Kwanza + ARS Pesos + ATS Schillings + AUD Dollars + AWG Guilders + AZM Manats + BAM Convertible Marka + BBD Dollars + BDT Taka + BEF Francs + BGL Leva + BHD Dinars + BIF Francs + BMD Dollars + BND Dollars + BOB Bolivianos + BRL Brazil Real + BSD Dollars + BTN Ngultrum + BWP Pulas + BYR Rubles + BZD Dollars + CAD Dollars + CDF Congolese Francs + CHF Francs + CLP Pesos + CNY Yuan Renminbi + COP Pesos + CRC Colones + CUP Pesos + CVE Escudos + CYP Pounds + CZK Koruny + DEM Deutsche Marks + DJF Francs + DKK Kroner + DOP Pesos + DZD Algeria Dinars + EEK Krooni + EGP Pounds + ERN Nakfa + ESP Pesetas + ETB Birr + EUR Euro + FIM Markkaa + FJD Dollars + FKP Pounds + FRF Francs + GBP Pounds + GEL Lari + GGP Pounds + GHC Cedis + GIP Pounds + GMD Dalasi + GNF Francs + GRD Drachmae + GTQ Quetzales + GYD Dollars + HKD Dollars + HNL Lempiras + HRK Kuna + HTG Gourdes + HUF Forints + IDR Rupiahs + IEP Pounds + ILS New Shekels + IMP Pounds + INR Rupees + IQD Dinars + IRR Rials + ISK Kronur + ITL Lire + JEP Pounds + JMD Dollars + JOD Dinars + JPY Yen + KES Shillings + KGS Soms + KHR Riels + KMF Francs + KPW Won + KWD Dinars + KYD Dollars + KZT Tenge + LAK Kips + LBP Pounds + LKR Rupees + LRD Dollars + LSL Maloti + LTL Litai + LUF Francs + LVL Lati + LYD Dinars + MAD Dirhams + MDL Lei + MGF Malagasy Francs + MKD Denars + MMK Kyats + MNT Tugriks + MOP Patacas + MRO Ouguiyas + MTL Liri + MUR Rupees + MVR Rufiyaa + MWK Kwachas + MXN Pesos + MYR Ringgits + MZM Meticais + NAD Dollars + NGN Nairas + NIO Gold Cordobas + NLG Guilders + NOK Krone + NPR Nepal Rupees + NZD Dollars + OMR Rials + PAB Balboa + PEN Nuevos Soles + PGK Kina + PHP Pesos + PKR Rupees + PLN Zlotych + PTE Escudos + PYG Guarani + QAR Rials + ROL Lei + RUR Rubles + RWF Rwanda Francs + SAR Riyals + SBD Dollars + SCR Rupees + SDD Dinars + SEK Kronor + SGD Dollars + SHP Pounds + SIT Tolars + SKK Koruny + SLL Leones + SOS Shillings + SPL Luigini + SRG Guilders + STD Dobras + SVC Colones + SYP Pounds + SZL Emalangeni + THB Baht + TJR Rubles + TMM Manats + TND Dinars + TOP Pa'anga + TRL Liras + TTD Dollars + TVD Tuvalu Dollars + TWD New Dollars + TZS Shillings + UAH Hryvnia + UGX Shillings + USD Dollars + UYU Pesos + UZS Sums + VAL Lire + VEB Bolivares + VND Dong + VUV Vatu + WST Tala + XAF Francs + XAG Ounces + XAU Ounces + XCD Dollars + XDR Special Drawing Rights + XPD Ounces + XPF Francs + XPT Ounces + YER Rials + YUM New Dinars + ZAR Rand + ZMK Kwacha + ZWD Zimbabwe Dollars + + */ + + return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-units'); + } + + + function LookupCurrencyCountry($currencyid) { + + $begin = __LINE__; + + /** This is not a comment! + + AED United Arab Emirates + AFA Afghanistan + ALL Albania + AMD Armenia + ANG Netherlands Antilles + AOA Angola + ARS Argentina + ATS Austria + AUD Australia + AWG Aruba + AZM Azerbaijan + BAM Bosnia and Herzegovina + BBD Barbados + BDT Bangladesh + BEF Belgium + BGL Bulgaria + BHD Bahrain + BIF Burundi + BMD Bermuda + BND Brunei Darussalam + BOB Bolivia + BRL Brazil + BSD Bahamas + BTN Bhutan + BWP Botswana + BYR Belarus + BZD Belize + CAD Canada + CDF Congo/Kinshasa + CHF Switzerland + CLP Chile + CNY China + COP Colombia + CRC Costa Rica + CUP Cuba + CVE Cape Verde + CYP Cyprus + CZK Czech Republic + DEM Germany + DJF Djibouti + DKK Denmark + DOP Dominican Republic + DZD Algeria + EEK Estonia + EGP Egypt + ERN Eritrea + ESP Spain + ETB Ethiopia + EUR Euro Member Countries + FIM Finland + FJD Fiji + FKP Falkland Islands (Malvinas) + FRF France + GBP United Kingdom + GEL Georgia + GGP Guernsey + GHC Ghana + GIP Gibraltar + GMD Gambia + GNF Guinea + GRD Greece + GTQ Guatemala + GYD Guyana + HKD Hong Kong + HNL Honduras + HRK Croatia + HTG Haiti + HUF Hungary + IDR Indonesia + IEP Ireland (Eire) + ILS Israel + IMP Isle of Man + INR India + IQD Iraq + IRR Iran + ISK Iceland + ITL Italy + JEP Jersey + JMD Jamaica + JOD Jordan + JPY Japan + KES Kenya + KGS Kyrgyzstan + KHR Cambodia + KMF Comoros + KPW Korea + KWD Kuwait + KYD Cayman Islands + KZT Kazakstan + LAK Laos + LBP Lebanon + LKR Sri Lanka + LRD Liberia + LSL Lesotho + LTL Lithuania + LUF Luxembourg + LVL Latvia + LYD Libya + MAD Morocco + MDL Moldova + MGF Madagascar + MKD Macedonia + MMK Myanmar (Burma) + MNT Mongolia + MOP Macau + MRO Mauritania + MTL Malta + MUR Mauritius + MVR Maldives (Maldive Islands) + MWK Malawi + MXN Mexico + MYR Malaysia + MZM Mozambique + NAD Namibia + NGN Nigeria + NIO Nicaragua + NLG Netherlands (Holland) + NOK Norway + NPR Nepal + NZD New Zealand + OMR Oman + PAB Panama + PEN Peru + PGK Papua New Guinea + PHP Philippines + PKR Pakistan + PLN Poland + PTE Portugal + PYG Paraguay + QAR Qatar + ROL Romania + RUR Russia + RWF Rwanda + SAR Saudi Arabia + SBD Solomon Islands + SCR Seychelles + SDD Sudan + SEK Sweden + SGD Singapore + SHP Saint Helena + SIT Slovenia + SKK Slovakia + SLL Sierra Leone + SOS Somalia + SPL Seborga + SRG Suriname + STD So Tome and Principe + SVC El Salvador + SYP Syria + SZL Swaziland + THB Thailand + TJR Tajikistan + TMM Turkmenistan + TND Tunisia + TOP Tonga + TRL Turkey + TTD Trinidad and Tobago + TVD Tuvalu + TWD Taiwan + TZS Tanzania + UAH Ukraine + UGX Uganda + USD United States of America + UYU Uruguay + UZS Uzbekistan + VAL Vatican City + VEB Venezuela + VND Viet Nam + VUV Vanuatu + WST Samoa + XAF Communaut Financire Africaine + XAG Silver + XAU Gold + XCD East Caribbean + XDR International Monetary Fund + XPD Palladium + XPF Comptoirs Franais du Pacifique + XPT Platinum + YER Yemen + YUM Yugoslavia + ZAR South Africa + ZMK Zambia + ZWD Zimbabwe + + */ + + return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-country'); + } + + + + function LanguageLookup($languagecode, $casesensitive=false) { + + if (!$casesensitive) { + $languagecode = strtolower($languagecode); + } + + // http://www.id3.org/id3v2.4.0-structure.txt + // [4. ID3v2 frame overview] + // The three byte language field, present in several frames, is used to + // describe the language of the frame's content, according to ISO-639-2 + // [ISO-639-2]. The language should be represented in lower case. If the + // language is not known the string "XXX" should be used. + + + // ISO 639-2 - http://www.id3.org/iso639-2.html + + $begin = __LINE__; + + /** This is not a comment! + + XXX unknown + xxx unknown + aar Afar + abk Abkhazian + ace Achinese + ach Acoli + ada Adangme + afa Afro-Asiatic (Other) + afh Afrihili + afr Afrikaans + aka Akan + akk Akkadian + alb Albanian + ale Aleut + alg Algonquian Languages + amh Amharic + ang English, Old (ca. 450-1100) + apa Apache Languages + ara Arabic + arc Aramaic + arm Armenian + arn Araucanian + arp Arapaho + art Artificial (Other) + arw Arawak + asm Assamese + ath Athapascan Languages + ava Avaric + ave Avestan + awa Awadhi + aym Aymara + aze Azerbaijani + bad Banda + bai Bamileke Languages + bak Bashkir + bal Baluchi + bam Bambara + ban Balinese + baq Basque + bas Basa + bat Baltic (Other) + bej Beja + bel Byelorussian + bem Bemba + ben Bengali + ber Berber (Other) + bho Bhojpuri + bih Bihari + bik Bikol + bin Bini + bis Bislama + bla Siksika + bnt Bantu (Other) + bod Tibetan + bra Braj + bre Breton + bua Buriat + bug Buginese + bul Bulgarian + bur Burmese + cad Caddo + cai Central American Indian (Other) + car Carib + cat Catalan + cau Caucasian (Other) + ceb Cebuano + cel Celtic (Other) + ces Czech + cha Chamorro + chb Chibcha + che Chechen + chg Chagatai + chi Chinese + chm Mari + chn Chinook jargon + cho Choctaw + chr Cherokee + chu Church Slavic + chv Chuvash + chy Cheyenne + cop Coptic + cor Cornish + cos Corsican + cpe Creoles and Pidgins, English-based (Other) + cpf Creoles and Pidgins, French-based (Other) + cpp Creoles and Pidgins, Portuguese-based (Other) + cre Cree + crp Creoles and Pidgins (Other) + cus Cushitic (Other) + cym Welsh + cze Czech + dak Dakota + dan Danish + del Delaware + deu German + din Dinka + div Divehi + doi Dogri + dra Dravidian (Other) + dua Duala + dum Dutch, Middle (ca. 1050-1350) + dut Dutch + dyu Dyula + dzo Dzongkha + efi Efik + egy Egyptian (Ancient) + eka Ekajuk + ell Greek, Modern (1453-) + elx Elamite + eng English + enm English, Middle (ca. 1100-1500) + epo Esperanto + esk Eskimo (Other) + esl Spanish + est Estonian + eus Basque + ewe Ewe + ewo Ewondo + fan Fang + fao Faroese + fas Persian + fat Fanti + fij Fijian + fin Finnish + fiu Finno-Ugrian (Other) + fon Fon + fra French + fre French + frm French, Middle (ca. 1400-1600) + fro French, Old (842- ca. 1400) + fry Frisian + ful Fulah + gaa Ga + gae Gaelic (Scots) + gai Irish + gay Gayo + gdh Gaelic (Scots) + gem Germanic (Other) + geo Georgian + ger German + gez Geez + gil Gilbertese + glg Gallegan + gmh German, Middle High (ca. 1050-1500) + goh German, Old High (ca. 750-1050) + gon Gondi + got Gothic + grb Grebo + grc Greek, Ancient (to 1453) + gre Greek, Modern (1453-) + grn Guarani + guj Gujarati + hai Haida + hau Hausa + haw Hawaiian + heb Hebrew + her Herero + hil Hiligaynon + him Himachali + hin Hindi + hmo Hiri Motu + hun Hungarian + hup Hupa + hye Armenian + iba Iban + ibo Igbo + ice Icelandic + ijo Ijo + iku Inuktitut + ilo Iloko + ina Interlingua (International Auxiliary language Association) + inc Indic (Other) + ind Indonesian + ine Indo-European (Other) + ine Interlingue + ipk Inupiak + ira Iranian (Other) + iri Irish + iro Iroquoian uages + isl Icelandic + ita Italian + jav Javanese + jaw Javanese + jpn Japanese + jpr Judeo-Persian + jrb Judeo-Arabic + kaa Kara-Kalpak + kab Kabyle + kac Kachin + kal Greenlandic + kam Kamba + kan Kannada + kar Karen + kas Kashmiri + kat Georgian + kau Kanuri + kaw Kawi + kaz Kazakh + kha Khasi + khi Khoisan (Other) + khm Khmer + kho Khotanese + kik Kikuyu + kin Kinyarwanda + kir Kirghiz + kok Konkani + kom Komi + kon Kongo + kor Korean + kpe Kpelle + kro Kru + kru Kurukh + kua Kuanyama + kum Kumyk + kur Kurdish + kus Kusaie + kut Kutenai + lad Ladino + lah Lahnda + lam Lamba + lao Lao + lat Latin + lav Latvian + lez Lezghian + lin Lingala + lit Lithuanian + lol Mongo + loz Lozi + ltz Letzeburgesch + lub Luba-Katanga + lug Ganda + lui Luiseno + lun Lunda + luo Luo (Kenya and Tanzania) + mac Macedonian + mad Madurese + mag Magahi + mah Marshall + mai Maithili + mak Macedonian + mak Makasar + mal Malayalam + man Mandingo + mao Maori + map Austronesian (Other) + mar Marathi + mas Masai + max Manx + may Malay + men Mende + mga Irish, Middle (900 - 1200) + mic Micmac + min Minangkabau + mis Miscellaneous (Other) + mkh Mon-Kmer (Other) + mlg Malagasy + mlt Maltese + mni Manipuri + mno Manobo Languages + moh Mohawk + mol Moldavian + mon Mongolian + mos Mossi + mri Maori + msa Malay + mul Multiple Languages + mun Munda Languages + mus Creek + mwr Marwari + mya Burmese + myn Mayan Languages + nah Aztec + nai North American Indian (Other) + nau Nauru + nav Navajo + nbl Ndebele, South + nde Ndebele, North + ndo Ndongo + nep Nepali + new Newari + nic Niger-Kordofanian (Other) + niu Niuean + nla Dutch + nno Norwegian (Nynorsk) + non Norse, Old + nor Norwegian + nso Sotho, Northern + nub Nubian Languages + nya Nyanja + nym Nyamwezi + nyn Nyankole + nyo Nyoro + nzi Nzima + oci Langue d'Oc (post 1500) + oji Ojibwa + ori Oriya + orm Oromo + osa Osage + oss Ossetic + ota Turkish, Ottoman (1500 - 1928) + oto Otomian Languages + paa Papuan-Australian (Other) + pag Pangasinan + pal Pahlavi + pam Pampanga + pan Panjabi + pap Papiamento + pau Palauan + peo Persian, Old (ca 600 - 400 B.C.) + per Persian + phn Phoenician + pli Pali + pol Polish + pon Ponape + por Portuguese + pra Prakrit uages + pro Provencal, Old (to 1500) + pus Pushto + que Quechua + raj Rajasthani + rar Rarotongan + roa Romance (Other) + roh Rhaeto-Romance + rom Romany + ron Romanian + rum Romanian + run Rundi + rus Russian + sad Sandawe + sag Sango + sah Yakut + sai South American Indian (Other) + sal Salishan Languages + sam Samaritan Aramaic + san Sanskrit + sco Scots + scr Serbo-Croatian + sel Selkup + sem Semitic (Other) + sga Irish, Old (to 900) + shn Shan + sid Sidamo + sin Singhalese + sio Siouan Languages + sit Sino-Tibetan (Other) + sla Slavic (Other) + slk Slovak + slo Slovak + slv Slovenian + smi Sami Languages + smo Samoan + sna Shona + snd Sindhi + sog Sogdian + som Somali + son Songhai + sot Sotho, Southern + spa Spanish + sqi Albanian + srd Sardinian + srr Serer + ssa Nilo-Saharan (Other) + ssw Siswant + ssw Swazi + suk Sukuma + sun Sudanese + sus Susu + sux Sumerian + sve Swedish + swa Swahili + swe Swedish + syr Syriac + tah Tahitian + tam Tamil + tat Tatar + tel Telugu + tem Timne + ter Tereno + tgk Tajik + tgl Tagalog + tha Thai + tib Tibetan + tig Tigre + tir Tigrinya + tiv Tivi + tli Tlingit + tmh Tamashek + tog Tonga (Nyasa) + ton Tonga (Tonga Islands) + tru Truk + tsi Tsimshian + tsn Tswana + tso Tsonga + tuk Turkmen + tum Tumbuka + tur Turkish + tut Altaic (Other) + twi Twi + tyv Tuvinian + uga Ugaritic + uig Uighur + ukr Ukrainian + umb Umbundu + und Undetermined + urd Urdu + uzb Uzbek + vai Vai + ven Venda + vie Vietnamese + vol Volapk + vot Votic + wak Wakashan Languages + wal Walamo + war Waray + was Washo + wel Welsh + wen Sorbian Languages + wol Wolof + xho Xhosa + yao Yao + yap Yap + yid Yiddish + yor Yoruba + zap Zapotec + zen Zenaga + zha Zhuang + zho Chinese + zul Zulu + zun Zuni + + */ + + return getid3_lib::EmbeddedLookup($languagecode, $begin, __LINE__, __FILE__, 'id3v2-languagecode'); + } + + + function ETCOEventLookup($index) { + if (($index >= 0x17) && ($index <= 0xDF)) { + return 'reserved for future use'; + } + if (($index >= 0xE0) && ($index <= 0xEF)) { + return 'not predefined synch 0-F'; + } + if (($index >= 0xF0) && ($index <= 0xFC)) { + return 'reserved for future use'; + } + + static $EventLookup = array( + 0x00 => 'padding (has no meaning)', + 0x01 => 'end of initial silence', + 0x02 => 'intro start', + 0x03 => 'main part start', + 0x04 => 'outro start', + 0x05 => 'outro end', + 0x06 => 'verse start', + 0x07 => 'refrain start', + 0x08 => 'interlude start', + 0x09 => 'theme start', + 0x0A => 'variation start', + 0x0B => 'key change', + 0x0C => 'time change', + 0x0D => 'momentary unwanted noise (Snap, Crackle & Pop)', + 0x0E => 'sustained noise', + 0x0F => 'sustained noise end', + 0x10 => 'intro end', + 0x11 => 'main part end', + 0x12 => 'verse end', + 0x13 => 'refrain end', + 0x14 => 'theme end', + 0x15 => 'profanity', + 0x16 => 'profanity end', + 0xFD => 'audio end (start of silence)', + 0xFE => 'audio file ends', + 0xFF => 'one more byte of events follows' + ); + + return (isset($EventLookup[$index]) ? $EventLookup[$index] : ''); + } + + function SYTLContentTypeLookup($index) { + static $SYTLContentTypeLookup = array( + 0x00 => 'other', + 0x01 => 'lyrics', + 0x02 => 'text transcription', + 0x03 => 'movement/part name', // (e.g. 'Adagio') + 0x04 => 'events', // (e.g. 'Don Quijote enters the stage') + 0x05 => 'chord', // (e.g. 'Bb F Fsus') + 0x06 => 'trivia/\'pop up\' information', + 0x07 => 'URLs to webpages', + 0x08 => 'URLs to images' + ); + + return (isset($SYTLContentTypeLookup[$index]) ? $SYTLContentTypeLookup[$index] : ''); + } + + function APICPictureTypeLookup($index, $returnarray=false) { + static $APICPictureTypeLookup = array( + 0x00 => 'Other', + 0x01 => '32x32 pixels \'file icon\' (PNG only)', + 0x02 => 'Other file icon', + 0x03 => 'Cover (front)', + 0x04 => 'Cover (back)', + 0x05 => 'Leaflet page', + 0x06 => 'Media (e.g. label side of CD)', + 0x07 => 'Lead artist/lead performer/soloist', + 0x08 => 'Artist/performer', + 0x09 => 'Conductor', + 0x0A => 'Band/Orchestra', + 0x0B => 'Composer', + 0x0C => 'Lyricist/text writer', + 0x0D => 'Recording Location', + 0x0E => 'During recording', + 0x0F => 'During performance', + 0x10 => 'Movie/video screen capture', + 0x11 => 'A bright coloured fish', + 0x12 => 'Illustration', + 0x13 => 'Band/artist logotype', + 0x14 => 'Publisher/Studio logotype' + ); + if ($returnarray) { + return $APICPictureTypeLookup; + } + return (isset($APICPictureTypeLookup[$index]) ? $APICPictureTypeLookup[$index] : ''); + } + + function COMRReceivedAsLookup($index) { + static $COMRReceivedAsLookup = array( + 0x00 => 'Other', + 0x01 => 'Standard CD album with other songs', + 0x02 => 'Compressed audio on CD', + 0x03 => 'File over the Internet', + 0x04 => 'Stream over the Internet', + 0x05 => 'As note sheets', + 0x06 => 'As note sheets in a book with other sheets', + 0x07 => 'Music on other media', + 0x08 => 'Non-musical merchandise' + ); + + return (isset($COMRReceivedAsLookup[$index]) ? $COMRReceivedAsLookup[$index] : ''); + } + + function RVA2ChannelTypeLookup($index) { + static $RVA2ChannelTypeLookup = array( + 0x00 => 'Other', + 0x01 => 'Master volume', + 0x02 => 'Front right', + 0x03 => 'Front left', + 0x04 => 'Back right', + 0x05 => 'Back left', + 0x06 => 'Front centre', + 0x07 => 'Back centre', + 0x08 => 'Subwoofer' + ); + + return (isset($RVA2ChannelTypeLookup[$index]) ? $RVA2ChannelTypeLookup[$index] : ''); + } + + function FrameNameLongLookup($framename) { + + $begin = __LINE__; + + /** This is not a comment! + + AENC Audio encryption + APIC Attached picture + ASPI Audio seek point index + BUF Recommended buffer size + CNT Play counter + COM Comments + COMM Comments + COMR Commercial frame + CRA Audio encryption + CRM Encrypted meta frame + ENCR Encryption method registration + EQU Equalisation + EQU2 Equalisation (2) + EQUA Equalisation + ETC Event timing codes + ETCO Event timing codes + GEO General encapsulated object + GEOB General encapsulated object + GRID Group identification registration + IPL Involved people list + IPLS Involved people list + LINK Linked information + LNK Linked information + MCDI Music CD identifier + MCI Music CD Identifier + MLL MPEG location lookup table + MLLT MPEG location lookup table + OWNE Ownership frame + PCNT Play counter + PIC Attached picture + POP Popularimeter + POPM Popularimeter + POSS Position synchronisation frame + PRIV Private frame + RBUF Recommended buffer size + REV Reverb + RVA Relative volume adjustment + RVA2 Relative volume adjustment (2) + RVAD Relative volume adjustment + RVRB Reverb + SEEK Seek frame + SIGN Signature frame + SLT Synchronised lyric/text + STC Synced tempo codes + SYLT Synchronised lyric/text + SYTC Synchronised tempo codes + TAL Album/Movie/Show title + TALB Album/Movie/Show title + TBP BPM (Beats Per Minute) + TBPM BPM (beats per minute) + TCM Composer + TCO Content type + TCOM Composer + TCON Content type + TCOP Copyright message + TCR Copyright message + TDA Date + TDAT Date + TDEN Encoding time + TDLY Playlist delay + TDOR Original release time + TDRC Recording time + TDRL Release time + TDTG Tagging time + TDY Playlist delay + TEN Encoded by + TENC Encoded by + TEXT Lyricist/Text writer + TFLT File type + TFT File type + TIM Time + TIME Time + TIPL Involved people list + TIT1 Content group description + TIT2 Title/songname/content description + TIT3 Subtitle/Description refinement + TKE Initial key + TKEY Initial key + TLA Language(s) + TLAN Language(s) + TLE Length + TLEN Length + TMCL Musician credits list + TMED Media type + TMOO Mood + TMT Media type + TOA Original artist(s)/performer(s) + TOAL Original album/movie/show title + TOF Original filename + TOFN Original filename + TOL Original Lyricist(s)/text writer(s) + TOLY Original lyricist(s)/text writer(s) + TOPE Original artist(s)/performer(s) + TOR Original release year + TORY Original release year + TOT Original album/Movie/Show title + TOWN File owner/licensee + TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group + TP2 Band/Orchestra/Accompaniment + TP3 Conductor/Performer refinement + TP4 Interpreted, remixed, or otherwise modified by + TPA Part of a set + TPB Publisher + TPE1 Lead performer(s)/Soloist(s) + TPE2 Band/orchestra/accompaniment + TPE3 Conductor/performer refinement + TPE4 Interpreted, remixed, or otherwise modified by + TPOS Part of a set + TPRO Produced notice + TPUB Publisher + TRC ISRC (International Standard Recording Code) + TRCK Track number/Position in set + TRD Recording dates + TRDA Recording dates + TRK Track number/Position in set + TRSN Internet radio station name + TRSO Internet radio station owner + TSI Size + TSIZ Size + TSOA Album sort order + TSOP Performer sort order + TSOT Title sort order + TSRC ISRC (international standard recording code) + TSS Software/hardware and settings used for encoding + TSSE Software/Hardware and settings used for encoding + TSST Set subtitle + TT1 Content group description + TT2 Title/Songname/Content description + TT3 Subtitle/Description refinement + TXT Lyricist/text writer + TXX User defined text information frame + TXXX User defined text information frame + TYE Year + TYER Year + UFI Unique file identifier + UFID Unique file identifier + ULT Unsychronised lyric/text transcription + USER Terms of use + USLT Unsynchronised lyric/text transcription + WAF Official audio file webpage + WAR Official artist/performer webpage + WAS Official audio source webpage + WCM Commercial information + WCOM Commercial information + WCOP Copyright/Legal information + WCP Copyright/Legal information + WOAF Official audio file webpage + WOAR Official artist/performer webpage + WOAS Official audio source webpage + WORS Official Internet radio station homepage + WPAY Payment + WPB Publishers official webpage + WPUB Publishers official webpage + WXX User defined URL link frame + WXXX User defined URL link frame + TFEA Featured Artist + TSTU Recording Studio + rgad Replay Gain Adjustment + + */ + + return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_long'); + + // Last three: + // from Helium2 [www.helium2.com] + // from http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html + } + + + function FrameNameShortLookup($framename) { + + $begin = __LINE__; + + /** This is not a comment! + + AENC audio_encryption + APIC attached_picture + ASPI audio_seek_point_index + BUF recommended_buffer_size + CNT play_counter + COM comments + COMM comments + COMR commercial_frame + CRA audio_encryption + CRM encrypted_meta_frame + ENCR encryption_method_registration + EQU equalisation + EQU2 equalisation + EQUA equalisation + ETC event_timing_codes + ETCO event_timing_codes + GEO general_encapsulated_object + GEOB general_encapsulated_object + GRID group_identification_registration + IPL involved_people_list + IPLS involved_people_list + LINK linked_information + LNK linked_information + MCDI music_cd_identifier + MCI music_cd_identifier + MLL mpeg_location_lookup_table + MLLT mpeg_location_lookup_table + OWNE ownership_frame + PCNT play_counter + PIC attached_picture + POP popularimeter + POPM popularimeter + POSS position_synchronisation_frame + PRIV private_frame + RBUF recommended_buffer_size + REV reverb + RVA relative_volume_adjustment + RVA2 relative_volume_adjustment + RVAD relative_volume_adjustment + RVRB reverb + SEEK seek_frame + SIGN signature_frame + SLT synchronised_lyric + STC synced_tempo_codes + SYLT synchronised_lyric + SYTC synchronised_tempo_codes + TAL album + TALB album + TBP bpm + TBPM bpm + TCM composer + TCO content_type + TCOM composer + TCON content_type + TCOP copyright_message + TCR copyright_message + TDA date + TDAT date + TDEN encoding_time + TDLY playlist_delay + TDOR original_release_time + TDRC recording_time + TDRL release_time + TDTG tagging_time + TDY playlist_delay + TEN encoded_by + TENC encoded_by + TEXT lyricist + TFLT file_type + TFT file_type + TIM time + TIME time + TIPL involved_people_list + TIT1 content_group_description + TIT2 title + TIT3 subtitle + TKE initial_key + TKEY initial_key + TLA language + TLAN language + TLE length + TLEN length + TMCL musician_credits_list + TMED media_type + TMOO mood + TMT media_type + TOA original_artist + TOAL original_album + TOF original_filename + TOFN original_filename + TOL original_lyricist + TOLY original_lyricist + TOPE original_artist + TOR original_year + TORY original_year + TOT original_album + TOWN file_owner + TP1 artist + TP2 band + TP3 conductor + TP4 remixer + TPA part_of_a_set + TPB publisher + TPE1 artist + TPE2 band + TPE3 conductor + TPE4 remixer + TPOS part_of_a_set + TPRO produced_notice + TPUB publisher + TRC isrc + TRCK track_number + TRD recording_dates + TRDA recording_dates + TRK track_number + TRSN internet_radio_station_name + TRSO internet_radio_station_owner + TSI size + TSIZ size + TSOA album_sort_order + TSOP performer_sort_order + TSOT title_sort_order + TSRC isrc + TSS encoder_settings + TSSE encoder_settings + TSST set_subtitle + TT1 description + TT2 title + TT3 subtitle + TXT lyricist + TXX text + TXXX text + TYE year + TYER year + UFI unique_file_identifier + UFID unique_file_identifier + ULT unsychronised_lyric + USER terms_of_use + USLT unsynchronised_lyric + WAF url_file + WAR url_artist + WAS url_source + WCM commercial_information + WCOM commercial_information + WCOP copyright + WCP copyright + WOAF url_file + WOAR url_artist + WOAS url_source + WORS url_station + WPAY url_payment + WPB url_publisher + WPUB url_publisher + WXX url_user + WXXX url_user + TFEA featured_artist + TSTU recording_studio + rgad replay_gain_adjustment + + */ + + return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short'); + } + + function TextEncodingTerminatorLookup($encoding) { + // http://www.id3.org/id3v2.4.0-structure.txt + // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: + // $00 ISO-8859-1. Terminated with $00. + // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. + // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. + // $03 UTF-8 encoded Unicode. Terminated with $00. + + static $TextEncodingTerminatorLookup = array(0=>"\x00", 1=>"\x00\x00", 2=>"\x00\x00", 3=>"\x00", 255=>"\x00\x00"); + + return @$TextEncodingTerminatorLookup[$encoding]; + } + + function TextEncodingNameLookup($encoding) { + // http://www.id3.org/id3v2.4.0-structure.txt + static $TextEncodingNameLookup = array(0=>'ISO-8859-1', 1=>'UTF-16', 2=>'UTF-16BE', 3=>'UTF-8', 255=>'UTF-16BE'); + return (isset($TextEncodingNameLookup[$encoding]) ? $TextEncodingNameLookup[$encoding] : 'ISO-8859-1'); + } + + function IsValidID3v2FrameName($framename, $id3v2majorversion) { + switch ($id3v2majorversion) { + case 2: + return ereg('[A-Z][A-Z0-9]{2}', $framename); + break; + + case 3: + case 4: + return ereg('[A-Z][A-Z0-9]{3}', $framename); + break; + } + return false; + } + + function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) { + for ($i = 0; $i < strlen($numberstring); $i++) { + if ((chr($numberstring{$i}) < chr('0')) || (chr($numberstring{$i}) > chr('9'))) { + if (($numberstring{$i} == '.') && $allowdecimal) { + // allowed + } elseif (($numberstring{$i} == '-') && $allownegative && ($i == 0)) { + // allowed + } else { + return false; + } + } + } + return true; + } + + function IsValidDateStampString($datestamp) { + if (strlen($datestamp) != 8) { + return false; + } + if (!$this->IsANumber($datestamp, false)) { + return false; + } + $year = substr($datestamp, 0, 4); + $month = substr($datestamp, 4, 2); + $day = substr($datestamp, 6, 2); + if (($year == 0) || ($month == 0) || ($day == 0)) { + return false; + } + if ($month > 12) { + return false; + } + if ($day > 31) { + return false; + } + if (($day > 30) && (($month == 4) || ($month == 6) || ($month == 9) || ($month == 11))) { + return false; + } + if (($day > 29) && ($month == 2)) { + return false; + } + return true; + } + + function ID3v2HeaderLength($majorversion) { + return (($majorversion == 2) ? 6 : 10); + } + +} + +?> diff --git a/campcaster/src/modules/getid3/var/module.tag.lyrics3.php b/campcaster/src/modules/getid3/var/module.tag.lyrics3.php new file mode 100644 index 000000000..e735d6d98 --- /dev/null +++ b/campcaster/src/modules/getid3/var/module.tag.lyrics3.php @@ -0,0 +1,271 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +/// // +// module.tag.lyrics3.php // +// module for analyzing Lyrics3 tags // +// dependencies: module.tag.apetag.php (optional) // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_lyrics3 +{ + + function getid3_lyrics3(&$fd, &$ThisFileInfo) { + // http://www.volweb.cz/str/tags.htm + + fseek($fd, (0 - 128 - 9 - 6), SEEK_END); // end - ID3v1 - LYRICSEND - [Lyrics3size] + $lyrics3_id3v1 = fread($fd, 128 + 9 + 6); + $lyrics3lsz = substr($lyrics3_id3v1, 0, 6); // Lyrics3size + $lyrics3end = substr($lyrics3_id3v1, 6, 9); // LYRICSEND or LYRICS200 + $id3v1tag = substr($lyrics3_id3v1, 15, 128); // ID3v1 + + if ($lyrics3end == 'LYRICSEND') { + // Lyrics3v1, ID3v1, no APE + + $lyrics3size = 5100; + $lyrics3offset = $ThisFileInfo['filesize'] - 128 - $lyrics3size; + $lyrics3version = 1; + + } elseif ($lyrics3end == 'LYRICS200') { + // Lyrics3v2, ID3v1, no APE + + // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' + $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); + $lyrics3offset = $ThisFileInfo['filesize'] - 128 - $lyrics3size; + $lyrics3version = 2; + + } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) { + // Lyrics3v1, no ID3v1, no APE + + $lyrics3size = 5100; + $lyrics3offset = $ThisFileInfo['filesize'] - $lyrics3size; + $lyrics3version = 1; + $lyrics3offset = $ThisFileInfo['filesize'] - $lyrics3size; + + } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) { + + // Lyrics3v2, no ID3v1, no APE + + $lyrics3size = strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' + $lyrics3offset = $ThisFileInfo['filesize'] - $lyrics3size; + $lyrics3version = 2; + + } else { + + if (isset($ThisFileInfo['ape']['tag_offset_start']) && ($ThisFileInfo['ape']['tag_offset_start'] > 15)) { + + fseek($fd, $ThisFileInfo['ape']['tag_offset_start'] - 15, SEEK_SET); + $lyrics3lsz = fread($fd, 6); + $lyrics3end = fread($fd, 9); + + if ($lyrics3end == 'LYRICSEND') { + // Lyrics3v1, APE, maybe ID3v1 + + $lyrics3size = 5100; + $lyrics3offset = $ThisFileInfo['ape']['tag_offset_start'] - $lyrics3size; + $ThisFileInfo['avdataend'] = $lyrics3offset; + $lyrics3version = 1; + $ThisFileInfo['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability'; + + } elseif ($lyrics3end == 'LYRICS200') { + // Lyrics3v2, APE, maybe ID3v1 + + $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' + $lyrics3offset = $ThisFileInfo['ape']['tag_offset_start'] - $lyrics3size; + $lyrics3version = 2; + $ThisFileInfo['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability'; + + } + + } + + } + + if (isset($lyrics3offset)) { + $ThisFileInfo['avdataend'] = $lyrics3offset; + $this->getLyrics3Data($ThisFileInfo, $fd, $lyrics3offset, $lyrics3version, $lyrics3size); + + if (!isset($ThisFileInfo['ape'])) { + $GETID3_ERRORARRAY = &$ThisFileInfo['warning']; + if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, false)) { + $tag = new getid3_apetag($fd, $ThisFileInfo, $ThisFileInfo['lyrics3']['tag_offset_start']); + } + } + + } + + return true; + } + + function getLyrics3Data(&$ThisFileInfo, &$fd, $endoffset, $version, $length) { + // http://www.volweb.cz/str/tags.htm + + fseek($fd, $endoffset, SEEK_SET); + if ($length <= 0) { + return false; + } + $rawdata = fread($fd, $length); + + if (substr($rawdata, 0, 11) != 'LYRICSBEGIN') { + if (strpos($rawdata, 'LYRICSBEGIN') !== false) { + + $ThisFileInfo['warning'][] = '"LYRICSBEGIN" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version; + $ThisFileInfo['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN'); + $ParsedLyrics3['tag_offset_start'] = $ThisFileInfo['avdataend']; + $rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN')); + $length = strlen($rawdata); + + } else { + + $ThisFileInfo['error'][] = '"LYRICSBEGIN" expected at '.$endoffset.' but found "'.substr($rawdata, 0, 11).'" instead'; + return false; + + } + + } + + $ParsedLyrics3['raw']['lyrics3version'] = $version; + $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; + $ParsedLyrics3['tag_offset_start'] = $endoffset; + $ParsedLyrics3['tag_offset_end'] = $endoffset + $length; + + switch ($version) { + + case 1: + if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') { + $ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9)); + $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); + } else { + $ThisFileInfo['error'][] = '"LYRICSEND" expected at '.(ftell($fd) - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'; + return false; + } + break; + + case 2: + if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') { + $ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ + $rawdata = $ParsedLyrics3['raw']['unparsed']; + while (strlen($rawdata) > 0) { + $fieldname = substr($rawdata, 0, 3); + $fieldsize = (int) substr($rawdata, 3, 5); + $ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize); + $rawdata = substr($rawdata, 3 + 5 + $fieldsize); + } + + if (isset($ParsedLyrics3['raw']['IND'])) { + $i = 0; + $flagnames = array('lyrics', 'timestamps', 'inhibitrandom'); + foreach ($flagnames as $flagname) { + if (strlen($ParsedLyrics3['raw']['IND']) > ++$i) { + $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1)); + } + } + } + + $fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author'); + foreach ($fieldnametranslation as $key => $value) { + if (isset($ParsedLyrics3['raw'][$key])) { + $ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]); + } + } + + if (isset($ParsedLyrics3['raw']['IMG'])) { + $imagestrings = explode("\r\n", $ParsedLyrics3['raw']['IMG']); + foreach ($imagestrings as $key => $imagestring) { + if (strpos($imagestring, '||') !== false) { + $imagearray = explode('||', $imagestring); + $ParsedLyrics3['images'][$key]['filename'] = $imagearray[0]; + $ParsedLyrics3['images'][$key]['description'] = $imagearray[1]; + $ParsedLyrics3['images'][$key]['timestamp'] = $this->Lyrics3Timestamp2Seconds($imagearray[2]); + } + } + } + if (isset($ParsedLyrics3['raw']['LYR'])) { + $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); + } + } else { + $ThisFileInfo['error'][] = '"LYRICS200" expected at '.(ftell($fd) - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'; + return false; + } + break; + + default: + $ThisFileInfo['error'][] = 'Cannot process Lyrics3 version '.$version.' (only v1 and v2)'; + return false; + break; + } + + + if (isset($ThisFileInfo['id3v1']['tag_offset_start']) && ($ThisFileInfo['id3v1']['tag_offset_start'] < $ParsedLyrics3['tag_offset_end'])) { + $ThisFileInfo['warning'][] = 'ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data'; + unset($ThisFileInfo['id3v1']); + foreach ($ThisFileInfo['warning'] as $key => $value) { + if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { + unset($ThisFileInfo['warning'][$key]); + sort($ThisFileInfo['warning']); + break; + } + } + } + + $ThisFileInfo['lyrics3'] = $ParsedLyrics3; + + return true; + } + + function Lyrics3Timestamp2Seconds($rawtimestamp) { + if (ereg('^\\[([0-9]{2}):([0-9]{2})\\]$', $rawtimestamp, $regs)) { + return (int) (($regs[1] * 60) + $regs[2]); + } + return false; + } + + function Lyrics3LyricsTimestampParse(&$Lyrics3data) { + $lyricsarray = explode("\r\n", $Lyrics3data['raw']['LYR']); + foreach ($lyricsarray as $key => $lyricline) { + $regs = array(); + unset($thislinetimestamps); + while (ereg('^(\\[[0-9]{2}:[0-9]{2}\\])', $lyricline, $regs)) { + $thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]); + $lyricline = str_replace($regs[0], '', $lyricline); + } + $notimestamplyricsarray[$key] = $lyricline; + if (isset($thislinetimestamps) && is_array($thislinetimestamps)) { + sort($thislinetimestamps); + foreach ($thislinetimestamps as $timestampkey => $timestamp) { + if (isset($Lyrics3data['synchedlyrics'][$timestamp])) { + // timestamps only have a 1-second resolution, it's possible that multiple lines + // could have the same timestamp, if so, append + $Lyrics3data['synchedlyrics'][$timestamp] .= "\r\n".$lyricline; + } else { + $Lyrics3data['synchedlyrics'][$timestamp] = $lyricline; + } + } + } + } + $Lyrics3data['unsynchedlyrics'] = implode("\r\n", $notimestamplyricsarray); + if (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) { + ksort($Lyrics3data['synchedlyrics']); + } + return true; + } + + function IntString2Bool($char) { + if ($char == '1') { + return true; + } elseif ($char == '0') { + return false; + } + return null; + } +} + + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/write.apetag.php b/campcaster/src/modules/getid3/var/write.apetag.php new file mode 100644 index 000000000..189160aff --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.apetag.php @@ -0,0 +1,228 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// write.apetag.php // +// module for writing APE tags // +// dependencies: module.tag.apetag.php // +// /// +///////////////////////////////////////////////////////////////// + + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true); + +class getid3_write_apetag +{ + + var $filename; + var $tag_data; + var $always_preserve_replaygain = true; // ReplayGain / MP3gain tags will be copied from old tag even if not passed in data + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + + function getid3_write_apetag() { + return true; + } + + function WriteAPEtag() { + // NOTE: All data passed to this function must be UTF-8 format + + $getID3 = new getID3; + $ThisFileInfo = $getID3->analyze($this->filename); + + if (isset($ThisFileInfo['ape']['tag_offset_start']) && isset($ThisFileInfo['lyrics3']['tag_offset_end'])) { + if ($ThisFileInfo['ape']['tag_offset_start'] >= $ThisFileInfo['lyrics3']['tag_offset_end']) { + // Current APE tag between Lyrics3 and ID3v1/EOF + // This break Lyrics3 functionality + if (!$this->DeleteAPEtag()) { + return false; + } + $ThisFileInfo = $getID3->analyze($this->filename); + } + } + + if ($this->always_preserve_replaygain) { + $ReplayGainTagsToPreserve = array('mp3gain_minmax', 'mp3gain_album_minmax', 'mp3gain_undo', 'replaygain_track_peak', 'replaygain_track_gain', 'replaygain_album_peak', 'replaygain_album_gain'); + foreach ($ReplayGainTagsToPreserve as $rg_key) { + if (isset($ThisFileInfo['ape']['items'][strtolower($rg_key)]['data'][0]) && !isset($this->tag_data[strtoupper($rg_key)][0])) { + $this->tag_data[strtoupper($rg_key)][0] = $ThisFileInfo['ape']['items'][strtolower($rg_key)]['data'][0]; + } + } + } + + if ($APEtag = $this->GenerateAPEtag()) { + if ($fp = @fopen($this->filename, 'a+b')) { + $oldignoreuserabort = ignore_user_abort(true); + flock($fp, LOCK_EX); + + $PostAPEdataOffset = $ThisFileInfo['avdataend']; + if (isset($ThisFileInfo['ape']['tag_offset_end'])) { + $PostAPEdataOffset = max($PostAPEdataOffset, $ThisFileInfo['ape']['tag_offset_end']); + } + if (isset($ThisFileInfo['lyrics3']['tag_offset_start'])) { + $PostAPEdataOffset = max($PostAPEdataOffset, $ThisFileInfo['lyrics3']['tag_offset_start']); + } + fseek($fp, $PostAPEdataOffset, SEEK_SET); + $PostAPEdata = ''; + if ($ThisFileInfo['filesize'] > $PostAPEdataOffset) { + $PostAPEdata = fread($fp, $ThisFileInfo['filesize'] - $PostAPEdataOffset); + } + + fseek($fp, $PostAPEdataOffset, SEEK_SET); + if (isset($ThisFileInfo['ape']['tag_offset_start'])) { + fseek($fp, $ThisFileInfo['ape']['tag_offset_start'], SEEK_SET); + } + ftruncate($fp, ftell($fp)); + fwrite($fp, $APEtag, strlen($APEtag)); + if (!empty($PostAPEdata)) { + fwrite($fp, $PostAPEdata, strlen($PostAPEdata)); + } + flock($fp, LOCK_UN); + fclose($fp); + ignore_user_abort($oldignoreuserabort); + return true; + + } + return false; + } + return false; + } + + function DeleteAPEtag() { + $getID3 = new getID3; + $ThisFileInfo = $getID3->analyze($this->filename); + if (isset($ThisFileInfo['ape']['tag_offset_start']) && isset($ThisFileInfo['ape']['tag_offset_end'])) { + if ($fp = @fopen($this->filename, 'a+b')) { + + flock($fp, LOCK_EX); + $oldignoreuserabort = ignore_user_abort(true); + + fseek($fp, $ThisFileInfo['ape']['tag_offset_end'], SEEK_SET); + $DataAfterAPE = ''; + if ($ThisFileInfo['filesize'] > $ThisFileInfo['ape']['tag_offset_end']) { + $DataAfterAPE = fread($fp, $ThisFileInfo['filesize'] - $ThisFileInfo['ape']['tag_offset_end']); + } + + ftruncate($fp, $ThisFileInfo['ape']['tag_offset_start']); + fseek($fp, $ThisFileInfo['ape']['tag_offset_start'], SEEK_SET); + + if (!empty($DataAfterAPE)) { + fwrite($fp, $DataAfterAPE, strlen($DataAfterAPE)); + } + + flock($fp, LOCK_UN); + fclose($fp); + ignore_user_abort($oldignoreuserabort); + + return true; + + } + return false; + } + return true; + } + + + function GenerateAPEtag() { + // NOTE: All data passed to this function must be UTF-8 format + + $items = array(); + if (!is_array($this->tag_data)) { + return false; + } + foreach ($this->tag_data as $key => $arrayofvalues) { + if (!is_array($arrayofvalues)) { + return false; + } + + $valuestring = ''; + foreach ($arrayofvalues as $value) { + $valuestring .= str_replace("\x00", '', $value)."\x00"; + } + $valuestring = rtrim($valuestring, "\x00"); + + // Length of the assigned value in bytes + $tagitem = getid3_lib::LittleEndian2String(strlen($valuestring), 4); + + //$tagitem .= $this->GenerateAPEtagFlags(true, true, false, 0, false); + $tagitem .= "\x00\x00\x00\x00"; + + $tagitem .= $this->CleanAPEtagItemKey($key)."\x00"; + $tagitem .= $valuestring; + + $items[] = $tagitem; + + } + + return $this->GenerateAPEtagHeaderFooter($items, true).implode('', $items).$this->GenerateAPEtagHeaderFooter($items, false); + } + + function GenerateAPEtagHeaderFooter(&$items, $isheader=false) { + $tagdatalength = 0; + foreach ($items as $itemdata) { + $tagdatalength += strlen($itemdata); + } + + $APEheader = 'APETAGEX'; + $APEheader .= getid3_lib::LittleEndian2String(2000, 4); + $APEheader .= getid3_lib::LittleEndian2String(32 + $tagdatalength, 4); + $APEheader .= getid3_lib::LittleEndian2String(count($items), 4); + $APEheader .= $this->GenerateAPEtagFlags(true, true, $isheader, 0, false); + $APEheader .= str_repeat("\x00", 8); + + return $APEheader; + } + + function GenerateAPEtagFlags($header=true, $footer=true, $isheader=false, $encodingid=0, $readonly=false) { + $APEtagFlags = array_fill(0, 4, 0); + if ($header) { + $APEtagFlags[0] |= 0x80; // Tag contains a header + } + if (!$footer) { + $APEtagFlags[0] |= 0x40; // Tag contains no footer + } + if ($isheader) { + $APEtagFlags[0] |= 0x20; // This is the header, not the footer + } + + // 0: Item contains text information coded in UTF-8 + // 1: Item contains binary information ) + // 2: Item is a locator of external stored information ) + // 3: reserved + $APEtagFlags[3] |= ($encodingid << 1); + + if ($readonly) { + $APEtagFlags[3] |= 0x01; // Tag or Item is Read Only + } + + return chr($APEtagFlags[3]).chr($APEtagFlags[2]).chr($APEtagFlags[1]).chr($APEtagFlags[0]); + } + + function CleanAPEtagItemKey($itemkey) { + $itemkey = eregi_replace("[^\x20-\x7E]", '', $itemkey); + + // http://www.personal.uni-jena.de/~pfk/mpp/sv8/apekey.html + switch (strtoupper($itemkey)) { + case 'EAN/UPC': + case 'ISBN': + case 'LC': + case 'ISRC': + $itemkey = strtoupper($itemkey); + break; + + default: + $itemkey = ucwords($itemkey); + break; + } + return $itemkey; + + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/write.id3v1.php b/campcaster/src/modules/getid3/var/write.id3v1.php new file mode 100644 index 000000000..212521488 --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.id3v1.php @@ -0,0 +1,104 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// write.id3v1.php // +// module for writing ID3v1 tags // +// dependencies: module.tag.id3v1.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); + +class getid3_write_id3v1 +{ + var $filename; + var $tag_data; + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + + function getid3_write_id3v1() { + return true; + } + + function WriteID3v1() { + // File MUST be writeable - CHMOD(646) at least + if (is_writeable($this->filename)) { + if ($fp_source = @fopen($this->filename, 'r+b')) { + + fseek($fp_source, -128, SEEK_END); + if (fread($fp_source, 3) == 'TAG') { + fseek($fp_source, -128, SEEK_END); // overwrite existing ID3v1 tag + } else { + fseek($fp_source, 0, SEEK_END); // append new ID3v1 tag + } + + $new_id3v1_tag_data = getid3_id3v1::GenerateID3v1Tag( + @$this->tag_data['title'], + @$this->tag_data['artist'], + @$this->tag_data['album'], + @$this->tag_data['year'], + @$this->tag_data['genreid'], + @$this->tag_data['comment'], + @$this->tag_data['track']); + fwrite($fp_source, $new_id3v1_tag_data, 128); + fclose($fp_source); + return true; + + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "r+b"'; + return false; + } + } + $this->errors[] = 'File is not writeable: '.$this->filename; + return false; + } + + function FixID3v1Padding() { + // ID3v1 data is supposed to be padded with NULL characters, but some taggers incorrectly use spaces + // This function rewrites the ID3v1 tag with correct padding + + // Initialize getID3 engine + $getID3 = new getID3; + $ThisFileInfo = $getID3->analyze($this->filename); + if (isset($ThisFileInfo['tags']['id3v1'])) { + foreach ($ThisFileInfo['tags']['id3v1'] as $key => $value) { + $id3v1data[$key] = implode(',', $value); + } + $this->tag_data = $id3v1data; + return $this->WriteID3v1(); + } + return false; + } + + function RemoveID3v1() { + // File MUST be writeable - CHMOD(646) at least + if (is_writeable($this->filename)) { + if ($fp_source = @fopen($this->filename, 'r+b')) { + + fseek($fp_source, -128, SEEK_END); + if (fread($fp_source, 3) == 'TAG') { + ftruncate($fp_source, filesize($this->filename) - 128); + } else { + // no ID3v1 tag to begin with - do nothing + } + fclose($fp_source); + return true; + + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "r+b"'; + } + } else { + $this->errors[] = $this->filename.' is not writeable'; + } + return false; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/write.id3v2.php b/campcaster/src/modules/getid3/var/write.id3v2.php new file mode 100644 index 000000000..52398fbd7 --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.id3v2.php @@ -0,0 +1,2038 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +/// // +// write.id3v2.php // +// module for writing ID3v2 tags // +// dependencies: module.tag.id3v2.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); + +class getid3_write_id3v2 +{ + var $filename; + var $tag_data; + var $paddedlength = 4096; // minimum length of ID3v2 tag in bytes + var $majorversion = 3; // ID3v2 major version (2, 3 (recommended), 4) + var $minorversion = 0; // ID3v2 minor version - always 0 + var $merge_existing_data = false; // if true, merge new data with existing tags; if false, delete old tag data and only write new tags + var $id3v2_default_encodingid = 0; // default text encoding (ISO-8859-1) if not explicitly passed + var $id3v2_use_unsynchronisation = false; // the specs say it should be TRUE, but most other ID3v2-aware programs are broken if unsynchronization is used, so by default don't use it. + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + + function getid3_write_id3v2() { + return true; + } + + function WriteID3v2() { + // File MUST be writeable - CHMOD(646) at least. It's best if the + // directory is also writeable, because that method is both faster and less susceptible to errors. + + if (is_writeable($this->filename) || (!file_exists($this->filename) && is_writeable(dirname($this->filename)))) { + // Initialize getID3 engine + $getID3 = new getID3; + $OldThisFileInfo = $getID3->analyze($this->filename); + if ($this->merge_existing_data) { + // merge with existing data + if (!empty($OldThisFileInfo['id3v2'])) { + $this->tag_data = $this->array_join_merge($OldThisFileInfo['id3v2'], $this->tag_data); + } + } + $this->paddedlength = max(@$OldThisFileInfo['id3v2']['headerlength'], $this->paddedlength); + + if ($NewID3v2Tag = $this->GenerateID3v2Tag()) { + + if (file_exists($this->filename) && is_writeable($this->filename) && isset($OldThisFileInfo['id3v2']['headerlength']) && ($OldThisFileInfo['id3v2']['headerlength'] == strlen($NewID3v2Tag))) { + + // best and fastest method - insert-overwrite existing tag (padded to length of old tag if neccesary) + if (file_exists($this->filename)) { + + ob_start(); + if ($fp = fopen($this->filename, 'r+b')) { + rewind($fp); + fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag)); + fclose($fp); + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "r+b" - '.strip_tags(ob_get_contents()); + } + ob_end_clean(); + + } else { + + ob_start(); + if ($fp = fopen($this->filename, 'wb')) { + rewind($fp); + fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag)); + fclose($fp); + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "wb" - '.strip_tags(ob_get_contents()); + } + ob_end_clean(); + + } + + } else { + + if ($tempfilename = tempnam('*', 'getID3')) { + ob_start(); + if ($fp_source = fopen($this->filename, 'rb')) { + if ($fp_temp = fopen($tempfilename, 'wb')) { + + fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag)); + + rewind($fp_source); + if (!empty($OldThisFileInfo['avdataoffset'])) { + fseek($fp_source, $OldThisFileInfo['avdataoffset'], SEEK_SET); + } + + while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) { + fwrite($fp_temp, $buffer, strlen($buffer)); + } + + fclose($fp_temp); + fclose($fp_source); + copy($tempfilename, $this->filename); + unlink($tempfilename); + ob_end_clean(); + return true; + + } else { + + $this->errors[] = 'Could not open '.$tempfilename.' mode "wb" - '.strip_tags(ob_get_contents()); + + } + fclose($fp_source); + + } else { + + $this->errors[] = 'Could not open '.$this->filename.' mode "rb" - '.strip_tags(ob_get_contents()); + + } + ob_end_clean(); + } + return false; + + } + + } else { + + $this->errors[] = '$this->GenerateID3v2Tag() failed'; + + } + + if (!empty($this->errors)) { + return false; + } + return true; + } else { + $this->errors[] = '!is_writeable('.$this->filename.')'; + } + return false; + } + + function RemoveID3v2() { + + // File MUST be writeable - CHMOD(646) at least. It's best if the + // directory is also writeable, because that method is both faster and less susceptible to errors. + if (is_writeable(dirname($this->filename))) { + + // preferred method - only one copying operation, minimal chance of corrupting + // original file if script is interrupted, but required directory to be writeable + if ($fp_source = @fopen($this->filename, 'rb')) { + // Initialize getID3 engine + $getID3 = new getID3; + $OldThisFileInfo = $getID3->analyze($this->filename); + rewind($fp_source); + if ($OldThisFileInfo['avdataoffset'] !== false) { + fseek($fp_source, $OldThisFileInfo['avdataoffset'], SEEK_SET); + } + if ($fp_temp = @fopen($this->filename.'getid3tmp', 'w+b')) { + while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) { + fwrite($fp_temp, $buffer, strlen($buffer)); + } + fclose($fp_temp); + } else { + $this->errors[] = 'Could not open '.$this->filename.'getid3tmp mode "w+b"'; + } + fclose($fp_source); + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "rb"'; + } + if (file_exists($this->filename)) { + unlink($this->filename); + } + rename($this->filename.'getid3tmp', $this->filename); + + } elseif (is_writable($this->filename)) { + + // less desirable alternate method - double-copies the file, overwrites original file + // and could corrupt source file if the script is interrupted or an error occurs. + if ($fp_source = @fopen($this->filename, 'rb')) { + // Initialize getID3 engine + $getID3 = new getID3; + $OldThisFileInfo = $getID3->analyze($this->filename); + rewind($fp_source); + if ($OldThisFileInfo['avdataoffset'] !== false) { + fseek($fp_source, $OldThisFileInfo['avdataoffset'], SEEK_SET); + } + if ($fp_temp = tmpfile()) { + while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) { + fwrite($fp_temp, $buffer, strlen($buffer)); + } + fclose($fp_source); + if ($fp_source = @fopen($this->filename, 'wb')) { + rewind($fp_temp); + while ($buffer = fread($fp_temp, GETID3_FREAD_BUFFER_SIZE)) { + fwrite($fp_source, $buffer, strlen($buffer)); + } + fseek($fp_temp, -128, SEEK_END); + fclose($fp_source); + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "wb"'; + } + fclose($fp_temp); + } else { + $this->errors[] = 'Could not create tmpfile()'; + } + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "rb"'; + } + + } else { + + $this->errors[] = 'Directory and file both not writeable'; + + } + + if (!empty($this->errors)) { + return false; + } + return true; + } + + + function GenerateID3v2TagFlags($flags) { + switch ($this->majorversion) { + case 4: + // %abcd0000 + $flag = (@$flags['unsynchronisation'] ? '1' : '0'); // a - Unsynchronisation + $flag .= (@$flags['extendedheader'] ? '1' : '0'); // b - Extended header + $flag .= (@$flags['experimental'] ? '1' : '0'); // c - Experimental indicator + $flag .= (@$flags['footer'] ? '1' : '0'); // d - Footer present + $flag .= '0000'; + break; + + case 3: + // %abc00000 + $flag = (@$flags['unsynchronisation'] ? '1' : '0'); // a - Unsynchronisation + $flag .= (@$flags['extendedheader'] ? '1' : '0'); // b - Extended header + $flag .= (@$flags['experimental'] ? '1' : '0'); // c - Experimental indicator + $flag .= '00000'; + break; + + case 2: + // %ab000000 + $flag = (@$flags['unsynchronisation'] ? '1' : '0'); // a - Unsynchronisation + $flag .= (@$flags['compression'] ? '1' : '0'); // b - Compression + $flag .= '000000'; + break; + + default: + return false; + break; + } + return chr(bindec($flag)); + } + + + function GenerateID3v2FrameFlags($TagAlter=false, $FileAlter=false, $ReadOnly=false, $Compression=false, $Encryption=false, $GroupingIdentity=false, $Unsynchronisation=false, $DataLengthIndicator=false) { + switch ($this->majorversion) { + case 4: + // %0abc0000 %0h00kmnp + $flag1 = '0'; + $flag1 .= $TagAlter ? '1' : '0'; // a - Tag alter preservation (true == discard) + $flag1 .= $FileAlter ? '1' : '0'; // b - File alter preservation (true == discard) + $flag1 .= $ReadOnly ? '1' : '0'; // c - Read only (true == read only) + $flag1 .= '0000'; + + $flag2 = '0'; + $flag2 .= $GroupingIdentity ? '1' : '0'; // h - Grouping identity (true == contains group information) + $flag2 .= '00'; + $flag2 .= $Compression ? '1' : '0'; // k - Compression (true == compressed) + $flag2 .= $Encryption ? '1' : '0'; // m - Encryption (true == encrypted) + $flag2 .= $Unsynchronisation ? '1' : '0'; // n - Unsynchronisation (true == unsynchronised) + $flag2 .= $DataLengthIndicator ? '1' : '0'; // p - Data length indicator (true == data length indicator added) + break; + + case 3: + // %abc00000 %ijk00000 + $flag1 = $TagAlter ? '1' : '0'; // a - Tag alter preservation (true == discard) + $flag1 .= $FileAlter ? '1' : '0'; // b - File alter preservation (true == discard) + $flag1 .= $ReadOnly ? '1' : '0'; // c - Read only (true == read only) + $flag1 .= '00000'; + + $flag2 = $Compression ? '1' : '0'; // i - Compression (true == compressed) + $flag2 .= $Encryption ? '1' : '0'; // j - Encryption (true == encrypted) + $flag2 .= $GroupingIdentity ? '1' : '0'; // k - Grouping identity (true == contains group information) + $flag2 .= '00000'; + break; + + default: + return false; + break; + + } + return chr(bindec($flag1)).chr(bindec($flag2)); + } + + function GenerateID3v2FrameData($frame_name, $source_data_array) { + if (!getid3_id3v2::IsValidID3v2FrameName($frame_name, $this->majorversion)) { + return false; + } + $framedata = ''; + + if (($this->majorversion < 3) || ($this->majorversion > 4)) { + + $this->errors[] = 'Only ID3v2.3 and ID3v2.4 are supported in GenerateID3v2FrameData()'; + + } else { // $this->majorversion 3 or 4 + + switch ($frame_name) { + case 'UFID': + // 4.1 UFID Unique file identifier + // Owner identifier $00 + // Identifier + if (strlen($source_data_array['data']) > 64) { + $this->errors[] = 'Identifier not allowed to be longer than 64 bytes in '.$frame_name.' (supplied data was '.strlen($source_data_array['data']).' bytes long)'; + } else { + $framedata .= str_replace("\x00", '', $source_data_array['ownerid'])."\x00"; + $framedata .= substr($source_data_array['data'], 0, 64); // max 64 bytes - truncate anything longer + } + break; + + case 'TXXX': + // 4.2.2 TXXX User defined text information frame + // Text encoding $xx + // Description $00 (00) + // Value + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'], $this->majorversion)) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= $source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + break; + + case 'WXXX': + // 4.3.2 WXXX User defined URL link frame + // Text encoding $xx + // Description $00 (00) + // URL + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'], $this->majorversion)) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } elseif (!isset($source_data_array['data']) || !$this->IsValidURL($source_data_array['data'], false, false)) { + //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + // probably should be an error, need to rewrite IsValidURL() to handle other encodings + $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= $source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + break; + + case 'IPLS': + // 4.4 IPLS Involved people list (ID3v2.3 only) + // Text encoding $xx + // People list strings + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'], $this->majorversion)) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + break; + + case 'MCDI': + // 4.4 MCDI Music CD identifier + // CD TOC + $framedata .= $source_data_array['data']; + break; + + case 'ETCO': + // 4.5 ETCO Event timing codes + // Time stamp format $xx + // Where time stamp format is: + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + // Followed by a list of key events in the following format: + // Type of event $xx + // Time stamp $xx (xx ...) + // The 'Time stamp' is set to zero if directly at the beginning of the sound + // or after the previous event. All events MUST be sorted in chronological order. + if (($source_data_array['timestampformat'] > 2) || ($source_data_array['timestampformat'] < 1)) { + $this->errors[] = 'Invalid Time Stamp Format byte in '.$frame_name.' ('.$source_data_array['timestampformat'].')'; + } else { + $framedata .= chr($source_data_array['timestampformat']); + foreach ($source_data_array as $key => $val) { + if (!$this->ID3v2IsValidETCOevent($val['typeid'])) { + $this->errors[] = 'Invalid Event Type byte in '.$frame_name.' ('.$val['typeid'].')'; + } elseif (($key != 'timestampformat') && ($key != 'flags')) { + if (($val['timestamp'] > 0) && ($previousETCOtimestamp >= $val['timestamp'])) { + // The 'Time stamp' is set to zero if directly at the beginning of the sound + // or after the previous event. All events MUST be sorted in chronological order. + $this->errors[] = 'Out-of-order timestamp in '.$frame_name.' ('.$val['timestamp'].') for Event Type ('.$val['typeid'].')'; + } else { + $framedata .= chr($val['typeid']); + $framedata .= getid3_lib::BigEndian2String($val['timestamp'], 4, false); + } + } + } + } + break; + + case 'MLLT': + // 4.6 MLLT MPEG location lookup table + // MPEG frames between reference $xx xx + // Bytes between reference $xx xx xx + // Milliseconds between reference $xx xx xx + // Bits for bytes deviation $xx + // Bits for milliseconds dev. $xx + // Then for every reference the following data is included; + // Deviation in bytes %xxx.... + // Deviation in milliseconds %xxx.... + if (($source_data_array['framesbetweenreferences'] > 0) && ($source_data_array['framesbetweenreferences'] <= 65535)) { + $framedata .= getid3_lib::BigEndian2String($source_data_array['framesbetweenreferences'], 2, false); + } else { + $this->errors[] = 'Invalid MPEG Frames Between References in '.$frame_name.' ('.$source_data_array['framesbetweenreferences'].')'; + } + if (($source_data_array['bytesbetweenreferences'] > 0) && ($source_data_array['bytesbetweenreferences'] <= 16777215)) { + $framedata .= getid3_lib::BigEndian2String($source_data_array['bytesbetweenreferences'], 3, false); + } else { + $this->errors[] = 'Invalid bytes Between References in '.$frame_name.' ('.$source_data_array['bytesbetweenreferences'].')'; + } + if (($source_data_array['msbetweenreferences'] > 0) && ($source_data_array['msbetweenreferences'] <= 16777215)) { + $framedata .= getid3_lib::BigEndian2String($source_data_array['msbetweenreferences'], 3, false); + } else { + $this->errors[] = 'Invalid Milliseconds Between References in '.$frame_name.' ('.$source_data_array['msbetweenreferences'].')'; + } + if (!$this->IsWithinBitRange($source_data_array['bitsforbytesdeviation'], 8, false)) { + if (($source_data_array['bitsforbytesdeviation'] % 4) == 0) { + $framedata .= chr($source_data_array['bitsforbytesdeviation']); + } else { + $this->errors[] = 'Bits For Bytes Deviation in '.$frame_name.' ('.$source_data_array['bitsforbytesdeviation'].') must be a multiple of 4.'; + } + } else { + $this->errors[] = 'Invalid Bits For Bytes Deviation in '.$frame_name.' ('.$source_data_array['bitsforbytesdeviation'].')'; + } + if (!$this->IsWithinBitRange($source_data_array['bitsformsdeviation'], 8, false)) { + if (($source_data_array['bitsformsdeviation'] % 4) == 0) { + $framedata .= chr($source_data_array['bitsformsdeviation']); + } else { + $this->errors[] = 'Bits For Milliseconds Deviation in '.$frame_name.' ('.$source_data_array['bitsforbytesdeviation'].') must be a multiple of 4.'; + } + } else { + $this->errors[] = 'Invalid Bits For Milliseconds Deviation in '.$frame_name.' ('.$source_data_array['bitsformsdeviation'].')'; + } + foreach ($source_data_array as $key => $val) { + if (($key != 'framesbetweenreferences') && ($key != 'bytesbetweenreferences') && ($key != 'msbetweenreferences') && ($key != 'bitsforbytesdeviation') && ($key != 'bitsformsdeviation') && ($key != 'flags')) { + $unwrittenbitstream .= str_pad(getid3_lib::Dec2Bin($val['bytedeviation']), $source_data_array['bitsforbytesdeviation'], '0', STR_PAD_LEFT); + $unwrittenbitstream .= str_pad(getid3_lib::Dec2Bin($val['msdeviation']), $source_data_array['bitsformsdeviation'], '0', STR_PAD_LEFT); + } + } + for ($i = 0; $i < strlen($unwrittenbitstream); $i += 8) { + $highnibble = bindec(substr($unwrittenbitstream, $i, 4)) << 4; + $lownibble = bindec(substr($unwrittenbitstream, $i + 4, 4)); + $framedata .= chr($highnibble & $lownibble); + } + break; + + case 'SYTC': + // 4.7 SYTC Synchronised tempo codes + // Time stamp format $xx + // Tempo data + // Where time stamp format is: + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + if (($source_data_array['timestampformat'] > 2) || ($source_data_array['timestampformat'] < 1)) { + $this->errors[] = 'Invalid Time Stamp Format byte in '.$frame_name.' ('.$source_data_array['timestampformat'].')'; + } else { + $framedata .= chr($source_data_array['timestampformat']); + foreach ($source_data_array as $key => $val) { + if (!$this->ID3v2IsValidETCOevent($val['typeid'])) { + $this->errors[] = 'Invalid Event Type byte in '.$frame_name.' ('.$val['typeid'].')'; + } elseif (($key != 'timestampformat') && ($key != 'flags')) { + if (($val['tempo'] < 0) || ($val['tempo'] > 510)) { + $this->errors[] = 'Invalid Tempo (max = 510) in '.$frame_name.' ('.$val['tempo'].') at timestamp ('.$val['timestamp'].')'; + } else { + if ($val['tempo'] > 255) { + $framedata .= chr(255); + $val['tempo'] -= 255; + } + $framedata .= chr($val['tempo']); + $framedata .= getid3_lib::BigEndian2String($val['timestamp'], 4, false); + } + } + } + } + break; + + case 'USLT': + // 4.8 USLT Unsynchronised lyric/text transcription + // Text encoding $xx + // Language $xx xx xx + // Content descriptor $00 (00) + // Lyrics/text + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') { + $this->errors[] = 'Invalid Language in '.$frame_name.' ('.$source_data_array['language'].')'; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= strtolower($source_data_array['language']); + $framedata .= $source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + break; + + case 'SYLT': + // 4.9 SYLT Synchronised lyric/text + // Text encoding $xx + // Language $xx xx xx + // Time stamp format $xx + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + // Content type $xx + // Content descriptor $00 (00) + // Terminated text to be synced (typically a syllable) + // Sync identifier (terminator to above string) $00 (00) + // Time stamp $xx (xx ...) + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') { + $this->errors[] = 'Invalid Language in '.$frame_name.' ('.$source_data_array['language'].')'; + } elseif (($source_data_array['timestampformat'] > 2) || ($source_data_array['timestampformat'] < 1)) { + $this->errors[] = 'Invalid Time Stamp Format byte in '.$frame_name.' ('.$source_data_array['timestampformat'].')'; + } elseif (!$this->ID3v2IsValidSYLTtype($source_data_array['contenttypeid'])) { + $this->errors[] = 'Invalid Content Type byte in '.$frame_name.' ('.$source_data_array['contenttypeid'].')'; + } elseif (!is_array($source_data_array['data'])) { + $this->errors[] = 'Invalid Lyric/Timestamp data in '.$frame_name.' (must be an array)'; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= strtolower($source_data_array['language']); + $framedata .= chr($source_data_array['timestampformat']); + $framedata .= chr($source_data_array['contenttypeid']); + $framedata .= $source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + ksort($source_data_array['data']); + foreach ($source_data_array['data'] as $key => $val) { + $framedata .= $val['data'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= getid3_lib::BigEndian2String($val['timestamp'], 4, false); + } + } + break; + + case 'COMM': + // 4.10 COMM Comments + // Text encoding $xx + // Language $xx xx xx + // Short content descrip. $00 (00) + // The actual text + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') { + $this->errors[] = 'Invalid Language in '.$frame_name.' ('.$source_data_array['language'].')'; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= strtolower($source_data_array['language']); + $framedata .= $source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + break; + + case 'RVA2': + // 4.11 RVA2 Relative volume adjustment (2) (ID3v2.4+ only) + // Identification $00 + // The 'identification' string is used to identify the situation and/or + // device where this adjustment should apply. The following is then + // repeated for every channel: + // Type of channel $xx + // Volume adjustment $xx xx + // Bits representing peak $xx + // Peak volume $xx (xx ...) + $framedata .= str_replace("\x00", '', $source_data_array['description'])."\x00"; + foreach ($source_data_array as $key => $val) { + if ($key != 'description') { + $framedata .= chr($val['channeltypeid']); + $framedata .= getid3_lib::BigEndian2String($val['volumeadjust'], 2, false, true); // signed 16-bit + if (!$this->IsWithinBitRange($source_data_array['bitspeakvolume'], 8, false)) { + $framedata .= chr($val['bitspeakvolume']); + if ($val['bitspeakvolume'] > 0) { + $framedata .= getid3_lib::BigEndian2String($val['peakvolume'], ceil($val['bitspeakvolume'] / 8), false, false); + } + } else { + $this->errors[] = 'Invalid Bits Representing Peak Volume in '.$frame_name.' ('.$val['bitspeakvolume'].') (range = 0 to 255)'; + } + } + } + break; + + case 'RVAD': + // 4.12 RVAD Relative volume adjustment (ID3v2.3 only) + // Increment/decrement %00fedcba + // Bits used for volume descr. $xx + // Relative volume change, right $xx xx (xx ...) // a + // Relative volume change, left $xx xx (xx ...) // b + // Peak volume right $xx xx (xx ...) + // Peak volume left $xx xx (xx ...) + // Relative volume change, right back $xx xx (xx ...) // c + // Relative volume change, left back $xx xx (xx ...) // d + // Peak volume right back $xx xx (xx ...) + // Peak volume left back $xx xx (xx ...) + // Relative volume change, center $xx xx (xx ...) // e + // Peak volume center $xx xx (xx ...) + // Relative volume change, bass $xx xx (xx ...) // f + // Peak volume bass $xx xx (xx ...) + if (!$this->IsWithinBitRange($source_data_array['bitsvolume'], 8, false)) { + $this->errors[] = 'Invalid Bits For Volume Description byte in '.$frame_name.' ('.$source_data_array['bitsvolume'].') (range = 1 to 255)'; + } else { + $incdecflag .= '00'; + $incdecflag .= $source_data_array['incdec']['right'] ? '1' : '0'; // a - Relative volume change, right + $incdecflag .= $source_data_array['incdec']['left'] ? '1' : '0'; // b - Relative volume change, left + $incdecflag .= $source_data_array['incdec']['rightrear'] ? '1' : '0'; // c - Relative volume change, right back + $incdecflag .= $source_data_array['incdec']['leftrear'] ? '1' : '0'; // d - Relative volume change, left back + $incdecflag .= $source_data_array['incdec']['center'] ? '1' : '0'; // e - Relative volume change, center + $incdecflag .= $source_data_array['incdec']['bass'] ? '1' : '0'; // f - Relative volume change, bass + $framedata .= chr(bindec($incdecflag)); + $framedata .= chr($source_data_array['bitsvolume']); + $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['right'], ceil($source_data_array['bitsvolume'] / 8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['left'], ceil($source_data_array['bitsvolume'] / 8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['right'], ceil($source_data_array['bitsvolume'] / 8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['left'], ceil($source_data_array['bitsvolume'] / 8), false); + if ($source_data_array['volumechange']['rightrear'] || $source_data_array['volumechange']['leftrear'] || + $source_data_array['peakvolume']['rightrear'] || $source_data_array['peakvolume']['leftrear'] || + $source_data_array['volumechange']['center'] || $source_data_array['peakvolume']['center'] || + $source_data_array['volumechange']['bass'] || $source_data_array['peakvolume']['bass']) { + $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['rightrear'], ceil($source_data_array['bitsvolume']/8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['leftrear'], ceil($source_data_array['bitsvolume']/8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['rightrear'], ceil($source_data_array['bitsvolume']/8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['leftrear'], ceil($source_data_array['bitsvolume']/8), false); + } + if ($source_data_array['volumechange']['center'] || $source_data_array['peakvolume']['center'] || + $source_data_array['volumechange']['bass'] || $source_data_array['peakvolume']['bass']) { + $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['center'], ceil($source_data_array['bitsvolume']/8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['center'], ceil($source_data_array['bitsvolume']/8), false); + } + if ($source_data_array['volumechange']['bass'] || $source_data_array['peakvolume']['bass']) { + $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['bass'], ceil($source_data_array['bitsvolume']/8), false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['bass'], ceil($source_data_array['bitsvolume']/8), false); + } + } + break; + + case 'EQU2': + // 4.12 EQU2 Equalisation (2) (ID3v2.4+ only) + // Interpolation method $xx + // $00 Band + // $01 Linear + // Identification $00 + // The following is then repeated for every adjustment point + // Frequency $xx xx + // Volume adjustment $xx xx + if (($source_data_array['interpolationmethod'] < 0) || ($source_data_array['interpolationmethod'] > 1)) { + $this->errors[] = 'Invalid Interpolation Method byte in '.$frame_name.' ('.$source_data_array['interpolationmethod'].') (valid = 0 or 1)'; + } else { + $framedata .= chr($source_data_array['interpolationmethod']); + $framedata .= str_replace("\x00", '', $source_data_array['description'])."\x00"; + foreach ($source_data_array['data'] as $key => $val) { + $framedata .= getid3_lib::BigEndian2String(intval(round($key * 2)), 2, false); + $framedata .= getid3_lib::BigEndian2String($val, 2, false, true); // signed 16-bit + } + } + break; + + case 'EQUA': + // 4.12 EQUA Equalisation (ID3v2.3 only) + // Adjustment bits $xx + // This is followed by 2 bytes + ('adjustment bits' rounded up to the + // nearest byte) for every equalisation band in the following format, + // giving a frequency range of 0 - 32767Hz: + // Increment/decrement %x (MSB of the Frequency) + // Frequency (lower 15 bits) + // Adjustment $xx (xx ...) + if (!$this->IsWithinBitRange($source_data_array['bitsvolume'], 8, false)) { + $this->errors[] = 'Invalid Adjustment Bits byte in '.$frame_name.' ('.$source_data_array['bitsvolume'].') (range = 1 to 255)'; + } else { + $framedata .= chr($source_data_array['adjustmentbits']); + foreach ($source_data_array as $key => $val) { + if ($key != 'bitsvolume') { + if (($key > 32767) || ($key < 0)) { + $this->errors[] = 'Invalid Frequency in '.$frame_name.' ('.$key.') (range = 0 to 32767)'; + } else { + if ($val >= 0) { + // put MSB of frequency to 1 if increment, 0 if decrement + $key |= 0x8000; + } + $framedata .= getid3_lib::BigEndian2String($key, 2, false); + $framedata .= getid3_lib::BigEndian2String($val, ceil($source_data_array['adjustmentbits'] / 8), false); + } + } + } + } + break; + + case 'RVRB': + // 4.13 RVRB Reverb + // Reverb left (ms) $xx xx + // Reverb right (ms) $xx xx + // Reverb bounces, left $xx + // Reverb bounces, right $xx + // Reverb feedback, left to left $xx + // Reverb feedback, left to right $xx + // Reverb feedback, right to right $xx + // Reverb feedback, right to left $xx + // Premix left to right $xx + // Premix right to left $xx + if (!$this->IsWithinBitRange($source_data_array['left'], 16, false)) { + $this->errors[] = 'Invalid Reverb Left in '.$frame_name.' ('.$source_data_array['left'].') (range = 0 to 65535)'; + } elseif (!$this->IsWithinBitRange($source_data_array['right'], 16, false)) { + $this->errors[] = 'Invalid Reverb Left in '.$frame_name.' ('.$source_data_array['right'].') (range = 0 to 65535)'; + } elseif (!$this->IsWithinBitRange($source_data_array['bouncesL'], 8, false)) { + $this->errors[] = 'Invalid Reverb Bounces, Left in '.$frame_name.' ('.$source_data_array['bouncesL'].') (range = 0 to 255)'; + } elseif (!$this->IsWithinBitRange($source_data_array['bouncesR'], 8, false)) { + $this->errors[] = 'Invalid Reverb Bounces, Right in '.$frame_name.' ('.$source_data_array['bouncesR'].') (range = 0 to 255)'; + } elseif (!$this->IsWithinBitRange($source_data_array['feedbackLL'], 8, false)) { + $this->errors[] = 'Invalid Reverb Feedback, Left-To-Left in '.$frame_name.' ('.$source_data_array['feedbackLL'].') (range = 0 to 255)'; + } elseif (!$this->IsWithinBitRange($source_data_array['feedbackLR'], 8, false)) { + $this->errors[] = 'Invalid Reverb Feedback, Left-To-Right in '.$frame_name.' ('.$source_data_array['feedbackLR'].') (range = 0 to 255)'; + } elseif (!$this->IsWithinBitRange($source_data_array['feedbackRR'], 8, false)) { + $this->errors[] = 'Invalid Reverb Feedback, Right-To-Right in '.$frame_name.' ('.$source_data_array['feedbackRR'].') (range = 0 to 255)'; + } elseif (!$this->IsWithinBitRange($source_data_array['feedbackRL'], 8, false)) { + $this->errors[] = 'Invalid Reverb Feedback, Right-To-Left in '.$frame_name.' ('.$source_data_array['feedbackRL'].') (range = 0 to 255)'; + } elseif (!$this->IsWithinBitRange($source_data_array['premixLR'], 8, false)) { + $this->errors[] = 'Invalid Premix, Left-To-Right in '.$frame_name.' ('.$source_data_array['premixLR'].') (range = 0 to 255)'; + } elseif (!$this->IsWithinBitRange($source_data_array['premixRL'], 8, false)) { + $this->errors[] = 'Invalid Premix, Right-To-Left in '.$frame_name.' ('.$source_data_array['premixRL'].') (range = 0 to 255)'; + } else { + $framedata .= getid3_lib::BigEndian2String($source_data_array['left'], 2, false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['right'], 2, false); + $framedata .= chr($source_data_array['bouncesL']); + $framedata .= chr($source_data_array['bouncesR']); + $framedata .= chr($source_data_array['feedbackLL']); + $framedata .= chr($source_data_array['feedbackLR']); + $framedata .= chr($source_data_array['feedbackRR']); + $framedata .= chr($source_data_array['feedbackRL']); + $framedata .= chr($source_data_array['premixLR']); + $framedata .= chr($source_data_array['premixRL']); + } + break; + + case 'APIC': + // 4.14 APIC Attached picture + // Text encoding $xx + // MIME type $00 + // Picture type $xx + // Description $00 (00) + // Picture data + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } elseif (!$this->ID3v2IsValidAPICpicturetype($source_data_array['picturetypeid'])) { + $this->errors[] = 'Invalid Picture Type byte in '.$frame_name.' ('.$source_data_array['picturetypeid'].') for ID3v2.'.$this->majorversion; + } elseif (($this->majorversion >= 3) && (!$this->ID3v2IsValidAPICimageformat($source_data_array['mime']))) { + $this->errors[] = 'Invalid MIME Type in '.$frame_name.' ('.$source_data_array['mime'].') for ID3v2.'.$this->majorversion; + } elseif (($source_data_array['mime'] == '-->') && (!$this->IsValidURL($source_data_array['data'], false, false))) { + //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + // probably should be an error, need to rewrite IsValidURL() to handle other encodings + $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= str_replace("\x00", '', $source_data_array['mime'])."\x00"; + $framedata .= chr($source_data_array['picturetypeid']); + $framedata .= @$source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + break; + + case 'GEOB': + // 4.15 GEOB General encapsulated object + // Text encoding $xx + // MIME type $00 + // Filename $00 (00) + // Content description $00 (00) + // Encapsulated object + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } elseif (!$this->IsValidMIMEstring($source_data_array['mime'])) { + $this->errors[] = 'Invalid MIME Type in '.$frame_name.' ('.$source_data_array['mime'].')'; + } elseif (!$source_data_array['description']) { + $this->errors[] = 'Missing Description in '.$frame_name; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= str_replace("\x00", '', $source_data_array['mime'])."\x00"; + $framedata .= $source_data_array['filename'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + break; + + case 'PCNT': + // 4.16 PCNT Play counter + // When the counter reaches all one's, one byte is inserted in + // front of the counter thus making the counter eight bits bigger + // Counter $xx xx xx xx (xx ...) + $framedata .= getid3_lib::BigEndian2String($source_data_array['data'], 4, false); + break; + + case 'POPM': + // 4.17 POPM Popularimeter + // When the counter reaches all one's, one byte is inserted in + // front of the counter thus making the counter eight bits bigger + // Email to user $00 + // Rating $xx + // Counter $xx xx xx xx (xx ...) + if (!$this->IsWithinBitRange($source_data_array['rating'], 8, false)) { + $this->errors[] = 'Invalid Rating byte in '.$frame_name.' ('.$source_data_array['rating'].') (range = 0 to 255)'; + } elseif (!IsValidEmail($source_data_array['email'])) { + $this->errors[] = 'Invalid Email in '.$frame_name.' ('.$source_data_array['email'].')'; + } else { + $framedata .= str_replace("\x00", '', $source_data_array['email'])."\x00"; + $framedata .= chr($source_data_array['rating']); + $framedata .= getid3_lib::BigEndian2String($source_data_array['data'], 4, false); + } + break; + + case 'RBUF': + // 4.18 RBUF Recommended buffer size + // Buffer size $xx xx xx + // Embedded info flag %0000000x + // Offset to next tag $xx xx xx xx + if (!$this->IsWithinBitRange($source_data_array['buffersize'], 24, false)) { + $this->errors[] = 'Invalid Buffer Size in '.$frame_name; + } elseif (!$this->IsWithinBitRange($source_data_array['nexttagoffset'], 32, false)) { + $this->errors[] = 'Invalid Offset To Next Tag in '.$frame_name; + } else { + $framedata .= getid3_lib::BigEndian2String($source_data_array['buffersize'], 3, false); + $flag .= '0000000'; + $flag .= $source_data_array['flags']['embededinfo'] ? '1' : '0'; + $framedata .= chr(bindec($flag)); + $framedata .= getid3_lib::BigEndian2String($source_data_array['nexttagoffset'], 4, false); + } + break; + + case 'AENC': + // 4.19 AENC Audio encryption + // Owner identifier $00 + // Preview start $xx xx + // Preview length $xx xx + // Encryption info + if (!$this->IsWithinBitRange($source_data_array['previewstart'], 16, false)) { + $this->errors[] = 'Invalid Preview Start in '.$frame_name.' ('.$source_data_array['previewstart'].')'; + } elseif (!$this->IsWithinBitRange($source_data_array['previewlength'], 16, false)) { + $this->errors[] = 'Invalid Preview Length in '.$frame_name.' ('.$source_data_array['previewlength'].')'; + } else { + $framedata .= str_replace("\x00", '', $source_data_array['ownerid'])."\x00"; + $framedata .= getid3_lib::BigEndian2String($source_data_array['previewstart'], 2, false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['previewlength'], 2, false); + $framedata .= $source_data_array['encryptioninfo']; + } + break; + + case 'LINK': + // 4.20 LINK Linked information + // Frame identifier $xx xx xx xx + // URL $00 + // ID and additional data + if (!getid3_id3v2::IsValidID3v2FrameName($source_data_array['frameid'], $this->majorversion)) { + $this->errors[] = 'Invalid Frame Identifier in '.$frame_name.' ('.$source_data_array['frameid'].')'; + } elseif (!$this->IsValidURL($source_data_array['data'], true, false)) { + //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + // probably should be an error, need to rewrite IsValidURL() to handle other encodings + $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + } elseif ((($source_data_array['frameid'] == 'AENC') || ($source_data_array['frameid'] == 'APIC') || ($source_data_array['frameid'] == 'GEOB') || ($source_data_array['frameid'] == 'TXXX')) && ($source_data_array['additionaldata'] == '')) { + $this->errors[] = 'Content Descriptor must be specified as additional data for Frame Identifier of '.$source_data_array['frameid'].' in '.$frame_name; + } elseif (($source_data_array['frameid'] == 'USER') && (getid3_id3v2::LanguageLookup($source_data_array['additionaldata'], true) == '')) { + $this->errors[] = 'Language must be specified as additional data for Frame Identifier of '.$source_data_array['frameid'].' in '.$frame_name; + } elseif (($source_data_array['frameid'] == 'PRIV') && ($source_data_array['additionaldata'] == '')) { + $this->errors[] = 'Owner Identifier must be specified as additional data for Frame Identifier of '.$source_data_array['frameid'].' in '.$frame_name; + } elseif ((($source_data_array['frameid'] == 'COMM') || ($source_data_array['frameid'] == 'SYLT') || ($source_data_array['frameid'] == 'USLT')) && ((getid3_id3v2::LanguageLookup(substr($source_data_array['additionaldata'], 0, 3), true) == '') || (substr($source_data_array['additionaldata'], 3) == ''))) { + $this->errors[] = 'Language followed by Content Descriptor must be specified as additional data for Frame Identifier of '.$source_data_array['frameid'].' in '.$frame_name; + } else { + $framedata .= $source_data_array['frameid']; + $framedata .= str_replace("\x00", '', $source_data_array['data'])."\x00"; + switch ($source_data_array['frameid']) { + case 'COMM': + case 'SYLT': + case 'USLT': + case 'PRIV': + case 'USER': + case 'AENC': + case 'APIC': + case 'GEOB': + case 'TXXX': + $framedata .= $source_data_array['additionaldata']; + break; + case 'ASPI': + case 'ETCO': + case 'EQU2': + case 'MCID': + case 'MLLT': + case 'OWNE': + case 'RVA2': + case 'RVRB': + case 'SYTC': + case 'IPLS': + case 'RVAD': + case 'EQUA': + // no additional data required + break; + case 'RBUF': + if ($this->majorversion == 3) { + // no additional data required + } else { + $this->errors[] = $source_data_array['frameid'].' is not a valid Frame Identifier in '.$frame_name.' (in ID3v2.'.$this->majorversion.')'; + } + + default: + if ((substr($source_data_array['frameid'], 0, 1) == 'T') || (substr($source_data_array['frameid'], 0, 1) == 'W')) { + // no additional data required + } else { + $this->errors[] = $source_data_array['frameid'].' is not a valid Frame Identifier in '.$frame_name.' (in ID3v2.'.$this->majorversion.')'; + } + break; + } + } + break; + + case 'POSS': + // 4.21 POSS Position synchronisation frame (ID3v2.3+ only) + // Time stamp format $xx + // Position $xx (xx ...) + if (($source_data_array['timestampformat'] < 1) || ($source_data_array['timestampformat'] > 2)) { + $this->errors[] = 'Invalid Time Stamp Format in '.$frame_name.' ('.$source_data_array['timestampformat'].') (valid = 1 or 2)'; + } elseif (!$this->IsWithinBitRange($source_data_array['position'], 32, false)) { + $this->errors[] = 'Invalid Position in '.$frame_name.' ('.$source_data_array['position'].') (range = 0 to 4294967295)'; + } else { + $framedata .= chr($source_data_array['timestampformat']); + $framedata .= getid3_lib::BigEndian2String($source_data_array['position'], 4, false); + } + break; + + case 'USER': + // 4.22 USER Terms of use (ID3v2.3+ only) + // Text encoding $xx + // Language $xx xx xx + // The actual text + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].')'; + } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') { + $this->errors[] = 'Invalid Language in '.$frame_name.' ('.$source_data_array['language'].')'; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= strtolower($source_data_array['language']); + $framedata .= $source_data_array['data']; + } + break; + + case 'OWNE': + // 4.23 OWNE Ownership frame (ID3v2.3+ only) + // Text encoding $xx + // Price paid $00 + // Date of purch. + // Seller + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].')'; + } elseif (!$this->IsANumber($source_data_array['pricepaid']['value'], false)) { + $this->errors[] = 'Invalid Price Paid in '.$frame_name.' ('.$source_data_array['pricepaid']['value'].')'; + } elseif (!$this->IsValidDateStampString($source_data_array['purchasedate'])) { + $this->errors[] = 'Invalid Date Of Purchase in '.$frame_name.' ('.$source_data_array['purchasedate'].') (format = YYYYMMDD)'; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= str_replace("\x00", '', $source_data_array['pricepaid']['value'])."\x00"; + $framedata .= $source_data_array['purchasedate']; + $framedata .= $source_data_array['seller']; + } + break; + + case 'COMR': + // 4.24 COMR Commercial frame (ID3v2.3+ only) + // Text encoding $xx + // Price string $00 + // Valid until + // Contact URL $00 + // Received as $xx + // Name of seller $00 (00) + // Description $00 (00) + // Picture MIME type $00 + // Seller logo + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].')'; + } elseif (!$this->IsValidDateStampString($source_data_array['pricevaliduntil'])) { + $this->errors[] = 'Invalid Valid Until date in '.$frame_name.' ('.$source_data_array['pricevaliduntil'].') (format = YYYYMMDD)'; + } elseif (!$this->IsValidURL($source_data_array['contacturl'], false, true)) { + $this->errors[] = 'Invalid Contact URL in '.$frame_name.' ('.$source_data_array['contacturl'].') (allowed schemes: http, https, ftp, mailto)'; + } elseif (!$this->ID3v2IsValidCOMRreceivedAs($source_data_array['receivedasid'])) { + $this->errors[] = 'Invalid Received As byte in '.$frame_name.' ('.$source_data_array['contacturl'].') (range = 0 to 8)'; + } elseif (!$this->IsValidMIMEstring($source_data_array['mime'])) { + $this->errors[] = 'Invalid MIME Type in '.$frame_name.' ('.$source_data_array['mime'].')'; + } else { + $framedata .= chr($source_data_array['encodingid']); + unset($pricestring); + foreach ($source_data_array['price'] as $key => $val) { + if ($this->ID3v2IsValidPriceString($key.$val['value'])) { + $pricestrings[] = $key.$val['value']; + } else { + $this->errors[] = 'Invalid Price String in '.$frame_name.' ('.$key.$val['value'].')'; + } + } + $framedata .= implode('/', $pricestrings); + $framedata .= $source_data_array['pricevaliduntil']; + $framedata .= str_replace("\x00", '', $source_data_array['contacturl'])."\x00"; + $framedata .= chr($source_data_array['receivedasid']); + $framedata .= $source_data_array['sellername'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']); + $framedata .= $source_data_array['mime']."\x00"; + $framedata .= $source_data_array['logo']; + } + break; + + case 'ENCR': + // 4.25 ENCR Encryption method registration (ID3v2.3+ only) + // Owner identifier $00 + // Method symbol $xx + // Encryption data + if (!$this->IsWithinBitRange($source_data_array['methodsymbol'], 8, false)) { + $this->errors[] = 'Invalid Group Symbol in '.$frame_name.' ('.$source_data_array['methodsymbol'].') (range = 0 to 255)'; + } else { + $framedata .= str_replace("\x00", '', $source_data_array['ownerid'])."\x00"; + $framedata .= ord($source_data_array['methodsymbol']); + $framedata .= $source_data_array['data']; + } + break; + + case 'GRID': + // 4.26 GRID Group identification registration (ID3v2.3+ only) + // Owner identifier $00 + // Group symbol $xx + // Group dependent data + if (!$this->IsWithinBitRange($source_data_array['groupsymbol'], 8, false)) { + $this->errors[] = 'Invalid Group Symbol in '.$frame_name.' ('.$source_data_array['groupsymbol'].') (range = 0 to 255)'; + } else { + $framedata .= str_replace("\x00", '', $source_data_array['ownerid'])."\x00"; + $framedata .= ord($source_data_array['groupsymbol']); + $framedata .= $source_data_array['data']; + } + break; + + case 'PRIV': + // 4.27 PRIV Private frame (ID3v2.3+ only) + // Owner identifier $00 + // The private data + $framedata .= str_replace("\x00", '', $source_data_array['ownerid'])."\x00"; + $framedata .= $source_data_array['data']; + break; + + case 'SIGN': + // 4.28 SIGN Signature frame (ID3v2.4+ only) + // Group symbol $xx + // Signature + if (!$this->IsWithinBitRange($source_data_array['groupsymbol'], 8, false)) { + $this->errors[] = 'Invalid Group Symbol in '.$frame_name.' ('.$source_data_array['groupsymbol'].') (range = 0 to 255)'; + } else { + $framedata .= ord($source_data_array['groupsymbol']); + $framedata .= $source_data_array['data']; + } + break; + + case 'SEEK': + // 4.29 SEEK Seek frame (ID3v2.4+ only) + // Minimum offset to next tag $xx xx xx xx + if (!$this->IsWithinBitRange($source_data_array['data'], 32, false)) { + $this->errors[] = 'Invalid Minimum Offset in '.$frame_name.' ('.$source_data_array['data'].') (range = 0 to 4294967295)'; + } else { + $framedata .= getid3_lib::BigEndian2String($source_data_array['data'], 4, false); + } + break; + + case 'ASPI': + // 4.30 ASPI Audio seek point index (ID3v2.4+ only) + // Indexed data start (S) $xx xx xx xx + // Indexed data length (L) $xx xx xx xx + // Number of index points (N) $xx xx + // Bits per index point (b) $xx + // Then for every index point the following data is included: + // Fraction at index (Fi) $xx (xx) + if (!$this->IsWithinBitRange($source_data_array['datastart'], 32, false)) { + $this->errors[] = 'Invalid Indexed Data Start in '.$frame_name.' ('.$source_data_array['datastart'].') (range = 0 to 4294967295)'; + } elseif (!$this->IsWithinBitRange($source_data_array['datalength'], 32, false)) { + $this->errors[] = 'Invalid Indexed Data Length in '.$frame_name.' ('.$source_data_array['datalength'].') (range = 0 to 4294967295)'; + } elseif (!$this->IsWithinBitRange($source_data_array['indexpoints'], 16, false)) { + $this->errors[] = 'Invalid Number Of Index Points in '.$frame_name.' ('.$source_data_array['indexpoints'].') (range = 0 to 65535)'; + } elseif (!$this->IsWithinBitRange($source_data_array['bitsperpoint'], 8, false)) { + $this->errors[] = 'Invalid Bits Per Index Point in '.$frame_name.' ('.$source_data_array['bitsperpoint'].') (range = 0 to 255)'; + } elseif ($source_data_array['indexpoints'] != count($source_data_array['indexes'])) { + $this->errors[] = 'Number Of Index Points does not match actual supplied data in '.$frame_name; + } else { + $framedata .= getid3_lib::BigEndian2String($source_data_array['datastart'], 4, false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['datalength'], 4, false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['indexpoints'], 2, false); + $framedata .= getid3_lib::BigEndian2String($source_data_array['bitsperpoint'], 1, false); + foreach ($source_data_array['indexes'] as $key => $val) { + $framedata .= getid3_lib::BigEndian2String($val, ceil($source_data_array['bitsperpoint'] / 8), false); + } + } + break; + + case 'RGAD': + // RGAD Replay Gain Adjustment + // http://privatewww.essex.ac.uk/~djmrob/replaygain/ + // Peak Amplitude $xx $xx $xx $xx + // Radio Replay Gain Adjustment %aaabbbcd %dddddddd + // Audiophile Replay Gain Adjustment %aaabbbcd %dddddddd + // a - name code + // b - originator code + // c - sign bit + // d - replay gain adjustment + + if (($source_data_array['track_adjustment'] > 51) || ($source_data_array['track_adjustment'] < -51)) { + $this->errors[] = 'Invalid Track Adjustment in '.$frame_name.' ('.$source_data_array['track_adjustment'].') (range = -51.0 to +51.0)'; + } elseif (($source_data_array['album_adjustment'] > 51) || ($source_data_array['album_adjustment'] < -51)) { + $this->errors[] = 'Invalid Album Adjustment in '.$frame_name.' ('.$source_data_array['album_adjustment'].') (range = -51.0 to +51.0)'; + } elseif (!$this->ID3v2IsValidRGADname($source_data_array['raw']['track_name'])) { + $this->errors[] = 'Invalid Track Name Code in '.$frame_name.' ('.$source_data_array['raw']['track_name'].') (range = 0 to 2)'; + } elseif (!$this->ID3v2IsValidRGADname($source_data_array['raw']['album_name'])) { + $this->errors[] = 'Invalid Album Name Code in '.$frame_name.' ('.$source_data_array['raw']['album_name'].') (range = 0 to 2)'; + } elseif (!$this->ID3v2IsValidRGADoriginator($source_data_array['raw']['track_originator'])) { + $this->errors[] = 'Invalid Track Originator Code in '.$frame_name.' ('.$source_data_array['raw']['track_originator'].') (range = 0 to 3)'; + } elseif (!$this->ID3v2IsValidRGADoriginator($source_data_array['raw']['album_originator'])) { + $this->errors[] = 'Invalid Album Originator Code in '.$frame_name.' ('.$source_data_array['raw']['album_originator'].') (range = 0 to 3)'; + } else { + $framedata .= getid3_lib::Float2String($source_data_array['peakamplitude'], 32); + $framedata .= getid3_lib::RGADgainString($source_data_array['raw']['track_name'], $source_data_array['raw']['track_originator'], $source_data_array['track_adjustment']); + $framedata .= getid3_lib::RGADgainString($source_data_array['raw']['album_name'], $source_data_array['raw']['album_originator'], $source_data_array['album_adjustment']); + } + break; + + default: + if ($frame_name{0} == 'T') { + // 4.2. T??? Text information frames + // Text encoding $xx + // Information + $source_data_array['encodingid'] = (isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid); + if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) { + $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion; + } else { + $framedata .= chr($source_data_array['encodingid']); + $framedata .= $source_data_array['data']; + } + } elseif ($frame_name{0} == 'W') { + // 4.3. W??? URL link frames + // URL + if (!$this->IsValidURL($source_data_array['data'], false, false)) { + //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + // probably should be an error, need to rewrite IsValidURL() to handle other encodings + $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')'; + } else { + $framedata .= $source_data_array['data']; + } + } else { + $this->errors[] = $frame_name.' not yet supported in $this->GenerateID3v2FrameData()'; + } + break; + } + } + if (!empty($this->errors)) { + return false; + } + return $framedata; + } + + function ID3v2FrameIsAllowed($frame_name, $source_data_array) { + static $PreviousFrames = array(); + + if ($frame_name === null) { + // if the writing functions are called multiple times, the static array needs to be + // cleared - this can be done by calling $this->ID3v2FrameIsAllowed(null, '') + $PreviousFrames = array(); + return true; + } + + if ($this->majorversion == 4) { + switch ($frame_name) { + case 'UFID': + case 'AENC': + case 'ENCR': + case 'GRID': + if (!isset($source_data_array['ownerid'])) { + $this->errors[] = '[ownerid] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['ownerid'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same OwnerID ('.$source_data_array['ownerid'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['ownerid']; + } + break; + + case 'TXXX': + case 'WXXX': + case 'RVA2': + case 'EQU2': + case 'APIC': + case 'GEOB': + if (!isset($source_data_array['description'])) { + $this->errors[] = '[description] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['description'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Description ('.$source_data_array['description'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['description']; + } + break; + + case 'USER': + if (!isset($source_data_array['language'])) { + $this->errors[] = '[language] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['language'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Language ('.$source_data_array['language'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['language']; + } + break; + + case 'USLT': + case 'SYLT': + case 'COMM': + if (!isset($source_data_array['language'])) { + $this->errors[] = '[language] not specified for '.$frame_name; + } elseif (!isset($source_data_array['description'])) { + $this->errors[] = '[description] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['language'].$source_data_array['description'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Language + Description ('.$source_data_array['language'].' + '.$source_data_array['description'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['language'].$source_data_array['description']; + } + break; + + case 'POPM': + if (!isset($source_data_array['email'])) { + $this->errors[] = '[email] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['email'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Email ('.$source_data_array['email'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['email']; + } + break; + + case 'IPLS': + case 'MCDI': + case 'ETCO': + case 'MLLT': + case 'SYTC': + case 'RVRB': + case 'PCNT': + case 'RBUF': + case 'POSS': + case 'OWNE': + case 'SEEK': + case 'ASPI': + case 'RGAD': + if (in_array($frame_name, $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed'; + } else { + $PreviousFrames[] = $frame_name; + } + break; + + case 'LINK': + // this isn't implemented quite right (yet) - it should check the target frame data for compliance + // but right now it just allows one linked frame of each type, to be safe. + if (!isset($source_data_array['frameid'])) { + $this->errors[] = '[frameid] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['frameid'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same FrameID ('.$source_data_array['frameid'].')'; + } elseif (in_array($source_data_array['frameid'], $PreviousFrames)) { + // no links to singleton tags + $this->errors[] = 'Cannot specify a '.$frame_name.' tag to a singleton tag that already exists ('.$source_data_array['frameid'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['frameid']; // only one linked tag of this type + $PreviousFrames[] = $source_data_array['frameid']; // no non-linked singleton tags of this type + } + break; + + case 'COMR': + // There may be more than one 'commercial frame' in a tag, but no two may be identical + // Checking isn't implemented at all (yet) - just assumes that it's OK. + break; + + case 'PRIV': + case 'SIGN': + if (!isset($source_data_array['ownerid'])) { + $this->errors[] = '[ownerid] not specified for '.$frame_name; + } elseif (!isset($source_data_array['data'])) { + $this->errors[] = '[data] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['ownerid'].$source_data_array['data'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same OwnerID + Data ('.$source_data_array['ownerid'].' + '.$source_data_array['data'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['ownerid'].$source_data_array['data']; + } + break; + + default: + if (($frame_name{0} != 'T') && ($frame_name{0} != 'W')) { + $this->errors[] = 'Frame not allowed in ID3v2.'.$this->majorversion.': '.$frame_name; + } + break; + } + + } elseif ($this->majorversion == 3) { + + switch ($frame_name) { + case 'UFID': + case 'AENC': + case 'ENCR': + case 'GRID': + if (!isset($source_data_array['ownerid'])) { + $this->errors[] = '[ownerid] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['ownerid'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same OwnerID ('.$source_data_array['ownerid'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['ownerid']; + } + break; + + case 'TXXX': + case 'WXXX': + case 'APIC': + case 'GEOB': + if (!isset($source_data_array['description'])) { + $this->errors[] = '[description] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['description'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Description ('.$source_data_array['description'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['description']; + } + break; + + case 'USER': + if (!isset($source_data_array['language'])) { + $this->errors[] = '[language] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['language'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Language ('.$source_data_array['language'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['language']; + } + break; + + case 'USLT': + case 'SYLT': + case 'COMM': + if (!isset($source_data_array['language'])) { + $this->errors[] = '[language] not specified for '.$frame_name; + } elseif (!isset($source_data_array['description'])) { + $this->errors[] = '[description] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['language'].$source_data_array['description'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Language + Description ('.$source_data_array['language'].' + '.$source_data_array['description'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['language'].$source_data_array['description']; + } + break; + + case 'POPM': + if (!isset($source_data_array['email'])) { + $this->errors[] = '[email] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['email'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Email ('.$source_data_array['email'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['email']; + } + break; + + case 'IPLS': + case 'MCDI': + case 'ETCO': + case 'MLLT': + case 'SYTC': + case 'RVAD': + case 'EQUA': + case 'RVRB': + case 'PCNT': + case 'RBUF': + case 'POSS': + case 'OWNE': + case 'RGAD': + if (in_array($frame_name, $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed'; + } else { + $PreviousFrames[] = $frame_name; + } + break; + + case 'LINK': + // this isn't implemented quite right (yet) - it should check the target frame data for compliance + // but right now it just allows one linked frame of each type, to be safe. + if (!isset($source_data_array['frameid'])) { + $this->errors[] = '[frameid] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['frameid'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same FrameID ('.$source_data_array['frameid'].')'; + } elseif (in_array($source_data_array['frameid'], $PreviousFrames)) { + // no links to singleton tags + $this->errors[] = 'Cannot specify a '.$frame_name.' tag to a singleton tag that already exists ('.$source_data_array['frameid'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['frameid']; // only one linked tag of this type + $PreviousFrames[] = $source_data_array['frameid']; // no non-linked singleton tags of this type + } + break; + + case 'COMR': + // There may be more than one 'commercial frame' in a tag, but no two may be identical + // Checking isn't implemented at all (yet) - just assumes that it's OK. + break; + + case 'PRIV': + if (!isset($source_data_array['ownerid'])) { + $this->errors[] = '[ownerid] not specified for '.$frame_name; + } elseif (!isset($source_data_array['data'])) { + $this->errors[] = '[data] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['ownerid'].$source_data_array['data'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same OwnerID + Data ('.$source_data_array['ownerid'].' + '.$source_data_array['data'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['ownerid'].$source_data_array['data']; + } + break; + + default: + if (($frame_name{0} != 'T') && ($frame_name{0} != 'W')) { + $this->errors[] = 'Frame not allowed in ID3v2.'.$this->majorversion.': '.$frame_name; + } + break; + } + + } elseif ($this->majorversion == 2) { + + switch ($frame_name) { + case 'UFI': + case 'CRM': + case 'CRA': + if (!isset($source_data_array['ownerid'])) { + $this->errors[] = '[ownerid] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['ownerid'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same OwnerID ('.$source_data_array['ownerid'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['ownerid']; + } + break; + + case 'TXX': + case 'WXX': + case 'PIC': + case 'GEO': + if (!isset($source_data_array['description'])) { + $this->errors[] = '[description] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['description'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Description ('.$source_data_array['description'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['description']; + } + break; + + case 'ULT': + case 'SLT': + case 'COM': + if (!isset($source_data_array['language'])) { + $this->errors[] = '[language] not specified for '.$frame_name; + } elseif (!isset($source_data_array['description'])) { + $this->errors[] = '[description] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['language'].$source_data_array['description'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Language + Description ('.$source_data_array['language'].' + '.$source_data_array['description'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['language'].$source_data_array['description']; + } + break; + + case 'POP': + if (!isset($source_data_array['email'])) { + $this->errors[] = '[email] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['email'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same Email ('.$source_data_array['email'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['email']; + } + break; + + case 'IPL': + case 'MCI': + case 'ETC': + case 'MLL': + case 'STC': + case 'RVA': + case 'EQU': + case 'REV': + case 'CNT': + case 'BUF': + if (in_array($frame_name, $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed'; + } else { + $PreviousFrames[] = $frame_name; + } + break; + + case 'LNK': + // this isn't implemented quite right (yet) - it should check the target frame data for compliance + // but right now it just allows one linked frame of each type, to be safe. + if (!isset($source_data_array['frameid'])) { + $this->errors[] = '[frameid] not specified for '.$frame_name; + } elseif (in_array($frame_name.$source_data_array['frameid'], $PreviousFrames)) { + $this->errors[] = 'Only one '.$frame_name.' tag allowed with the same FrameID ('.$source_data_array['frameid'].')'; + } elseif (in_array($source_data_array['frameid'], $PreviousFrames)) { + // no links to singleton tags + $this->errors[] = 'Cannot specify a '.$frame_name.' tag to a singleton tag that already exists ('.$source_data_array['frameid'].')'; + } else { + $PreviousFrames[] = $frame_name.$source_data_array['frameid']; // only one linked tag of this type + $PreviousFrames[] = $source_data_array['frameid']; // no non-linked singleton tags of this type + } + break; + + default: + if (($frame_name{0} != 'T') && ($frame_name{0} != 'W')) { + $this->errors[] = 'Frame not allowed in ID3v2.'.$this->majorversion.': '.$frame_name; + } + break; + } + } + + if (!empty($this->errors)) { + return false; + } + return true; + } + + function GenerateID3v2Tag($noerrorsonly=true) { + $this->ID3v2FrameIsAllowed(null, ''); // clear static array in case this isn't the first call to $this->GenerateID3v2Tag() + + $tagstring = ''; + if (is_array($this->tag_data)) { + foreach ($this->tag_data as $frame_name => $frame_rawinputdata) { + foreach ($frame_rawinputdata as $irrelevantindex => $source_data_array) { + if (getid3_id3v2::IsValidID3v2FrameName($frame_name, $this->majorversion)) { + unset($frame_length); + unset($frame_flags); + $frame_data = false; + if ($this->ID3v2FrameIsAllowed($frame_name, $source_data_array)) { + if ($frame_data = $this->GenerateID3v2FrameData($frame_name, $source_data_array)) { + $FrameUnsynchronisation = false; + if ($this->majorversion >= 4) { + // frame-level unsynchronisation + $unsynchdata = $frame_data; + if ($this->id3v2_use_unsynchronisation) { + $unsynchdata = $this->Unsynchronise($frame_data); + } + if (strlen($unsynchdata) != strlen($frame_data)) { + // unsynchronisation needed + $FrameUnsynchronisation = true; + $frame_data = $unsynchdata; + if (isset($TagUnsynchronisation) && $TagUnsynchronisation === false) { + // only set to true if ALL frames are unsynchronised + } else { + $TagUnsynchronisation = true; + } + } else { + if (isset($TagUnsynchronisation)) { + $TagUnsynchronisation = false; + } + } + unset($unsynchdata); + + $frame_length = getid3_lib::BigEndian2String(strlen($frame_data), 4, true); + } else { + $frame_length = getid3_lib::BigEndian2String(strlen($frame_data), 4, false); + } + $frame_flags = $this->GenerateID3v2FrameFlags($this->ID3v2FrameFlagsLookupTagAlter($frame_name), $this->ID3v2FrameFlagsLookupFileAlter($frame_name), false, false, false, false, $FrameUnsynchronisation, false); + } + } else { + $this->errors[] = 'Frame "'.$frame_name.'" is NOT allowed'; + } + if ($frame_data === false) { + $this->errors[] = '$this->GenerateID3v2FrameData() failed for "'.$frame_name.'"'; + if ($noerrorsonly) { + return false; + } else { + unset($frame_name); + } + } + } else { + // ignore any invalid frame names, including 'title', 'header', etc + $this->warnings[] = 'Ignoring invalid ID3v2 frame type: "'.$frame_name.'"'; + unset($frame_name); + unset($frame_length); + unset($frame_flags); + unset($frame_data); + } + if (isset($frame_name) && isset($frame_length) && isset($frame_flags) && isset($frame_data)) { + $tagstring .= $frame_name.$frame_length.$frame_flags.$frame_data; + } + } + } + + if (!isset($TagUnsynchronisation)) { + $TagUnsynchronisation = false; + } + if (($this->majorversion <= 3) && $this->id3v2_use_unsynchronisation) { + // tag-level unsynchronisation + $unsynchdata = $this->Unsynchronise($tagstring); + if (strlen($unsynchdata) != strlen($tagstring)) { + // unsynchronisation needed + $TagUnsynchronisation = true; + $tagstring = $unsynchdata; + } + } + + while ($this->paddedlength < (strlen($tagstring) + getid3_id3v2::ID3v2HeaderLength($this->majorversion))) { + $this->paddedlength += 1024; + } + + $footer = false; // ID3v2 footers not yet supported in getID3() + if (!$footer && ($this->paddedlength > (strlen($tagstring) + getid3_id3v2::ID3v2HeaderLength($this->majorversion)))) { + // pad up to $paddedlength bytes if unpadded tag is shorter than $paddedlength + // "Furthermore it MUST NOT have any padding when a tag footer is added to the tag." + $tagstring .= @str_repeat("\x00", $this->paddedlength - strlen($tagstring) - getid3_id3v2::ID3v2HeaderLength($this->majorversion)); + } + if ($this->id3v2_use_unsynchronisation && (substr($tagstring, strlen($tagstring) - 1, 1) == "\xFF")) { + // special unsynchronisation case: + // if last byte == $FF then appended a $00 + $TagUnsynchronisation = true; + $tagstring .= "\x00"; + } + + $tagheader = 'ID3'; + $tagheader .= chr($this->majorversion); + $tagheader .= chr($this->minorversion); + $tagheader .= $this->GenerateID3v2TagFlags(array('unsynchronisation'=>$TagUnsynchronisation)); + $tagheader .= getid3_lib::BigEndian2String(strlen($tagstring), 4, true); + + return $tagheader.$tagstring; + } + $this->errors[] = 'tag_data is not an array in GenerateID3v2Tag()'; + return false; + } + + function ID3v2IsValidPriceString($pricestring) { + if (getid3_id3v2::LanguageLookup(substr($pricestring, 0, 3), true) == '') { + return false; + } elseif (!$this->IsANumber(substr($pricestring, 3), true)) { + return false; + } + return true; + } + + function ID3v2FrameFlagsLookupTagAlter($framename) { + // unfinished + switch ($framename) { + case 'RGAD': + $allow = true; + default: + $allow = false; + break; + } + return $allow; + } + + function ID3v2FrameFlagsLookupFileAlter($framename) { + // unfinished + switch ($framename) { + case 'RGAD': + return false; + break; + + default: + return false; + break; + } + } + + function ID3v2IsValidETCOevent($eventid) { + if (($eventid < 0) || ($eventid > 0xFF)) { + // outside range of 1 byte + return false; + } elseif (($eventid >= 0xF0) && ($eventid <= 0xFC)) { + // reserved for future use + return false; + } elseif (($eventid >= 0x17) && ($eventid <= 0xDF)) { + // reserved for future use + return false; + } elseif (($eventid >= 0x0E) && ($eventid <= 0x16) && ($this->majorversion == 2)) { + // not defined in ID3v2.2 + return false; + } elseif (($eventid >= 0x15) && ($eventid <= 0x16) && ($this->majorversion == 3)) { + // not defined in ID3v2.3 + return false; + } + return true; + } + + function ID3v2IsValidSYLTtype($contenttype) { + if (($contenttype >= 0) && ($contenttype <= 8) && ($this->majorversion == 4)) { + return true; + } elseif (($contenttype >= 0) && ($contenttype <= 6) && ($this->majorversion == 3)) { + return true; + } + return false; + } + + function ID3v2IsValidRVA2channeltype($channeltype) { + if (($channeltype >= 0) && ($channeltype <= 8) && ($this->majorversion == 4)) { + return true; + } + return false; + } + + function ID3v2IsValidAPICpicturetype($picturetype) { + if (($picturetype >= 0) && ($picturetype <= 0x14) && ($this->majorversion >= 2) && ($this->majorversion <= 4)) { + return true; + } + return false; + } + + function ID3v2IsValidAPICimageformat($imageformat) { + if ($imageformat == '-->') { + return true; + } elseif ($this->majorversion == 2) { + if ((strlen($imageformat) == 3) && ($imageformat == strtoupper($imageformat))) { + return true; + } + } elseif (($this->majorversion == 3) || ($this->majorversion == 4)) { + if ($this->IsValidMIMEstring($imageformat)) { + return true; + } + } + return false; + } + + function ID3v2IsValidCOMRreceivedAs($receivedas) { + if (($this->majorversion >= 3) && ($receivedas >= 0) && ($receivedas <= 8)) { + return true; + } + return false; + } + + function ID3v2IsValidRGADname($RGADname) { + if (($RGADname >= 0) && ($RGADname <= 2)) { + return true; + } + return false; + } + + function ID3v2IsValidRGADoriginator($RGADoriginator) { + if (($RGADoriginator >= 0) && ($RGADoriginator <= 3)) { + return true; + } + return false; + } + + function ID3v2IsValidTextEncoding($textencodingbyte) { + static $ID3v2IsValidTextEncoding_cache = array( + 2 => array(true, true), + 3 => array(true, true), + 4 => array(true, true, true, true)); + return isset($ID3v2IsValidTextEncoding_cache[$this->majorversion][$textencodingbyte]); + } + + function Unsynchronise($data) { + // Whenever a false synchronisation is found within the tag, one zeroed + // byte is inserted after the first false synchronisation byte. The + // format of a correct sync that should be altered by ID3 encoders is as + // follows: + // %11111111 111xxxxx + // And should be replaced with: + // %11111111 00000000 111xxxxx + // This has the side effect that all $FF 00 combinations have to be + // altered, so they won't be affected by the decoding process. Therefore + // all the $FF 00 combinations have to be replaced with the $FF 00 00 + // combination during the unsynchronisation. + + $data = str_replace("\xFF\x00", "\xFF\x00\x00", $data); + $unsyncheddata = ''; + $datalength = strlen($data); + for ($i = 0; $i < $datalength; $i++) { + $thischar = $data{$i}; + $unsyncheddata .= $thischar; + if ($thischar == "\xFF") { + $nextchar = ord($data{$i + 1}); + if (($nextchar & 0xE0) == 0xE0) { + // previous byte = 11111111, this byte = 111????? + $unsyncheddata .= "\x00"; + } + } + } + return $unsyncheddata; + } + + function is_hash($var) { + // written by dev-nullchristophe*vg + // taken from http://www.php.net/manual/en/function.array-merge-recursive.php + if (is_array($var)) { + $keys = array_keys($var); + $all_num = true; + for ($i = 0; $i < count($keys); $i++) { + if (is_string($keys[$i])) { + return true; + } + } + } + return false; + } + + function array_join_merge($arr1, $arr2) { + // written by dev-nullchristophe*vg + // taken from http://www.php.net/manual/en/function.array-merge-recursive.php + if (is_array($arr1) && is_array($arr2)) { + // the same -> merge + $new_array = array(); + + if ($this->is_hash($arr1) && $this->is_hash($arr2)) { + // hashes -> merge based on keys + $keys = array_merge(array_keys($arr1), array_keys($arr2)); + foreach ($keys as $key) { + $new_array[$key] = $this->array_join_merge(@$arr1[$key], @$arr2[$key]); + } + } else { + // two real arrays -> merge + $new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2)))); + } + return $new_array; + } else { + // not the same ... take new one if defined, else the old one stays + return $arr2 ? $arr2 : $arr1; + } + } + + function IsValidMIMEstring($mimestring) { + if ((strlen($mimestring) >= 3) && (strpos($mimestring, '/') > 0) && (strpos($mimestring, '/') < (strlen($mimestring) - 1))) { + return true; + } + return false; + } + + function IsWithinBitRange($number, $maxbits, $signed=false) { + if ($signed) { + if (($number > (0 - pow(2, $maxbits - 1))) && ($number <= pow(2, $maxbits - 1))) { + return true; + } + } else { + if (($number >= 0) && ($number <= pow(2, $maxbits))) { + return true; + } + } + return false; + } + + function safe_parse_url($url) { + $parts = @parse_url($url); + $parts['scheme'] = (isset($parts['scheme']) ? $parts['scheme'] : ''); + $parts['host'] = (isset($parts['host']) ? $parts['host'] : ''); + $parts['user'] = (isset($parts['user']) ? $parts['user'] : ''); + $parts['pass'] = (isset($parts['pass']) ? $parts['pass'] : ''); + $parts['path'] = (isset($parts['path']) ? $parts['path'] : ''); + $parts['query'] = (isset($parts['query']) ? $parts['query'] : ''); + return $parts; + } + + function IsValidURL($url, $allowUserPass=false) { + if ($url == '') { + return false; + } + if ($allowUserPass !== true) { + if (strstr($url, '@')) { + // in the format http://user:pass@example.com or http://user@example.com + // but could easily be somebody incorrectly entering an email address in place of a URL + return false; + } + } + if ($parts = $this->safe_parse_url($url)) { + if (($parts['scheme'] != 'http') && ($parts['scheme'] != 'https') && ($parts['scheme'] != 'ftp') && ($parts['scheme'] != 'gopher')) { + return false; + } elseif (!eregi("^[[:alnum:]]([-.]?[0-9a-z])*\.[a-z]{2,3}$", $parts['host'], $regs) && !IsValidDottedIP($parts['host'])) { + return false; + } elseif (!eregi("^([[:alnum:]-]|[\_])*$", $parts['user'], $regs)) { + return false; + } elseif (!eregi("^([[:alnum:]-]|[\_])*$", $parts['pass'], $regs)) { + return false; + } elseif (!eregi("^[[:alnum:]/_\.@~-]*$", $parts['path'], $regs)) { + return false; + } elseif (!eregi("^[[:alnum:]?&=+:;_()%#/,\.-]*$", $parts['query'], $regs)) { + return false; + } else { + return true; + } + } + return false; + } + + function ID3v2ShortFrameNameLookup($majorversion, $long_description) { + $long_description = str_replace(' ', '_', strtolower(trim($long_description))); + static $ID3v2ShortFrameNameLookup = array(); + if (empty($ID3v2ShortFrameNameLookup)) { + + // The following are unique to ID3v2.2 + $ID3v2ShortFrameNameLookup[2]['comment'] = 'COM'; + $ID3v2ShortFrameNameLookup[2]['album'] = 'TAL'; + $ID3v2ShortFrameNameLookup[2]['beats_per_minute'] = 'TBP'; + $ID3v2ShortFrameNameLookup[2]['composer'] = 'TCM'; + $ID3v2ShortFrameNameLookup[2]['genre'] = 'TCO'; + $ID3v2ShortFrameNameLookup[2]['copyright'] = 'TCR'; + $ID3v2ShortFrameNameLookup[2]['encoded_by'] = 'TEN'; + $ID3v2ShortFrameNameLookup[2]['language'] = 'TLA'; + $ID3v2ShortFrameNameLookup[2]['length'] = 'TLE'; + $ID3v2ShortFrameNameLookup[2]['original_artist'] = 'TOA'; + $ID3v2ShortFrameNameLookup[2]['original_filename'] = 'TOF'; + $ID3v2ShortFrameNameLookup[2]['original_lyricist'] = 'TOL'; + $ID3v2ShortFrameNameLookup[2]['original_album_title'] = 'TOT'; + $ID3v2ShortFrameNameLookup[2]['artist'] = 'TP1'; + $ID3v2ShortFrameNameLookup[2]['band'] = 'TP2'; + $ID3v2ShortFrameNameLookup[2]['conductor'] = 'TP3'; + $ID3v2ShortFrameNameLookup[2]['remixer'] = 'TP4'; + $ID3v2ShortFrameNameLookup[2]['publisher'] = 'TPB'; + $ID3v2ShortFrameNameLookup[2]['isrc'] = 'TRC'; + $ID3v2ShortFrameNameLookup[2]['tracknumber'] = 'TRK'; + $ID3v2ShortFrameNameLookup[2]['size'] = 'TSI'; + $ID3v2ShortFrameNameLookup[2]['encoder_settings'] = 'TSS'; + $ID3v2ShortFrameNameLookup[2]['description'] = 'TT1'; + $ID3v2ShortFrameNameLookup[2]['title'] = 'TT2'; + $ID3v2ShortFrameNameLookup[2]['subtitle'] = 'TT3'; + $ID3v2ShortFrameNameLookup[2]['lyricist'] = 'TXT'; + $ID3v2ShortFrameNameLookup[2]['user_text'] = 'TXX'; + $ID3v2ShortFrameNameLookup[2]['year'] = 'TYE'; + $ID3v2ShortFrameNameLookup[2]['unique_file_identifier'] = 'UFI'; + $ID3v2ShortFrameNameLookup[2]['unsynchronised_lyrics'] = 'ULT'; + $ID3v2ShortFrameNameLookup[2]['url_file'] = 'WAF'; + $ID3v2ShortFrameNameLookup[2]['url_artist'] = 'WAR'; + $ID3v2ShortFrameNameLookup[2]['url_source'] = 'WAS'; + $ID3v2ShortFrameNameLookup[2]['copyright_information'] = 'WCP'; + $ID3v2ShortFrameNameLookup[2]['url_publisher'] = 'WPB'; + $ID3v2ShortFrameNameLookup[2]['url_user'] = 'WXX'; + + // The following are common to ID3v2.3 and ID3v2.4 + $ID3v2ShortFrameNameLookup[3]['audio_encryption'] = 'AENC'; + $ID3v2ShortFrameNameLookup[3]['attached_picture'] = 'APIC'; + $ID3v2ShortFrameNameLookup[3]['comment'] = 'COMM'; + $ID3v2ShortFrameNameLookup[3]['commercial'] = 'COMR'; + $ID3v2ShortFrameNameLookup[3]['encryption_method_registration'] = 'ENCR'; + $ID3v2ShortFrameNameLookup[3]['event_timing_codes'] = 'ETCO'; + $ID3v2ShortFrameNameLookup[3]['general_encapsulated_object'] = 'GEOB'; + $ID3v2ShortFrameNameLookup[3]['group_identification_registration'] = 'GRID'; + $ID3v2ShortFrameNameLookup[3]['linked_information'] = 'LINK'; + $ID3v2ShortFrameNameLookup[3]['music_cd_identifier'] = 'MCDI'; + $ID3v2ShortFrameNameLookup[3]['mpeg_location_lookup_table'] = 'MLLT'; + $ID3v2ShortFrameNameLookup[3]['ownership'] = 'OWNE'; + $ID3v2ShortFrameNameLookup[3]['play_counter'] = 'PCNT'; + $ID3v2ShortFrameNameLookup[3]['popularimeter'] = 'POPM'; + $ID3v2ShortFrameNameLookup[3]['position_synchronisation'] = 'POSS'; + $ID3v2ShortFrameNameLookup[3]['private'] = 'PRIV'; + $ID3v2ShortFrameNameLookup[3]['recommended_buffer_size'] = 'RBUF'; + $ID3v2ShortFrameNameLookup[3]['reverb'] = 'RVRB'; + $ID3v2ShortFrameNameLookup[3]['synchronised_lyrics'] = 'SYLT'; + $ID3v2ShortFrameNameLookup[3]['synchronised_tempo_codes'] = 'SYTC'; + $ID3v2ShortFrameNameLookup[3]['album'] = 'TALB'; + $ID3v2ShortFrameNameLookup[3]['beats_per_minute'] = 'TBPM'; + $ID3v2ShortFrameNameLookup[3]['composer'] = 'TCOM'; + $ID3v2ShortFrameNameLookup[3]['genre'] = 'TCON'; + $ID3v2ShortFrameNameLookup[3]['copyright'] = 'TCOP'; + $ID3v2ShortFrameNameLookup[3]['playlist_delay'] = 'TDLY'; + $ID3v2ShortFrameNameLookup[3]['encoded_by'] = 'TENC'; + $ID3v2ShortFrameNameLookup[3]['lyricist'] = 'TEXT'; + $ID3v2ShortFrameNameLookup[3]['file_type'] = 'TFLT'; + $ID3v2ShortFrameNameLookup[3]['content_group_description'] = 'TIT1'; + $ID3v2ShortFrameNameLookup[3]['title'] = 'TIT2'; + $ID3v2ShortFrameNameLookup[3]['subtitle'] = 'TIT3'; + $ID3v2ShortFrameNameLookup[3]['initial_key'] = 'TKEY'; + $ID3v2ShortFrameNameLookup[3]['language'] = 'TLAN'; + $ID3v2ShortFrameNameLookup[3]['length'] = 'TLEN'; + $ID3v2ShortFrameNameLookup[3]['media_type'] = 'TMED'; + $ID3v2ShortFrameNameLookup[3]['original_album_title'] = 'TOAL'; + $ID3v2ShortFrameNameLookup[3]['original_filename'] = 'TOFN'; + $ID3v2ShortFrameNameLookup[3]['original_lyricist'] = 'TOLY'; + $ID3v2ShortFrameNameLookup[3]['original_artist'] = 'TOPE'; + $ID3v2ShortFrameNameLookup[3]['file_owner'] = 'TOWN'; + $ID3v2ShortFrameNameLookup[3]['artist'] = 'TPE1'; + $ID3v2ShortFrameNameLookup[3]['band'] = 'TPE2'; + $ID3v2ShortFrameNameLookup[3]['conductor'] = 'TPE3'; + $ID3v2ShortFrameNameLookup[3]['remixer'] = 'TPE4'; + $ID3v2ShortFrameNameLookup[3]['part_of_set'] = 'TPOS'; + $ID3v2ShortFrameNameLookup[3]['publisher'] = 'TPUB'; + $ID3v2ShortFrameNameLookup[3]['tracknumber'] = 'TRCK'; + $ID3v2ShortFrameNameLookup[3]['internet_radio_station_name'] = 'TRSN'; + $ID3v2ShortFrameNameLookup[3]['internet_radio_station_owner'] = 'TRSO'; + $ID3v2ShortFrameNameLookup[3]['isrc'] = 'TSRC'; + $ID3v2ShortFrameNameLookup[3]['encoder_settings'] = 'TSSE'; + $ID3v2ShortFrameNameLookup[3]['user_text'] = 'TXXX'; + $ID3v2ShortFrameNameLookup[3]['unique_file_identifier'] = 'UFID'; + $ID3v2ShortFrameNameLookup[3]['terms_of_use'] = 'USER'; + $ID3v2ShortFrameNameLookup[3]['unsynchronised_lyrics'] = 'USLT'; + $ID3v2ShortFrameNameLookup[3]['commercial'] = 'WCOM'; + $ID3v2ShortFrameNameLookup[3]['copyright_information'] = 'WCOP'; + $ID3v2ShortFrameNameLookup[3]['url_file'] = 'WOAF'; + $ID3v2ShortFrameNameLookup[3]['url_artist'] = 'WOAR'; + $ID3v2ShortFrameNameLookup[3]['url_source'] = 'WOAS'; + $ID3v2ShortFrameNameLookup[3]['url_station'] = 'WORS'; + $ID3v2ShortFrameNameLookup[3]['payment'] = 'WPAY'; + $ID3v2ShortFrameNameLookup[3]['url_publisher'] = 'WPUB'; + $ID3v2ShortFrameNameLookup[3]['url_user'] = 'WXXX'; + + // The above are common to ID3v2.3 and ID3v2.4 + // so copy them to ID3v2.4 before adding specifics for 2.3 and 2.4 + $ID3v2ShortFrameNameLookup[4] = $ID3v2ShortFrameNameLookup[3]; + + // The following are unique to ID3v2.3 + $ID3v2ShortFrameNameLookup[3]['equalisation'] = 'EQUA'; + $ID3v2ShortFrameNameLookup[3]['involved_people_list'] = 'IPLS'; + $ID3v2ShortFrameNameLookup[3]['relative_volume_adjustment'] = 'RVAD'; + $ID3v2ShortFrameNameLookup[3]['date'] = 'TDAT'; + $ID3v2ShortFrameNameLookup[3]['time'] = 'TIME'; + $ID3v2ShortFrameNameLookup[3]['original_release_year'] = 'TORY'; + $ID3v2ShortFrameNameLookup[3]['recording_dates'] = 'TRDA'; + $ID3v2ShortFrameNameLookup[3]['size'] = 'TSIZ'; + $ID3v2ShortFrameNameLookup[3]['year'] = 'TYER'; + + + // The following are unique to ID3v2.4 + $ID3v2ShortFrameNameLookup[4]['audio_seek_point_index'] = 'ASPI'; + $ID3v2ShortFrameNameLookup[4]['equalisation'] = 'EQU2'; + $ID3v2ShortFrameNameLookup[4]['relative_volume_adjustment'] = 'RVA2'; + $ID3v2ShortFrameNameLookup[4]['seek'] = 'SEEK'; + $ID3v2ShortFrameNameLookup[4]['signature'] = 'SIGN'; + $ID3v2ShortFrameNameLookup[4]['encoding_time'] = 'TDEN'; + $ID3v2ShortFrameNameLookup[4]['original_release_time'] = 'TDOR'; + $ID3v2ShortFrameNameLookup[4]['recording_time'] = 'TDRC'; + $ID3v2ShortFrameNameLookup[4]['release_time'] = 'TDRL'; + $ID3v2ShortFrameNameLookup[4]['tagging_time'] = 'TDTG'; + $ID3v2ShortFrameNameLookup[4]['involved_people_list'] = 'TIPL'; + $ID3v2ShortFrameNameLookup[4]['musician_credits_list'] = 'TMCL'; + $ID3v2ShortFrameNameLookup[4]['mood'] = 'TMOO'; + $ID3v2ShortFrameNameLookup[4]['produced_notice'] = 'TPRO'; + $ID3v2ShortFrameNameLookup[4]['album_sort_order'] = 'TSOA'; + $ID3v2ShortFrameNameLookup[4]['performer_sort_order'] = 'TSOP'; + $ID3v2ShortFrameNameLookup[4]['title_sort_order'] = 'TSOT'; + $ID3v2ShortFrameNameLookup[4]['set_subtitle'] = 'TSST'; + } + return @$ID3v2ShortFrameNameLookup[$majorversion][strtolower($long_description)]; + + } + +} + +?> diff --git a/campcaster/src/modules/getid3/var/write.lyrics3.php b/campcaster/src/modules/getid3/var/write.lyrics3.php new file mode 100644 index 000000000..6b8a47d6a --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.lyrics3.php @@ -0,0 +1,78 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// write.lyrics3.php // +// module for writing Lyrics3 tags // +// dependencies: module.tag.lyrics3.php // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_write_lyrics3 +{ + var $filename; + var $tag_data; + //var $lyrics3_version = 2; // 1 or 2 + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + + function getid3_write_lyrics3() { + return true; + } + + function WriteLyrics3() { + $this->errors[] = 'WriteLyrics3() not yet functional - cannot write Lyrics3'; + return false; + } + + function DeleteLyrics3() { + // Initialize getID3 engine + $getID3 = new getID3; + $ThisFileInfo = $getID3->analyze($this->filename); + if (isset($ThisFileInfo['lyrics3']['tag_offset_start']) && isset($ThisFileInfo['lyrics3']['tag_offset_end'])) { + if ($fp = @fopen($this->filename, 'a+b')) { + + flock($fp, LOCK_EX); + $oldignoreuserabort = ignore_user_abort(true); + + fseek($fp, $ThisFileInfo['lyrics3']['tag_offset_end'], SEEK_SET); + $DataAfterLyrics3 = ''; + if ($ThisFileInfo['filesize'] > $ThisFileInfo['lyrics3']['tag_offset_end']) { + $DataAfterLyrics3 = fread($fp, $ThisFileInfo['filesize'] - $ThisFileInfo['lyrics3']['tag_offset_end']); + } + + ftruncate($fp, $ThisFileInfo['lyrics3']['tag_offset_start']); + + if (!empty($DataAfterLyrics3)) { + fseek($fp, $ThisFileInfo['lyrics3']['tag_offset_start'], SEEK_SET); + fwrite($fp, $DataAfterLyrics3, strlen($DataAfterLyrics3)); + } + + flock($fp, LOCK_UN); + fclose($fp); + ignore_user_abort($oldignoreuserabort); + + return true; + + } else { + + $this->errors[] = 'Cannot open "'.$this->filename.'" in "a+b" mode'; + return false; + + } + } + // no Lyrics3 present + return true; + } + + + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/write.metaflac.php b/campcaster/src/modules/getid3/var/write.metaflac.php new file mode 100644 index 000000000..c5acc8ce3 --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.metaflac.php @@ -0,0 +1,167 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// write.metaflac.php // +// module for writing metaflac tags // +// dependencies: /helperapps/metaflac.exe // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_write_metaflac +{ + + var $filename; + var $tag_data; + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + + function getid3_write_metaflac() { + return true; + } + + function WriteMetaFLAC() { + + if (!ini_get('safe_mode')) { + + // Create file with new comments + $tempcommentsfilename = tempnam('*', 'getID3'); + if ($fpcomments = @fopen($tempcommentsfilename, 'wb')) { + + foreach ($this->tag_data as $key => $value) { + foreach ($value as $commentdata) { + fwrite($fpcomments, $this->CleanmetaflacName($key).'='.$commentdata."\n"); + } + } + fclose($fpcomments); + + } else { + + $this->errors[] = 'failed to open temporary tags file "'.$tempcommentsfilename.'", tags not written'; + return false; + + } + + $oldignoreuserabort = ignore_user_abort(true); + if (GETID3_OS_ISWINDOWS) { + + if (file_exists(GETID3_HELPERAPPSDIR.'metaflac.exe')) { + //$commandline = '"'.GETID3_HELPERAPPSDIR.'metaflac.exe" --no-utf8-convert --remove-vc-all --import-vc-from="'.$tempcommentsfilename.'" "'.str_replace('/', '\\', $this->filename).'"'; + // metaflac works fine if you copy-paste the above commandline into a command prompt, + // but refuses to work with `backtick` if there are "doublequotes" present around BOTH + // the metaflac pathname and the target filename. For whatever reason...?? + // The solution is simply ensure that the metaflac pathname has no spaces, + // and therefore does not need to be quoted + + // On top of that, if error messages are not always captured properly under Windows + // To at least see if there was a problem, compare file modification timestamps before and after writing + clearstatcache(); + $timestampbeforewriting = filemtime($this->filename); + + $commandline = GETID3_HELPERAPPSDIR.'metaflac.exe --no-utf8-convert --remove-vc-all --import-vc-from="'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1'; + $metaflacError = `$commandline`; + + if (empty($metaflacError)) { + clearstatcache(); + if ($timestampbeforewriting == filemtime($this->filename)) { + $metaflacError = 'File modification timestamp has not changed - it looks like the tags were not written'; + } + } + } else { + $metaflacError = 'metaflac.exe not found in '.GETID3_HELPERAPPSDIR; + } + + } else { + + // It's simpler on *nix + $commandline = 'metaflac --no-utf8-convert --remove-vc-all --import-vc-from='.$tempcommentsfilename.' "'.$this->filename.'" 2>&1'; + $metaflacError = `$commandline`; + + } + + // Remove temporary comments file + unlink($tempcommentsfilename); + ignore_user_abort($oldignoreuserabort); + + if (!empty($metaflacError)) { + + $this->errors[] = 'System call to metaflac failed with this message returned: '."\n\n".$metaflacError; + return false; + + } + + return true; + } + + $this->errors[] = 'PHP running in Safe Mode (backtick operator not available) - cannot call metaflac, tags not written'; + return false; + } + + + function DeleteMetaFLAC() { + + if (!ini_get('safe_mode')) { + + $oldignoreuserabort = ignore_user_abort(true); + if (GETID3_OS_ISWINDOWS) { + + if (file_exists(GETID3_HELPERAPPSDIR.'metaflac.exe')) { + // To at least see if there was a problem, compare file modification timestamps before and after writing + clearstatcache(); + $timestampbeforewriting = filemtime($this->filename); + + $commandline = GETID3_HELPERAPPSDIR.'metaflac.exe --remove-vc-all "'.$this->filename.'" 2>&1'; + $metaflacError = `$commandline`; + + if (empty($metaflacError)) { + clearstatcache(); + if ($timestampbeforewriting == filemtime($this->filename)) { + $metaflacError = 'File modification timestamp has not changed - it looks like the tags were not deleted'; + } + } + } else { + $metaflacError = 'metaflac.exe not found in '.GETID3_HELPERAPPSDIR; + } + + } else { + + // It's simpler on *nix + $commandline = 'metaflac --remove-vc-all "'.$this->filename.'" 2>&1'; + $metaflacError = `$commandline`; + + } + + ignore_user_abort($oldignoreuserabort); + + if (!empty($metaflacError)) { + $this->errors[] = 'System call to metaflac failed with this message returned: '."\n\n".$metaflacError; + return false; + } + return true; + } + $this->errors[] = 'PHP running in Safe Mode (backtick operator not available) - cannot call metaflac, tags not deleted'; + return false; + } + + + function CleanmetaflacName($originalcommentname) { + // A case-insensitive field name that may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded. + // ASCII 0x41 through 0x5A inclusive (A-Z) is to be considered equivalent to ASCII 0x61 through + // 0x7A inclusive (a-z). + + // replace invalid chars with a space, return uppercase text + // Thanks Chris Bolt for improving this function + // note: ereg_replace() replaces nulls with empty string (not space) + return strtoupper(ereg_replace('[^ -<>-}]', ' ', str_replace("\x00", ' ', $originalcommentname))); + + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/write.php b/campcaster/src/modules/getid3/var/write.php new file mode 100644 index 000000000..73e261036 --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.php @@ -0,0 +1,592 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +/// // +// write.php // +// module for writing tags (APEv2, ID3v1, ID3v2) // +// dependencies: getid3.lib.php // +// write.apetag.php (optional) // +// write.id3v1.php (optional) // +// write.id3v2.php (optional) // +// write.vorbiscomment.php (optional) // +// write.metaflac.php (optional) // +// write.lyrics3.php (optional) // +// /// +///////////////////////////////////////////////////////////////// + +if (!defined('GETID3_INCLUDEPATH')) { + die('getid3.php MUST be included before calling getid3_writetags'); +} +if (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) { + die('write.php depends on getid3.lib.php, which is missing.'); +} + + +// NOTES: +// +// You should pass data here with standard field names as follows: +// * TITLE +// * ARTIST +// * ALBUM +// * TRACKNUMBER +// * COMMENT +// * GENRE +// * YEAR +// * ATTACHED_PICTURE (ID3v2 only) +// +// http://www.personal.uni-jena.de/~pfk/mpp/sv8/apekey.html +// The APEv2 Tag Items Keys definition says "TRACK" is correct but foobar2000 uses "TRACKNUMBER" instead +// Pass data here as "TRACKNUMBER" for compatability with all formats + + +class getid3_writetags +{ + // public + var $filename; // absolute filename of file to write tags to + var $tagformats = array(); // array of tag formats to write ('id3v1', 'id3v2.2', 'id2v2.3', 'id3v2.4', 'ape', 'vorbiscomment', 'metaflac', 'real') + var $tag_data = array(array()); // 2-dimensional array of tag data (ex: $data['ARTIST'][0] = 'Elvis') + var $tag_encoding = 'ISO-8859-1'; // text encoding used for tag data ('ISO-8859-1', 'UTF-8', 'UTF-16', 'UTF-16LE', 'UTF-16BE', ) + var $overwrite_tags = true; // if true will erase existing tag data and write only passed data; if false will merge passed data with existing tag data + var $remove_other_tags = false; // if true will erase remove all existing tags and only write those passed in $tagformats; if false will ignore any tags not mentioned in $tagformats + + var $id3v2_tag_language = 'eng'; // ISO-639-2 3-character language code needed for some ID3v2 frames (http://www.id3.org/iso639-2.html) + var $id3v2_paddedlength = 4096; // minimum length of ID3v2 tags (will be padded to this length if tag data is shorter) + + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + + // private + var $ThisFileInfo; // analysis of file before writing + + function getid3_writetags() { + return true; + } + + + function WriteTags() { + + if (empty($this->filename)) { + $this->errors[] = 'filename is undefined in getid3_writetags'; + return false; + } elseif (!file_exists($this->filename)) { + $this->errors[] = 'filename set to non-existant file "'.$this->filename.'" in getid3_writetags'; + return false; + } + + if (!is_array($this->tagformats)) { + $this->errors[] = 'tagformats must be an array in getid3_writetags'; + return false; + } + + $TagFormatsToRemove = array(); + if (filesize($this->filename) == 0) { + + // empty file special case - allow any tag format, don't check existing format + // could be useful if you want to generate tag data for a non-existant file + $this->ThisFileInfo = array('fileformat'=>''); + $AllowedTagFormats = array('id3v1', 'id3v2.2', 'id3v2.3', 'id3v2.4', 'ape', 'lyrics3'); + + } else { + + $getID3 = new getID3; + $getID3->encoding = $this->tag_encoding; + $this->ThisFileInfo = $getID3->analyze($this->filename); + + // check for what file types are allowed on this fileformat + switch (@$this->ThisFileInfo['fileformat']) { + case 'mp3': + case 'mp2': + case 'mp1': + case 'riff': // maybe not officially, but people do it anyway + $AllowedTagFormats = array('id3v1', 'id3v2.2', 'id3v2.3', 'id3v2.4', 'ape', 'lyrics3'); + break; + + case 'mpc': + $AllowedTagFormats = array('ape'); + break; + + case 'flac': + $AllowedTagFormats = array('metaflac'); + break; + + case 'real': + $AllowedTagFormats = array('real'); + break; + + case 'ogg': + switch (@$this->ThisFileInfo['audio']['dataformat']) { + case 'flac': + //$AllowedTagFormats = array('metaflac'); + $this->errors[] = 'metaflac is not (yet) compatible with OggFLAC files'; + return false; + break; + case 'vorbis': + $AllowedTagFormats = array('vorbiscomment'); + break; + default: + $this->errors[] = 'metaflac is not (yet) compatible with Ogg files other than OggVorbis'; + return false; + break; + } + break; + + default: + $AllowedTagFormats = array(); + break; + } + foreach ($this->tagformats as $requested_tag_format) { + if (!in_array($requested_tag_format, $AllowedTagFormats)) { + $errormessage = 'Tag format "'.$requested_tag_format.'" is not allowed on "'.@$this->ThisFileInfo['fileformat']; + if (@$this->ThisFileInfo['fileformat'] != @$this->ThisFileInfo['audio']['dataformat']) { + $errormessage .= '.'.@$this->ThisFileInfo['audio']['dataformat']; + } + $errormessage .= '" files'; + $this->errors[] = $errormessage; + return false; + } + } + + // List of other tag formats, removed if requested + if ($this->remove_other_tags) { + foreach ($AllowedTagFormats as $AllowedTagFormat) { + switch ($AllowedTagFormat) { + case 'id3v2.2': + case 'id3v2.3': + case 'id3v2.4': + if (!in_array('id3v2', $TagFormatsToRemove) && !in_array('id3v2.2', $this->tagformats) && !in_array('id3v2.3', $this->tagformats) && !in_array('id3v2.4', $this->tagformats)) { + $TagFormatsToRemove[] = 'id3v2'; + } + break; + + default: + if (!in_array($AllowedTagFormat, $this->tagformats)) { + $TagFormatsToRemove[] = $AllowedTagFormat; + } + break; + } + } + } + } + + $WritingFilesToInclude = array_merge($this->tagformats, $TagFormatsToRemove); + + // Check for required include files and include them + foreach ($WritingFilesToInclude as $tagformat) { + switch ($tagformat) { + case 'ape': + $GETID3_ERRORARRAY = &$this->errors; + if (!getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.apetag.php', __FILE__, false)) { + return false; + } + break; + + case 'id3v1': + case 'lyrics3': + case 'vorbiscomment': + case 'metaflac': + case 'real': + $GETID3_ERRORARRAY = &$this->errors; + if (!getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.'.$tagformat.'.php', __FILE__, false)) { + return false; + } + break; + + case 'id3v2.2': + case 'id3v2.3': + case 'id3v2.4': + case 'id3v2': + $GETID3_ERRORARRAY = &$this->errors; + if (!getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.id3v2.php', __FILE__, false)) { + return false; + } + break; + + default: + $this->errors[] = 'unknown tag format "'.$tagformat.'" in $tagformats in WriteTags()'; + return false; + break; + } + + } + + // Validation of supplied data + if (!is_array($this->tag_data)) { + $this->errors[] = '$tag_data is not an array in WriteTags()'; + return false; + } + // convert supplied data array keys to upper case, if they're not already + foreach ($this->tag_data as $tag_key => $tag_array) { + if (strtoupper($tag_key) !== $tag_key) { + $this->tag_data[strtoupper($tag_key)] = $this->tag_data[$tag_key]; + unset($this->tag_data[$tag_key]); + } + } + // convert source data array keys to upper case, if they're not already + if (!empty($this->ThisFileInfo['tags'])) { + foreach ($this->ThisFileInfo['tags'] as $tag_format => $tag_data_array) { + foreach ($tag_data_array as $tag_key => $tag_array) { + if (strtoupper($tag_key) !== $tag_key) { + $this->ThisFileInfo['tags'][$tag_format][strtoupper($tag_key)] = $this->ThisFileInfo['tags'][$tag_format][$tag_key]; + unset($this->ThisFileInfo['tags'][$tag_format][$tag_key]); + } + } + } + } + + // Convert "TRACK" to "TRACKNUMBER" (if needed) for compatability with all formats + if (isset($this->tag_data['TRACK']) && !isset($this->tag_data['TRACKNUMBER'])) { + $this->tag_data['TRACKNUMBER'] = $this->tag_data['TRACK']; + unset($this->tag_data['TRACK']); + } + + // Remove all other tag formats, if requested + if ($this->remove_other_tags) { + $this->DeleteTags($TagFormatsToRemove); + } + + // Write data for each tag format + foreach ($this->tagformats as $tagformat) { + $success = false; // overridden if tag writing is successful + switch ($tagformat) { + case 'ape': + $ape_writer = new getid3_write_apetag; + if (($ape_writer->tag_data = $this->FormatDataForAPE()) !== false) { + $ape_writer->filename = $this->filename; + if (($success = $ape_writer->WriteAPEtag()) === false) { + $this->errors[] = 'WriteAPEtag() failed with message(s):
    • '.trim(implode('
    • ', $ape_writer->errors)).'
    '; + } + } else { + $this->errors[] = 'FormatDataForAPE() failed'; + } + break; + + case 'id3v1': + $id3v1_writer = new getid3_write_id3v1; + if (($id3v1_writer->tag_data = $this->FormatDataForID3v1()) !== false) { + $id3v1_writer->filename = $this->filename; + if (($success = $id3v1_writer->WriteID3v1()) === false) { + $this->errors[] = 'WriteID3v1() failed with message(s):
    • '.trim(implode('
    • ', $id3v1_writer->errors)).'
    '; + } + } else { + $this->errors[] = 'FormatDataForID3v1() failed'; + } + break; + + case 'id3v2.2': + case 'id3v2.3': + case 'id3v2.4': + $id3v2_writer = new getid3_write_id3v2; + $id3v2_writer->majorversion = intval(substr($tagformat, -1)); + $id3v2_writer->paddedlength = $this->id3v2_paddedlength; + if (($id3v2_writer->tag_data = $this->FormatDataForID3v2($id3v2_writer->majorversion)) !== false) { + $id3v2_writer->filename = $this->filename; + if (($success = $id3v2_writer->WriteID3v2()) === false) { + $this->errors[] = 'WriteID3v2() failed with message(s):
    • '.trim(implode('
    • ', $id3v2_writer->errors)).'
    '; + } + } else { + $this->errors[] = 'FormatDataForID3v2() failed'; + } + break; + + case 'vorbiscomment': + $vorbiscomment_writer = new getid3_write_vorbiscomment; + if (($vorbiscomment_writer->tag_data = $this->FormatDataForVorbisComment()) !== false) { + $vorbiscomment_writer->filename = $this->filename; + if (($success = $vorbiscomment_writer->WriteVorbisComment()) === false) { + $this->errors[] = 'WriteVorbisComment() failed with message(s):
    • '.trim(implode('
    • ', $vorbiscomment_writer->errors)).'
    '; + } + } else { + $this->errors[] = 'FormatDataForVorbisComment() failed'; + } + break; + + case 'metaflac': + $metaflac_writer = new getid3_write_metaflac; + if (($metaflac_writer->tag_data = $this->FormatDataForMetaFLAC()) !== false) { + $metaflac_writer->filename = $this->filename; + if (($success = $metaflac_writer->WriteMetaFLAC()) === false) { + $this->errors[] = 'WriteMetaFLAC() failed with message(s):
    • '.trim(implode('
    • ', $metaflac_writer->errors)).'
    '; + } + } else { + $this->errors[] = 'FormatDataForMetaFLAC() failed'; + } + break; + + case 'real': + $real_writer = new getid3_write_real; + if (($real_writer->tag_data = $this->FormatDataForReal()) !== false) { + $real_writer->filename = $this->filename; + if (($success = $real_writer->WriteReal()) === false) { + $this->errors[] = 'WriteReal() failed with message(s):
    • '.trim(implode('
    • ', $real_writer->errors)).'
    '; + } + } else { + $this->errors[] = 'FormatDataForReal() failed'; + } + break; + + default: + $this->errors[] = 'Invalid tag format to write: "'.$tagformat.'"'; + return false; + break; + } + if (!$success) { + return false; + } + } + return true; + + } + + + function DeleteTags($TagFormatsToDelete) { + foreach ($TagFormatsToDelete as $DeleteTagFormat) { + $success = false; // overridden if tag deletion is successful + switch ($DeleteTagFormat) { + case 'id3v1': + $id3v1_writer = new getid3_write_id3v1; + $id3v1_writer->filename = $this->filename; + if (($success = $id3v1_writer->RemoveID3v1()) === false) { + $this->errors[] = 'RemoveID3v1() failed with message(s):
    • '.trim(implode('
    • ', $id3v1_writer->errors)).'
    '; + } + break; + + case 'id3v2': + $id3v2_writer = new getid3_write_id3v2; + $id3v2_writer->filename = $this->filename; + if (($success = $id3v2_writer->RemoveID3v2()) === false) { + $this->errors[] = 'RemoveID3v2() failed with message(s):
    • '.trim(implode('
    • ', $id3v2_writer->errors)).'
    '; + } + break; + + case 'ape': + $ape_writer = new getid3_write_apetag; + $ape_writer->filename = $this->filename; + if (($success = $ape_writer->DeleteAPEtag()) === false) { + $this->errors[] = 'DeleteAPEtag() failed with message(s):
    • '.trim(implode('
    • ', $ape_writer->errors)).'
    '; + } + break; + + case 'vorbiscomment': + $vorbiscomment_writer = new getid3_write_vorbiscomment; + $vorbiscomment_writer->filename = $this->filename; + if (($success = $vorbiscomment_writer->DeleteVorbisComment()) === false) { + $this->errors[] = 'DeleteVorbisComment() failed with message(s):
    • '.trim(implode('
    • ', $vorbiscomment_writer->errors)).'
    '; + } + break; + + case 'metaflac': + $metaflac_writer = new getid3_write_metaflac; + $metaflac_writer->filename = $this->filename; + if (($success = $metaflac_writer->DeleteMetaFLAC()) === false) { + $this->errors[] = 'DeleteMetaFLAC() failed with message(s):
    • '.trim(implode('
    • ', $metaflac_writer->errors)).'
    '; + } + break; + + case 'lyrics3': + $lyrics3_writer = new getid3_write_lyrics3; + $lyrics3_writer->filename = $this->filename; + if (($success = $lyrics3_writer->DeleteLyrics3()) === false) { + $this->errors[] = 'DeleteLyrics3() failed with message(s):
    • '.trim(implode('
    • ', $lyrics3_writer->errors)).'
    '; + } + break; + + case 'real': + $real_writer = new getid3_write_real; + $real_writer->filename = $this->filename; + if (($success = $real_writer->RemoveReal()) === false) { + $this->errors[] = 'RemoveReal() failed with message(s):
    • '.trim(implode('
    • ', $real_writer->errors)).'
    '; + } + break; + + default: + $this->errors[] = 'Invalid tag format to delete: "'.$tagformat.'"'; + return false; + break; + } + if (!$success) { + return false; + } + } + return true; + } + + + function MergeExistingTagData($TagFormat, &$tag_data) { + // Merge supplied data with existing data, if requested + if ($this->overwrite_tags) { + // do nothing - ignore previous data + } else { + if (!isset($this->ThisFileInfo['tags'][$TagFormat])) { + return false; + } + $tag_data = array_merge_recursive($tag_data, $this->ThisFileInfo['tags'][$TagFormat]); + } + return true; + } + + function FormatDataForAPE() { + $ape_tag_data = array(); + foreach ($this->tag_data as $tag_key => $valuearray) { + switch ($tag_key) { + case 'ATTACHED_PICTURE': + // ATTACHED_PICTURE is ID3v2 only - ignore + $this->warnings[] = '$data['.$tag_key.'] is assumed to be ID3v2 APIC data - NOT written to APE tag'; + break; + + default: + foreach ($valuearray as $key => $value) { + if (is_string($value) || is_numeric($value)) { + $ape_tag_data[$tag_key][$key] = getid3_lib::iconv_fallback($this->tag_encoding, 'UTF-8', $value); + } else { + $this->warnings[] = '$data['.$tag_key.']['.$key.'] is not a string value - all of $data['.$tag_key.'] NOT written to APE tag'; + unset($ape_tag_data[$tag_key]); + break; + } + } + break; + } + } + $this->MergeExistingTagData('ape', $ape_tag_data); + return $ape_tag_data; + } + + + function FormatDataForID3v1() { + $tag_data_id3v1['genreid'] = 255; + if (!empty($this->tag_data['GENRE'])) { + foreach ($this->tag_data['GENRE'] as $key => $value) { + if (getid3_id3v1::LookupGenreID($value) !== false) { + $tag_data_id3v1['genreid'] = getid3_id3v1::LookupGenreID($value); + break; + } + } + } + + $tag_data_id3v1['title'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['TITLE'])); + $tag_data_id3v1['artist'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['ARTIST'])); + $tag_data_id3v1['album'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['ALBUM'])); + $tag_data_id3v1['year'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['YEAR'])); + $tag_data_id3v1['comment'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['COMMENT'])); + + $tag_data_id3v1['track'] = intval(getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['TRACKNUMBER']))); + if ($tag_data_id3v1['track'] <= 0) { + $tag_data_id3v1['track'] = ''; + } + + $this->MergeExistingTagData('id3v1', $tag_data_id3v1); + return $tag_data_id3v1; + } + + function FormatDataForID3v2($id3v2_majorversion) { + $tag_data_id3v2 = array(); + + $ID3v2_text_encoding_lookup[2] = array('ISO-8859-1'=>0, 'UTF-16'=>1); + $ID3v2_text_encoding_lookup[3] = array('ISO-8859-1'=>0, 'UTF-16'=>1); + $ID3v2_text_encoding_lookup[4] = array('ISO-8859-1'=>0, 'UTF-16'=>1, 'UTF-16BE'=>2, 'UTF-8'=>3); + foreach ($this->tag_data as $tag_key => $valuearray) { + $ID3v2_framename = getid3_write_id3v2::ID3v2ShortFrameNameLookup($id3v2_majorversion, $tag_key); + switch ($ID3v2_framename) { + case 'APIC': + foreach ($valuearray as $key => $apic_data_array) { + if (isset($apic_data_array['data']) && + isset($apic_data_array['picturetypeid']) && + isset($apic_data_array['description']) && + isset($apic_data_array['mime'])) { + $tag_data_id3v2['APIC'][] = $apic_data_array; + } else { + $this->errors[] = 'ID3v2 APIC data is not properly structured'; + return false; + } + } + break; + + case '': + $this->errors[] = 'ID3v2: Skipping "'.$tag_key.'" because cannot match it to a known ID3v2 frame type'; + // some other data type, don't know how to handle it, ignore it + break; + + default: + // most other (text) frames can be copied over as-is + foreach ($valuearray as $key => $value) { + if (isset($ID3v2_text_encoding_lookup[$id3v2_majorversion][$this->tag_encoding])) { + // source encoding is valid in ID3v2 - use it with no conversion + $tag_data_id3v2[$ID3v2_framename][$key]['encodingid'] = $ID3v2_text_encoding_lookup[$id3v2_majorversion][$this->tag_encoding]; + $tag_data_id3v2[$ID3v2_framename][$key]['data'] = $value; + } else { + // source encoding is NOT valid in ID3v2 - convert it to an ID3v2-valid encoding first + if ($id3v2_majorversion < 4) { + // convert data from other encoding to UTF-16 + $tag_data_id3v2[$ID3v2_framename][$key]['encodingid'] = 1; + $tag_data_id3v2[$ID3v2_framename][$key]['data'] = getid3_lib::iconv_fallback($this->tag_encoding, 'UTF-16', $value); + + } else { + // convert data from other encoding to UTF-8 + $tag_data_id3v2[$ID3v2_framename][$key]['encodingid'] = 3; + $tag_data_id3v2[$ID3v2_framename][$key]['data'] = getid3_lib::iconv_fallback($this->tag_encoding, 'UTF-8', $value); + } + } + + // These values are not needed for all frame types, but if they're not used no matter + $tag_data_id3v2[$ID3v2_framename][$key]['description'] = ''; + $tag_data_id3v2[$ID3v2_framename][$key]['language'] = $this->id3v2_tag_language; + } + break; + } + } + $this->MergeExistingTagData('id3v2', $tag_data_id3v2); + return $tag_data_id3v2; + } + + function FormatDataForVorbisComment() { + $tag_data_vorbiscomment = $this->tag_data; + + // check for multi-line comment values - split out to multiple comments if neccesary + // and convert data to UTF-8 strings + foreach ($tag_data_vorbiscomment as $tag_key => $valuearray) { + foreach ($valuearray as $key => $value) { + str_replace("\r", "\n", $value); + if (strstr($value, "\n")) { + unset($tag_data_vorbiscomment[$tag_key][$key]); + $multilineexploded = explode("\n", $value); + foreach ($multilineexploded as $newcomment) { + if (strlen(trim($newcomment)) > 0) { + $tag_data_vorbiscomment[$tag_key][] = getid3_lib::iconv_fallback($this->tag_encoding, 'UTF-8', $newcomment); + } + } + } elseif (is_string($value) || is_numeric($value)) { + $tag_data_vorbiscomment[$tag_key][$key] = getid3_lib::iconv_fallback($this->tag_encoding, 'UTF-8', $value); + } else { + $this->warnings[] = '$data['.$tag_key.']['.$key.'] is not a string value - all of $data['.$tag_key.'] NOT written to VorbisComment tag'; + unset($tag_data_vorbiscomment[$tag_key]); + break; + } + } + } + $this->MergeExistingTagData('vorbiscomment', $tag_data_vorbiscomment); + return $tag_data_vorbiscomment; + } + + function FormatDataForMetaFLAC() { + // FLAC & OggFLAC use VorbisComments same as OggVorbis + // but require metaflac to do the writing rather than vorbiscomment + return $this->FormatDataForVorbisComment(); + } + + function FormatDataForReal() { + $tag_data_real['title'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['TITLE'])); + $tag_data_real['artist'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['ARTIST'])); + $tag_data_real['copyright'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['COPYRIGHT'])); + $tag_data_real['comment'] = getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', @implode(' ', @$this->tag_data['COMMENT'])); + + $this->MergeExistingTagData('real', $tag_data_real); + return $tag_data_real; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/write.real.php b/campcaster/src/modules/getid3/var/write.real.php new file mode 100644 index 000000000..1e0240ccf --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.real.php @@ -0,0 +1,295 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// write.real.php // +// module for writing RealAudio/RealVideo tags // +// dependencies: module.tag.real.php // +// /// +///////////////////////////////////////////////////////////////// + +class getid3_write_real +{ + var $filename; + var $tag_data = array(); + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + var $paddedlength = 512; // minimum length of CONT tag in bytes + + function getid3_write_real() { + return true; + } + + function WriteReal() { + // File MUST be writeable - CHMOD(646) at least + if (is_writeable($this->filename)) { + if ($fp_source = @fopen($this->filename, 'r+b')) { + + // Initialize getID3 engine + $getID3 = new getID3; + $OldThisFileInfo = $getID3->analyze($this->filename); + if (empty($OldThisFileInfo['real']['chunks']) && !empty($OldThisFileInfo['real']['old_ra_header'])) { + $this->errors[] = 'Cannot write Real tags on old-style file format'; + fclose($fp_source); + return false; + } + + if (empty($OldThisFileInfo['real']['chunks'])) { + $this->errors[] = 'Cannot write Real tags because cannot find DATA chunk in file'; + fclose($fp_source); + return false; + } + foreach ($OldThisFileInfo['real']['chunks'] as $chunknumber => $chunkarray) { + $oldChunkInfo[$chunkarray['name']] = $chunkarray; + } + if (!empty($oldChunkInfo['CONT']['length'])) { + $this->paddedlength = max($oldChunkInfo['CONT']['length'], $this->paddedlength); + } + + $new_CONT_tag_data = $this->GenerateCONTchunk(); + $new_PROP_tag_data = $this->GeneratePROPchunk($OldThisFileInfo['real']['chunks'], $new_CONT_tag_data); + $new__RMF_tag_data = $this->GenerateRMFchunk($OldThisFileInfo['real']['chunks']); + + if (@$oldChunkInfo['.RMF']['length'] == strlen($new__RMF_tag_data)) { + fseek($fp_source, $oldChunkInfo['.RMF']['offset'], SEEK_SET); + fwrite($fp_source, $new__RMF_tag_data); + } else { + $this->errors[] = 'new .RMF tag ('.strlen($new__RMF_tag_data).' bytes) different length than old .RMF tag ('.$oldChunkInfo['.RMF']['length'].' bytes)'; + fclose($fp_source); + return false; + } + + if (@$oldChunkInfo['PROP']['length'] == strlen($new_PROP_tag_data)) { + fseek($fp_source, $oldChunkInfo['PROP']['offset'], SEEK_SET); + fwrite($fp_source, $new_PROP_tag_data); + } else { + $this->errors[] = 'new PROP tag ('.strlen($new_PROP_tag_data).' bytes) different length than old PROP tag ('.$oldChunkInfo['PROP']['length'].' bytes)'; + fclose($fp_source); + return false; + } + + if (@$oldChunkInfo['CONT']['length'] == strlen($new_CONT_tag_data)) { + + // new data length is same as old data length - just overwrite + fseek($fp_source, $oldChunkInfo['CONT']['offset'], SEEK_SET); + fwrite($fp_source, $new_CONT_tag_data); + fclose($fp_source); + return true; + + } else { + + if (empty($oldChunkInfo['CONT'])) { + // no existing CONT chunk + $BeforeOffset = $oldChunkInfo['DATA']['offset']; + $AfterOffset = $oldChunkInfo['DATA']['offset']; + } else { + // new data is longer than old data + $BeforeOffset = $oldChunkInfo['CONT']['offset']; + $AfterOffset = $oldChunkInfo['CONT']['offset'] + $oldChunkInfo['CONT']['length']; + } + if ($tempfilename = tempnam('*', 'getID3')) { + ob_start(); + if ($fp_temp = fopen($tempfilename, 'wb')) { + + rewind($fp_source); + fwrite($fp_temp, fread($fp_source, $BeforeOffset)); + fwrite($fp_temp, $new_CONT_tag_data); + fseek($fp_source, $AfterOffset, SEEK_SET); + while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) { + fwrite($fp_temp, $buffer, strlen($buffer)); + } + fclose($fp_temp); + + if (copy($tempfilename, $this->filename)) { + unlink($tempfilename); + fclose($fp_source); + return true; + } + unlink($tempfilename); + $this->errors[] = 'FAILED: copy('.$tempfilename.', '.$this->filename.') - '.strip_tags(ob_get_contents()); + + } else { + + $this->errors[] = 'Could not open '.$tempfilename.' mode "wb" - '.strip_tags(ob_get_contents()); + + } + ob_end_clean(); + } + fclose($fp_source); + return false; + + } + + + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "r+b"'; + return false; + } + } + $this->errors[] = 'File is not writeable: '.$this->filename; + return false; + } + + function GenerateRMFchunk(&$chunks) { + $oldCONTexists = false; + foreach ($chunks as $key => $chunk) { + $chunkNameKeys[$chunk['name']] = $key; + if ($chunk['name'] == 'CONT') { + $oldCONTexists = true; + } + } + $newHeadersCount = $chunks[$chunkNameKeys['.RMF']]['headers_count'] + ($oldCONTexists ? 0 : 1); + + $RMFchunk = "\x00\x00"; // object version + $RMFchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['.RMF']]['file_version'], 4); + $RMFchunk .= getid3_lib::BigEndian2String($newHeadersCount, 4); + + $RMFchunk = '.RMF'.getid3_lib::BigEndian2String(strlen($RMFchunk) + 8, 4).$RMFchunk; // .RMF chunk identifier + chunk length + return $RMFchunk; + } + + function GeneratePROPchunk(&$chunks, &$new_CONT_tag_data) { + $old_CONT_length = 0; + $old_DATA_offset = 0; + $old_INDX_offset = 0; + foreach ($chunks as $key => $chunk) { + $chunkNameKeys[$chunk['name']] = $key; + if ($chunk['name'] == 'CONT') { + $old_CONT_length = $chunk['length']; + } elseif ($chunk['name'] == 'DATA') { + if (!$old_DATA_offset) { + $old_DATA_offset = $chunk['offset']; + } + } elseif ($chunk['name'] == 'INDX') { + if (!$old_INDX_offset) { + $old_INDX_offset = $chunk['offset']; + } + } + } + $CONTdelta = strlen($new_CONT_tag_data) - $old_CONT_length; + + $PROPchunk = "\x00\x00"; // object version + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['max_bit_rate'], 4); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['avg_bit_rate'], 4); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['max_packet_size'], 4); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['avg_packet_size'], 4); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['num_packets'], 4); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['duration'], 4); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['preroll'], 4); + $PROPchunk .= getid3_lib::BigEndian2String(max(0, $old_INDX_offset + $CONTdelta), 4); + $PROPchunk .= getid3_lib::BigEndian2String(max(0, $old_DATA_offset + $CONTdelta), 4); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['num_streams'], 2); + $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['flags_raw'], 2); + + $PROPchunk = 'PROP'.getid3_lib::BigEndian2String(strlen($PROPchunk) + 8, 4).$PROPchunk; // PROP chunk identifier + chunk length + return $PROPchunk; + } + + function GenerateCONTchunk() { + foreach ($this->tag_data as $key => $value) { + // limit each value to 0xFFFF bytes + $this->tag_data[$key] = substr($value, 0, 65535); + } + + $CONTchunk = "\x00\x00"; // object version + + $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['title']), 2); + $CONTchunk .= @$this->tag_data['title']; + + $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['artist']), 2); + $CONTchunk .= @$this->tag_data['artist']; + + $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['copyright']), 2); + $CONTchunk .= @$this->tag_data['copyright']; + + $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['comment']), 2); + $CONTchunk .= @$this->tag_data['comment']; + + if ($this->paddedlength > (strlen($CONTchunk) + 8)) { + $CONTchunk .= str_repeat("\x00", $this->paddedlength - strlen($CONTchunk) - 8); + } + + $CONTchunk = 'CONT'.getid3_lib::BigEndian2String(strlen($CONTchunk) + 8, 4).$CONTchunk; // CONT chunk identifier + chunk length + + return $CONTchunk; + } + + function RemoveReal() { + // File MUST be writeable - CHMOD(646) at least + if (is_writeable($this->filename)) { + if ($fp_source = @fopen($this->filename, 'r+b')) { + + // Initialize getID3 engine + $getID3 = new getID3; + $OldThisFileInfo = $getID3->analyze($this->filename); + if (empty($OldThisFileInfo['real']['chunks']) && !empty($OldThisFileInfo['real']['old_ra_header'])) { + $this->errors[] = 'Cannot remove Real tags from old-style file format'; + fclose($fp_source); + return false; + } + + if (empty($OldThisFileInfo['real']['chunks'])) { + $this->errors[] = 'Cannot remove Real tags because cannot find DATA chunk in file'; + fclose($fp_source); + return false; + } + foreach ($OldThisFileInfo['real']['chunks'] as $chunknumber => $chunkarray) { + $oldChunkInfo[$chunkarray['name']] = $chunkarray; + } + + if (empty($oldChunkInfo['CONT'])) { + // no existing CONT chunk + fclose($fp_source); + return true; + } + + $BeforeOffset = $oldChunkInfo['CONT']['offset']; + $AfterOffset = $oldChunkInfo['CONT']['offset'] + $oldChunkInfo['CONT']['length']; + if ($tempfilename = tempnam('*', 'getID3')) { + ob_start(); + if ($fp_temp = fopen($tempfilename, 'wb')) { + + rewind($fp_source); + fwrite($fp_temp, fread($fp_source, $BeforeOffset)); + fseek($fp_source, $AfterOffset, SEEK_SET); + while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) { + fwrite($fp_temp, $buffer, strlen($buffer)); + } + fclose($fp_temp); + + if (copy($tempfilename, $this->filename)) { + unlink($tempfilename); + fclose($fp_source); + return true; + } + unlink($tempfilename); + $this->errors[] = 'FAILED: copy('.$tempfilename.', '.$this->filename.') - '.strip_tags(ob_get_contents()); + + } else { + + $this->errors[] = 'Could not open '.$tempfilename.' mode "wb" - '.strip_tags(ob_get_contents()); + + } + ob_end_clean(); + } + fclose($fp_source); + return false; + + + } else { + $this->errors[] = 'Could not open '.$this->filename.' mode "r+b"'; + return false; + } + } + $this->errors[] = 'File is not writeable: '.$this->filename; + return false; + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/getid3/var/write.vorbiscomment.php b/campcaster/src/modules/getid3/var/write.vorbiscomment.php new file mode 100644 index 000000000..f93b1a1cd --- /dev/null +++ b/campcaster/src/modules/getid3/var/write.vorbiscomment.php @@ -0,0 +1,124 @@ + // +// available at http://getid3.sourceforge.net // +// or http://www.getid3.org // +///////////////////////////////////////////////////////////////// +// See readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// write.vorbiscomment.php // +// module for writing VorbisComment tags // +// dependencies: /helperapps/vorbiscomment.exe // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_write_vorbiscomment +{ + + var $filename; + var $tag_data; + var $warnings = array(); // any non-critical errors will be stored here + var $errors = array(); // any critical errors will be stored here + + function getid3_write_vorbiscomment() { + return true; + } + + function WriteVorbisComment() { + + if (!ini_get('safe_mode')) { + + // Create file with new comments + $tempcommentsfilename = tempnam('*', 'getID3'); + if ($fpcomments = @fopen($tempcommentsfilename, 'wb')) { + + foreach ($this->tag_data as $key => $value) { + foreach ($value as $commentdata) { + fwrite($fpcomments, $this->CleanVorbisCommentName($key).'='.$commentdata."\n"); + } + } + fclose($fpcomments); + + } else { + + $this->errors[] = 'failed to open temporary tags file "'.$tempcommentsfilename.'", tags not written'; + return false; + + } + + $oldignoreuserabort = ignore_user_abort(true); + if (GETID3_OS_ISWINDOWS) { + + if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) { + //$commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w --raw -c "'.$tempcommentsfilename.'" "'.str_replace('/', '\\', $this->filename).'"'; + // vorbiscomment works fine if you copy-paste the above commandline into a command prompt, + // but refuses to work with `backtick` if there are "doublequotes" present around BOTH + // the metaflac pathname and the target filename. For whatever reason...?? + // The solution is simply ensure that the metaflac pathname has no spaces, + // and therefore does not need to be quoted + + // On top of that, if error messages are not always captured properly under Windows + // To at least see if there was a problem, compare file modification timestamps before and after writing + clearstatcache(); + $timestampbeforewriting = filemtime($this->filename); + + $commandline = GETID3_HELPERAPPSDIR.'vorbiscomment.exe -w --raw -c "'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1'; + $VorbiscommentError = `$commandline`; + + if (empty($VorbiscommentError)) { + clearstatcache(); + if ($timestampbeforewriting == filemtime($this->filename)) { + $VorbiscommentError = 'File modification timestamp has not changed - it looks like the tags were not written'; + } + } + } else { + $VorbiscommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR; + } + + } else { + + $commandline = 'vorbiscomment -w --raw -c "'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1'; + $VorbiscommentError = `$commandline`; + + } + + // Remove temporary comments file + unlink($tempcommentsfilename); + ignore_user_abort($oldignoreuserabort); + + if (!empty($VorbiscommentError)) { + + $this->errors[] = 'system call to vorbiscomment failed with message: '."\n\n".$VorbiscommentError; + return false; + + } + + return true; + } + + $this->errors[] = 'PHP running in Safe Mode (backtick operator not available) - cannot call vorbiscomment, tags not written'; + return false; + } + + function DeleteVorbisComment() { + $this->tag_data = array(array()); + return $this->WriteVorbisComment(); + } + + function CleanVorbisCommentName($originalcommentname) { + // A case-insensitive field name that may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded. + // ASCII 0x41 through 0x5A inclusive (A-Z) is to be considered equivalent to ASCII 0x61 through + // 0x7A inclusive (a-z). + + // replace invalid chars with a space, return uppercase text + // Thanks Chris Bolt for improving this function + // note: ereg_replace() replaces nulls with empty string (not space) + return strtoupper(ereg_replace('[^ -<>-}]', ' ', str_replace("\x00", ' ', $originalcommentname))); + + } + +} + +?> \ No newline at end of file diff --git a/campcaster/src/modules/gstreamerElements/bin/autogen.sh b/campcaster/src/modules/gstreamerElements/bin/autogen.sh new file mode 100755 index 000000000..29ccd8413 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/bin/autogen.sh @@ -0,0 +1,95 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) +#------------------------------------------------------------------------------- + +package="GstreamerElements" + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. +usrdir=`cd $basedir/../../../usr; pwd;` + +bindir=$basedir/bin +etcdir=$basedir/etc +tmpdir=$basedir/tmp + +cd "$tmpdir" +DIE=0 + +(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 +aclocal_m4=${tmpdir}/aclocal.m4 + +# copy over configure.ac and acinlclude.m4 from etc to tmp, +# as aclocal >= 1.8 is sooo unbelivably stupid that it will simply try to +# look for configure.ac in the current directory, and include acinclude.m4 +# in aclocal.m4 it without a directory path in front +ACLOCAL_FLAGS="-I ${tmpdir} --acdir=${tmpdir} --output=${aclocal_m4}" +echo " aclocal $ACLOCAL_FLAGS" +cp -f ${configure_ac} ${tmpdir} +cp -f ${etcdir}/acinclude.m4 ${tmpdir} +aclocal $ACLOCAL_FLAGS + +echo " autoheader ${configure_ac}" +autoheader ${configure_ac} + +echo " autoconf -I ${tmpdir} -o ${configure} ${configure_ac}" +autoconf -I ${tmpdir} -o ${configure} ${configure_ac} + diff --git a/campcaster/src/modules/gstreamerElements/bin/gen_coverage_data.sh b/campcaster/src/modules/gstreamerElements/bin/gen_coverage_data.sh new file mode 100755 index 000000000..abd37d816 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/bin/gen_coverage_data.sh @@ -0,0 +1,80 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script generates code coverage data for the module +#------------------------------------------------------------------------------- +module="Campcaster GstreamerElements" + +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +bindir=$basedir/bin +docdir=$basedir/doc +tmpdir=$basedir/tmp + +usrdir=`cd $basedir/../../../usr; pwd;` + +coverage_report_dir=$docdir/coverage + +raw_coverage_file=$tmpdir/raw_coverage.info +coverage_file=$tmpdir/coverage.info + +lcov=$usrdir/bin/lcov +genhtml=$usrdir/bin/genhtml + + +cd $basedir + +#------------------------------------------------------------------------------- +# Re-configure with covarege collection enabled, compile and run the tests +#------------------------------------------------------------------------------- +$bindir/autogen.sh --enable-coverage +make clean +make check + +#------------------------------------------------------------------------------- +# Generate some symlinks so that the sources are visible from tmpdir +#------------------------------------------------------------------------------- +ln -s $basedir/include $tmpdir/include +ln -s $basedir/src $tmpdir/src + + +#------------------------------------------------------------------------------- +# Use lcov to generate an HTML report on the coverage data +#------------------------------------------------------------------------------- +$lcov -d $tmpdir -c > $raw_coverage_file +$lcov -e $raw_coverage_file "$tmpdir/*" > $coverage_file +rm -rf $coverage_report_dir +mkdir -p $coverage_report_dir +$genhtml -t "$module" -o $coverage_report_dir $coverage_file + + +#------------------------------------------------------------------------------- +# Clean up +#------------------------------------------------------------------------------- +rm -f $tmpdir/include +rm -f $tmpdir/src diff --git a/campcaster/src/modules/gstreamerElements/bin/play.sh b/campcaster/src/modules/gstreamerElements/bin/play.sh new file mode 100755 index 000000000..746822dd9 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/bin/play.sh @@ -0,0 +1,64 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Play an audio file by using gstreamer and autoplugging. +#------------------------------------------------------------------------------- + +# assume we're in $basedir/bin +reldir=`dirname $0`/.. +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. +usrdir=`cd $basedir/../../../usr; pwd;` + +bindir=$basedir/bin +etcdir=$basedir/etc +libdir=$basedir/lib +tmpdir=$basedir/tmp + +play=$tmpdir/play + + +export CPPFLAGS="-I$usrdir/include" +export LDFLAGS="-L$usrdir/lib" +export PKG_CONFIG_PATH="$usrdir/lib/pkgconfig" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$usrdir/lib" +export GST_PLUGIN_PATH="$libdir" + + +if [ ! -f $play ]; then + echo "first build the play executable by issuing the following command:"; + echo ""; + echo "make all"; + + exit -1; +fi + + +$play "$*" + diff --git a/campcaster/src/modules/gstreamerElements/configure b/campcaster/src/modules/gstreamerElements/configure new file mode 100755 index 000000000..03e54b0b4 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/configure @@ -0,0 +1,52 @@ +#!/bin/sh +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Run this script to configure the environment. +# +# This script in effect calls the real automake / autoconf configure script +#------------------------------------------------------------------------------- + +# assume we're in $basedir +reldir=`dirname $0` +basedir=`cd $reldir; pwd;` +test -z "$basedir" && basedir=. + +bindir=$basedir/bin +tmpdir=$basedir/tmp + + +autogen=$bindir/autogen.sh +configure=$tmpdir/configure + +if [ ! -x $configure ]; then + (cd $basedir && $autogen $*) +fi + +(cd $tmpdir && $configure $*) + diff --git a/campcaster/src/modules/gstreamerElements/doc/.keepme b/campcaster/src/modules/gstreamerElements/doc/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/doc/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/gstreamerElements/etc/Makefile.in b/campcaster/src/modules/gstreamerElements/etc/Makefile.in new file mode 100644 index 000000000..9bd4bb1b2 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/etc/Makefile.in @@ -0,0 +1,275 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +# +# @configure_input@ +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# General command definitions +#------------------------------------------------------------------------------- +MKDIR = mkdir -p +RM = rm -f +RMDIR = rm -rf +DOXYGEN = doxygen +CP = cp -f + + +#------------------------------------------------------------------------------- +# Basic directory and file definitions +#------------------------------------------------------------------------------- +PACKAGE_NAME = @PACKAGE_NAME@ + +BASE_DIR = @builddir@ +DOC_DIR = ${BASE_DIR}/doc +DOXYGEN_DIR = ${DOC_DIR}/doxygen +COVERAGE_DIR = ${DOC_DIR}/coverage +ETC_DIR = ${BASE_DIR}/etc +INCLUDE_DIR = ${BASE_DIR}/include +LIB_DIR = ${BASE_DIR}/lib +SRC_DIR = ${BASE_DIR}/src +TMP_DIR = ${BASE_DIR}/tmp +VAR_DIR = ${BASE_DIR}/var + +REAL_BASE_DIR=$(shell cd ${BASE_DIR}; pwd) + + +prefix = @prefix@ + +USR_DIR = ${prefix} +USR_INCLUDE_DIR = ${USR_DIR}/include +USR_BIN_DIR = ${USR_DIR}/bin +USR_LIB_DIR = ${USR_DIR}/lib +BOOST_INCLUDE_DIR = ${USR_INCLUDE_DIR}/boost-1_33_1 + +MODULES_DIR = ${BASE_DIR}/.. + +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 + +VPATH = ${SRC_DIR} + +BOOST_DATE_TIME_LIB=@BOOST_DATE_TIME_LIB@ + +GSTREAMER_CFLAGS=@GSTREAMER_CFLAGS@ +GSTREAMER_LIBS=@GSTREAMER_LIBS@ +GST_REGISTER=@GST_REGISTER@ + +TEST_RESULTS = ${DOC_DIR}/testResults.xml +# the text result XSLT has to be relative to the test result file, e.g. TMP_DIR +TEST_XSLT = ../etc/testResultToHtml.xsl + +GSTREAMER_ELEMENTS_LIB = livesupport_gstreamerelements +GSTREAMER_ELEMENTS_LIB_FILE = ${LIB_DIR}/lib${GSTREAMER_ELEMENTS_LIB}.a + +ONESHOT_READER_LIB = livesupport_oneshotreader +ONESHOT_READER_LIB_FILE = ${LIB_DIR}/lib${ONESHOT_READER_LIB}.so +MINIMAL_AUDIO_SMIL_LIB = livesupport_minimalaudiosmil +MINIMAL_AUDIO_SMIL_LIB_FILE = ${LIB_DIR}/lib${MINIMAL_AUDIO_SMIL_LIB}.so +PARTIAL_PLAY_LIB = livesupport_partialplay +PARTIAL_PLAY_LIB_FILE = ${LIB_DIR}/lib${PARTIAL_PLAY_LIB}.so +SWITCHER_LIB = livesupport_switcher +SWITCHER_LIB_FILE = ${LIB_DIR}/lib${SWITCHER_LIB}.so + +TEST_RUNNER = ${TMP_DIR}/testRunner +PLAY = ${TMP_DIR}/play + +DOXYGEN_CONFIG = ${ETC_DIR}/doxygen.config + +export LD_LIBRARY_PATH:=${USR_LIB_DIR}:${LD_LIBRARY_PATH} +export GST_PLUGIN_PATH=${REAL_BASE_DIR}/lib + + +#------------------------------------------------------------------------------- +# Configuration parameters +#------------------------------------------------------------------------------- +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -pedantic -Wall -std=c99 -Wno-long-long \ + -fPIC -DPIC \ + ${GSTREAMER_CFLAGS} \ + -I${USR_INCLUDE_DIR} \ + -I${INCLUDE_DIR} -I${TMP_DIR} +CXXFLAGS = @CXXFLAGS@ @DEFS@ @COVERAGE_CXXFLAGS@ -pthread \ + -Wall -Wno-long-long \ + ${GSTREAMER_CFLAGS} \ + -I${USR_INCLUDE_DIR} \ + -I${BOOST_INCLUDE_DIR} \ + -I${CORE_INCLUDE_DIR} \ + -I${INCLUDE_DIR} -I${TMP_DIR} +GST_LDFLAGS = @LDFLAGS@ ${GSTREAMER_LIBS} \ + -L${USR_LIB_DIR} \ + -L${LIB_DIR} +LDFLAGS = @LDFLAGS@ ${GSTREAMER_LIBS} \ + -L${USR_LIB_DIR} \ + -L${CORE_LIB_DIR} \ + -L${LIB_DIR} + + +#------------------------------------------------------------------------------- +# Dependencies +#------------------------------------------------------------------------------- +GSTREAMER_ELEMENTS_LIB_OBJS = ${TMP_DIR}/seek.o \ + ${TMP_DIR}/util.o \ + ${TMP_DIR}/seek-pack.o \ + ${TMP_DIR}/autoplug.o \ + ${TMP_DIR}/smil-util.o + +ONESHOT_READER_LIB_OBJS = ${TMP_DIR}/oneshot-reader.o + +MINIMAL_AUDIO_SMIL_LIB_OBJS = ${TMP_DIR}/minimal-audio-smil.o + +PARTIAL_PLAY_LIB_OBJS = ${TMP_DIR}/partial-play.o + +SWITCHER_LIB_OBJS = ${TMP_DIR}/switcher.o + +TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ + ${TMP_DIR}/AutoplugTest.o +DONT_TEST= ${TMP_DIR}/AutoplugTest.o \ + ${TMP_DIR}/SeekTest.o \ + ${TMP_DIR}/SwitcherTest.o \ + ${TMP_DIR}/SeekPackTest.o \ + ${TMP_DIR}/PartialPlayTest.o \ + ${TMP_DIR}/OneshotReaderTest.o \ + ${TMP_DIR}/MinimalAudioSmilTest.o + +TEST_RUNNER_LIBS = -l${GSTREAMER_ELEMENTS_LIB} -l${CORE_LIB} \ + -l${BOOST_DATE_TIME_LIB} \ + -lcppunit -ldl -lxmlrpc++ + +PLAY_OBJS = ${TMP_DIR}/play.o + +PLAY_LIBS = -l${GSTREAMER_ELEMENTS_LIB} -l${CORE_LIB} + + +#------------------------------------------------------------------------------- +# Targets +#------------------------------------------------------------------------------- +.PHONY: all dir_setup doc clean docclean depclean distclean check install + +all: dir_setup ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${ONESHOT_READER_LIB_FILE} \ + ${MINIMAL_AUDIO_SMIL_LIB_FILE} \ + ${PARTIAL_PLAY_LIB_FILE} \ + ${SWITCHER_LIB_FILE} \ + ${PLAY} \ + gst_register + +dir_setup: ${TMP_DIR} ${DOXYGEN_DIR} + + +gst_register: + ${GST_REGISTER} > /dev/null 2>&1 + +doc: + ${DOXYGEN} ${DOXYGEN_CONFIG} + +clean: + ${RM} ${GSTREAMER_ELEMENTS_LIB_OBJS} ${GSTREAMER_ELEMENTS_LIB_FILE} + ${RM} ${ONESHOT_READER_LIB_OBJS} ${ONESHOT_READER_LIB_FILE} + ${RM} ${MINIMAL_AUDIO_SMIL_LIB_OBJS} ${MINIMAL_AUDIO_SMIL_LIB_FILE} + ${RM} ${PARTIAL_PLAY_LIB_OBJS} ${PARTIAL_PLAY_LIB_FILE} + ${RM} ${SWITCHER_LIB_OBJS} ${SWITCHER_LIB_FILE} + ${RM} ${TEST_RUNNER_OBJS} ${TEST_RUNNER_RES} ${TEST_RUNNER} + ${RM} ${PLAY_OBJS} ${PLAY} + ${RM} ${TMP_DIR}/*.bb ${TMP_DIR}/*.bbg ${TMP_DIR}/*.da ${TMP_DIR}/*.info + +docclean: + ${RMDIR} ${DOXYGEN_DIR}/html + ${RMDIR} ${COVERAGE_DIR}/* + ${RM} ${TEST_RESULTS} + +depclean: clean + +distclean: clean docclean + ${RMDIR} ${TMP_DIR}/config* ${TMP_DIR}/autom4te* ${TMP_DIR}/ac*.m4 + +check: all ${TEST_RUNNER} + ${TEST_RUNNER} -o ${TEST_RESULTS} -s ${TEST_XSLT} + +install: all + ${MKDIR} ${USR_INCLUDE_DIR}/LiveSupport/GstreamerElements + ${CP} ${INCLUDE_DIR}/LiveSupport/GstreamerElements/*.h \ + ${USR_INCLUDE_DIR}/LiveSupport/GstreamerElements + ${CP} ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${ONESHOT_READER_LIB_FILE} \ + ${MINIMAL_AUDIO_SMIL_LIB_FILE} \ + ${PARTIAL_PLAY_LIB_FILE} \ + ${SWITCHER_LIB_FILE} \ + ${USR_LIB_DIR} + -GST_PLUGIN_PATH=${USR_LIB_DIR} ${GST_REGISTER} + + +#------------------------------------------------------------------------------- +# Specific targets +#------------------------------------------------------------------------------- +${GSTREAMER_ELEMENTS_LIB_FILE}: ${GSTREAMER_ELEMENTS_LIB_OBJS} + ${AR} crus $@ $^ + +${ONESHOT_READER_LIB_FILE}: ${ONESHOT_READER_LIB_OBJS} \ + ${GSTREAMER_ELEMENTS_LIB_FILE} + ${CC} -shared -o $@ $^ ${GST_LDFLAGS} + +${MINIMAL_AUDIO_SMIL_LIB_FILE}: ${MINIMAL_AUDIO_SMIL_LIB_OBJS} \ + ${GSTREAMER_ELEMENTS_LIB_FILE} + ${CC} -shared -o $@ $^ ${GST_LDFLAGS} + +${PARTIAL_PLAY_LIB_FILE}: ${PARTIAL_PLAY_LIB_OBJS} \ + ${GSTREAMER_ELEMENTS_LIB_FILE} + ${CC} -shared -o $@ $^ ${GST_LDFLAGS} + +${SWITCHER_LIB_FILE}: ${SWITCHER_LIB_OBJS} \ + ${GSTREAMER_ELEMENTS_LIB_FILE} + ${CC} -shared -o $@ $^ ${GST_LDFLAGS} + +${TMP_DIR}: + ${MKDIR} ${TMP_DIR} + +${DOXYGEN_DIR}: + ${MKDIR} ${DOXYGEN_DIR} + +${TEST_RUNNER}: ${CORE_LIB_FILE} ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${TEST_RUNNER_OBJS} + ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} + +${PLAY}: ${CORE_LIB_FILE} ${GSTREAMER_ELEMENTS_LIB_FILE} ${PLAY_OBJS} + ${CXX} ${LDFLAGS} -o $@ ${PLAY_OBJS} ${PLAY_LIBS} + +${CORE_LIB_FILE}: + ${MAKE} -C ${CORE_DIR} + + +#------------------------------------------------------------------------------- +# Pattern rules +#------------------------------------------------------------------------------- +${TMP_DIR}/%.o : ${SRC_DIR}/%.c + ${CC} ${CPPFLAGS} ${CFLAGS} -c -o $@ $< + +${TMP_DIR}/%.o : ${SRC_DIR}/%.cxx + ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c -o $@ $< + diff --git a/campcaster/src/modules/gstreamerElements/etc/acinclude.m4 b/campcaster/src/modules/gstreamerElements/etc/acinclude.m4 new file mode 100644 index 000000000..a4bb20528 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/etc/acinclude.m4 @@ -0,0 +1,159 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +dnl----------------------------------------------------------------------------- + +dnl----------------------------------------------------------------------------- +dnl Macro to check for available modules using pkg-conf +dnl +dnl usage: +dnl PKG_CHECK_MODULES(GSTUFF,[gtk+-2.0 >= 1.3], action-if, action-not) +dnl +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +dnl +dnl This function was taken from the glade-- project +dnl----------------------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for C++ namespaces +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ac_cxx_namespaces.html +dnl +dnl usage: +dnl If the compiler can prevent names clashes using namespaces, +dnl define HAVE_NAMESPACES. +dnl----------------------------------------------------------------------------- +AC_DEFUN([AC_CXX_NAMESPACES], +[AC_CACHE_CHECK(whether the compiler implements namespaces, +ac_cv_cxx_namespaces, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], + [using namespace Outer::Inner; return i;], + ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) + AC_LANG_RESTORE +]) +if test "$ac_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES,,[define if the compiler implements namespaces]) +fi +]) + + +dnl----------------------------------------------------------------------------- +dnl Macro to check for the boost datetime library. +dnl for more information on boost, see http://www.boost.org/ +dnl for more information on this macro, see +dnl http://autoconf-archive.cryp.to/ax_boost_date-time.html +dnl +dnl usage: +dnl This macro checks to see if the Boost.DateTime library is installed. +dnl It also attempts to guess the currect library name using several attempts. +dnl It tries to build the library name using a user supplied name or suffix +dnl and then just the raw library. +dnl +dnl If the library is found, HAVE_BOOST_DATE_TIME is defined and +dnl BOOST_DATE_TIME_LIB is set to the name of the library. +dnl +dnl This macro calls AC_SUBST(BOOST_DATE_TIME_LIB). +dnl----------------------------------------------------------------------------- +AC_DEFUN([AX_BOOST_DATE_TIME], +[AC_REQUIRE([AC_CXX_NAMESPACES])dnl +AC_CACHE_CHECK(whether the Boost::DateTime library is available, +ax_cv_boost_date_time, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include ]], + [[using namespace boost::gregorian; date d(2002,Jan,10); return 0;]]), + ax_cv_boost_date_time=yes, ax_cv_boost_date_time=no) + AC_LANG_RESTORE +]) +if test "$ax_cv_boost_date_time" = yes; then + AC_DEFINE(HAVE_BOOST_DATE_TIME,,[define if the Boost::DateTime library is available]) + dnl Now determine the appropriate file names + AC_ARG_WITH([boost-date-time],AS_HELP_STRING([--with-boost-date-time], + [specify the boost date-time library or suffix to use]), + [if test "x$with_boost_date_time" != "xno"; then + ax_date_time_lib=$with_boost_date_time + ax_boost_date_time_lib=boost_date_time-$with_boost_date_time + fi]) + for ax_lib in $ax_date_time_lib $ax_boost_date_time_lib boost_date_time; do + AC_CHECK_LIB($ax_lib, main, [BOOST_DATE_TIME_LIB=$ax_lib break]) + done + AC_SUBST(BOOST_DATE_TIME_LIB) +fi +])dnl diff --git a/campcaster/src/modules/gstreamerElements/etc/configure.ac b/campcaster/src/modules/gstreamerElements/etc/configure.ac new file mode 100644 index 000000000..6bfb25bcf --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/etc/configure.ac @@ -0,0 +1,117 @@ +dnl----------------------------------------------------------------------------- +dnl Copyright (c) 2004 Media Development Loan Fund +dnl +dnl This file is part of the Campcaster project. +dnl http://campcaster.campware.org/ +dnl To report bugs, send an e-mail to bugs@campware.org +dnl +dnl Campcaster 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 Campcaster 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 Campcaster; 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$ +dnl Version : $Revision$ +dnl Location : $URL$ +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(GstreamerElements, 1.0, bugs@campware.org) +AC_PREREQ(2.59) +AC_COPYRIGHT([Copyright (c) 2004 Media Development Loan Fund under the GNU GPL]) +AC_REVISION($Revision$) + +AC_CONFIG_SRCDIR(../src/oneshot-reader.c) + +AC_CONFIG_HEADERS(configure.h) +AC_PROG_CC() +AC_PROG_CXX() + +AC_CHECK_HEADERS(string.h getopt.h sys/time.h) + + +dnl----------------------------------------------------------------------------- +dnl specify whether debug info should be compiled into the executable +dnl----------------------------------------------------------------------------- +AC_SUBST(CXXFLAGS) + +AC_ARG_ENABLE([debug], + AC_HELP_STRING([--enable-debug], [compile with debug info (no)]), + [], + [enable_debug=no]) + +if test "x${enable_debug}" = "xyes"; then + CXXFLAGS="-g -O0" +else + CXXFLAGS="-O3" +fi + +AC_MSG_RESULT([using compiler options: ${CXXFLAGS}]) + + +dnl----------------------------------------------------------------------------- +dnl specify the pkg-config path +dnl----------------------------------------------------------------------------- +AC_ARG_WITH([pkg-config-path], + AC_HELP_STRING([--with-pkg-config-path], + [use the pkg-config path (prefix/lib/pkgconfig)]), + [PKG_CONFIG_PATH=${withval}], + [PKG_CONFIG_PATH=${prefix}/lib/pkgconfig]) + +AC_MSG_RESULT([using pkg-config path: ${PKG_CONFIG_PATH}]) + +export PKG_CONFIG_PATH + +export PATH=${prefix}/bin:${PATH} + +AX_BOOST_DATE_TIME() +if test "$BOOST_DATE_TIME_LIB" = "" ; then + BOOST_DATE_TIME_LIB=boost_date_time-gcc + AC_SUBST(BOOST_DATE_TIME_LIB) +fi +AC_MSG_RESULT([checking BOOST_DATE_TIME_LIB... ${BOOST_DATE_TIME_LIB}]) + +PKG_CHECK_MODULES(GSTREAMER,[gstreamer-0.8 >= 0.8]) +AC_SUBST(GSTREAMER_CFLAGS) +AC_SUBST(GSTREAMER_LIBS) + +AC_PATH_PROG(GST_REGISTER, gst-register-0.8) +AC_SUBST(GST_REGISTER) + + +dnl----------------------------------------------------------------------------- +dnl enable compilaton for code coverage data +dnl----------------------------------------------------------------------------- +AC_SUBST(COVERAGE_CXXFLAGS) + +AC_ARG_ENABLE( coverage, +[ --enable-coverage enable code coverage data generaton (no) ], + ENABLE_COVERAGE=${enableval}, ENABLE_COVERAGE="no" ) + +if test "x${ENABLE_COVERAGE}" == "xyes" ; then + COVERAGE_CXXFLAGS="-fprofile-arcs -ftest-coverage" + AC_MSG_RESULT([compiling in code coverage mode]) +else + AC_MSG_RESULT([not compiling in code coverage mode]) +fi + + +AC_CONFIG_FILES(../Makefile:../etc/Makefile.in) + +AC_OUTPUT() diff --git a/campcaster/src/modules/gstreamerElements/etc/doxygen.config b/campcaster/src/modules/gstreamerElements/etc/doxygen.config new file mode 100644 index 000000000..6788ad8b3 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/etc/doxygen.config @@ -0,0 +1,1144 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the Campcaster project. +# http://campcaster.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# Campcaster 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. +# +# Campcaster 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 Campcaster; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author$ +# Version : $Revision$ +# Location : $URL$ +#------------------------------------------------------------------------------- + +# Doxyfile 1.3.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Campcaster + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = include src + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/campcaster/src/modules/gstreamerElements/include/LiveSupport/GstreamerElements/autoplug.h b/campcaster/src/modules/gstreamerElements/include/LiveSupport/GstreamerElements/autoplug.h new file mode 100644 index 000000000..aa492abd3 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/include/LiveSupport/GstreamerElements/autoplug.h @@ -0,0 +1,98 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_GstreamerElements_Autoplug_h +#define LiveSupport_GstreamerElements_Autoplug_h + +/** + * @file + * Functions for autoplugging gstreamer elements based on their MIME types. + * + * @author $Author$ + * @version $Revision$ + */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* ============================================================ include files */ + +#include + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + + +/* ====================================================== function prototypes */ + +/** + * Autoplug a source element, that contains some form of audio. + * The result will be a gstreamer element, that is linked with + * source, and produces raw audio on its src pad as it output. + * + * @param source the source to autoplug. + * @param name the name of the new element. + * @param caps the capabilities expected from the returned element, + * on its src pad. + * @return a gstreamer element already linked to source, that produces + * the audio provided by source in audio/x-raw-int or + * audio/x-raw-float format, as needed. + */ +GstElement * +ls_gst_autoplug_plug_source(GstElement * source, + const gchar * name, + const GstCaps * caps); + +/** + * Return the current position in a previously autoplugged element. + * This is a workaround function, as querying the element returned by + * ls_gst_autoplug_plug_source() with the standard gstreamer calls + * will not give satisfactory results. + * + * @param element a GstElement that was returned by a previous call to + * ls_gst_autoplug_plug_source() + * @return the current position, in nanoseconds + */ +gint64 +ls_gst_autoplug_get_position(GstElement * element); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LiveSupport_GstreamerElements_Autoplug_h */ + diff --git a/campcaster/src/modules/gstreamerElements/lib/.keepme b/campcaster/src/modules/gstreamerElements/lib/.keepme new file mode 100644 index 000000000..e0808fa16 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/lib/.keepme @@ -0,0 +1 @@ +keep me diff --git a/campcaster/src/modules/gstreamerElements/src/AutoplugTest.cxx b/campcaster/src/modules/gstreamerElements/src/AutoplugTest.cxx new file mode 100644 index 000000000..cf503e975 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/AutoplugTest.cxx @@ -0,0 +1,540 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include + +#include "LiveSupport/GstreamerElements/autoplug.h" +#include "AutoplugTest.h" + + +using namespace boost::posix_time; +using namespace LiveSupport::Core; +using namespace LiveSupport::GstreamerElements; + + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(AutoplugTest); + +/** + * Define this if time statistics should be printed while running tests. + */ +#undef PRINT_TIMES + +/** + * Define this if time statistics should be printed for each iteration. + */ +#undef PRINT_ITERATION_TIMES + + +/** + * An mp3 test file. + */ +static const char * mp3TestFile = "var/5seccounter.mp3"; + +/** + * A 48 kHz mp3 test file. + */ +static const char * mp3_48kHzTestFile = "var/48kHz.mp3"; + +/** + * An ogg vorbis test file. + */ +static const char * oggTestFile = "var/5seccounter.ogg"; + +/** + * A 160kb/s ogg vorbis test file. + */ +static const char * ogg160kbpsTestFile = "var/d160.ogg"; + +/** + * A SMIL test file. + */ +static const char * smilTestFile = "var/simple.smil"; + +/** + * A SMIL test file, containing an ogg vorbis file. + */ +static const char * oggSmilFile = "var/simple-ogg.smil"; + +/** + * A file we can't plug. + */ +static const char * badFile = "src/AutoplugTest.cxx"; + +/** + * A very short file. + */ +static const char * shortFile = "var/test-short.mp3"; + +/** + * A SMIL file referring to a very short file. + */ +static const char * shortSmilFile = "var/short.smil"; + +/** + * An embedded SMIL file. + */ +static const char * embeddedSmilFile = "var/embedded.smil"; + +/** + * A sequentially looking SMIL file. + */ +static const char * sequentialSmilFile = "var/sequentialSmil.smil"; + +/** + * A long (in time) playlist + */ +static const char * longSmilFile = "var/bach.smil"; + + +/* =============================================== local function prototypes */ + +/** + * Signal handler for the eos event of the autoplug element. + * + * @param element the element emitting the eos signal + * @param userData pointer to the container bin of the switcher. + */ +static void +eos_signal_handler(GstElement * element, + gpointer userData); + + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Play an audio file + *----------------------------------------------------------------------------*/ +gint64 +AutoplugTest :: playFile(const char * audioFile) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * source; + GstElement * decoder; + GstElement * sink; + GstCaps * caps; + gint64 timePlayed; + + /* initialize GStreamer */ + gst_init(0, 0); + + caps = gst_caps_new_simple("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "channels", G_TYPE_INT, 2, + "rate", G_TYPE_INT, 44100, + NULL); + + /* create elements */ + pipeline = gst_pipeline_new("audio-player"); + source = gst_element_factory_make("filesrc", "source"); + sink = gst_element_factory_make("alsasink", "alsa-output"); + + g_object_set(G_OBJECT(source), "location", audioFile, NULL); + + decoder = ls_gst_autoplug_plug_source(source, "decoder", caps); + + if (!decoder) { + gst_object_unref(GST_OBJECT(sink)); + gst_object_unref(GST_OBJECT(source)); + gst_object_unref(GST_OBJECT(pipeline)); + + return 0LL; + } + + g_signal_connect(decoder, "eos", G_CALLBACK(eos_signal_handler), pipeline); + + gst_element_link(decoder, sink); + gst_bin_add_many(GST_BIN(pipeline), source, decoder, sink, NULL); + + gst_element_set_state(source, GST_STATE_PAUSED); + gst_element_set_state(decoder, GST_STATE_PAUSED); + gst_element_set_state(sink, GST_STATE_PAUSED); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + while (gst_bin_iterate(GST_BIN(pipeline))) { +#ifdef PRINT_ITERATION_TIMES + timePlayed = ls_gst_autoplug_get_position(decoder); + std::cerr << "iteration time: " << timePlayed << std::endl; +#endif + } + + timePlayed = ls_gst_autoplug_get_position(decoder); + + /* clean up nicely */ + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT(pipeline)); + + return timePlayed; +} + + +/*------------------------------------------------------------------------------ + * eos signal handler for the switcher element + *----------------------------------------------------------------------------*/ +static void +eos_signal_handler(GstElement * element, + gpointer userData) +{ + GstElement * container = GST_ELEMENT(userData); + + g_return_if_fail(container != NULL); + g_return_if_fail(GST_IS_ELEMENT(container)); + + // set the container into eos state + gst_element_set_eos(container); +} + + +/*------------------------------------------------------------------------------ + * Open an audio file + *----------------------------------------------------------------------------*/ +Ptr::Ref +AutoplugTest :: openFile(const char * audioFile) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * source; + GstElement * decoder; + GstElement * sink; + GstCaps * caps; + Ptr::Ref start; + Ptr::Ref end; + Ptr::Ref duration; + + /* initialize GStreamer */ + gst_init(0, 0); + + caps = gst_caps_new_simple("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "channels", G_TYPE_INT, 2, + "rate", G_TYPE_INT, 44100, + NULL); + + start = TimeConversion::now(); + + /* create elements */ + pipeline = gst_pipeline_new("audio-player"); + source = gst_element_factory_make("filesrc", "source"); + sink = gst_element_factory_make("alsasink", "alsa-output"); + + g_object_set(G_OBJECT(source), "location", audioFile, NULL); + + decoder = ls_gst_autoplug_plug_source(source, "decoder", caps); + + if (!decoder) { + gst_object_unref(GST_OBJECT(sink)); + gst_object_unref(GST_OBJECT(source)); + gst_object_unref(GST_OBJECT(pipeline)); + + return duration; + } + + gst_element_link(decoder, sink); + gst_bin_add_many(GST_BIN(pipeline), source, decoder, sink, NULL); + + gst_element_set_state(source, GST_STATE_PAUSED); + gst_element_set_state(decoder, GST_STATE_PAUSED); + gst_element_set_state(sink, GST_STATE_PAUSED); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + gst_bin_iterate(GST_BIN(pipeline)); + + end = TimeConversion::now(); + + /* clean up nicely */ + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT(pipeline)); + + duration.reset(new time_duration(*end - *start)); + + return duration; +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3TestFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test a 48kHz mp3 file + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: mp3_48kHzTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3_48kHzTestFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 12.1 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 12.3 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * An ogg vorbis test. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: oggVorbisTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggTestFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * An ogg vorbis test. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: oggVorbis160kbpsTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(ogg160kbpsTestFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.1 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 2.4 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A SMIL test. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: smilTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(smilTestFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test somethign we can't plug. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: negativeTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(badFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed == 0LL); +} + + +/*------------------------------------------------------------------------------ + * Test on a very short file. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: shortTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(shortFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 1.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 2.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test on a SMIL file referring to a very short file. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: shortSmilTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(shortSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 1.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 2.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * See how long it takes to open some playlists + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: playlistOpenTest(void) + throw (CPPUNIT_NS::Exception) +{ + Ptr::Ref duration; + + duration = openFile(mp3TestFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << mp3TestFile << ": " + << *duration << std::endl; +#endif + + duration = openFile(oggTestFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << oggTestFile << ": " + << *duration << std::endl; +#endif + + duration = openFile(smilTestFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << smilTestFile << ": " + << *duration << std::endl; +#endif + + duration = openFile(oggSmilFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << oggSmilFile << ": " + << *duration << std::endl; +#endif + + duration = openFile(shortSmilFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << shortSmilFile << ": " + << *duration << std::endl; +#endif + + duration = openFile(embeddedSmilFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << embeddedSmilFile << ": " + << *duration << std::endl; +#endif + + duration = openFile(sequentialSmilFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << sequentialSmilFile << ": " + << *duration << std::endl; +#endif + + duration = openFile(longSmilFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << longSmilFile << ": " + << *duration << std::endl; +#endif +} + + +/*------------------------------------------------------------------------------ + * A test to see if play duration is reported properly. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: playDurationTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 duration; + + duration = playFile(mp3TestFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << mp3TestFile << ": " + << duration << std::endl; +#endif + + duration = playFile(sequentialSmilFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << sequentialSmilFile << ": " + << duration << std::endl; +#endif + + duration = playFile(embeddedSmilFile); +#ifdef PRINT_TIMES + std::cerr << "duration for " << embeddedSmilFile << ": " + << duration << std::endl; +#endif +} + diff --git a/campcaster/src/modules/gstreamerElements/src/AutoplugTest.h b/campcaster/src/modules/gstreamerElements/src/AutoplugTest.h new file mode 100644 index 000000000..40727d5d3 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/AutoplugTest.h @@ -0,0 +1,222 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef AutoplugTest_h +#define AutoplugTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +using namespace LiveSupport::Core; +using namespace boost::posix_time; + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the partialplay gstreamer element. + * + * @author $Author$ + * @version $Revision$ + */ +class AutoplugTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(AutoplugTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(mp3_48kHzTest); + CPPUNIT_TEST(oggVorbisTest); + CPPUNIT_TEST(oggVorbis160kbpsTest); + CPPUNIT_TEST(smilTest); + CPPUNIT_TEST(negativeTest); + CPPUNIT_TEST(shortTest); + CPPUNIT_TEST(shortSmilTest); + CPPUNIT_TEST(playlistOpenTest); + CPPUNIT_TEST(playDurationTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Play a specific file. + * + * @param audioFile the audio file to play. + * @return the number of milliseconds played. + * @exception CPPUNIT_NS::Exception on test failures. + */ + gint64 + playFile(const char * audioFile) + throw (CPPUNIT_NS::Exception); + + /** + * Open a specific file. Used to measure the time it takes to + * open files. + * + * @param audioFile the audio file to play. + * @return the amount of time it took to open the file. + * @exception CPPUNIT_NS::Exception on test failures. + */ + Ptr::Ref + openFile(const char * audioFile) + throw (CPPUNIT_NS::Exception); + + + protected: + + /** + * A simple smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test a 48kHz mp3 file + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3_48kHzTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test an Ogg Vorbis file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test a 160 kb/s Ogg Vorbis file. + * See http://bugs.campware.org/view.php?id=1421 for details. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbis160kbpsTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test a SMIL file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A negative test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + negativeTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test on a very short file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + shortTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test on a SMIL file referring to a very short file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + shortSmilTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to open playlists, for seeing how long it takes to open + * them. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + playlistOpenTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to see if play duration is reported properly. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + playDurationTest(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 GstreamerElements +} // namespace LiveSupport + +#endif // AutoplugTest_h + diff --git a/campcaster/src/modules/gstreamerElements/src/MinimalAudioSmilTest.cxx b/campcaster/src/modules/gstreamerElements/src/MinimalAudioSmilTest.cxx new file mode 100644 index 000000000..934f2891e --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/MinimalAudioSmilTest.cxx @@ -0,0 +1,402 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_STRING_H +#include +#else +#error need string.h +#endif + + +#include +#include + +#include + +#include "MinimalAudioSmilTest.h" + + +using namespace LiveSupport::GstreamerElements; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(MinimalAudioSmilTest); + +/** + * A simple smil file. + */ +static const char * simpleFile = "var/simple.smil"; + +/** + * A simple smil file with clipBegin and clipEnd attributes + */ +static const char * simpleClipBeginFile = + "var/simple-clipBegin.smil"; + +/** + * A simple smil file with clipBegin and clipEnd attributes + */ +static const char * simpleClipBeginEndFile = + "var/simple-clipBegin-clipEnd.smil"; + +/** + * A parallel smil file. + */ +static const char * parallelFile = "var/parallel.smil"; + + +/** + * A parallel smil file with clipBegin and clipEnd attributes. + */ +static const char * parallelClipBeginEndFile = + "var/parallel-clipBegin-clipEnd.smil"; + +/** + * A SMIL file containing an Ogg Vorbis file. + */ +static const char * oggVorbisSmilFile = "var/simple-ogg.smil"; + +/** + * A SMIL file containing another SMIL file. + */ +static const char * embeddedSmilFile = "var/embedded.smil"; + +/** + * A SMIL file containing sound animation. + */ +static const char * soundAnimationSmilFile = "var/animateSound.smil"; + +/** + * A SMIL file containing sound animation with two parallel files. + */ +static const char * soundAnimationParallelSmilFile = + "var/animateSoundParallel.smil"; + +/** + * A SMIL file containing sound animation in effect of a fade in / out. + */ +static const char * fadeInOutSmilFile = "var/fadeInOut.smil"; + +/** + * A SMIL file containing sound animation in effect of a fade in / out, + * with two overlapping audio files. + */ +static const char * fadeInOutParallelSmilFile = + "var/fadeInOutParallel.smil"; + +/** + * A SMIL file containing several audio elements in a par, that in effect + * play sequentially. + */ +static const char * sequentialSmilFile = + "var/sequentialSmil.smil"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Play a SMIL file. + *----------------------------------------------------------------------------*/ +gint64 +MinimalAudioSmilTest :: playSmilFile(const char * smilFile) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * filesrc; + GstElement * smil; + GstElement * sink; + GstFormat format; + gint64 timePlayed; + + /* initialization */ + gst_init(0, 0); + + /* create elements */ + pipeline = gst_pipeline_new("pipeline"); + filesrc = gst_element_factory_make("filesrc", "filesource"); + smil = gst_element_factory_make("minimalaudiosmil", "smil"); + sink = gst_element_factory_make("alsasink", "audiosink"); + + g_object_set(G_OBJECT(filesrc), "location", smilFile, NULL); + + /* link everything together */ + gst_element_link_many(filesrc, smil, sink, NULL); + gst_bin_add_many(GST_BIN(pipeline), filesrc, smil, sink, NULL); + + /* run */ + gst_element_set_state(pipeline, GST_STATE_PLAYING); + while (gst_bin_iterate(GST_BIN(pipeline))); + + format = GST_FORMAT_TIME; + gst_element_query(sink, GST_QUERY_POSITION, &format, &timePlayed); + + /* clean up */ + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT(pipeline)); + + return timePlayed; +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(simpleFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple test with clipBegin attribute + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: simpleClipBeginTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(simpleClipBeginFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple test with clipBegin and clipEnd attributes + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: simpleClipBeginEndTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(simpleClipBeginEndFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test SMIL elements + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: parallelTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(parallelFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 7.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 8.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test SMIL elements with clipBegin and clipEnd attributes + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: parallelClipBeginEndTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(parallelClipBeginEndFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 7.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 8.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test a SMIL file pointing to an Ogg Vorbis file. + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: oggVorbisTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(oggVorbisSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test a SMIL file pointing to another SMIL file. + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: embeddedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(embeddedSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 9.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 10.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test a SMIL file containing sound level animation. + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: soundAnimationTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(soundAnimationSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test a SMIL file containing sound level animation with two files in + * parallel. + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: soundAnimationParallelTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(soundAnimationParallelSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test a SMIL file containing sound level animation resulting in a fade + * in / fade out effect. + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: fadeInOutTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(fadeInOutSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Test a SMIL file containing sound level animation resulting in a fade + * in / fade out effect, with two parallel files + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: fadeInOutParallelTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(fadeInOutParallelSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A sequential par element test. + *----------------------------------------------------------------------------*/ +void +MinimalAudioSmilTest :: sequentialSmilTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playSmilFile(sequentialSmilFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 34.7 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 35.0 * GST_SECOND); +} + diff --git a/campcaster/src/modules/gstreamerElements/src/MinimalAudioSmilTest.h b/campcaster/src/modules/gstreamerElements/src/MinimalAudioSmilTest.h new file mode 100644 index 000000000..15f77b9ce --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/MinimalAudioSmilTest.h @@ -0,0 +1,222 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef MinimalAudioSmilTest_h +#define MinimalAudioSmilTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the partialplay gstreamer element. + * + * @author $Author$ + * @version $Revision$ + */ +class MinimalAudioSmilTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(MinimalAudioSmilTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(simpleClipBeginTest); + CPPUNIT_TEST(simpleClipBeginEndTest); + CPPUNIT_TEST(parallelTest); + CPPUNIT_TEST(parallelClipBeginEndTest); + CPPUNIT_TEST(oggVorbisTest); +// disabled because this test hangs on some systems +// CPPUNIT_TEST(embeddedTest); + CPPUNIT_TEST(soundAnimationTest); + CPPUNIT_TEST(soundAnimationParallelTest); + CPPUNIT_TEST(fadeInOutTest); + CPPUNIT_TEST(fadeInOutParallelTest); + CPPUNIT_TEST(sequentialSmilTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Play a smil file. + * + * @param smilFile the name of the smil file to play. + * @return the number of milliseconds played. + * @exception CPPUNIT_NS::Exception on test failures. + */ + gint64 + playSmilFile(const char * smilFile) + throw (CPPUNIT_NS::Exception); + + + protected: + + /** + * A simple smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple test with clipBegin attribute. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + simpleClipBeginTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple test with clipBegin and clipEnd attributes. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + simpleClipBeginEndTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test on elements in a SMIL file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + parallelTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test on elements in a SMIL file, with clipBegin and + * clipEnd attributes. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + parallelClipBeginEndTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple test with a SMIL file referring to an Ogg Vorbis file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test looking at an embedded SMIL file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + embeddedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test sound level animation. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + soundAnimationTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test sound level animation with two parallel elements. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + soundAnimationParallelTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test fade in / fade out using sound level animation. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + fadeInOutTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test fade in / fade out using sound level animation, + * with two parallel audio files. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + fadeInOutParallelTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A sequential par element test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + sequentialSmilTest(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 GstreamerElements +} // namespace LiveSupport + +#endif // MinimalAudioSmilTest_h + diff --git a/campcaster/src/modules/gstreamerElements/src/OneshotReaderTest.cxx b/campcaster/src/modules/gstreamerElements/src/OneshotReaderTest.cxx new file mode 100644 index 000000000..3ab67856c --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/OneshotReaderTest.cxx @@ -0,0 +1,146 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_STRING_H +#include +#else +#error need string.h +#endif + + +#include +#include +#include + +#include + +#include "OneshotReaderTest.h" + + +using namespace LiveSupport::GstreamerElements; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(OneshotReaderTest); + +static const char * testFile = "var/oneshotReader.input"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +OneshotReaderTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +OneshotReaderTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +OneshotReaderTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * filesrc; + GstElement * oneshot; + GstElement * bin; + guint8 * contents; + guint length; + char * verifyContents; + std::ifstream ifs; + + /* initialize GStreamer */ + gst_init(0, 0); + + /* create elements */ + pipeline = gst_pipeline_new ("my_pipeline"); + + filesrc = gst_element_factory_make("filesrc", "my_filesource"); + oneshot = gst_element_factory_make("oneshotreader", "oneshot"); + bin = gst_bin_new("bin"); + + g_object_set(G_OBJECT(filesrc), "location", testFile, NULL); + + gst_bin_add(GST_BIN(bin), oneshot); + gst_element_add_ghost_pad(bin, + gst_element_get_pad(oneshot, "sink"), + "sink"); + + /* link everything together */ + gst_element_link_many(filesrc, bin, NULL); + gst_bin_add_many(GST_BIN(pipeline), filesrc, bin, NULL); + + /* run */ + gst_element_set_state(pipeline, GST_STATE_PLAYING); + // well, actually don't run, by setting to state PLAYING, + // we already have what we're looking for. + while (gst_bin_iterate(GST_BIN(pipeline))); + + g_object_get(G_OBJECT(oneshot), "contents", &contents, NULL); + g_object_get(G_OBJECT(oneshot), "length", &length, NULL); + + // read in the file contents with an ifstream, and see if + // we get the same + verifyContents = new char[length]; + ifs.open(testFile); + CPPUNIT_ASSERT(ifs.good()); + ifs.read(verifyContents, length); + CPPUNIT_ASSERT(!memcmp(contents, verifyContents, length)); + + /* clean up */ + delete[] verifyContents; + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT(pipeline)); +} + diff --git a/campcaster/src/modules/gstreamerElements/src/OneshotReaderTest.h b/campcaster/src/modules/gstreamerElements/src/OneshotReaderTest.h new file mode 100644 index 000000000..67e4a7495 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/OneshotReaderTest.h @@ -0,0 +1,106 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef OneshotReaderTest_h +#define OneshotReaderTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the partialplay gstreamer element. + * + * @author $Author$ + * @version $Revision$ + */ +class OneshotReaderTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(OneshotReaderTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST_SUITE_END(); + + protected: + + /** + * A simple smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(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 GstreamerElements +} // namespace LiveSupport + +#endif // OneshotReaderTest_h + diff --git a/campcaster/src/modules/gstreamerElements/src/PartialPlayTest.cxx b/campcaster/src/modules/gstreamerElements/src/PartialPlayTest.cxx new file mode 100644 index 000000000..e0cb6fb80 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/PartialPlayTest.cxx @@ -0,0 +1,267 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include + +#include "PartialPlayTest.h" + + +using namespace LiveSupport::GstreamerElements; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(PartialPlayTest); + +/** + * An mp3 test file. + */ +static const char * mp3File = "var/5seccounter.mp3"; + +/** + * An ogg vorbis test file. + */ +static const char * oggVorbisFile = "var/5seccounter.ogg"; + +/** + * A SMIL test file. + */ +static const char * smilFile = "var/simple.smil"; + + +/* =============================================== local function prototypes */ + +/** + * Signal handler for the eos event of the switcher element. + * + * @param element the element emitting the eos signal + * @param userData pointer to the container bin of the switcher. + */ +static void +eos_signal_handler(GstElement * element, + gpointer userData); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +gint64 +PartialPlayTest :: playFile(const char * audioFile, + const char * config) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * filter; + GstElement * sink; + GstFormat format; + gint64 timePlayed; + + /* initialize GStreamer */ + gst_init(0, 0); + + /* create elements */ + pipeline = gst_pipeline_new("audio-player"); + filter = gst_element_factory_make("partialplay", "partialplay"); + sink = gst_element_factory_make("alsasink", "alsa-output"); + + /* set filename property on the file source */ + g_object_set(G_OBJECT(filter), "location", audioFile, NULL); + g_object_set(G_OBJECT(filter), "config", config, NULL); + g_signal_connect(filter, "eos", G_CALLBACK(eos_signal_handler), pipeline); + + gst_element_link(filter, sink); + + gst_bin_add_many(GST_BIN(pipeline), filter, sink, NULL); + + gst_element_set_state(filter, GST_STATE_READY); + gst_element_set_state(sink, GST_STATE_READY); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + while (gst_bin_iterate(GST_BIN(pipeline))); + + format = GST_FORMAT_TIME; + gst_element_query(sink, GST_QUERY_POSITION, &format, &timePlayed); + + /* clean up nicely */ + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT (pipeline)); + + return timePlayed; +} + + +/*------------------------------------------------------------------------------ + * eos signal handler for the switcher element + *----------------------------------------------------------------------------*/ +static void +eos_signal_handler(GstElement * element, + gpointer userData) +{ + GstElement * container = GST_ELEMENT(userData); + + g_return_if_fail(container != NULL); + g_return_if_fail(GST_IS_ELEMENT(container)); + + // set the container into eos state + gst_element_set_eos(container); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: mp3Test(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3File, "2s;1s-4s"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Open ended test + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: mp3OpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3File, "2s;2s-"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: oggVorbisTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggVorbisFile, "2s;1s-4s"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Open ended test + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: oggVorbisOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggVorbisFile, "2s;2s-"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: smilTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(smilFile, "2s;1s-4s"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Open ended test + *----------------------------------------------------------------------------*/ +void +PartialPlayTest :: smilOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(smilFile, "2s;2s-"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + diff --git a/campcaster/src/modules/gstreamerElements/src/PartialPlayTest.h b/campcaster/src/modules/gstreamerElements/src/PartialPlayTest.h new file mode 100644 index 000000000..0882b4e0d --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/PartialPlayTest.h @@ -0,0 +1,167 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef PartialPlayTest_h +#define PartialPlayTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the partialplay gstreamer element. + * + * @author $Author$ + * @version $Revision$ + */ +class PartialPlayTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(PartialPlayTest); + CPPUNIT_TEST(mp3Test); + CPPUNIT_TEST(mp3OpenEndedTest); + CPPUNIT_TEST(oggVorbisTest); + CPPUNIT_TEST(oggVorbisOpenEndedTest); + CPPUNIT_TEST(smilTest); + CPPUNIT_TEST(smilOpenEndedTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Play a file, with a specific partial play config. + * + * @param audioFile the file to play + * @param config the partial play config to use when playing the file + * @return the number of milliseconds played. + * @exception CPPUNIT_NS::Exception on test failures. + */ + gint64 + playFile(const char * audioFile, + const char * config) + throw (CPPUNIT_NS::Exception); + + + protected: + + /** + * A simple mp3 smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3Test(void) throw (CPPUNIT_NS::Exception); + + /** + * An open ended mp3 play test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3OpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple ogg vorbis smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisTest(void) throw (CPPUNIT_NS::Exception); + + /** + * An open ended ogg vorbis play test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisOpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple SMIL smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilTest(void) throw (CPPUNIT_NS::Exception); + + /** + * An open ended SMIL play test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilOpenEndedTest(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 GstreamerElements +} // namespace LiveSupport + +#endif // PartialPlayTest_h + diff --git a/campcaster/src/modules/gstreamerElements/src/SeekPackTest.cxx b/campcaster/src/modules/gstreamerElements/src/SeekPackTest.cxx new file mode 100644 index 000000000..0be83b94f --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/SeekPackTest.cxx @@ -0,0 +1,370 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include + +#include "seek-pack.h" +#include "SeekPackTest.h" + + +using namespace LiveSupport::GstreamerElements; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(SeekPackTest); + +/** + * An mp3 test file. + */ +static const char * mp3File = "var/5seccounter.mp3"; + +/** + * An ogg vorbis test file. + */ +static const char * oggVorbisFile = "var/5seccounter.ogg"; + +/** + * A smil test file. + */ +static const char * smilFile = "var/simple.smil"; + + +/* =============================================== local function prototypes */ + +/** + * Signal handler for the eos event of the switcher element. + * + * @param element the element emitting the eos signal + * @param userData pointer to the container bin of the switcher. + */ +static void +eos_signal_handler(GstElement * element, + gpointer userData); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +gint64 +SeekPackTest :: playFile(const char * audioFile, + gint64 silenceDuration, + gint64 playFrom, + gint64 playTo) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * source; + LivesupportSeekPack * seekPack; + GstCaps * caps; + GstElement * sink; + GstFormat format; + gint64 timePlayed; + + /* initialize GStreamer */ + gst_init(0, 0); + + caps = gst_caps_new_simple("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "channels", G_TYPE_INT, 2, + "rate", G_TYPE_INT, 44100, + NULL); + + /* create elements */ + pipeline = gst_pipeline_new("audio-player"); + source = gst_element_factory_make("filesrc", "filesource"); + seekPack = livesupport_seek_pack_new("seekPack", caps); + sink = gst_element_factory_make("alsasink", "alsaoutput"); + + /* set filename property on the file source */ + g_object_set(G_OBJECT (source), "location", audioFile, NULL); + + livesupport_seek_pack_init(seekPack, + source, + silenceDuration, + playFrom, + playTo); + g_signal_connect(seekPack->bin, + "eos", + G_CALLBACK(eos_signal_handler), + pipeline); + + livesupport_seek_pack_link(seekPack, sink); + + livesupport_seek_pack_add_to_bin(seekPack, GST_BIN(pipeline)); + gst_bin_add(GST_BIN(pipeline), sink); + + gst_element_set_state(sink, GST_STATE_READY); + livesupport_seek_pack_set_state(seekPack, GST_STATE_PLAYING); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + while (gst_bin_iterate(GST_BIN(pipeline))); + + format = GST_FORMAT_TIME; + gst_element_query(sink, GST_QUERY_POSITION, &format, &timePlayed); + + /* clean up nicely */ + gst_element_set_state(pipeline, GST_STATE_NULL); + livesupport_seek_pack_destroy(seekPack); + gst_object_unref(GST_OBJECT(pipeline)); + + return timePlayed; +} + + +/*------------------------------------------------------------------------------ + * eos signal handler for the switcher element + *----------------------------------------------------------------------------*/ +static void +eos_signal_handler(GstElement * element, + gpointer userData) +{ + GstElement * container = GST_ELEMENT(userData); + + g_return_if_fail(container != NULL); + g_return_if_fail(GST_IS_ELEMENT(container)); + + // set the container into eos state + gst_element_set_eos(container); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: mp3Test(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3File, + 2LL * GST_SECOND, + 1LL * GST_SECOND, + 3LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A test with no silence. + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: mp3NoSilenceTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3File, + 0LL * GST_SECOND, + 1LL * GST_SECOND, + 3LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 1.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 2.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Open ended test + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: mp3OpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3File, + 2LL * GST_SECOND, + 1LL * GST_SECOND, + -1LL); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 5.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 6.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple test with an ogg vorbis file + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: oggVorbisTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggVorbisFile, + 2LL * GST_SECOND, + 1LL * GST_SECOND, + 3LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A no silence test with an ogg vorbis file + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: oggVorbisNoSilenceTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggVorbisFile, + 0LL * GST_SECOND, + 1LL * GST_SECOND, + 3LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 1.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 2.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * An open ended test with an ogg vorbis file + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: oggVorbisOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggVorbisFile, + 2LL * GST_SECOND, + 1LL * GST_SECOND, + -1LL); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple test with a SMIL file + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: smilTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(smilFile, + 2LL * GST_SECOND, + 1LL * GST_SECOND, + 3LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple test with a SMIL file, without silence + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: smilNoSilenceTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(smilFile, + 0LL * GST_SECOND, + 1LL * GST_SECOND, + 3LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 1.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 2.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple test with a SMIL file, playing until EOS + *----------------------------------------------------------------------------*/ +void +SeekPackTest :: smilOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(smilFile, + 2LL * GST_SECOND, + 1LL * GST_SECOND, + -1LL); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + diff --git a/campcaster/src/modules/gstreamerElements/src/SeekPackTest.h b/campcaster/src/modules/gstreamerElements/src/SeekPackTest.h new file mode 100644 index 000000000..238e94236 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/SeekPackTest.h @@ -0,0 +1,199 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SeekPackTest_h +#define SeekPackTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the SeekPack structure. + * + * @author $Author$ + * @version $Revision$ + */ +class SeekPackTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(SeekPackTest); + CPPUNIT_TEST(mp3Test); + CPPUNIT_TEST(mp3NoSilenceTest); + CPPUNIT_TEST(mp3OpenEndedTest); + CPPUNIT_TEST(oggVorbisTest); + CPPUNIT_TEST(oggVorbisNoSilenceTest); + CPPUNIT_TEST(oggVorbisOpenEndedTest); + CPPUNIT_TEST(smilTest); + CPPUNIT_TEST(smilNoSilenceTest); + CPPUNIT_TEST(smilOpenEndedTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Play a file, with a specific partial play config. + * + * @param audioFile the file to play + * @param silenceDuration the amount of silence before playing + * @param playFrom play the audio file from this offset + * @param playTo play the audio file until this offset, + * or -1LL if until the end. + * @return the number of milliseconds played. + * @exception CPPUNIT_NS::Exception on test failures. + */ + gint64 + playFile(const char * audioFile, + gint64 silenceDuration, + gint64 playFrom, + gint64 playTo) + throw (CPPUNIT_NS::Exception); + + + protected: + + /** + * A simple mp3 smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3Test(void) throw (CPPUNIT_NS::Exception); + + /** + * An mp3 test with no silence. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3NoSilenceTest(void) throw (CPPUNIT_NS::Exception); + + /** + * An open ended mp3 play test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3OpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Try SeekPack on an ogg vorbis file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Try SeekPack on an ogg vorbis file, without playing silence. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisNoSilenceTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Try SeekPack on an ogg vorbis file, playing until EOS. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisOpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Try SeekPack on a SMIL file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Try SeekPack on a SMIL file, with no silence in the front. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilNoSilenceTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Try SeekPack on a SMIL file, playing until EOS. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilOpenEndedTest(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 GstreamerElements +} // namespace LiveSupport + +#endif // SeekPackTest_h + diff --git a/campcaster/src/modules/gstreamerElements/src/SeekTest.cxx b/campcaster/src/modules/gstreamerElements/src/SeekTest.cxx new file mode 100644 index 000000000..18924b908 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/SeekTest.cxx @@ -0,0 +1,298 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include + +#include "LiveSupport/GstreamerElements/autoplug.h" +#include "seek.h" +#include "SeekTest.h" + + +using namespace LiveSupport::GstreamerElements; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(SeekTest); + +/** + * An mp3 test file. + */ +static const char * mp3File = "var/5seccounter.mp3"; + +/** + * An Ogg Vorbis test file. + */ +static const char * oggVorbisFile = "var/5seccounter.ogg"; + +/** + * An smil test file. + */ +static const char * smilFile = "var/simple.smil"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +SeekTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +SeekTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Play an audio file + *----------------------------------------------------------------------------*/ +gint64 +SeekTest :: playFile(const char * audioFile, + gint64 seekTo, + gint64 playTo) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * source; + GstElement * decoder; + GstElement * sink; + GstSeekType seekType; + GstCaps * caps; + GstFormat format; + gint64 timePlayed; + gint64 timeAfterSeek; + gboolean ret; + + /* initialize GStreamer */ + gst_init(0, 0); + + caps = gst_caps_new_simple("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "channels", G_TYPE_INT, 2, + "rate", G_TYPE_INT, 44100, + NULL); + + /* create elements */ + seekType = (GstSeekType) (GST_FORMAT_TIME | + GST_SEEK_METHOD_SET | + GST_SEEK_FLAG_FLUSH); + + pipeline = gst_pipeline_new("audio-player"); + source = gst_element_factory_make("filesrc", "source"); + sink = gst_element_factory_make("alsasink", "alsa-output"); + + g_object_set(G_OBJECT(source), "location", audioFile, NULL); + + decoder = ls_gst_autoplug_plug_source(source, "decoder", caps); + + if (!decoder) { + gst_object_unref(GST_OBJECT(sink)); + gst_object_unref(GST_OBJECT(source)); + gst_object_unref(GST_OBJECT(pipeline)); + + return 0LL; + } + + gst_element_link(decoder, sink); + gst_bin_add_many(GST_BIN(pipeline), source, decoder, sink, NULL); + + gst_element_set_state(source, GST_STATE_PLAYING); + gst_element_set_state(decoder, GST_STATE_PAUSED); + gst_element_set_state(sink, GST_STATE_PAUSED); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + // iterate on the pipline until the played time becomes more than 0 + // as the seek even will only be taken into consideration after that + // by gstreamer + for (timePlayed = 0; + timePlayed == 0 && gst_bin_iterate(GST_BIN(pipeline)); ) { + + format = GST_FORMAT_TIME; + gst_element_query(sink, GST_QUERY_POSITION, &format, &timePlayed); + } + + // so, seek now + timeAfterSeek = -1LL; + ret = livesupport_seek(decoder, seekType, seekTo); + CPPUNIT_ASSERT(ret); + + // iterate until playTo is reached + while (gst_bin_iterate(GST_BIN(pipeline))) { + format = GST_FORMAT_TIME; + gst_element_query(sink, GST_QUERY_POSITION, &format, &timePlayed); + + if (timeAfterSeek == -1LL && timePlayed > seekTo) { + timeAfterSeek = timePlayed; + } + + if (playTo > 0 && timePlayed > playTo) { + break; + } + } + + /* clean up nicely */ + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT (pipeline)); + + return timePlayed - timeAfterSeek; +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +SeekTest :: mp3Test(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3File, 1LL * GST_SECOND, 4LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Seek and play until the end of the auido file. + *----------------------------------------------------------------------------*/ +void +SeekTest :: mp3OpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + // see http://bugzilla.gnome.org/show_bug.cgi?id=308312 + // as why this seek is not precise + timePlayed = playFile(mp3File, 2LL * GST_SECOND, -1LL); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + +/*------------------------------------------------------------------------------ + * A simple smoke test on an Ogg Vorbis file. + *----------------------------------------------------------------------------*/ +void +SeekTest :: oggVorbisTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggVorbisFile, 1LL * GST_SECOND, 4LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Seek and play an ogg vorbis file until the end of the auido file. + *----------------------------------------------------------------------------*/ +void +SeekTest :: oggVorbisOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + // see http://bugzilla.gnome.org/show_bug.cgi?id=308312 + // as why this seek is not precise + timePlayed = playFile(oggVorbisFile, 2LL * GST_SECOND, -1LL); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test on a SMIL file. + *----------------------------------------------------------------------------*/ +void +SeekTest :: smilTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(smilFile, 1LL * GST_SECOND, 4LL * GST_SECOND); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Seek and play a SMIL file until the end of the auido file. + *----------------------------------------------------------------------------*/ +void +SeekTest :: smilOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + // see http://bugzilla.gnome.org/show_bug.cgi?id=308312 + // as why this seek is not precise + timePlayed = playFile(oggVorbisFile, 2LL * GST_SECOND, -1LL); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + diff --git a/campcaster/src/modules/gstreamerElements/src/SeekTest.h b/campcaster/src/modules/gstreamerElements/src/SeekTest.h new file mode 100644 index 000000000..ec6275b3a --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/SeekTest.h @@ -0,0 +1,170 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SeekTest_h +#define SeekTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the partialplay gstreamer element. + * + * @author $Author$ + * @version $Revision$ + */ +class SeekTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(SeekTest); + CPPUNIT_TEST(mp3Test); + CPPUNIT_TEST(mp3OpenEndedTest); + CPPUNIT_TEST(oggVorbisTest); + CPPUNIT_TEST(oggVorbisOpenEndedTest); + CPPUNIT_TEST(smilTest); + CPPUNIT_TEST(smilOpenEndedTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Play a specific file, from and until a specific timepoint. + * + * @param audioFile the audio file to play. + * @param seekTo before playing, seek to this position. + * @param playTo play until this position, or -1LL if play until + * the end. + * @return the number of milliseconds played. + * @exception CPPUNIT_NS::Exception on test failures. + */ + gint64 + playFile(const char * audioFile, + gint64 seekTo, + gint64 playTo) + throw (CPPUNIT_NS::Exception); + + + protected: + + /** + * A simple mp3 test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3Test(void) throw (CPPUNIT_NS::Exception); + + /** + * A test where an mp3 file is played until its end. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3OpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple ogg vorbis test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test where an ogg vorbis file is played until its end. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisOpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple SMIL test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test where an SMIL file is played until its end. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilOpenEndedTest(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 GstreamerElements +} // namespace LiveSupport + +#endif // SeekTest_h + diff --git a/campcaster/src/modules/gstreamerElements/src/SwitcherTest.cxx b/campcaster/src/modules/gstreamerElements/src/SwitcherTest.cxx new file mode 100644 index 000000000..656f32b8d --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/SwitcherTest.cxx @@ -0,0 +1,415 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include + +#include "LiveSupport/GstreamerElements/autoplug.h" +#include "SwitcherTest.h" + + +using namespace LiveSupport::GstreamerElements; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(SwitcherTest); + +/** + * An mp3 test file. + */ +static const char * mp3File = "var/5seccounter.mp3"; + +/** + * An ogg vorbis test file. + */ +static const char * oggVorbisFile = "var/5seccounter.ogg"; + +/** + * A SMIL test file. + */ +static const char * smilFile = "var/simple.smil"; + + +/* =============================================== local function prototypes */ + +/** + * Signal handler for the eos event of the switcher element. + * + * @param element the element emitting the eos signal + * @param userData pointer to the container bin of the switcher. + */ +static void +eos_signal_handler(GstElement * element, + gpointer userData); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Play an audio file + *----------------------------------------------------------------------------*/ +gint64 +SwitcherTest :: playFiles(const char ** audioFiles, + unsigned int noFiles, + const char * sourceConfig) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * switcher; + GstElement * sink; + GstCaps * caps; + unsigned int i; + GstFormat format; + gint64 timePlayed; + + /* initialize GStreamer */ + gst_init(0, 0); + + caps = gst_caps_new_simple("audio/x-raw-int", + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "channels", G_TYPE_INT, 2, + "rate", G_TYPE_INT, 44100, + NULL); + + /* create elements */ + pipeline = gst_pipeline_new("audio-player"); + switcher = gst_element_factory_make("switcher", "switcher"); + sink = gst_element_factory_make("alsasink", "alsa-output"); + + for (i = 0; i < noFiles; ++i) { + GstElement * source; + GstElement * decoder; + char str[256]; + gboolean ret; + + g_snprintf(str, 256, "source_%d", i); + source = gst_element_factory_make("filesrc", str); + CPPUNIT_ASSERT(source); + g_object_set(G_OBJECT(source), "location", audioFiles[i], NULL); + + g_snprintf(str, 256, "decoder_%d", i); + decoder = ls_gst_autoplug_plug_source(source, str, caps); + CPPUNIT_ASSERT(decoder); + + ret = gst_element_link(decoder, switcher); + CPPUNIT_ASSERT(ret); + gst_bin_add_many(GST_BIN(pipeline), source, decoder, NULL); + } + + /* link and add the switcher & sink _after_ the decoders above + * otherwise we'll get a: + * "assertion failed: (group->group_links == NULL)" + * error later on when trying to free up the pipeline + * see http://bugzilla.gnome.org/show_bug.cgi?id=309122 + */ + gst_element_link_many(switcher, sink, NULL); + gst_bin_add_many(GST_BIN(pipeline), switcher, sink, NULL); + + g_object_set(G_OBJECT(switcher), "source-config", sourceConfig, NULL); + /* listen for the eos event on switcher, so the pipeline can be stopped */ + g_signal_connect(switcher, "eos", G_CALLBACK(eos_signal_handler), pipeline); + + gst_element_set_state(sink, GST_STATE_PAUSED); + /* set the switcher to PAUSED, as it will give + * "trying to push on unnegotiaded pad" warnings otherwise */ + gst_element_set_state(switcher, GST_STATE_PAUSED); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + while (gst_bin_iterate(GST_BIN(pipeline))); + + format = GST_FORMAT_TIME; + gst_element_query(sink, GST_QUERY_POSITION, &format, &timePlayed); + + /* clean up nicely */ + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT (pipeline)); + + return timePlayed; +} + + +/*------------------------------------------------------------------------------ + * eos signal handler for the switcher element + *----------------------------------------------------------------------------*/ +static void +eos_signal_handler(GstElement * element, + gpointer userData) +{ + GstElement * container = GST_ELEMENT(userData); + + g_return_if_fail(container != NULL); + g_return_if_fail(GST_IS_ELEMENT(container)); + + // set the container into eos state + gst_element_set_eos(container); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: mp3Test(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(&mp3File, 1, "0[3s]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: mp3OpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(&mp3File, 1, "0[]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: mp3MultipleTest(void) + throw (CPPUNIT_NS::Exception) +{ + const char * testFiles[] = { mp3File, mp3File }; + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(testFiles, 2, "0[2s];1[2s]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: mp3MultipleOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + const char * testFiles[] = { mp3File, mp3File }; + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(testFiles, 2, "0[2s];1[]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 6.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 7.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: oggVorbisTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(&oggVorbisFile, 1, "0[3s]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: oggVorbisOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(&oggVorbisFile, 1, "0[]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: oggVorbisMultipleTest(void) + throw (CPPUNIT_NS::Exception) +{ + const char * testFiles[] = { oggVorbisFile, oggVorbisFile }; + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(testFiles, 2, "0[2s];1[2s]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: oggVorbisMultipleOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + const char * testFiles[] = { oggVorbisFile, oggVorbisFile }; + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(testFiles, 2, "0[2s];1[]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 6.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 7.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: smilTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(&smilFile, 1, "0[3s]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 2.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 3.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: smilOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(&smilFile, 1, "0[]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: smilMultipleTest(void) + throw (CPPUNIT_NS::Exception) +{ + const char * testFiles[] = { smilFile, smilFile }; + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(testFiles, 2, "0[2s];1[2s]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 3.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 4.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * Play a file until its end. + *----------------------------------------------------------------------------*/ +void +SwitcherTest :: smilMultipleOpenEndedTest(void) + throw (CPPUNIT_NS::Exception) +{ + const char * testFiles[] = { smilFile, smilFile }; + gint64 timePlayed; + char str[256]; + + timePlayed = playFiles(testFiles, 2, "0[2s];1[]"); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 6.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 7.1 * GST_SECOND); +} + + diff --git a/campcaster/src/modules/gstreamerElements/src/SwitcherTest.h b/campcaster/src/modules/gstreamerElements/src/SwitcherTest.h new file mode 100644 index 000000000..7b39429e5 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/SwitcherTest.h @@ -0,0 +1,226 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ +#ifndef SwitcherTest_h +#define SwitcherTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the partialplay gstreamer element. + * + * @author $Author$ + * @version $Revision$ + */ +class SwitcherTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(SwitcherTest); + CPPUNIT_TEST(mp3Test); + CPPUNIT_TEST(mp3OpenEndedTest); + CPPUNIT_TEST(mp3MultipleTest); + CPPUNIT_TEST(mp3MultipleOpenEndedTest); + CPPUNIT_TEST(oggVorbisTest); + CPPUNIT_TEST(oggVorbisOpenEndedTest); + CPPUNIT_TEST(oggVorbisMultipleTest); + CPPUNIT_TEST(oggVorbisMultipleOpenEndedTest); + CPPUNIT_TEST(smilTest); + CPPUNIT_TEST(smilOpenEndedTest); + CPPUNIT_TEST(smilMultipleTest); + CPPUNIT_TEST(smilMultipleOpenEndedTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Play audio files, with a specific switcher configuration. + * + * @param audioFiles an array of file names to play + * @param noFiles the size of the audioFiles array. + * @param sourceConfig the source config to use. + * @return the number of milliseconds played. + * @exception CPPUNIT_NS::Exception on test failures. + */ + gint64 + playFiles(const char ** audioFiles, + unsigned int noFiles, + const char * sourceConfig) + throw (CPPUNIT_NS::Exception); + + + protected: + + /** + * A simple smoke test with an mp3 file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3Test(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to play an mp3 file until its end. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3OpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the switcher with multiple mp3 inputs. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3MultipleTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the switcher with multiple mp3 inputs, + * including open-ended ones. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + mp3MultipleOpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple smoke test with an ogg vorbis file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to play an ogg vorbis file until its end. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisOpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the switcher with multiple ogg vorbis inputs. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisMultipleTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the switcher with multiple ogg vorbis inputs, + * including open-ended ones. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisMultipleOpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A simple smoke test with a SMIL file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilTest(void) throw (CPPUNIT_NS::Exception); + + /** + * A test to play a SMIL file until its end. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilOpenEndedTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the switcher with multiple SMIL inputs. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilMultipleTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test the switcher with multiple SMIL inputs, + * including open-ended ones. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + smilMultipleOpenEndedTest(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 GstreamerElements +} // namespace LiveSupport + +#endif // SwitcherTest_h + diff --git a/campcaster/src/modules/gstreamerElements/src/TestRunner.cxx b/campcaster/src/modules/gstreamerElements/src/TestRunner.cxx new file mode 100644 index 000000000..aeece9178 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/TestRunner.cxx @@ -0,0 +1,286 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#if HAVE_UNISTD_H +#include +#else +#error "Need unistd.h" +#endif + +#if HAVE_GETOPT_H +#include +#else +#error "Need getopt.h" +#endif + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "LiveSupport/Core/Ptr.h" + + +using namespace LiveSupport::Core; + +/* =================================================== 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[] = "ho:s:v"; + +/** + * Structure describing the long options + */ +static const struct option longOptions[] = { + { "help", no_argument, 0, 'h' }, + { "output", required_argument, 0, 'o' }, + { "stylesheet", required_argument, 0, 's' }, + { "version", no_argument, 0, 'v' }, + { 0, 0, 0, 0 } +}; + +/** + * The encoding to use for the output file. + */ +static const std::string encoding = "utf-8"; + +/** + * The output XML file name. + */ +static Ptr::Ref xmlOutFileName; + +/** + * The XSLT attached to the output file. + */ +static Ptr::Ref xsltFileName; + + +/* =============================================== 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 ); + +/** + * Process command line arguments. + * + * @param argc the number of arguments. + * @param argv the arguments themselves. + * @return true of all went well, false in case the program should exit + * after this call. + */ +static bool +processArguments(int argc, char *argv[]); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Run all tests + *----------------------------------------------------------------------------*/ +int +main( int argc, + char * argv[] ) throw () +{ + // initialize the gst parameters + gst_init(&argc, &argv); + + if (!processArguments(argc, argv)) { + return 0; + } + + // 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(); + + // also generate an XML document as an output + std::ofstream xmlOutFile(xmlOutFileName->c_str()); + CPPUNIT_NS::XmlOutputter xmlOutputter(&result, xmlOutFile, encoding); + xmlOutputter.setStandalone(false); + if (xsltFileName) { + xmlOutputter.setStyleSheet(*xsltFileName); + } + xmlOutputter.write(); + xmlOutFile.flush(); + xmlOutFile.close(); + + return result.wasSuccessful() ? 0 : 1; +} + + +/*------------------------------------------------------------------------------ + * Process command line arguments. + *----------------------------------------------------------------------------*/ +static bool +processArguments(int argc, char *argv[]) +{ + int i; + + while ((i = getopt_long(argc, argv, options, longOptions, 0)) != -1) { + switch (i) { + case 'h': + printUsage(argv[0], std::cout); + return false; + + case 'o': + xmlOutFileName.reset(new std::string(optarg)); + break; + + case 's': + xsltFileName.reset(new std::string(optarg)); + break; + + case 'v': + printVersion(std::cout); + return false; + + default: + printUsage(argv[0], std::cout); + return false; + } + } + + if (optind < argc) { + std::cerr << "error processing command line arguments" << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + if (!xmlOutFileName) { + std::cerr << "mandatory option output file name not specified" + << std::endl; + printUsage(argv[0], std::cout); + return false; + } + + std::cerr << "writing output to '" << *xmlOutFileName << '\'' << std::endl; + if (xsltFileName) { + std::cerr << "using XSLT file '" << *xsltFileName << '\'' << std::endl; + } + + return true; +} + + +/*------------------------------------------------------------------------------ + * Print program version. + *----------------------------------------------------------------------------*/ +static void +printVersion ( std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << copyrightNotice << std::endl; +} + + +/*------------------------------------------------------------------------------ + * Print program usage. + *----------------------------------------------------------------------------*/ +static void +printUsage ( const char invocation[], + std::ostream & os ) +{ + os << PACKAGE_NAME << ' ' << PACKAGE_VERSION << std::endl + << "Unit test runner" << std::endl + << std::endl + << "Usage: " << invocation << " [OPTION]" + << std::endl + << " mandatory options:" << std::endl + << " -o, --output=file.name write test results into this XML file" + << std::endl + << " optional options:" << std::endl + << " -s, --stylesheet specify this XSLT for the output file" + << std::endl + << " this is either an absolute URI, or a" + << std::endl + << " relative path for the output document" + << 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; +} + diff --git a/campcaster/src/modules/gstreamerElements/src/autoplug.c b/campcaster/src/modules/gstreamerElements/src/autoplug.c new file mode 100644 index 000000000..310778727 --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/autoplug.c @@ -0,0 +1,826 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + This code is based on the examples/manual/dynamic.c sample file + provided in the gstreamer-0.8.10 source tarball, which is published + under the GNU LGPL license. + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include + +#include "LiveSupport/GstreamerElements/autoplug.h" + + +/* =================================================== local data structures */ + +typedef struct _Typefind Typefind; + +/** + * Data structure to hold information related to typefindinf. + */ +struct _Typefind { + GstElement * pipeline; + GstElement * bin; + GstElement * source; + GstElement * typefind; + GstElement * audiosink; + GstElement * sink; + + const GstCaps * caps; + + gulong typefindSignal; + + gboolean done; +}; + +/** + * The list of factories this autoplugger is interested in. + */ +static GList * factories = 0; + +/** + * The reference count for the autoplugger, used to determine if static + * (shared) resources should be freed. + */ +static unsigned int refCount = 0; + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + +/** + * Handle typefinding error. + * + * @param pipeline the pipeline generating the error. + * @param source the source element with the error + * @param error the error itself. + * @param message the error message. + * @param userData user-specific data. + */ +static void +autoplug_error_handler(GstElement * pipeline, + GstElement * source, + GError * error, + gchar * message, + gpointer userData); + +/** + * Handle event of the typefinder finding a type. + * + * @param typefind the typefind element that found the type. + * @param probability the probability of the find. + * @param caps the found capabilities. + * @param userData user-specific data, a pointer to a related Typefind + * structure. + */ +static void +autoplug_typefound_handler(GstElement * typefind, + gint probability, + GstCaps * caps, + gpointer userData); + +/** + * Initialize a typefind object. + * + * @param typefind the Typefind structure to init. + * @param name the name of the topmost bin element, that will + * be returned at the end of autoplugging. + * @param caps the capabilities expected from the returned element, + * on its src pad. + */ +static void +autoplug_init(Typefind * typefind, + const gchar * name, + const GstCaps * caps); + +/** + * De-initialize a typefind object. + * + * @param typefind the Typefind structure to de-init. + */ +static void +autoplug_deinit(Typefind * typefind); + +/** + * A filter specifying the kind of factories we're interested in. + * + * @param feature the feature to test + * @param userData user-specific data + * @return TRUE if we're interested in the supplied feature, FALSE otherwise + */ +static gboolean +autoplug_feature_filter(GstPluginFeature * feature, + gpointer userData); + +/** + * A comparison function based on the ranks of two features. + * + * @param feature1 one of the features to compare. + * @param feature2 the other feature to compare. + * @return 0 if the two features match in terms of their ranks, + * <0 if feature1 is higher, >0 if feature2 is higher in + * their ranks. + */ +static gint +autoplug_compare_ranks(GstPluginFeature * feature1, + GstPluginFeature * feature2); + +/** + * Type to plug an appropriate element to a pad, according to the specified + * capabilities. + * + * @param typefind the Typefind structure to do the plugging for + * @param pad the pad to plug. + * @param caps the capabilities to plug with. + */ +static void +autoplug_try_to_plug(Typefind * typefind, + GstPad * pad, + const GstCaps * caps); + +/** + * Close a found link. + * + * @param typefind the Typefind structure to do close the link for. + * @param srcpad the source pad to close linking for. + * @param sinkelement the sink element to link the src pad to. + * @param padname the name of sink pad in sinkelement to link srcpad to. + * @param templlist a pad template list (TODO: what's this for?) + */ +static void +autoplug_close_link(Typefind * typefind, + GstPad * srcpad, + GstElement * sinkelement, + const gchar * padname, + const GList * templlist); + +/** + * Handle the event of new pads created on elements with dynamic pads. + * + * @param element the element that the new pad was created on. + * @param pad the new pad. + * @param userData user-specific data. + */ +static void +autoplug_newpad(GstElement * element, + GstPad * pad, + gpointer data); + + +/** + * Remove all typefind elements inside the bin, traversing to lower binds + * if necessary. The pads linked through the removed typefind elements are + * linked directly instead. + * The typefind member of the supplied Typefind object is also removed, + * and changed to NULL. + * + * @param typefind the typefind object to work on. + * @param bin the bin to remove the typefind elements from. + */ +static void +autoplug_remove_typefind_elements(Typefind * typefind, + GstBin * bin); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Filter the features that we're interested in. + *----------------------------------------------------------------------------*/ +static gboolean +autoplug_feature_filter(GstPluginFeature * feature, + gpointer userData) +{ + GstElementFactory * factory; + const gchar * klass; + guint rank; + const GList * pads; + gboolean good; + + /* we only care about element factories */ + if (!GST_IS_ELEMENT_FACTORY(feature)) { + return FALSE; + } + factory = GST_ELEMENT_FACTORY(feature); + + /* only parsers, demuxers and decoders */ + klass = gst_element_factory_get_klass(factory); + if (g_strrstr(klass, "Demux") == NULL && + g_strrstr(klass, "Decoder") == NULL && + g_strrstr(klass, "Parse") == NULL) { + + return FALSE; + } + + /* select only the factories we care about, which are enough to + * open and plug mp3, ogg vorbis and SMIL */ + good = FALSE; + for (pads = gst_element_factory_get_pad_templates(factory); + pads != NULL; + pads = pads->next) { + + GstPadTemplate * templ = GST_PAD_TEMPLATE(pads->data); + const char * mime; + + if (!GST_IS_PAD_TEMPLATE(templ)) { + continue; + } + /* find the sink template - need an always pad*/ + if (templ->direction != GST_PAD_SINK || + templ->presence != GST_PAD_ALWAYS) { + continue; + } + + if (gst_caps_get_size(templ->caps) <= 0) { + continue; + } + + mime = gst_structure_get_name(gst_caps_get_structure(templ->caps, 0)); + + if (g_strrstr(mime, "application/x-id3") + || g_strrstr(mime, "audio/mpeg") + || g_strrstr(mime, "application/ogg") + || g_strrstr(mime, "audio/x-vorbis") + || g_strrstr(mime, "application/smil")) { + + good = TRUE; + break; + } + } + + if (!good) { + return FALSE; + } + + /* only select elements with autoplugging rank */ + rank = gst_plugin_feature_get_rank(feature); + if (rank < GST_RANK_MARGINAL) { + return FALSE; + } + + return TRUE; +} + + +/*------------------------------------------------------------------------------ + * Compare the ranks of two features. + *----------------------------------------------------------------------------*/ +static gint +autoplug_compare_ranks(GstPluginFeature * feature1, + GstPluginFeature * feature2) +{ + return gst_plugin_feature_get_rank(feature2) + - gst_plugin_feature_get_rank(feature1); +} + + +/*------------------------------------------------------------------------------ + * Initialize a Typefind object, like the factories that we care about. + *----------------------------------------------------------------------------*/ +static void +autoplug_init(Typefind * typefind, + const gchar * name, + const GstCaps * caps) +{ + /* first filter out the interesting element factories */ + if (!factories) { + /* FIXME: this is not thread safe! + * but set factoires to non-zero ASAP to avoid race conditions */ + factories = (GList *) -1; + + factories = gst_registry_pool_feature_filter( + (GstPluginFeatureFilter) autoplug_feature_filter, + FALSE, NULL); + + /* sort them according to their ranks */ + factories = g_list_sort(factories, + (GCompareFunc) autoplug_compare_ranks); + } + + typefind->pipeline = gst_pipeline_new("pipeline"); + typefind->bin = gst_bin_new(name); + typefind->typefind = gst_element_factory_make("typefind", "tf"); + typefind->audiosink = gst_element_factory_make("audioconvert", "audiosink"); + typefind->sink = gst_element_factory_make("fakesink", "fakesink"); + + typefind->caps = caps; + + gst_element_add_ghost_pad(typefind->bin, + gst_element_get_pad(typefind->typefind, "sink"), + "sink"); + gst_bin_add_many(GST_BIN(typefind->bin), + typefind->typefind, + NULL); + + g_signal_connect(typefind->bin, + "error", + G_CALLBACK(autoplug_error_handler), + NULL); + typefind->typefindSignal = g_signal_connect(typefind->typefind, + "have-type", + G_CALLBACK(autoplug_typefound_handler), + typefind); + + gst_element_link(typefind->source, typefind->bin); + gst_bin_add_many(GST_BIN(typefind->pipeline), + typefind->source, + typefind->bin, + NULL); + + typefind->done = FALSE; + + ++refCount; +} + +/*------------------------------------------------------------------------------ + * De-initialize a Typefind object. + *----------------------------------------------------------------------------*/ +static void +autoplug_deinit(Typefind * typefind) +{ + --refCount; + + if (refCount == 0) { + g_list_free(factories); + factories = 0; + } + + gst_element_set_state(typefind->pipeline, GST_STATE_NULL); + if (typefind->typefind) { + g_signal_handler_disconnect(typefind->typefind, + typefind->typefindSignal); + } + + if (typefind->audiosink && !gst_element_get_parent(typefind->audiosink)) { + gst_object_unref(GST_OBJECT(typefind->audiosink)); + } + if (typefind->sink && !gst_element_get_parent(typefind->sink)) { + gst_object_unref(GST_OBJECT(typefind->sink)); + } + gst_object_unref(GST_OBJECT(typefind->pipeline)); +} + + +/*------------------------------------------------------------------------------ + * Handle the event of a new pad being created on an element with + * request pads. + *----------------------------------------------------------------------------*/ +static void +autoplug_newpad(GstElement * element, + GstPad * pad, + gpointer userData) +{ + GstCaps * caps; + Typefind * typefind = (Typefind*) userData; + + g_return_if_fail(typefind != NULL); + + GST_DEBUG("created new pad %s for element %s", + gst_pad_get_name(pad), gst_element_get_name(element)); + caps = gst_pad_get_caps(pad); + autoplug_try_to_plug(typefind, pad, caps); + gst_caps_free(caps); +} + + + +/*------------------------------------------------------------------------------ + * Close the link. + *----------------------------------------------------------------------------*/ +static void +autoplug_close_link(Typefind * typefind, + GstPad * srcpad, + GstElement * sinkelement, + const gchar * padname, + const GList * templlist) +{ + GstPad * pad; + gboolean has_dynamic_pads = FALSE; + GstElement * srcelement; + + srcelement = GST_ELEMENT(gst_pad_get_parent(srcpad)); + + GST_DEBUG("Plugging pad %s:%s to newly created %s:%s", + gst_object_get_name(GST_OBJECT(srcelement)), + gst_pad_get_name(srcpad), + gst_object_get_name(GST_OBJECT(sinkelement)), padname); + + /* add the element to the pipeline and set correct state */ + gst_bin_add(GST_BIN(typefind->bin), sinkelement); + pad = gst_element_get_pad(sinkelement, padname); + + gst_pad_link(srcpad, pad); + + /* FIXME: this is a nasty workaround for lack of time + * the minimalaudiosmil will try to read the input immediately + * from it sink pad as its set to PLAYING state, + * but that will result in a zillion such gstreamer warnings: + * "deadlock detected, disabling group 0xXXXXXX" + * but for example the vorbis demuxer needs to be in PLAYING + * state so that it can dynamically connect its request pads. + * fix this as soon as possible! + */ + if (!(g_strrstr(gst_object_get_name(GST_OBJECT(srcelement)), + "minimalaudiosmil") + || g_strrstr(gst_object_get_name(GST_OBJECT(sinkelement)), + "minimalaudiosmil"))) { + + gst_bin_sync_children_state(GST_BIN(typefind->bin)); + } + + /* if we have static source pads, link those. If we have dynamic + * source pads, listen for new-pad signals on the element */ + for ( ; templlist != NULL; templlist = templlist->next) { + GstPadTemplate *templ = GST_PAD_TEMPLATE (templlist->data); + + /* only sourcepads, no request pads */ + if (templ->direction != GST_PAD_SRC || + templ->presence == GST_PAD_REQUEST) { + continue; + } + + switch (templ->presence) { + case GST_PAD_ALWAYS: { + GstPad * pad = gst_element_get_pad(sinkelement, + templ->name_template); + GstCaps * caps = gst_pad_get_caps(pad); + + /* link */ + autoplug_try_to_plug(typefind, pad, caps); + gst_caps_free(caps); + } break; + + case GST_PAD_SOMETIMES: + has_dynamic_pads = TRUE; + break; + + default: + break; + } + } + + /* listen for newly created pads if this element supports that */ + if (has_dynamic_pads) { + g_signal_connect(sinkelement, + "new-pad", + G_CALLBACK(autoplug_newpad), + typefind); + } +} + + +/*------------------------------------------------------------------------------ + * Try to plug a pad with the specified capabilities. + *----------------------------------------------------------------------------*/ +static void +autoplug_try_to_plug(Typefind * typefind, + GstPad * pad, + const GstCaps * caps) +{ + GstObject * parent = GST_OBJECT(gst_pad_get_parent(pad)); + const gchar * mime; + const GList * item; + + g_return_if_fail(typefind != NULL); + + /* don't plug if we're already plugged */ + if (GST_PAD_IS_LINKED(gst_element_get_pad(typefind->audiosink, "sink"))) { + GST_DEBUG("Omitting link for pad %s:%s because we're already linked", + gst_object_get_name(parent), gst_pad_get_name(pad)); + return; + } + + /* as said above, we only try to plug audio... Omit video */ + mime = gst_structure_get_name(gst_caps_get_structure(caps, 0)); + if (g_strrstr(mime, "video")) { + GST_DEBUG("Omitting link for pad %s:%s because " + "mimetype %s is non-audio\n", + gst_object_get_name(parent), gst_pad_get_name(pad), mime); + return; + } + + /* can it link to the audiopad? */ + /* instead of doing a gst_caps_intersect between caps and the sink + * pad caps of typefind->audiosink, just look at the mime type of caps. + * this is sufficient, as we know that we're linking to an audioconvert + * element, that accepts audio/x-raw-int and audio/x-raw-float */ + if (g_strrstr(mime, "audio/x-raw-int") + || g_strrstr(mime, "audio/x-raw-float")) { + + GST_DEBUG("Found pad to link to audiosink - plugging is now done"); + typefind->done = TRUE; + + autoplug_close_link(typefind, pad, typefind->audiosink, "sink", NULL); + + gst_element_add_ghost_pad(typefind->bin, + gst_element_get_pad(typefind->audiosink, "src"), + "src"); + gst_element_link_filtered(typefind->bin, typefind->sink, + typefind->caps); + gst_bin_add(GST_BIN(typefind->pipeline), typefind->sink); + gst_bin_sync_children_state(GST_BIN(typefind->pipeline)); + + return; + } + + /* try to plug from our list */ + for (item = factories; item != NULL; item = item->next) { + GstElementFactory * factory = GST_ELEMENT_FACTORY(item->data); + const GList * pads; + GstCaps * res; + + for (pads = gst_element_factory_get_pad_templates(factory); + pads != NULL; + pads = pads->next) { + GstPadTemplate * templ = GST_PAD_TEMPLATE(pads->data); + const gchar * templMime; + + if (!GST_IS_PAD_TEMPLATE(templ)) { + continue; + } + /* find the sink template - need an always pad*/ + if (templ->direction != GST_PAD_SINK || + templ->presence != GST_PAD_ALWAYS) { + continue; + } + + /* first check if mime types match */ + templMime = gst_structure_get_name( + gst_caps_get_structure(templ->caps, 0)); + if (!g_strrstr(mime, templMime)) { + continue; + } + /* can it link? */ + res = gst_caps_intersect(caps, templ->caps); + if (res && !gst_caps_is_empty(res)) { + GstElement * element; + const GList * padTemplates; + gchar * templateName; + + /* close link and return */ + gst_caps_free(res); + templateName = g_strdup(templ->name_template); + element = gst_element_factory_create(factory, NULL); + padTemplates = gst_element_factory_get_pad_templates(factory); + autoplug_close_link(typefind, + pad, + element, + templateName, + padTemplates); + g_free(templateName); + return; + } + gst_caps_free(res); + + /* we only check one sink template per factory, so move on to the + * next factory now */ + break; + } + } + + /* if we get here, no item was found */ + GST_DEBUG("No compatible pad found to decode %s on %s:%s", + mime, gst_object_get_name(parent), gst_pad_get_name(pad)); +} + + +/*------------------------------------------------------------------------------ + * Handle the event when a new type was found. + *----------------------------------------------------------------------------*/ +static void +autoplug_typefound_handler(GstElement * typefind, + gint probability, + GstCaps * caps, + gpointer userData) +{ + gchar * str; + Typefind * tf = (Typefind*) userData; + + g_return_if_fail(tf != NULL); + + str = gst_caps_to_string(caps); + GST_DEBUG("Detected media type %s", str); + g_free(str); + + /* actually plug now */ + autoplug_try_to_plug(tf, gst_element_get_pad(typefind, "src"), caps); +} + + +/*------------------------------------------------------------------------------ + * Filter the features that we're interested in. + *----------------------------------------------------------------------------*/ +static void +autoplug_error_handler(GstElement * pipeline, + GstElement * source, + GError * error, + gchar * message, + gpointer userData) +{ + /* TODO: handle error somehow */ + GST_DEBUG("error: %s", message); +} + + +/*------------------------------------------------------------------------------ + * Remove all typefind elements inside the bin, traversing to lower binds + * if necessary. The pads linked to the removed typefind elements are + * linked directly instead. + *----------------------------------------------------------------------------*/ +static void +autoplug_remove_typefind_elements(Typefind * typefind, + GstBin * bin) +{ + GstElement * element; + const GList * elements; + + elements = gst_bin_get_list(GST_BIN(bin)); + while (elements) { + GstElementFactory * factory; + GType type; + + element = (GstElement*) elements->data; + factory = gst_element_get_factory(element); + type = gst_element_factory_get_element_type(factory); + + GST_DEBUG("found factory: %s of type %s, is bin: %d", + gst_element_factory_get_longname(factory), + g_type_name(type), + g_type_is_a(type, GST_TYPE_BIN)); + + if (GST_IS_BIN(element)) { + autoplug_remove_typefind_elements(typefind, GST_BIN(element)); + } else if (g_strrstr(gst_element_factory_get_longname(factory), + "TypeFind")) { + GstPad * tfSinkPad; + GstPad * tfSrcPad; + GstPad * sinkPad; + GstElement * sinkElement; + GstPad * srcPad; + GstElement * srcElement; + GstElement * parent; + GstPad * parentSrcPad; + GstPad * parentSinkPad; + + tfSinkPad = gst_element_get_pad(element, "sink"); + tfSrcPad = gst_element_get_pad(element, "src"); + sinkPad = gst_pad_get_peer(tfSrcPad); + sinkElement = gst_pad_get_parent(sinkPad); + srcPad = gst_pad_get_peer(tfSinkPad); + srcElement = gst_pad_get_parent(srcPad); + parent = (GstElement*) gst_element_get_parent(element); + parentSrcPad = gst_element_get_pad(parent, "src"); + parentSinkPad = gst_element_get_pad(parent, "sink"); + + gst_element_unlink(srcElement, element); + gst_element_unlink(element, sinkElement); + + if (GST_PAD_REALIZE(parentSrcPad) == (GstRealPad*) tfSrcPad) { + /* if the pad we want to relink is ghosted by the container */ + gst_element_remove_pad(parent, parentSrcPad); + gst_element_add_ghost_pad(parent, srcPad, "src"); + gst_element_link(parent, sinkElement); + } else if (GST_PAD_REALIZE(parentSinkPad) == + (GstRealPad*) tfSinkPad) { + /* if the pad we want to relink is ghosted by the container */ + gst_element_remove_pad(parent, parentSinkPad); + gst_element_add_ghost_pad(parent, sinkPad, "sink"); + gst_element_link(srcElement, parent); + } else { + gst_element_link(srcElement, sinkElement); + } + + gst_bin_remove(bin, element); + + if (element == typefind->typefind) { + typefind->typefind = NULL; + } + + /* start iteration from the beginning, as probably the element + * list is invalidated with us removing the typefind element */ + elements = gst_bin_get_list(GST_BIN(bin)); + continue; + } + + elements = elements->next; + } +} + + +/*------------------------------------------------------------------------------ + * Filter the features that we're interested in. + *----------------------------------------------------------------------------*/ +GstElement * +ls_gst_autoplug_plug_source(GstElement * source, + const gchar * name, + const GstCaps * caps) +{ + Typefind typefind; + GstElement * bin; + GValue gvalue = { 0 }; + + /* add an additional ref on the source, as we'll put it in a bin + * and remove it from the bin later, which will decrease the ref by one */ + g_object_ref(source); + + typefind.source = source; + autoplug_init(&typefind, name, caps); + + gst_element_set_state(typefind.audiosink, GST_STATE_PAUSED); + gst_element_set_state(typefind.sink, GST_STATE_PAUSED); + gst_element_set_state(typefind.bin, GST_STATE_PLAYING); + gst_element_set_state(typefind.pipeline, GST_STATE_PLAYING); + + /* run */ + while (!typefind.done && gst_bin_iterate(GST_BIN(typefind.pipeline))); + + /* do an extra iteration, otherwise some gstreamer elements don't get + * properly initialized, like the vorbis element. + * see http://bugs.campware.org/view.php?id=1421 for details */ + g_value_init(&gvalue, G_TYPE_STRING); + gst_element_get_property(typefind.typefind, "caps", &gvalue); + if (g_strrstr("application/ogg", g_value_get_string(&gvalue))) { + gst_bin_iterate(GST_BIN(typefind.pipeline)); + } + + if (!typefind.done) { + autoplug_deinit(&typefind); + return NULL; + } + + /* remove the sink element */ + gst_element_unlink(typefind.bin, typefind.sink); + gst_bin_remove(GST_BIN(typefind.pipeline), typefind.sink); + typefind.sink = NULL; + + /* remove the typefind elements, and re-link with the source */ + autoplug_remove_typefind_elements(&typefind, GST_BIN(typefind.bin)); + gst_element_link(typefind.source, typefind.bin); + + /* destory the pipeline, but keep source and bin */ + g_object_ref(typefind.bin); + gst_bin_remove(GST_BIN(typefind.pipeline), typefind.bin); + + bin = typefind.bin; + + autoplug_deinit(&typefind); + + gst_element_set_state(bin, GST_STATE_PAUSED); + gst_bin_sync_children_state(GST_BIN(bin)); + + return bin; +} + + +/*------------------------------------------------------------------------------ + * Return the current position of an autoplugged element + *----------------------------------------------------------------------------*/ +gint64 +ls_gst_autoplug_get_position(GstElement * element) +{ + GstFormat format; + gint64 position; + + if (!element || !GST_IS_BIN(element)) { + return 0LL; + } + + format = GST_FORMAT_TIME; + if (!gst_element_query(element, GST_QUERY_POSITION, &format, &position) + || format != GST_FORMAT_TIME) { + return 0LL; + } + + return position; +} + diff --git a/campcaster/src/modules/gstreamerElements/src/minimal-audio-smil.c b/campcaster/src/modules/gstreamerElements/src/minimal-audio-smil.c new file mode 100644 index 000000000..d30b8d99d --- /dev/null +++ b/campcaster/src/modules/gstreamerElements/src/minimal-audio-smil.c @@ -0,0 +1,979 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the Campcaster project. + http://campcaster.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + Campcaster 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. + + Campcaster 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 Campcaster; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author$ + Version : $Revision$ + Location : $URL$ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#ifdef HAVE_STRING_H +#include +#else +#error need string.h +#endif + + +#include + +#include +#include + +#include "smil-util.h" +#include "minimal-audio-smil.h" + + +/* =================================================== local data structures */ + +/** + * ElementFactory information + */ +static GstElementDetails livesupport_minimal_audio_smil_details = + GST_ELEMENT_DETAILS("MinimalAudioSmil", + "Parse/Smil", + "A minimal SMIL player, supporting only audio", + "Akos Maroy "); + +/** + * The parent class. + */ +static GstBinClass * parent_class = NULL; + +/** + * Declaration of the sink pad factory. + */ +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ( + "sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS("application/smil")); + +/** + * Declaration of the source pad factory. + */ +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ( + "src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS("audio/x-raw-int, " + "width = (int) 16, " + "depth = (int) 16, " + "endianness = (int) BYTE_ORDER, " + "channels = (int) { 1, 2 }, " + "rate = (int) [ 8000, 96000 ]")); + + +/* ================================================ local constants & macros */ + +#define NSEC_PER_SEC_FLOAT 1000000000.0 + + +#define UNREF_IF_NOT_NULL(gst_object) \ +{ \ + if ((gst_object)) { \ + gst_object_unref(GST_OBJECT(gst_object)); \ + } \ +} + +/** + * The debug definition. + */ +GST_DEBUG_CATEGORY_STATIC(minimal_audio_smil_debug); + +/** + * The plugin definition. + */ +GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "minimalaudiosmil", + "Minimal Audio-only SMIL", + plugin_init, + "$Revision$", + "GPL", + "LiveSupport", + "http://campcaster.campware.org/") + + +/* =============================================== local function prototypes */ + +/** + * Read the sink stream into memory, using a oneshotreader element. + * + * @param smil a MinimalAudioSmil object. + * @param outbuffer the buffer containing the contents of the sink stream. + * (out parameter). must be freed by g_free() after no longer needed. + * @param outlength the length of outbuffer (an out parameter). + */ +static void +read_stream_into_memory(LivesupportMinimalAudioSmil * smil, + guint8 ** outbuffer, + guint32 * outlength); + +/** + * Return the the first "" element of an XML document. + * + * @param document the XML document to return the root element for. + * @return the "" element closes to the document root, + * or NULL if no "" element found. + */ +static xmlNode * +get_body_element(xmlDocPtr document); + +/** + * Handle an "" element. + * + * @param smil a MinimalAudioSmil object. + * @param bin the container to put all the generated elements in. + * @param offset the offset in nanoseconds that the animation should + * begin at. this is usually the begin="xx" attribute value + * of the containing element. + * @param animate the "" element to handle. + * @param namePrefix name prefix to use for generated gstreamer element + * names + * @param index the index of the "" element with respect to it's + * containing element. + * @return a gstreamer element, that if linked after the containing SMIL + * element, performs the animation described by the "" + * SMIL element + */ +static GstElement * +handle_animate_element(LivesupportMinimalAudioSmil * smil, + GstBin * bin, + gint64 offset, + xmlNode * animate, + const gchar * namePrefix, + int index); + +/** + * Signal handler for the eos event of a gstreamer element. + * The handler will set the gstreamer element pointed to by userData + * to eos as well. + * + * @param element the element emitting the eos signal + * @param userData pointer to a gstreamer element to put into eos state. + */ +static void +element_eos_signal_handler(GstElement * element, + gpointer userData); + +/** + * Handle an "