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

DESCRIPTION="Firmware files needed for operation of some dvb-devices"
HOMEPAGE="http://www.linuxtv.org"

LICENSE="freedist ISC all-rights-reserved"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""
RESTRICT="mirror bindist"

DEPEND=""
RDEPEND=""

S="${WORKDIR}"

# Files which can be fetched from linuxtv.org
PACKET_NAME=dvb-firmwares-1.tar.bz2
PACKET_SRC_URI="http://www.linuxtv.org/downloads/firmware/${PACKET_NAME}"
get_dvb_firmware="${FILESDIR}/get_dvb_firmware-${PV}"
# from https://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6-stable.git;a=history;f=Documentation/dvb/get_dvb_firmware

FW_USE_FLAGS=(
# packet
	"usb-a800"
	"dibusb-usb2"
	"usb-dtt200u"
	"usb-umt"
	"usb-vp702x"
	"usb-vp7045"
	"usb-wt220u"
	"dibusb-usb1"
	"or51211"
	"or51132"
	"or51132"
# own URL
	"ttpci"
	"bcm3510"
	"usb-wt220u"
	"usb-wt220u"
	"usb-dib0700"
	"usb-af9015"
	"sp887x"
	"af9005"
	"cx231xx"
	"cx18"
	"cx18"
	"cx18"
	"cx23885"
	"cx23885"
	"pvrusb2"
	"usb-bluebird"
	"tda10045"
# get_dvb_firmware
	"sp8870"
	"tda10046"
	"tda10046lifeview"
	"ttusb-dec"
	"ttusb-dec"
	"ttusb-dec"
	"opera1"
	"opera1"
	"vp7041"
	"nxt200x"
	"mpc718"
)

FW_FILES=(
# packet
	"dvb-usb-avertv-a800-02.fw"
	"dvb-usb-dibusb-6.0.0.8.fw"
	"dvb-usb-dtt200u-01.fw"
	"dvb-usb-umt-010-02.fw"
	"dvb-usb-vp702x-01.fw"
	"dvb-usb-vp7045-01.fw"
	"dvb-usb-wt220u-01.fw"
	"dvb-usb-dibusb-5.0.0.11.fw"
	"dvb-fe-or51211.fw"
	"dvb-fe-or51132-qam.fw"
	"dvb-fe-or51132-vsb.fw"
# own URL
	"dvb-ttpci-01.fw"
	"dvb-fe-bcm3510-01.fw"
	"dvb-usb-wt220u-02.fw"
	"dvb-usb-wt220u-fc03.fw"
	"dvb-usb-dib0700-1.20.fw"
	"dvb-usb-af9015.fw"
	"dvb-fe-sp887x.fw"
	"af9005.fw"
	"v4l-cx231xx-avcore-01.fw"
	"v4l-cx23418-apu.fw"
	"v4l-cx23418-cpu.fw"
	"v4l-cx23418-dig.fw"
	"v4l-cx23885-avcore-01.fw"
	"v4l-cx23885-enc.fw"
	"v4l-cx25840.fw"
	"dvb-usb-bluebird-01.fw"
	"dvb-fe-tda10045.fw"
# get_dvb_firmware
	"dvb-fe-sp8870.fw"
	"dvb-fe-tda10046.fw"
	"dvb-fe-tda10046.fw"
	"dvb-ttusb-dec-2000t.fw"
	"dvb-ttusb-dec-2540t.fw"
	"dvb-ttusb-dec-3000s.fw"
	"dvb-usb-opera1-fpga-01.fw"
	"dvb-usb-opera-01.fw"
	"dvb-vp7041-2.422.fw"
	"dvb-fe-nxt2004.fw"
	"dvb-cx18-mpc718-mt352.fw"
)

FW_GET_PARAMETER=(
# packet
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
# own URL
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
	"-"
# get_dvb_firmware
	"sp8870"
	"tda10046"
	"tda10046lifeview"
	"dec2000t"
	"dec2540t"
	"dec3000s"
	"opera1"
	"-"
	"vp7041"
	"nxt2004"
	"mpc718"
)

FW_URLS=(
# packet
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
	"${PACKET_SRC_URI}"
# own URL
	"http://www.escape-edv.de/endriss/firmware/dvb-ttpci-01.fw-fc2624"
	"http://www.linuxtv.org/downloads/firmware/dvb-fe-bcm3510-01.fw"
	"http://www.linuxtv.org/downloads/firmware/dvb-usb-wt220u-02.fw"
	"http://home.arcor.de/efocht/dvb-usb-wt220u-fc03.fw"
	"http://www.wi-bw.tfh-wildau.de/~pboettch/home/files/dvb-usb-dib0700-1.20.fw"
	"http://www.otit.fi/~crope/v4l-dvb/af9015/af9015_firmware_cutter/firmware_files/4.95.0/dvb-usb-af9015.fw"
	"http://peterdamen.com/dvb-fe-sp887x.fw"
	"http://ventoso.org/luca/af9005/af9005.fw"
	"http://linuxtv.org/downloads/firmware/v4l-cx231xx-avcore-01.fw"
	"http://linuxtv.org/downloads/firmware/v4l-cx23418-apu.fw"
	"http://linuxtv.org/downloads/firmware/v4l-cx23418-cpu.fw"
	"http://linuxtv.org/downloads/firmware/v4l-cx23418-dig.fw"
	"http://linuxtv.org/downloads/firmware/v4l-cx23885-avcore-01.fw"
	"http://linuxtv.org/downloads/firmware/v4l-cx23885-enc.fw"
	"http://linuxtv.org/downloads/firmware/v4l-cx25840.fw"
	"http://linuxtv.org/downloads/firmware/dvb-usb-bluebird-01.fw"
	"http://www.fireburn.co.uk/dvb-fe-tda10045.fw"
# get_dvb_firmware
	"http://2.download.softwarepatch.pl/1619edb0dcb493dd5337b94a1f79c3f6/tt_Premium_217g.zip"
	"http://www.tt-download.com/download/updates/219/TT_PCI_2.19h_28_11_2006.zip"
	"http://www.lifeview.hk/dbimages/document/7%5Cdrv_2.11.02.zip"
	"http://hauppauge.lightpath.net/de/dec217g.exe"
	"http://hauppauge.lightpath.net/de/dec217g.exe"
	"http://hauppauge.lightpath.net/de/dec217g.exe"
	"http://www.informatik.uni-leipzig.de/~hlawit/dvb/2830SCap2.sys"
	"http://www.informatik.uni-leipzig.de/~hlawit/dvb/2830SLoad2.sys"
	"http://www.twinhan.com/files/AW/Software/TwinhanDTV2.608a.zip"
	"http://www.avermedia-usa.com/support/Drivers/AVerTVHD_MCE_A180_Drv_v1.2.2.16.zip"
	"ftp://ftp.work.acer-euro.com/desktop/aspire_idea510/vista/Drivers/Yuan%20MPC718%20TV%20Tuner%20Card%202.13.10.1016.zip"
)

SRC_URI=""
NEGATIVE_USE_FLAGS=""
NEGATIVE_END_BRACKETS=""
ALL_URLS=""

for ((CARD=0; CARD < ${#FW_USE_FLAGS[*]}; CARD++)) do
	URL="${FW_URLS[CARD]}"

	if [[ -z ${URL} ]]; then
		echo "missing url for ${FW_USE_FLAGS[CARD]}"
		continue
	fi
	SRC_URI="${SRC_URI} dvb_cards_${FW_USE_FLAGS[CARD]}? ( ${URL} )"

	IUSE="${IUSE} dvb_cards_${FW_USE_FLAGS[CARD]}"
	NEGATIVE_USE_FLAGS="${NEGATIVE_USE_FLAGS} !dvb_cards_${FW_USE_FLAGS[CARD]}? ( "
	NEGATIVE_END_BRACKETS="${NEGATIVE_END_BRACKETS} )"
	ALL_URLS="${ALL_URLS} ${URL}"

	GET_PARAM="${FW_GET_PARAMETER[CARD]}"
	if [[ ${GET_PARAM} != "-" ]]; then
		# all firmwares extracted by get_dvb_firmware need unzip
		DEPEND="${DEPEND} dvb_cards_${FW_USE_FLAGS[CARD]}? ( app-arch/unzip )"
	fi
done

SRC_URI="${SRC_URI} ${NEGATIVE_USE_FLAGS} ${ALL_URLS} ${NEGATIVE_END_BRACKETS}"

DEPEND="${DEPEND}
	${NEGATIVE_USE_FLAGS}
	app-arch/unzip
	${NEGATIVE_END_BRACKETS}"

install_dvb_card() {
	if [[ -z ${DVB_CARDS} ]]; then
		# install (almost) all firmware files
		# do not install this one due to conflicting filenames
		[[ "${1}" != "tda10046lifeview" ]]
	else
		# Check if this flag is set
		use dvb_cards_${1}
	fi
}

pkg_setup() {
	#echo SRC_URI=${SRC_URI}
	#echo DEPEND=${DEPEND}
	if has tda1004x ${DVB_CARDS}; then
		eerror
		eerror "DVB_CARDS flag tda1004x has been split into"
		eerror "tda10045, tda10046 and tda10046lifeview".
		eerror
		eerror "But beware that you cannot enable tda10046 and"
		eerror "tda10046lifeview at the same time."
	fi

	if [[ -z ${DVB_CARDS} ]]; then
		elog
		elog "DVB_CARDS is not set, installing all available firmware files."
		elog "To save bandwidth please consider setting the DVB_CARDS variable"
		elog "in ${ROOT%/}/etc/make.conf. This way only the firmwares you own"
		elog "the hardware will be installed."
	fi
	# according to https://devmanual.gentoo.org/general-concepts/use-flags/index.html
	# we should not die here. However, there is no sensible fallback choice to make
	# because the user may have either the one or the other. WYGIWYG
	if use dvb_cards_tda10046 && use dvb_cards_tda10046lifeview; then
		eerror
		eerror "You cannot have both tda10046 and tda10046lifeview in DVB_CARDS"
		eerror "because of colliding firmware filenames (dvb-fe-tda10046.fw)."
		eerror "Sorry."
		die "Conflicting values for DVB_CARDS set."
	fi
	elog
	elog "List of possible card-names to use for DVB_CARDS:"
	echo ${FW_USE_FLAGS[*]}| tr ' ' '\n' | sort | uniq | fmt \
	| while read line; do
		elog "   ${line}"
	done
	elog
	elog "If you need another firmware file and want it included create a bug"
	elog "at bugs.gentoo.org."
	elog "In case some firmware sources are not fetchable please try again at"
	elog "a later time and if it still does not fetch report a bug. If there"
	elog "is no alternative source or an update to the firmware available we"
	elog "have to remove it from the ebuild and you are on your own."
}

src_unpack() {
	local distfile

	# link all downloaded files to ${S}
	for distfile in ${A}; do
		[[ -L ${distfile} ]] || ln -s ${DISTDIR}/${distfile} ${distfile}
	done

	# unpack firmware-packet
	if has ${PACKET_NAME} ${A}; then
		unpack ${PACKET_NAME}
	fi

	if [[ -z ${DVB_CARDS} ]] || use dvb_cards_mpc718 ; then
		mv Yuan%20MPC718%20TV%20Tuner%20Card%202.13.10.1016.zip "Yuan MPC718 TV Tuner Card 2.13.10.1016.zip"
	fi
	if [[ -z ${DVB_CARDS} ]] || use dvb_cards_ttpci ; then
		mv dvb-ttpci-01.fw-fc2624 dvb-ttpci-01.fw
	fi

	local script_v=${PV}

	# Adjust temp-dir of get_dvb_firmware
	sed "${FILESDIR}"/get_dvb_firmware-${script_v} \
		-e "s#/tmp#${T}#g" > get_dvb_firmware
	chmod a+x get_dvb_firmware

	# extract the firmware-files
	for ((CARD=0; CARD < ${#FW_USE_FLAGS[*]}; CARD++)) do
		install_dvb_card ${FW_USE_FLAGS[CARD]} || continue

		GET_PARAM=${FW_GET_PARAMETER[CARD]}
		if [[ ${GET_PARAM} != "-" ]]; then
			[[ -f ${FW_FILES[CARD]} ]] && ewarn "Already existing: ${FW_FILES[CARD]}"
			elog "Extracting ${FW_FILES[CARD]}"
			./get_dvb_firmware ${GET_PARAM}
		fi
	done
}

src_install() {
	insinto /lib/firmware

	for ((CARD=0; CARD < ${#FW_USE_FLAGS[*]}; CARD++)) do
		if install_dvb_card ${FW_USE_FLAGS[CARD]}; then
			local file=${FW_FILES[CARD]}
			[[ -f ${file} ]] || die "File ${file} does not exist!"
			doins ${file}
		fi
	done
}