#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

#
# This class will generate the proper postinst/postrm scriptlets for pixbuf
# packages.
#

DEPENDS:append:class-target = " qemu-native"
inherit qemu

PIXBUF_PACKAGES ??= "${PN}"

PACKAGE_WRITE_DEPS += "qemu-native gdk-pixbuf-native"

pixbufcache_common() {
if [ "x$D" != "x" ]; then
	$INTERCEPT_DIR/postinst_intercept update_pixbuf_cache ${PKG} mlprefix=${MLPREFIX} binprefix=${MLPREFIX} libdir=${libdir} \
		bindir=${bindir} base_libdir=${base_libdir}
else

	# Update the pixbuf loaders in case they haven't been registered yet
	${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache

	if [ -x ${bindir}/gtk-update-icon-cache ] && [ -d ${datadir}/icons ]; then
		for icondir in /usr/share/icons/*; do
			if [ -d ${icondir} ]; then
				gtk-update-icon-cache -t -q ${icondir}
			fi
		done
	fi
fi
}

python populate_packages:append() {
    pixbuf_pkgs = d.getVar('PIXBUF_PACKAGES').split()

    for pkg in pixbuf_pkgs:
        bb.note("adding pixbuf postinst and postrm scripts to %s" % pkg)
        postinst = d.getVar('pkg_postinst:%s' % pkg) or d.getVar('pkg_postinst')
        if not postinst:
            postinst = '#!/bin/sh\n'
        postinst += d.getVar('pixbufcache_common')
        d.setVar('pkg_postinst:%s' % pkg, postinst)

        postrm = d.getVar('pkg_postrm:%s' % pkg) or d.getVar('pkg_postrm')
        if not postrm:
            postrm = '#!/bin/sh\n'
        postrm += d.getVar('pixbufcache_common')
        d.setVar('pkg_postrm:%s' % pkg, postrm)
}

gdkpixbuf_complete() {
GDK_PIXBUF_FATAL_LOADER=1 ${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache || exit 1
}

DEPENDS:append:class-native = " gdk-pixbuf-native"
SYSROOT_PREPROCESS_FUNCS:append:class-native = " pixbufcache_sstate_postinst"

pixbufcache_sstate_postinst() {
	mkdir -p ${SYSROOT_DESTDIR}${bindir}
	dest=${SYSROOT_DESTDIR}${bindir}/postinst-${PN}
        echo '#!/bin/sh' > $dest
	echo "${gdkpixbuf_complete}" >> $dest
	chmod 0755 $dest
}
