#!/bin/bash -
#
#  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
#
#  Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
#
#  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 3 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., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#  Additional permission under GNU GPL version 3 section 7:
#
#  If you modify this program, or any covered work, by linking or
#  combining it with the OpenSSL project's OpenSSL library (or a
#  modified version of that library), containing parts covered by the
#  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
#  grants you additional permission to convey the resulting work.
#  Corresponding Source for a non-source form of such a combination
#  shall include the source code for the parts of OpenSSL used as well
#  as that of the covered work.
#

# input: jni/sflphone/daemon/src/dbus/jni_interface.i
# output: sflphoneservice_loader.c
#         callmanager_wrap.cpp
#         sflphoneservice.java
#         sflphoneserviceJNI.java
#         ManagerImpl.java

SRCDIR=jni/sflphone/daemon/src
NATIVE=client/android
NATIVEDIR=$SRCDIR/$NATIVE
PACKAGE=org.sflphone.service
PACKAGEDIR=src/org/sflphone/service
ROOT=`pwd`

echo "in $ROOT"

echo "Checking that swig is 2.0.6 or later"
SWIGVER=`swig -version | \
    grep -i "SWIG version" | \
    awk '{print $3}'`
SWIGVER1=`echo $SWIGVER | \
    awk '{split($0, array, ".")} END{print array[1]}'`
SWIGVER2=`echo $SWIGVER | \
    awk '{split($0, array, ".")} END{print array[2]}'`
SWIGVER3=`echo $SWIGVER | \
    awk '{split($0, array, ".")} END{print array[3]}'`

echo swig-$SWIGVER1.$SWIGVER2.$SWIGVER3

if [[ $SWIGVER1 -ge 2 ]]; then
    echo "swig version is greater than 2.x"
    if [[ $SWIGVER1 -gt 2 ]]; then
        echo "swig version is greater than 3.x"
    else
        if [[ $SWIGVER2 -ge 1 ]]; then
            echo "swig version is greater than 2.1"
        else
            echo "swig version is less than 2.1"
            if [[ $SWIGVER3 -ge 6 ]]; then
                echo "swig version is greater than 2.0.6"
            else
                echo "swig version is less than 2.0.6"
                echo "exiting..."
                exit 4
            fi
        fi
    fi
else
    echo "swig version is less than 2.x"
    echo "exiting..."
    exit 3
fi




# FIXME
echo "Generating callmanager_wrap.cpp..."

swig -v -c++ -java \
-package $PACKAGE \
-outdir $PACKAGEDIR \
-o $SRCDIR/client/android/callmanager_wrap.cpp $SRCDIR/client/android/jni_interface.i

pushd $SRCDIR
echo "in $PWD"

echo "Generating sflphoneservice_loader.c..."
python client/android/JavaJNI2CJNI_Load.py \
-i $ROOT/$PACKAGEDIR/SFLPhoneserviceJNI.java \
-o $NATIVE/sflphoneservice_loader.c \
-t client/android/sflphoneservice.c.template \
-m SFLPhoneservice \
-p $PACKAGE

echo "Appending callmanager_wrap.cpp..."
cat $NATIVE/sflphoneservice_loader.c >> client/android/callmanager_wrap.cpp


#if [ "" != "$(find -iname sflphoneservice_loader.c)" ]; then
	#
#fi
#  callmanager_wrap.cpp
#  callmanager_wrap.cpp
#  sflphoneservice.java
#  sflphoneserviceJNI.java
#  ManagerImpl.java

echo -n "in " && popd
echo "Done"
exit 0
