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

EAPI=5
inherit nsplugins toolchain-funcs versionator multilib multilib-minimal

DESCRIPTION="Adobe Flash Player"
HOMEPAGE="
	http://www.adobe.com/products/flashplayer.html
	http://get.adobe.com/flashplayer/
	https://helpx.adobe.com/security/products/flash-player.html#version11
"

AF_URI="http://fpdownload.macromedia.com/get/flashplayer/pdc"
AF_DB_URI="http://fpdownload.macromedia.com/pub/flashplayer/updaters"
PV_M=$(get_major_version)
AF_32_URI="${AF_URI}/${PV}/install_flash_player_${PV_M}_linux.i386.tar.gz -> ${P}.i386.tar.gz"
AF_64_URI="${AF_URI}/${PV}/install_flash_player_${PV_M}_linux.x86_64.tar.gz -> ${P}.x86_64.tar.gz"
AF_32_DB_URI="${AF_DB_URI}/${PV_M}/flashplayer_${PV_M}_plugin_debug.i386.tar.gz -> ${P}-debug.i386.tar.gz"

SRC_URI="
	abi_x86_32? (
		!debug? ( ${AF_32_URI} )
		debug? ( ${AF_32_DB_URI} )
	)
	abi_x86_64? ( ${AF_64_URI} )
"
IUSE="debug kde selinux cpu_flags_x86_sse2"
REQUIRED_USE="
	cpu_flags_x86_sse2
	debug? ( abi_x86_32 )
	|| ( abi_x86_64 abi_x86_32 )
"
SLOT="0"

KEYWORDS="-* amd64 x86"
LICENSE="AdobeFlash-11.x"
RESTRICT="strip mirror"

S="${WORKDIR}"

NATIVE_DEPS="
	dev-libs/atk
	dev-libs/glib:2
	dev-libs/nspr
	dev-libs/nss
	kde? (
		dev-qt/qtcore:4
		dev-qt/qtdbus:4
		dev-qt/qtgui:4
		dev-qt/qtsvg:4
		kde-base/kdelibs
		x11-libs/libICE
		x11-libs/libSM
		x11-libs/libXau
		x11-libs/libXdmcp
		x11-libs/libXext
		x11-libs/libXft
		x11-libs/libXpm
	)
	media-libs/fontconfig
	media-libs/freetype
	>=sys-libs/glibc-2.4
	x11-libs/cairo
	x11-libs/gdk-pixbuf
	x11-libs/gtk+:2
	x11-libs/libX11
	x11-libs/libXcursor
	x11-libs/libXext
	x11-libs/libXrender
	x11-libs/libXt
	x11-libs/pango
"

DEPEND="
	amd64? ( abi_x86_32? ( !abi_x86_64? ( www-plugins/nspluginwrapper ) ) )
"
RDEPEND="
	${DEPEND}
	abi_x86_64? ( ${NATIVE_DEPS} )
	abi_x86_32? (
		amd64? (
			>=dev-libs/atk-2.10.0[abi_x86_32(-)]
			>=dev-libs/glib-2.34.3:2[abi_x86_32(-)]
			>=dev-libs/nspr-4.10.4[abi_x86_32(-)]
			>=dev-libs/nss-3.15.4[abi_x86_32(-)]
			>=media-libs/fontconfig-2.10.92[abi_x86_32(-)]
			>=media-libs/freetype-2.5.0.1[abi_x86_32(-)]
			>=x11-libs/cairo-1.12.14-r4[abi_x86_32(-)]
			>=x11-libs/gdk-pixbuf-2.30.7[abi_x86_32(-)]
			>=x11-libs/gtk+-2.24.23:2[abi_x86_32(-)]
			>=x11-libs/libX11-1.6.2[abi_x86_32(-)]
			>=x11-libs/libXcursor-1.1.14[abi_x86_32(-)]
			>=x11-libs/libXext-1.3.2[abi_x86_32(-)]
			>=x11-libs/libXrender-0.9.8[abi_x86_32(-)]
			>=x11-libs/libXt-1.1.4[abi_x86_32(-)]
			>=x11-libs/pango-1.36.3[abi_x86_32(-)]
		)
		x86? ( ${NATIVE_DEPS} )
	)
	|| ( media-fonts/liberation-fonts media-fonts/corefonts )
	selinux? ( sec-policy/selinux-flash )
"

# Ignore QA warnings in these closed-source binaries, since we can't fix them:
QA_PREBUILT="usr/*"

any_cpu_missing_flag() {
	local value=${1}
	grep '^flags' /proc/cpuinfo | grep -qv "${value}"
}

pkg_setup() {
	unset need_lahf_wrapper
	if use abi_x86_64 && any_cpu_missing_flag 'lahf_lm'; then
		export need_lahf_wrapper=1
	fi
}

src_unpack() {
	local files=( ${A} )

	multilib_src_unpack() {
		mkdir -p "${BUILD_DIR}" || die
		cd "${BUILD_DIR}" || die

		# we need to filter out the other archive(s)
		local other_abi
		[[ ${ABI} == amd64 ]] && other_abi=i386 || other_abi=x86_64
		unpack ${files[@]//*${other_abi}*/}
	}

	multilib_parallel_foreach_abi multilib_src_unpack
}

src_configure() { :; }

multilib_src_compile() {
	if [[ ${ABI} == amd64 && ${need_lahf_wrapper} ]]; then
		# This experimental wrapper, from Maks Verver via bug #268336 should
		# emulate the missing lahf instruction affected platforms.
		set -- $(tc-getCC) -fPIC -shared -nostdlib -lc \
			-oflashplugin-lahf-fix.so  "${FILESDIR}/flashplugin-lahf-fix.c"
		echo "${@}" >&2
		"${@}" || die "Compile of flashplugin-lahf-fix.so failed"
	fi
}

multilib_src_install() {
	# PLUGINS_DIR comes from nsplugins.eclass
	exeinto /usr/$(get_libdir)/${PLUGINS_DIR}
	doexe libflashplayer.so

	if [[ ${ABI} == amd64 && ${need_lahf_wrapper} ]]; then
		# This experimental wrapper, from Maks Verver via bug #268336 should
		# emulate the missing lahf instruction affected platforms.
		doexe flashplugin-lahf-fix.so
	fi

	if multilib_is_native_abi; then
		if use kde; then
			local pkglibdir=lib
			[[ -d usr/lib64 ]] && pkglibdir=lib64

			exeinto /usr/$(get_libdir)/kde4
			doexe usr/${pkglibdir}/kde4/kcm_adobe_flash_player.so
			insinto /usr/share/kde4/services
			doins usr/share/kde4/services/kcm_adobe_flash_player.desktop
		else
			# No KDE applet, so allow the GTK utility to show up in KDE:
			sed -i usr/share/applications/flash-player-properties.desktop \
				-e "/^NotShowIn=KDE;/d" || die "sed of .desktop file failed"
		fi

		# The userland 'flash-player-properties' standalone app:
		dobin usr/bin/flash-player-properties

		# Icon and .desktop for 'flash-player-properties'
		insinto /usr/share
		doins -r usr/share/{icons,applications}
		dosym ../icons/hicolor/48x48/apps/flash-player-properties.png \
			/usr/share/pixmaps/flash-player-properties.png
	fi

	# The magic config file!
	insinto "/etc/adobe"
	doins "${FILESDIR}/mms.cfg"
}

unregister_pluginwrapper() {
	# TODO: Perhaps parse the output of 'nspluginwrapper -l'
	# TODO: However, the 64b flash plugin makes
	# TODO: 'nspluginwrapper -l' segfault.
	local FLASH_WRAPPER="${ROOT}/usr/lib64/${PLUGINS_DIR}/npwrapper.libflashplayer.so"
	if has_version 'www-plugins/nspluginwrapper' && [[ -f ${FLASH_WRAPPER} ]]; then
		einfo "Removing 32-bit plugin wrapper"
		nspluginwrapper -r "${FLASH_WRAPPER}"
	fi
}

pkg_postinst() {
	if use amd64 ; then
		if [[ ${need_lahf_wrapper} ]]; then
			ewarn "Your processor does not support the 'lahf' instruction which is used"
			ewarn "by Adobe's 64-bit flash binary. We have installed a wrapper which"
			ewarn "should allow this plugin to run. If you encounter problems, please"
			ewarn "adjust your USE flags to install only the 32-bit version and reinstall:"
			ewarn " ${CATEGORY}/${PN}[abi_x86_32,-abi_x86_64]"
			elog
		fi
		# needed to clean up upgrades from older installs
		if use abi_x86_64 && [[ -n ${REPLACING_VERSIONS} ]]; then
			unregister_pluginwrapper
		fi
		if has_version 'www-plugins/nspluginwrapper'; then
			if use abi_x86_32 && ! use abi_x86_64; then
				einfo "nspluginwrapper detected: Installing plugin wrapper"
				local oldabi="${ABI}"
				ABI="x86"
				local FLASH_SOURCE="${ROOT}/usr/lib32/${PLUGINS_DIR}/libflashplayer.so"
				nspluginwrapper -i "${FLASH_SOURCE}"
				ABI="${oldabi}"
			fi
		elif use abi_x86_32; then
			elog "To use the 32-bit flash player in a native 64-bit browser,"
			elog "you must install www-plugins/nspluginwrapper"
		fi
	fi
}

pkg_prerm() {
	use amd64 && use abi_x86_32 && ! use abi_x86_64 && \
		unregister_pluginwrapper
}
