#!/bin/sh


prefix=gst
templatedir=element-templates

while [ "$1" ] ; do
  case $1 in
    --help)
      cat <<-EOF
Usage: gst-project-maker [OPTIONS] PROJECT_NAME
Create an autotools project based on GStreamer from a template.
Options:
  --help             Print this information
  --prefix PREFIX    Use PREFIX instead of "gst"
Example: 'gst-project-maker my_project' will create the project gst-my-project.
EOF
      exit 0
      ;;
    --prefix)
      shift
      prefix=$1
      ;;
    -*)
      echo Unknown option: $1
      exit 1
      ;;
    *)
      if [ "$name" = "" ]; then
        name=$1
      else
        echo Ignored: $1
      fi
  esac
  shift
done

if [ "$name" = "" ] ; then
  echo "Usage: gst-project-maker [OPTIONS] PROJECT_NAME"
  exit 1
fi


PREFIX=$(echo $prefix | sed -e 's/\(.*\)/\U\1/')
NAME=$(echo $name | sed -e 's/\(.*\)/\U\1/')
Prefix=$(echo $prefix | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')
Name=$(echo $name | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')

if [ "$prefix" != "gst" ] ; then
  cmdline_prefix="--prefix $prefix"
else
  cmdline_prefix=""
fi

GST_IS_REPLACE=${PREFIX}_IS_${NAME}
GST_REPLACE=${PREFIX}_${NAME}
GST_TYPE_REPLACE=${PREFIX}_TYPE_${NAME}
GstReplace=${Prefix}${Name}
gst_replace=${prefix}_${name}
gst__replace=${prefix}-${name}
gstreplace=${prefix}$(echo $name | sed -e 's/_//g')
replace=$(echo $name | sed -e 's/_//g')

if [ "$REAL_NAME" = "" ] ; then
  REAL_NAME=FIXME
fi
if [ "$EMAIL_ADDRESS" = "" ] ; then
  EMAIL_ADDRESS=fixme@example.com
fi



basedir=`pwd`/$gst__replace

rm -rf $basedir
mkdir $basedir

cat >$basedir/AUTHORS <<EOF
$REAL_NAME <$EMAIL_ADDRESS>
EOF

cat >$basedir/COPYING <<EOF
Put your license here.
EOF

cat >$basedir/ChangeLog <<EOF
Put your changelog here.
EOF

cat >$basedir/NEWS <<EOF
News about your project.
EOF

cat >$basedir/README <<EOF
README for your project.
EOF

cat >$basedir/autogen.sh <<EOF
#!/bin/sh
# you can either set the environment variables AUTOCONF, AUTOHEADER, AUTOMAKE,
# ACLOCAL, AUTOPOINT and/or LIBTOOLIZE to the right versions, or leave them
# unset and get the defaults

autoreconf --verbose --force --install --make || {
 echo 'autogen.sh failed';
 exit 1;
}

./configure || {
 echo 'configure failed';
 exit 1;
}

echo
echo "Now type 'make' to compile this module."
echo
EOF
chmod 755 $basedir/autogen.sh

cat >$basedir/configure.ac <<EOF
dnl required version of autoconf
AC_PREREQ([2.53])

dnl TODO: fill in your package name and package version here
AC_INIT([${gst__replace}],[1.0.0])

dnl required versions of gstreamer and plugins-base
GST_REQUIRED=1.0.0
GSTPB_REQUIRED=1.0.0

AC_CONFIG_SRCDIR([plugins/${gstreplace}.c])
AC_CONFIG_HEADERS([config.h])

dnl required version of automake
AM_INIT_AUTOMAKE([1.10])
AC_CONFIG_MACRO_DIR([m4])

dnl enable mainainer mode by default
AM_MAINTAINER_MODE([enable])

dnl check for tools (compiler etc.)
AC_PROG_CC
AM_PROG_CC_C_O

dnl required version of libtool
LT_PREREQ([2.2.6])
LT_INIT

dnl give error and exit if we don't have pkgconfig
AC_CHECK_PROG(HAVE_PKGCONFIG, pkg-config, [ ], [
  AC_MSG_ERROR([You need to have pkg-config installed!])
])

dnl Check for the required version of GStreamer core (and gst-plugins-base)
dnl This will export GST_CFLAGS and GST_LIBS variables for use in Makefile.am
dnl
dnl If you need libraries from gst-plugins-base here, also add:
dnl for libgstaudio-1.0: gstreamer-audio-1.0 >= \$GST_REQUIRED
dnl for libgstvideo-1.0: gstreamer-video-1.0 >= \$GST_REQUIRED
dnl for libgsttag-1.0: gstreamer-tag-1.0 >= \$GST_REQUIRED
dnl for libgstpbutils-1.0: gstreamer-pbutils-1.0 >= \$GST_REQUIRED
dnl for libgstfft-1.0: gstreamer-fft-1.0 >= \$GST_REQUIRED
dnl for libgstinterfaces-1.0: gstreamer-interfaces-1.0 >= \$GST_REQUIRED
dnl for libgstrtp-1.0: gstreamer-rtp-1.0 >= \$GST_REQUIRED
dnl for libgstrtsp-1.0: gstreamer-rtsp-1.0 >= \$GST_REQUIRED
dnl etc.
PKG_CHECK_MODULES(GST, [
  gstreamer-1.0 >= \$GST_REQUIRED
  gstreamer-base-1.0 >= \$GST_REQUIRED
  gstreamer-controller-1.0 >= \$GST_REQUIRED
], [
  AC_SUBST(GST_CFLAGS)
  AC_SUBST(GST_LIBS)
], [
  AC_MSG_ERROR([
      You need to install or upgrade the GStreamer development
      packages on your system. On debian-based systems these are
      libgstreamer1.0-dev and libgstreamer-plugins-base1.0-dev.
      on RPM-based systems gstreamer1.0-devel, libgstreamer1.0-devel
      or similar. The minimum version required is \$GST_REQUIRED.
  ])
])

dnl check if compiler understands -Wall (if yes, add -Wall to GST_CFLAGS)
AC_MSG_CHECKING([to see if compiler understands -Wall])
save_CFLAGS="\$CFLAGS"
CFLAGS="\$CFLAGS -Wall"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ ], [ ])], [
  GST_CFLAGS="\$GST_CFLAGS -Wall"
  AC_MSG_RESULT([yes])
], [
  AC_MSG_RESULT([no])
])

dnl set the plugindir where plugins should be installed (for plugins/Makefile.am)
if test "x\${prefix}" = "x\$HOME"; then
  plugindir="\$HOME/.gstreamer-1.0/plugins"
else
  plugindir="\\\$(libdir)/gstreamer-1.0"
fi
AC_SUBST(plugindir)

dnl set proper LDFLAGS for plugins
GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*'
AC_SUBST(GST_PLUGIN_LDFLAGS)

AC_CONFIG_FILES([Makefile plugins/Makefile tools/Makefile])
AC_OUTPUT
EOF

cat >$basedir/Makefile.am <<EOF
SUBDIRS = plugins tools

EXTRA_DIST = autogen.sh

ACLOCAL_AMFLAGS = -I m4
EOF

mkdir -p $basedir/m4

mkdir -p $basedir/plugins

cat >$basedir/plugins/Makefile.am <<EOF
plugin_LTLIBRARIES = lib$gstreplace.la

# sources used to compile this plug-in
lib${gstreplace}_la_SOURCES = ${gstreplace}plugin.c ${gstreplace}.c ${gstreplace}.h

# compiler and linker flags used to compile this plugin, set in configure.ac
lib${gstreplace}_la_CFLAGS = \$(GST_CFLAGS)
lib${gstreplace}_la_LIBADD = \$(GST_LIBS)
lib${gstreplace}_la_LDFLAGS = \$(GST_PLUGIN_LDFLAGS)
lib${gstreplace}_la_LIBTOOLFLAGS = \$(GST_PLUGIN_LIBTOOLFLAGS)

EOF


generate()
{
cat <<EOF
/*
 * GStreamer
 * Copyright (C) $(date +%Y) $REAL_NAME <$EMAIL_ADDRESS>
 * 
 * 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
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Alternatively, the contents of this file may be used under the
 * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
 * which case the following provisions apply instead of the ones
 * mentioned above:
 *
 * 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; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <gst/gst.h>
#include "gstreplace.h"

static gboolean
plugin_init (GstPlugin * plugin)
{
  gst_element_register (plugin, "replace", GST_RANK_NONE,
      GST_TYPE_REPLACE);

  return TRUE;
}

GST_PLUGIN_DEFINE (
    GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    replace,
    "FIXME Template plugin",
    plugin_init,
    VERSION,
    "LGPL", /* FIXME */
    "GStreamer",
    "http://gstreamer.net/"
)
EOF
}


generate | sed \
  -e "s/GST_BASE_REPLACE/$GST_BASE_REPLACE/g" \
  -e "s/GST_TYPE_BASE_REPLACE/$GST_TYPE_BASE_REPLACE/g" \
  -e "s/GstBaseReplace/$GstBaseReplace/g" \
  -e "s/GST_IS_REPLACE/$GST_IS_REPLACE/g" \
  -e "s/GST_REPLACE/$GST_REPLACE/g" \
  -e "s/GST_TYPE_REPLACE/$GST_TYPE_REPLACE/g" \
  -e "s/GstReplace/$GstReplace/g" \
  -e "s/gst_replace/$gst_replace/g" \
  -e "s/gstreplace/$gstreplace/g" \
  -e "s/replace/$replace/g" >$basedir/plugins/${gstreplace}plugin.c

gst-indent $basedir/plugins/${gstreplace}plugin.c
rm -f $basedir/plugins/${gstreplace}plugin.c~

cat >$basedir/plugins/${gstreplace}.c <<EOF
/* This file should be replaced by element source generated by
 * gst-element-maker, or by your own source code.  To generate suitable
 * element source using gst-element-maker, run:
 *
 *   gst-element-maker $cmdline_prefix $replace BASE_CLASS
 *
 * Where BASE_CLASS is replaced by one of the base class templates,
 * such as basesrc, basetransform, audiofilter, videofilter2, etc.
 * Then copy the resulting $gstreplace.c file over this file, and
 * $gstreplace.h over $gstreplace.h.
 */
/* The rest of this file is shim code to allow the project to compile */
EOF

cat >$basedir/plugins/${gstreplace}.h <<EOF
/* This file should be replaced by element header generated by
 * gst-element-maker, or by your own source code.  To generate suitable
 * element header using gst-element-maker, run:
 *
 *   gst-element-maker $cmdline_prefix $replace BASE_CLASS
 *
 * Where BASE_CLASS is replaced by one of the base class templates,
 * such as basesrc, basetransform, audiofilter, videofilter2, etc.
 * Then copy the resulting $gstreplace.h file over this file, and
 * $gstreplace.c over $gstreplace.c.
 */
/* The rest of this file is shim code to allow the project to compile */
#define ${GST_TYPE_REPLACE} G_TYPE_NONE
EOF


mkdir -p $basedir/tools

cat >$basedir/tools/Makefile.am <<EOF
bin_PROGRAMS = ${gst__replace}

# sources used to compile this plug-in
${gst_replace}_SOURCES = ${gstreplace}.c

# compiler and linker flags used to compile the program, set in configure.ac
${gst_replace}_CFLAGS = \$(GST_CFLAGS)
${gst_replace}_LDADD = \$(GST_LIBS)

EOF

cat >$basedir/tools/${gstreplace}.c <<EOF
/* This file should be replaced by application source generated by
 * gst-app-maker, or by your own source code.  To generate suitable
 * app source using gst-app-maker, run:
 *
 *   gst-app-maker $cmdline_prefix $replace
 *
 * Then copy the resulting $gstreplace.c file over this file.
 */
/* The rest of this file is shim code to allow the project to compile */
#include <stdio.h>
int main (void) { printf ("FIXME\n"); return 0; }
EOF


