#!/bin/bash -e

xpifile=$1
destdir=$2

error () {
	echo "$*" >&2
}

if [ -z "$xpifile" -o -z "$destdir" ]
then
	error "Usage: $0 xpifile.xpi destdir"
	exit 1
fi

if [ ! -f "$xpifile" ]
then
	error "$xpifile does not exist or is not a regular file."
	exit 1
fi

if [ -x "$destdir" ]
then
	error "$destdir already exists."
	exit 1
fi

# ensure we delete all temporary stuff upon exit
olddir=`pwd`
trap 'rm -fR $tmpdir; cd $olddir' EXIT

# Unpack XPI into temporary directory
tmpdir=`mktemp -d`

unzip $xpifile -d $tmpdir
cd $tmpdir

# Check whether it is an original XPI or a language pack
if [ -f bin/chrome/en-US.jar -a -f install.js ]
then
	# Move the contents around
	if [ -f bin/chrome/en-US.manifest ]
	then
		mv bin/chrome/en-US.manifest chrome.manifest
	fi
	unzip bin/chrome/en-US.jar

	if [ -f bin/defaults/profile/extensions/*/install.rdf ]
	then
		# Determine the extension's and product's GUID and version
		enusguid=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '/about="urn:mozilla:install-manifest"/,$s/.*<em:id>\([^<]\+\)<\/em:id>.*/\1/p' | head -1`
		enusver=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '/about="urn:mozilla:install-manifest"/,$s/.*<em:version>\([^<]\+\)<\/em:version>.*/\1/p' | head -1`
		prodguid=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '/<em:targetApplication>/,$s/.*<em:id>\([^<]\+\)<\/em:id>.*/\1/p' | head -1`
		prodminver=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '/<em:targetApplication>/,$s/.*<em:minVersion>\([^<]\+\)<\/em:minVersion>.*/\1/p' | head -1`
		prodmaxver=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '/<em:targetApplication>/,$s/.*<em:maxVersion>\([^<]\+\)<\/em:maxVersion>.*/\1/p' | head -1`
	else
		enusguid=langpack-en-US@mozilla.org
		enusver=`cat install.js | sed -n 's/.*initInstall *(.*,.*,[^"]*"\([^"]\+\)".*/\1/p' | head -1`
		prodminver=$enusver
		prodmaxver=$enusver
		for i in locale/{,en-US/}branding/brand.properties
		do
			if [ -f $i ]
			then
				brandpropfile=$i
			fi
		done
		prodname=`cat "$brandpropfile" | sed -n 's/^brandShortName *= *\(.\+\) *$/\1/p' | head -1`
		prodguid=`cat <<EOL | grep -i "$prodname" | cut -f 2
Firefox	{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
Thunderbird	{3550f703-e582-4d05-9a08-453d09bdfdc6}
Nvu	{136c295a-4a5a-41cf-bf24-5cee526720d5}
Mozilla	{86c18b42-e466-45a9-ae7a-9b95ba6f5640}
SeaMonkey 	{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}
Sunbird 	{718e30fb-e89b-41dd-9da7-e25a45638b28}
Netscape	{3db10fab-e461-4c80-8b97-957ad5f8ea47}
Flock	{a463f10c-3994-11da-9945-000d60ca027b}
EOL`
	fi

	# Determine which directories are registered
	registered=`cat install.js | sed -n 's/.*registerChrome *([^"]*"\([^"]\+\)" *) *;.*/        <em:locale>\1<\/em:locale>/gp'`
	if [ -z "$registered" ]
	then
		registered=`cat chrome.manifest | sed -n 's/.*jar:en-US.jar!\/\(.*\)/        <em:locale>\1<\/em:locale>/gp'`
	fi	

	cat <<EOT > install.rdf
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>$enusguid</em:id>
    <em:name>en-US Language Pack</em:name>
    <em:version>$enusver</em:version>
    <em:type>8</em:type>
    
    <em:targetApplication>
      <Description>
        <em:id>$prodguid</em:id>
        <em:minVersion>$prodminver</em:minVersion>
        <em:maxVersion>$prodmaxver</em:maxVersion>
      </Description>
    </em:targetApplication>
    
    <em:file>
      <Description about="urn:mozilla:extension:file:en-US.jar">
$registered
      </Description>
    </em:file>
  </Description>
</RDF>
EOT

	if [ -d locale/en-US ]
	then
		mv locale/en-US locale/lang-reg
	fi

	rm -fR bin/ install.js

# Make sure it is a language pack
elif [ -d chrome -a -f chrome/*.jar -a -f install.rdf ]
then
	unzip chrome/*.jar
	rm -fR chrome

	# Determine the locale
	if [ -f chrome.manifest ]
	then
		locale=`cat chrome.manifest | sed -n 's/ *locale \+[^ ]\+ \+\([^ ]\+\) .*/\1/p' | head -1`
	else
		locale=`cat install.rdf | sed -n 's/.*about="urn:mozilla:extension:file:\([^.]\+\)\.jar.*/\1/p' | head -1`
	fi
	
	if [ -d locale/$locale ]
	then
		mv locale/$locale locale/lang-reg
	fi

# It is neither an original XPI nor a translated language pack
else
	error "$xpifile is not a language pack."
	exit 1
fi

# Done; now move everything to $destdir
cd $olddir
if [ -x $destdir ]
then
	error "$destdir did not previously exist but now does."
	exit 1
fi
# The previous check does not avoid race conditions, but it helps
mv $tmpdir $destdir
