# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5

inherit eutils

DESCRIPTION="Network focused portable C++ class library providing high level functions"
HOMEPAGE="http://www.opalvoip.org/"
SRC_URI="mirror://sourceforge/opalvoip/${P}.tar.bz2
	doc? ( mirror://sourceforge/opalvoip/${P}-htmldoc.tar.bz2 )"

LICENSE="MPL-1.0"
SLOT="0/${PV}"
KEYWORDS="~alpha ~amd64 ~arm ~ia64 ~ppc ~ppc64 ~sparc ~x86"
# default enabled are features from 'minsize', the most used according to ptlib
IUSE="alsa +asn debug doc +dtmf examples ffmpeg ftp +http ipv6
xmpp ldap libressl lua mail odbc oss pch pulseaudio remote sasl sdl serial
shmvideo snmp soap socks +sound ssl static-libs +stun telnet tts v4l +video
vxml wav xml xmlrpc"

CDEPEND="
	ldap? ( net-nds/openldap )
	lua? ( dev-lang/lua )
	odbc? ( dev-db/unixODBC )
	pulseaudio? ( media-sound/pulseaudio )
	sasl? ( dev-libs/cyrus-sasl:2 )
	sdl? ( media-libs/libsdl )
	sound? ( alsa? ( media-libs/alsa-lib ) )
	ssl? (
		!libressl? ( dev-libs/openssl:0 )
		libressl? ( dev-libs/libressl )
	)
	video? ( v4l? ( media-libs/libv4l ) )
	xml? ( dev-libs/expat )
	!!dev-libs/pwlib"
RDEPEND="${CDEPEND}
	ffmpeg? ( virtual/ffmpeg )"
DEPEND="${CDEPEND}
	virtual/pkgconfig
	sys-devel/bison
	sys-devel/flex
	video? ( v4l? ( sys-kernel/linux-headers ) )"

# NOTES:
# media-libs/libdc1394:2 should be supported but headers location have changed
# tools/ directory is ignored
# avc plugin is disabled to fix bug 276514, see upstream bug 2821744

REQUIRED_USE="sdl? ( video )
	xmpp? ( xml )
	vxml? ( http tts xml )
	xmlrpc? ( http xml )
	soap? ( http xml )"

src_prepare() {
	epatch "${FILESDIR}/${PN}-2.10.9-svn_revision_override.patch" \
		"${FILESDIR}/${PN}-2.10.9-pkgconfig_ldflags.patch" \
		"${FILESDIR}/${PN}-2.12.4-respect_cxxflags.patch" \
		"${FILESDIR}/${PN}-2.12.4-sdl-linking.patch"

	if ! use telnet; then
		epatch "${FILESDIR}/${PN}-2.10.9-disable-telnet-symbols.patch"
	fi

	# remove visual studio related files from samples/
	if use examples; then
		rm -f samples/*/*.vcproj
		rm -f samples/*/*.sln
		rm -f samples/*/*.dsp
		rm -f samples/*/*.dsw
	fi

	if [[ ! -z ${TARGET+set} ]]; then
		ewarn "TARGET variable is set. Removing as it would break the build, bug #465722."
		unset TARGET
	fi
}

src_configure() {
	local myconf=""

	# plugins are disabled only if ! sound and ! video
	if ! use sound && ! use video; then
		myconf+=" --disable-plugins"
	else
		myconf+=" --enable-plugins"
	fi

	# minsize: presets of features (overwritten by use flags)
	# ansi-bool, atomicity: there is no reason to disable those features
	# internalregex: we want to use system one
	# sunaudio and bsdvideo are respectively for SunOS and BSD's
	# appshare, vfw: only for windows
	# samples: no need to build samples
	# avc: disabled, bug 276514, upstream bug 2821744
	# mlib: SUN mediaLibs. Not in tree.
	# pipechan, configfile, resolver, url: force enabling
	econf ${myconf} \
		--disable-minsize \
		--enable-ansi-bool \
		--enable-atomicity \
		--disable-internalregex \
		--disable-sunaudio \
		--disable-bsdvideo \
		--disable-appshare \
		--disable-vfw \
		--disable-samples \
		--disable-avc \
		--disable-mlib \
		--enable-configfile \
		--enable-pipechan \
		--enable-resolver \
		--enable-url \
		$(use_enable alsa) \
		$(use_enable asn) \
		$(use_enable debug exceptions) \
		$(use_enable debug memcheck) \
		$(use_enable debug tracing) \
		$(use_enable dtmf) \
		--disable-esd \
		$(use_enable ffmpeg ffvdev) \
		$(use_enable ftp) \
		$(use_enable http) \
		$(use_enable http httpforms) \
		$(use_enable http httpsvc) \
		--disable-dc \
		$(use_enable ipv6) \
		$(use_enable xmpp jabber) \
		$(use_enable ldap openldap) \
		$(use_enable lua) \
		$(use_enable mail pop3smtp) \
		$(use_enable pulseaudio pulse) \
		$(use_enable odbc) \
		$(use_enable oss) \
		$(use_enable pch) \
		$(use_enable remote remconn) \
		$(use_enable sasl) \
		$(use_enable sdl) \
		$(use_enable serial) \
		$(use_enable shmvideo) \
		$(use_enable snmp) \
		$(use_enable soap) \
		$(use_enable socks) \
		$(use_enable sound audio) \
		$(use_enable ssl openssl) \
		$(use_enable stun) \
		$(use_enable telnet) \
		$(use_enable tts) \
		--disable-v4l \
		$(use_enable v4l v4l2) \
		$(use_enable video) $(use_enable video vidfile) \
		$(use_enable vxml) \
		$(use_enable wav wavfile) \
		$(use_enable xml expat) \
		$(use_enable xmlrpc)
}

src_compile() {
	local makeopts=""
	tc-env_build

	use debug && makeopts="debug"

	emake ${makeopts}
}

src_install() {
	local makeopts=""

	use debug && makeopts="DEBUG=1"

	emake DESTDIR="${D}" ${makeopts} install

	# Get rid of static libraries if not requested
	# There seems to be no easy way to disable this in the build system
	if ! use static-libs; then
		rm -v "${D}"/usr/lib*/*.a || die
	fi

	if use doc; then
		dohtml -r "${WORKDIR}"/html/*
	fi

	dodoc History.txt ReadMe.txt ReadMe_QOS.txt

	if use sound || use video; then
		newdoc plugins/ReadMe.txt ReadMe-Plugins.txt
	fi

	if use examples; then
		local exampledir="/usr/share/doc/${PF}/examples"
		local basedir="samples"
		local sampledirs="`ls samples --hide=Makefile`"

		# first, install Makefile
		insinto ${exampledir}/
		doins ${basedir}/Makefile || die "doins failed"

		# now, all examples
		for x in ${sampledirs}; do
			insinto ${exampledir}/${x}/
			doins ${basedir}/${x}/* || die "doins failed"
		done
	fi
}

pkg_postinst() {
	if use examples; then
		ewarn "All examples have been installed, some of them will not work on your system"
		ewarn "it will depend of the enabled USE flags."
		ewarn "To test examples, you have to run PTLIBDIR=/usr/share/ptlib make"
	fi

	if ! use sound || ! use video; then
		ewarn "You have disabled sound or video USE flags."
		ewarn "Most audio/video have been disabled silently even if enabled via USE flags."
		ewarn "Having a feature enabled via use flag but disabled can lead to issues."
	fi

	ewarn "If you've just removed pwlib to install ptlib, some packages will be broken."
	ewarn "Please use 'revdep-rebuild' from app-portage/gentoolkit to check."
	ewarn "If some packages need pwlib, consider removing ptlib and re-installing pwlib"
	ewarn "or help us to make them live together."
}
