From 80ba845c7cb571644d9dea61b9872c393d128c37 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 4 Jun 2011 22:48:12 +0000 Subject: Sat Jun 4 22:48:12 UTC 2011 --- community-staging/calibre/PKGBUILD | 67 + community-staging/calibre/calibre.install | 12 + .../calibre/desktop_integration.patch | 68 + community-staging/couchdb/PKGBUILD | 40 + community-staging/couchdb/couchdb.install | 22 + community-staging/couchdb/rc-script.patch | 90 + community-staging/dwdiff/PKGBUILD | 24 + community-staging/gnustep-base/ChangeLog | 6 + community-staging/gnustep-base/PKGBUILD | 34 + community-staging/goldendict/PKGBUILD | 37 + community-staging/goldendict/goldendict-paths.diff | 10 + community-staging/goldendict/goldendict.changelog | 8 + community-staging/ibus-qt/PKGBUILD | 31 + community-staging/mapnik/PKGBUILD | 52 + community-staging/mapnik/mapnik.install | 11 + community-staging/open-vm-tools/PKGBUILD | 68 + .../open-vm-tools/open-vm-tools-X11Bool.patch | 15 + .../open-vm-tools/open-vm-tools.conf.d | 6 + .../open-vm-tools/open-vm-tools.install | 10 + community-staging/open-vm-tools/open-vm-tools.rc.d | 101 ++ .../open-vm-tools/scripts-network-FS19541.patch | 40 + .../open-vm-tools/scripts-network.patch | 63 + community-staging/open-vm-tools/tools.conf | 1 + community-staging/open-vm-tools/vmware-guestd | 6 + community-staging/open-vm-tools/xautostart.conf | 6 + community-staging/openttd/PKGBUILD | 38 + community-staging/openttd/openttd.install | 17 + community-staging/parrot/ChangeLog | 5 + community-staging/parrot/PKGBUILD | 44 + community-staging/sword/PKGBUILD | 26 + community-staging/tea/PKGBUILD | 35 + community-staging/tea/tea.desktop | 10 + community-staging/tea/tea.install | 4 + community-staging/tracker/PKGBUILD | 50 + community-staging/tracker/tracker.install | 11 + community-staging/xulrunner-oss/PKGBUILD | 70 + community-staging/xulrunner-oss/mozconfig | 56 + .../xulrunner-oss/mozilla-pkgconfig.patch | 60 + community-staging/xulrunner-oss/oss.patch | 31 + .../xulrunner-oss/port_gnomevfs_to_gio.patch | 1316 +++++++++++++++ .../xulrunner-oss/xulrunner-omnijar.patch | 1737 ++++++++++++++++++++ .../xulrunner-oss/xulrunner-version.patch | 12 + community-staging/yaz/PKGBUILD | 38 + 43 files changed, 4388 insertions(+) create mode 100644 community-staging/calibre/PKGBUILD create mode 100644 community-staging/calibre/calibre.install create mode 100644 community-staging/calibre/desktop_integration.patch create mode 100644 community-staging/couchdb/PKGBUILD create mode 100644 community-staging/couchdb/couchdb.install create mode 100644 community-staging/couchdb/rc-script.patch create mode 100644 community-staging/dwdiff/PKGBUILD create mode 100644 community-staging/gnustep-base/ChangeLog create mode 100644 community-staging/gnustep-base/PKGBUILD create mode 100644 community-staging/goldendict/PKGBUILD create mode 100644 community-staging/goldendict/goldendict-paths.diff create mode 100644 community-staging/goldendict/goldendict.changelog create mode 100644 community-staging/ibus-qt/PKGBUILD create mode 100644 community-staging/mapnik/PKGBUILD create mode 100644 community-staging/mapnik/mapnik.install create mode 100644 community-staging/open-vm-tools/PKGBUILD create mode 100644 community-staging/open-vm-tools/open-vm-tools-X11Bool.patch create mode 100644 community-staging/open-vm-tools/open-vm-tools.conf.d create mode 100644 community-staging/open-vm-tools/open-vm-tools.install create mode 100644 community-staging/open-vm-tools/open-vm-tools.rc.d create mode 100644 community-staging/open-vm-tools/scripts-network-FS19541.patch create mode 100644 community-staging/open-vm-tools/scripts-network.patch create mode 100644 community-staging/open-vm-tools/tools.conf create mode 100644 community-staging/open-vm-tools/vmware-guestd create mode 100644 community-staging/open-vm-tools/xautostart.conf create mode 100644 community-staging/openttd/PKGBUILD create mode 100644 community-staging/openttd/openttd.install create mode 100644 community-staging/parrot/ChangeLog create mode 100644 community-staging/parrot/PKGBUILD create mode 100644 community-staging/sword/PKGBUILD create mode 100644 community-staging/tea/PKGBUILD create mode 100644 community-staging/tea/tea.desktop create mode 100644 community-staging/tea/tea.install create mode 100644 community-staging/tracker/PKGBUILD create mode 100644 community-staging/tracker/tracker.install create mode 100644 community-staging/xulrunner-oss/PKGBUILD create mode 100644 community-staging/xulrunner-oss/mozconfig create mode 100644 community-staging/xulrunner-oss/mozilla-pkgconfig.patch create mode 100644 community-staging/xulrunner-oss/oss.patch create mode 100644 community-staging/xulrunner-oss/port_gnomevfs_to_gio.patch create mode 100644 community-staging/xulrunner-oss/xulrunner-omnijar.patch create mode 100644 community-staging/xulrunner-oss/xulrunner-version.patch create mode 100644 community-staging/yaz/PKGBUILD (limited to 'community-staging') diff --git a/community-staging/calibre/PKGBUILD b/community-staging/calibre/PKGBUILD new file mode 100644 index 000000000..5ad10d94b --- /dev/null +++ b/community-staging/calibre/PKGBUILD @@ -0,0 +1,67 @@ +# $Id: PKGBUILD 48634 2011-06-03 16:47:30Z stephane $ +# Maintainer: Giovanni Scafora +# Contributor: Petrov Roman +# Contributor: Andrea Fagiani + +pkgname=calibre +pkgver=0.8.3 +pkgrel=2 +pkgdesc="Ebook management application" +arch=('i686' 'x86_64') +url="http://calibre-ebook.com/" +license=('GPL3') +depends=('python-dateutil' 'python2-cssutils' 'python2-cherrypy' + 'python-mechanize' 'podofo' 'libwmf' 'python-beautifulsoup' + 'imagemagick' 'poppler-qt' 'chmlib' 'python-lxml' 'libusb' + 'python-imaging' 'desktop-file-utils' 'shared-mime-info' + 'python-dnspython' 'unrar' 'python2-pyqt' 'icu') +makedepends=('python2-pycountry') +optdepends=('ipython: to use calibre-debug') +install=calibre.install +source=(http://downloads.sourceforge.net/${pkgname}/${pkgname}-${pkgver}.tar.gz + desktop_integration.patch) +md5sums=('aee05cac444f68491f2a3d68b22da53e' + 'f4b80e3b34e34bce68b3f052ff52dee8') + +build() { + cd "${srcdir}/${pkgname}" + + #rm -rf src/{cherrypy,pyPdf} + rm -rf src/cherrypy + sed -i -e "s/ldflags = shlex.split(ldflags)/ldflags = shlex.split(ldflags) + ['-fPIC']/" setup/extensions.py + sed -i -e 's:\(#!/usr/bin/env[ ]\+python$\|#!/usr/bin/python$\):\12:g' \ + $(find . -regex ".*.py\|.*.recipe") + + python2 setup.py build + python2 setup.py resources + python2 setup.py translations +} + +package() { + cd "${srcdir}/${pkgname}" + + patch -Np1 -i "${srcdir}/desktop_integration.patch" + + # More on desktop integration (e.g. enforce arch defaults) + sed -i -e "/self.create_uninstaller()/,/os.rmdir(config_dir)/d" \ + -e "s|self.opts.staging_sharedir, 'man/man1'|self.opts.staging_root, 'usr/share/man/man1'|" \ + -e "s|manpath, prog+'.1'+__appname__+'.bz2'|manpath, prog+'.1'+'.bz2'|" \ + -e "s|old_udev = '/etc|old_udev = '${pkgdir}/etc|" \ + -e "s/^Name=calibre/Name=Calibre/g" src/calibre/linux.py + + # Fix the environment module location + sed -i -e "s|(prefix=.*)|(prefix='$pkgdir/usr')|g" setup/install.py + + install -d "${pkgdir}/usr/lib/python2.7/site-packages" + python2 setup.py install --root="${pkgdir}" --prefix=/usr \ + --staging-bindir="${pkgdir}/usr/bin" \ + --staging-libdir="${pkgdir}/usr/lib" \ + --staging-sharedir="${pkgdir}/usr/share" + + find "${pkgdir}" -type d -empty -delete + + # Decompress the man pages so makepkg will do it for us. + for decom in "${pkgdir}"/usr/share/man/man1/*.bz2; do + bzip2 -d "${decom}" + done +} diff --git a/community-staging/calibre/calibre.install b/community-staging/calibre/calibre.install new file mode 100644 index 000000000..6210bd0ab --- /dev/null +++ b/community-staging/calibre/calibre.install @@ -0,0 +1,12 @@ +post_install() { + update-desktop-database -q + update-mime-database usr/share/mime &> /dev/null +} + +post_upgrade() { + post_install +} + +post_remove() { + post_install +} diff --git a/community-staging/calibre/desktop_integration.patch b/community-staging/calibre/desktop_integration.patch new file mode 100644 index 000000000..40d48c03e --- /dev/null +++ b/community-staging/calibre/desktop_integration.patch @@ -0,0 +1,68 @@ +--- a/src/calibre/linux.py 2011-05-27 18:42:14.000000000 +0200 ++++ b/src/calibre/linux.py 2011-05-29 14:57:49.000000000 +0200 +@@ -340,51 +340,39 @@ + + with TemporaryDirectory() as tdir: + with CurrentDir(tdir): +- render_img('mimetypes/lrf.png', 'calibre-lrf.png') +- check_call('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True) +- self.icon_resources.append(('mimetypes', 'application-lrf', '128')) +- check_call('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True) +- self.icon_resources.append(('mimetypes', 'application-lrs', +- '128')) +- render_img('lt.png', 'calibre-gui.png') +- check_call('xdg-icon-resource install --noupdate --size 128 calibre-gui.png calibre-gui', shell=True) +- self.icon_resources.append(('apps', 'calibre-gui', '128')) +- render_img('viewer.png', 'calibre-viewer.png') +- check_call('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True) +- self.icon_resources.append(('apps', 'calibre-viewer', '128')) ++ dir = os.path.join(self.opts.staging_sharedir,'../pixmaps') ++ os.mkdir(dir) ++ render_img('mimetypes/lrf.png', os.path.join(dir,'calibre-lrf.png')) ++ render_img('lt.png', os.path.join(dir, 'calibre-gui.png')) ++ render_img('viewer.png', os.path.join(dir, 'calibre-viewer.png')) + + mimetypes = set([]) + for x in all_input_formats(): + mt = guess_type('dummy.'+x)[0] +- if mt and 'chemical' not in mt and 'ctc-posml' not in mt: ++ if mt and 'chemical' not in mt and 'text' not in mt and 'pdf' not in mt and 'xhtml' not in mt: + mimetypes.add(mt) + + def write_mimetypes(f): + f.write('MimeType=%s;\n'%';'.join(mimetypes)) + +- f = open('calibre-lrfviewer.desktop', 'wb') ++ dir = os.path.join(self.opts.staging_sharedir,'../applications') ++ os.mkdir(dir) ++ f = open(os.path.join(dir, 'calibre-lrfviewer.desktop'), 'wb') + f.write(VIEWER) + f.close() +- f = open('calibre-ebook-viewer.desktop', 'wb') ++ f = open(os.path.join(dir, 'calibre-ebook-viewer.desktop'), 'wb') + f.write(EVIEWER) + write_mimetypes(f) + f.close() +- f = open('calibre-gui.desktop', 'wb') ++ f = open(os.path.join(dir, 'calibre-gui.desktop'), 'wb') + f.write(GUI) + write_mimetypes(f) + f.close() +- des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', +- 'calibre-ebook-viewer.desktop') +- for x in des: +- cmd = ['xdg-desktop-menu', 'install', '--noupdate', './'+x] +- check_call(' '.join(cmd), shell=True) +- self.menu_resources.append(x) +- check_call(['xdg-desktop-menu', 'forceupdate']) +- f = open('calibre-mimetypes', 'wb') ++ dir = os.path.join(self.opts.staging_sharedir,'../mime/packages/') ++ os.makedirs(dir) ++ f = open(os.path.join(dir, 'calibre.xml'), 'wb') + f.write(MIME) + f.close() +- self.mime_resources.append('calibre-mimetypes') +- check_call('xdg-mime install ./calibre-mimetypes', shell=True) + except Exception: + if self.opts.fatal_errors: + raise diff --git a/community-staging/couchdb/PKGBUILD b/community-staging/couchdb/PKGBUILD new file mode 100644 index 000000000..4327a8094 --- /dev/null +++ b/community-staging/couchdb/PKGBUILD @@ -0,0 +1,40 @@ +# $Id: PKGBUILD 48637 2011-06-03 16:51:06Z stephane $ +# Maintainer: Sergej Pupykin +# Contributor: Vitaliy Berdinskikh ur6lad[at]i.ua +# Previous Contributor: Michael Fellinger + +pkgname=couchdb +pkgver=1.0.2 +pkgrel=3 +pkgdesc="A document-oriented database that can be queried and indexed in a MapReduce fashion using JSON" +arch=('i686' 'x86_64') +url="http://couchdb.apache.org" +license=('APACHE') +depends=('icu' 'erlang' 'spidermonkey' 'openssl' 'curl') +makedepends=('gcc') +install=couchdb.install +options=('!libtool') +backup=('etc/couchdb/local.ini' + 'etc/conf.d/couchdb' + 'etc/logrotate.d/couchdb') +source=("http://www.apache.org/dist/$pkgname/$pkgver/apache-$pkgname-$pkgver.tar.gz" + "rc-script.patch") +md5sums=('7ffbbe0f23f672181c89923c9f7a1de1' + 'e9b5595338efbdc1a5db13284a296612') + +build() { + cd "$srcdir/apache-$pkgname-$pkgver" + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + patch etc/init/couchdb <$srcdir/rc-script.patch + make DESTDIR="$pkgdir" install + + install -Dm755 etc/default/couchdb $pkgdir/etc/conf.d/couchdb + sed -i 's|\(CONFIGURATION_FILE=/etc/\)default\(/couchdb\)|\1conf.d\2|' $pkgdir/etc/rc.d/couchdb + sed -i 's|\(COUCHDB_OPTIONS=\)|\1"-p /var/run/couchdb/couchdb.pid"|' $pkgdir/etc/conf.d/couchdb + sed -i 's|$COUCHDB -s|$COUCHDB $COUCHDB_OPTIONS -s|' $pkgdir/etc/rc.d/couchdb + sed -i 's|su $COUCHDB_USER -c|su $COUCHDB_USER -s /bin/bash -c|' $pkgdir/etc/rc.d/couchdb + + rm -rf $pkgdir/etc/default/ $pkgdir/var/run +} diff --git a/community-staging/couchdb/couchdb.install b/community-staging/couchdb/couchdb.install new file mode 100644 index 000000000..5eff459c7 --- /dev/null +++ b/community-staging/couchdb/couchdb.install @@ -0,0 +1,22 @@ +post_install() { + id couchdb &>/dev/null || \ + useradd -r -c "CouchDB daemon" -g daemon -d /var/lib/couchdb -s /bin/false couchdb + mkdir -p /var/run/couchdb + chown -R couchdb.daemon /etc/couchdb + chown -R couchdb.daemon /var/{lib,log,run}/couchdb +} + +pre_upgrade() { + id couchdb &>/dev/null || \ + useradd -r -c "CouchDB daemon" -g daemon -d /var/lib/couchdb -s /bin/false couchdb +} + +post_upgrade() { + mkdir -p $pkgdir/var/run/couchdb + chown -R couchdb.daemon /etc/couchdb + chown -R couchdb.daemon /var/{lib,log,run}/couchdb +} + +post_remove() { + userdel couchdb &>/dev/null +} diff --git a/community-staging/couchdb/rc-script.patch b/community-staging/couchdb/rc-script.patch new file mode 100644 index 000000000..d38f4dc6c --- /dev/null +++ b/community-staging/couchdb/rc-script.patch @@ -0,0 +1,90 @@ +--- couchdb.org 2011-04-01 19:56:32.000000000 +0000 ++++ couchdb 2011-04-01 19:59:17.000000000 +0000 +@@ -1,4 +1,7 @@ +-#!/bin/sh -e ++#!/bin/bash ++#general config ++. /etc/rc.conf ++. /etc/rc.d/functions + + # Licensed under the Apache License, Version 2.0 (the "License"); you may not + # use this file except in compliance with the License. You may obtain a copy of +@@ -29,7 +32,7 @@ + NAME=couchdb + SCRIPT_NAME=`basename $0` + COUCHDB=/usr/bin/couchdb +-CONFIGURATION_FILE=/etc/default/couchdb ++CONFIGURATION_FILE=/etc/conf.d/couchdb + RUN_DIR=/var/run/couchdb + LSB_LIBRARY=/lib/lsb/init-functions + +@@ -61,8 +63,9 @@ + fi + + start_couchdb () { +- # Start Apache CouchDB as a background process. ++ stat_busy "Starting the CouchDB daemon" + ++ [ -d /var/run/couchdb ] || mkdir -p /var/run/couchdb + command="$COUCHDB -b" + if test -n "$COUCHDB_STDOUT_FILE"; then + command="$command -o $COUCHDB_STDOUT_FILE" +@@ -79,38 +82,38 @@ + mkdir -p "$RUN_DIR" + if test -n "$COUCHDB_USER"; then + chown $COUCHDB_USER "$RUN_DIR" +- if su $COUCHDB_USER -c "$command" > /dev/null; then +- return $SCRIPT_OK ++ if su $COUCHDB_USER -s /bin/bash -c "$command" > /dev/null; then ++ stat_done + else +- return $SCRIPT_ERROR ++ stat_fail + fi + else + if $command > /dev/null; then +- return $SCRIPT_OK ++ stat_done + else +- return $SCRIPT_ERROR ++ stat_fail + fi + fi + } + + stop_couchdb () { +- # Stop the running Apache CouchDB process. ++ stat_busy "Stopping the CouchDB daemon" + + command="$COUCHDB -d" + if test -n "$COUCHDB_OPTIONS"; then + command="$command $COUCHDB_OPTIONS" + fi + if test -n "$COUCHDB_USER"; then +- if su $COUCHDB_USER -c "$command" > /dev/null; then +- return $SCRIPT_OK ++ if su $COUCHDB_USER -s /bin/bash -c "$command" > /dev/null; then ++ stat_done + else +- return $SCRIPT_ERROR ++ stat_fail + fi + else + if $command > /dev/null; then +- return $SCRIPT_OK ++ stat_done + else +- return $SCRIPT_ERROR ++ stat_fail + fi + fi + } +@@ -118,7 +121,7 @@ + display_status () { + # Display the status of the running Apache CouchDB process. + +- $COUCHDB -s ++ $COUCHDB $COUCHDB_OPTIONS -s + } + + parse_script_option_list () { diff --git a/community-staging/dwdiff/PKGBUILD b/community-staging/dwdiff/PKGBUILD new file mode 100644 index 000000000..4585b2ae9 --- /dev/null +++ b/community-staging/dwdiff/PKGBUILD @@ -0,0 +1,24 @@ +# $Id: PKGBUILD 48640 2011-06-03 16:55:04Z stephane $ +# Maintainer: Sergej Pupykin + +pkgname=dwdiff +pkgver=1.9 +pkgrel=2 +pkgdesc="a front-end for the diff program that operates at the word level instead of the line level" +arch=('i686' 'x86_64') +url="http://os.ghalkes.nl/dwdiff.html" +depends=('diffutils' 'icu') +license=('GPL') +source=(http://os.ghalkes.nl/dist/$pkgname-$pkgver.tgz) +md5sums=('f483d8d8dab7a972ef21d5096e07fd47') + +build() { + cd "$srcdir/$pkgname-$pkgver" + ./configure --prefix=/usr + make +} + +package() { + cd "$srcdir/$pkgname-$pkgver" + make prefix="$pkgdir"/usr install +} diff --git a/community-staging/gnustep-base/ChangeLog b/community-staging/gnustep-base/ChangeLog new file mode 100644 index 000000000..590f23f5e --- /dev/null +++ b/community-staging/gnustep-base/ChangeLog @@ -0,0 +1,6 @@ +2007-07-24 Snowman + * rebuilt against toolchain in current + * fixed SMP build + * fixed file ownership +2007-06-26 tardo +* Built for x86_64 diff --git a/community-staging/gnustep-base/PKGBUILD b/community-staging/gnustep-base/PKGBUILD new file mode 100644 index 000000000..a2a05176b --- /dev/null +++ b/community-staging/gnustep-base/PKGBUILD @@ -0,0 +1,34 @@ +# $Id: PKGBUILD 48665 2011-06-03 22:32:57Z stephane $ +# Maintainer: Sergej Pupykin +# Maintainer: Vesa Kaihlavirta +# Contributor: Sebastian Sareyko + +pkgname=gnustep-base +pkgver=1.22.0 +pkgrel=2 +pkgdesc="The GNUstep base package" +arch=('i686' 'x86_64') +url="http://www.gnustep.org/" +license=("GPL" "LGPL") +depends=(libxslt avahi gmp gcc-libs openssl libffi gnustep-make gnutls) +makedepends=(gcc-objc) +conflicts=('gnustep-base-svn') +groups=('gnustep-core') +options=('!emptydirs' '!makeflags') +source=(ftp://ftp.gnustep.org/pub/gnustep/core/$pkgname-$pkgver.tar.gz) +md5sums=('7faab4891ae6c1e7a6c806d6da368410') + +build() { + cd "$srcdir/$pkgname-$pkgver" + source /etc/profile.d/GNUstep.sh + ./configure --prefix=/usr --sysconfdir=/etc/GNUstep --with-ffi-include=/usr/lib/libffi-3.0.9/include/ + # fix file ownership + sed -i 's/tar -xf $(TIMEZONE_ARCHIVE);/tar -xf $(TIMEZONE_ARCHIVE);chown -R root:root * ;/' NSTimeZones/Makefile.postamble + make VERBOSE=1 +} + +package() { + cd "$srcdir/$pkgname-$pkgver" + make DESTDIR="$pkgdir" install + chown -R root.root "$pkgdir/" +} diff --git a/community-staging/goldendict/PKGBUILD b/community-staging/goldendict/PKGBUILD new file mode 100644 index 000000000..237e20083 --- /dev/null +++ b/community-staging/goldendict/PKGBUILD @@ -0,0 +1,37 @@ +# $Id: PKGBUILD 48628 2011-06-03 15:58:27Z stephane $ +# Maintainer: Jaroslav Lichtblau +# Contributor: m0rph + +pkgname=goldendict +pkgver=1.0.1 +pkgrel=3 +pkgdesc="Feature-rich dictionary lookup program" +arch=('i686' 'x86_64') +url="http://goldendict.berlios.de/" +license=('GPL3') +depends=('hunspell' 'libvorbis' 'libxtst' 'libzip' 'openssl' 'phonon') +makedepends=('patch') +changelog=$pkgname.changelog +source=(http://downloads.sourceforge.net/$pkgname/$pkgname-$pkgver-src.tar.bz2 \ + $pkgname-paths.diff) +md5sums=('d56bb854936015104029d1f0b98b61bb' + '4488d4353e5522796c00785f0ce265e1') + +build(){ + cd ${srcdir} + + patch -Np0 -i ${srcdir}/$pkgname-paths.diff + + qmake + make + qmake +} + +package() { + cd ${srcdir} + + make INSTALL_ROOT=${pkgdir} install + +#removing unneeded + rm -rf ${pkgdir}/usr/share/app-install +} diff --git a/community-staging/goldendict/goldendict-paths.diff b/community-staging/goldendict/goldendict-paths.diff new file mode 100644 index 000000000..812dfdb97 --- /dev/null +++ b/community-staging/goldendict/goldendict-paths.diff @@ -0,0 +1,10 @@ +--- goldendict.pro~ 2010-12-27 22:52:21.000000000 +0100 ++++ goldendict.pro 2010-12-27 22:52:21.000000000 +0100 +@@ -63,2 +63,2 @@ +- isEmpty( PREFIX ):PREFIX = /usr/local +- DEFINES += PROGRAM_DATA_DIR=\\\"$$PREFIX/share/apps/goldendict/\\\" ++ isEmpty( PREFIX ):PREFIX = /usr ++ DEFINES += PROGRAM_DATA_DIR=\\\"$$PREFIX/share/goldendict/\\\" +@@ -66 +66 @@ +- locale.path = $$PREFIX/share/apps/goldendict/locale/ ++ locale.path = $$PREFIX/share/goldendict/locale/ diff --git a/community-staging/goldendict/goldendict.changelog b/community-staging/goldendict/goldendict.changelog new file mode 100644 index 000000000..8ec311fe1 --- /dev/null +++ b/community-staging/goldendict/goldendict.changelog @@ -0,0 +1,8 @@ +2010-12-27 Jaroslav Lichtblau + * Update to major release 1.0.1 + +2010-02-16 Jaroslav Lichtblau + * FS#18350 fixed in 0.9.0-5 + +2009-06-21 Jaroslav Lichtblau + * Package moved to [community] in v0.9.0 diff --git a/community-staging/ibus-qt/PKGBUILD b/community-staging/ibus-qt/PKGBUILD new file mode 100644 index 000000000..51d3beb3d --- /dev/null +++ b/community-staging/ibus-qt/PKGBUILD @@ -0,0 +1,31 @@ +# $Id: PKGBUILD 48593 2011-06-03 07:34:58Z andrea $ +# Maintainer: Thomas Dziedzic < gostrc at gmail > +# Contributor: garion < garion @ mailoo.org > +# Contributor: leemars + +pkgname=ibus-qt +pkgver=1.3.1 +pkgrel=3 +pkgdesc='IBus qt library and IBus qt input method plugin' +arch=('i686' 'x86_64') +license=('LGPL') +url='http://ibus.googlecode.com' +depends=('qt' 'ibus' 'icu') +makedepends=('cmake' 'automoc4' 'doxygen') +source=("http://ibus.googlecode.com/files/${pkgname}-${pkgver}-Source.tar.gz") +md5sums=('769e8872ca8a59327b2073ce2f142589') + +build() { + cd "${srcdir}" + mkdir build + cd build + + cmake ../${pkgname}-${pkgver}-Source \ + -DCMAKE_INSTALL_PREFIX=/usr + make +} + +package() { + cd "${srcdir}"/build + make DESTDIR="${pkgdir}" install +} diff --git a/community-staging/mapnik/PKGBUILD b/community-staging/mapnik/PKGBUILD new file mode 100644 index 000000000..a008e5c60 --- /dev/null +++ b/community-staging/mapnik/PKGBUILD @@ -0,0 +1,52 @@ +# $Id: PKGBUILD 48662 2011-06-03 19:43:21Z stephane $ +# Maintainer: Sergej Pupykin +# Contributor: David Dent +# Contributor: orbisvicis + +pkgname=mapnik +pkgver=0.7.1 +pkgrel=10 +pkgdesc="Free Toolkit for developing mapping applications. Above all Mapnik is about rendering beautiful maps." +arch=('i686' 'x86_64') +url="http://mapnik.org/" +license=('LGPL') +depends=('boost-libs' 'icu' 'libpng' 'libjpeg' 'libtiff' 'freetype2' + 'libxml2' 'python2' 'proj' 'cairo' 'cairomm' 'pycairo' + 'postgresql-libs' 'postgis' 'gdal' 'curl' 'libtool') + # already in core ('zlib' 'sqlite3') +optdepends=('libxslt: Web Map Service' + 'python-lxml: Web Map Service' + 'python-imaging: Web Map Service' + 'python-nose: Web Map Service' + 'apache: Web Map Service' + 'mod_fastcgi: Web Map Service - or:' + 'mod_fcgid: Web Map Service - or:' + 'mod_wsgi: Web Map Service' + ) +makedepends=('scons' 'boost') # already in core ('pkg-config') +conflicts=('mapnik-svn') +install="mapnik.install" +source=("http://download.berlios.de/${pkgname}/${pkgname}-${pkgver}.tar.bz2") +md5sums=('8f65fda2a792518d6f6be8a85f62fc73') + +build() { + cd "$srcdir/$pkgname-$pkgver" + + #patch SConstruct so libs end up in /usr/lib not /usr/lib64 on X86_64 + sed -i -e "/LIBDIR_SCHEMA=/s/lib64/lib/" SConstruct + + sed -i 's/-ansi -Wall/-ansi -DBOOST_FILESYSTEM_VERSION=2 -Wall/' SConstruct + + scons configure \ + PREFIX="/usr" \ + INPUT_PLUGINS=all \ + DESTDIR="$pkgdir" + scons +} +package(){ + cd "$srcdir/$pkgname-$pkgver" + scons install + + # fix permissions on SCons-autogenerated files + chmod 644 "${pkgdir}/usr/lib/python2.7/site-packages/mapnik/paths.py" +} diff --git a/community-staging/mapnik/mapnik.install b/community-staging/mapnik/mapnik.install new file mode 100644 index 000000000..46f265d5b --- /dev/null +++ b/community-staging/mapnik/mapnik.install @@ -0,0 +1,11 @@ +post_install() { + /sbin/ldconfig +} + +post_upgrade() { + post_install +} + +post_remove() { + post_install +} diff --git a/community-staging/open-vm-tools/PKGBUILD b/community-staging/open-vm-tools/PKGBUILD new file mode 100644 index 000000000..9a97df2e4 --- /dev/null +++ b/community-staging/open-vm-tools/PKGBUILD @@ -0,0 +1,68 @@ +# $Id: PKGBUILD 48659 2011-06-03 19:34:11Z stephane $ +# Maintainer: Sergej Pupykin +# Contributor: Krzysztof Raczkowski + +pkgname=open-vm-tools +pkgver=2011.03.28 +_pkgsubver=387002 +pkgrel=4 +pkgdesc="The Open Virtual Machine Tools (open-vm-tools) are the open source implementation of VMware Tools." +arch=('i686' 'x86_64') +url="http://open-vm-tools.sourceforge.net/" +license=('LGPL') +depends=('open-vm-tools-modules' 'libdnet' 'icu' 'procps' 'glib2' 'uriparser' 'libsigc++' 'libxss') +makedepends=('chrpath' 'doxygen' 'gtkmm' 'fuse' 'libxtst') +optdepends=('gtkmm' 'libnotify' 'libxtst' 'fuse' 'libsm') +options=('docs' '!libtool') +install=$pkgname.install +source=(http://switch.dl.sourceforge.net/$pkgname/$pkgname-$pkgver-${_pkgsubver}.tar.gz + scripts-network.patch + scripts-network-FS19541.patch + open-vm-tools-X11Bool.patch + open-vm-tools.conf.d + open-vm-tools.rc.d + tools.conf + vmware-guestd + xautostart.conf) +md5sums=('a9c72ab0b8f7778d444e69e9d3b95527' + '06f7448e274db2a911f582e276088fc9' + 'b183ec265200d68431a5e4eb1b0c8cf5' + '8c333a979578bdc0c3134c1dd6bb7353' + '79b0a14d86191fee70a4639da8bd7785' + '67cb83a9e5a4dd016c1a1da2863ca36d' + 'b55d15e2c4be396aad709aeca91033d3' + '73cc1a2665b0dd62427733d62ead8b9a' + '75a25d83417e683957321f97a00f8465') + +build() { + cd "$srcdir/$pkgname-${pkgver}-${_pkgsubver}" + [ $NOEXTRACT -eq 1 ] || { + sed -i 's#3.2.7#3.2.8#' configure configure.ac + sed -i 's#CFLAGS="$CFLAGS -Werror"##' configure configure.ac + } + [ -f Makefile ] || ./configure --prefix=/usr --without-kernel-modules + make +} + +package() { + cd "$srcdir/$pkgname-${pkgver}-${_pkgsubver}" + + make install DESTDIR=$pkgdir + install -D -m 755 scripts/common/vmware-xdg-detect-de $pkgdir/usr/bin/vmware-xdg-detect-de + chmod 07755 $pkgdir/usr/bin/vmware-user-suid-wrapper + + cd $pkgdir + patch -Np1 -i $srcdir/scripts-network.patch etc/vmware-tools/scripts/vmware/network + patch -Np1 -i $srcdir/scripts-network-FS19541.patch etc/vmware-tools/scripts/vmware/network + + install -D -m 755 $srcdir/open-vm-tools.rc.d $pkgdir/etc/rc.d/open-vm-tools + install -D -m 644 $srcdir/open-vm-tools.conf.d $pkgdir/etc/conf.d/open-vm-tools + install -D -m 644 $srcdir/tools.conf $pkgdir/etc/vmware-tools/tools.conf + install -D -m 644 $srcdir/xautostart.conf $pkgdir/etc/vmware-tools/xautostart.conf + install -D -m 644 $srcdir/vmware-guestd $pkgdir/etc/pam.d/vmware-guestd + rm -rf $pkgdir/usr/etc + + ln -fs /usr/sbin/mount.vmhgfs $pkgdir/sbin/mount.vmhgfs + + cd $pkgdir && find -type f -exec sh -c "file {} | grep ELF >/dev/null && echo {} && chrpath -d {}" \; +} diff --git a/community-staging/open-vm-tools/open-vm-tools-X11Bool.patch b/community-staging/open-vm-tools/open-vm-tools-X11Bool.patch new file mode 100644 index 000000000..f12581807 --- /dev/null +++ b/community-staging/open-vm-tools/open-vm-tools-X11Bool.patch @@ -0,0 +1,15 @@ +diff -wbBur open-vm-tools-2010.08.24-292196.org/lib/include/vm_basic_types.h open-vm-tools-2010.08.24-292196/lib/include/vm_basic_types.h +--- open-vm-tools-2010.08.24-292196.org/lib/include/vm_basic_types.h 2010-08-24 19:59:22.000000000 +0000 ++++ open-vm-tools-2010.08.24-292196/lib/include/vm_basic_types.h 2010-08-30 09:38:48.000000000 +0000 +@@ -83,8 +83,11 @@ + + /* STRICT ANSI means the Xserver build and X defines Bool differently. */ + #if !defined(__STRICT_ANSI__) || defined(__FreeBSD__) || defined(__MINGW32__) ++# ifndef _XTYPEDEF_BOOL ++# define _XTYPEDEF_BOOL + typedef char Bool; + #endif ++#endif + + #ifndef FALSE + #define FALSE 0 diff --git a/community-staging/open-vm-tools/open-vm-tools.conf.d b/community-staging/open-vm-tools/open-vm-tools.conf.d new file mode 100644 index 000000000..83f7864e8 --- /dev/null +++ b/community-staging/open-vm-tools/open-vm-tools.conf.d @@ -0,0 +1,6 @@ +# Enable support for Drag'n'Drop +VM_DRAG_AND_DROP="yes" + +# vmware-guestd settings +GUESTD_BIN="/usr/sbin/vmware-guestd" +PIDFILE="/var/run/vmware-guestd.pid" diff --git a/community-staging/open-vm-tools/open-vm-tools.install b/community-staging/open-vm-tools/open-vm-tools.install new file mode 100644 index 000000000..88d9b88e6 --- /dev/null +++ b/community-staging/open-vm-tools/open-vm-tools.install @@ -0,0 +1,10 @@ +post_install() { + [ ! -d "/mnt/hgfs" ] && mkdir /mnt/hgfs + echo ">>>" + echo ">>> You can mount VMware Shared Folders via:" + echo ">>> mount -t vmhgfs .host:/ /mnt/hgfs" + echo ">>>" + echo ">>> or by adding this line to /etc/fstab:" + echo ">>> .host:/ /mnt/hgfs vmhgfs defaults 0 0" + echo ">>>" +} diff --git a/community-staging/open-vm-tools/open-vm-tools.rc.d b/community-staging/open-vm-tools/open-vm-tools.rc.d new file mode 100644 index 000000000..0c9221489 --- /dev/null +++ b/community-staging/open-vm-tools/open-vm-tools.rc.d @@ -0,0 +1,101 @@ +#!/bin/bash + +. /etc/rc.conf +. /etc/rc.d/functions + +# source application-specific settings +[ -f /etc/conf.d/open-vm-tools ] && . /etc/conf.d/open-vm-tools + +PID=`pidof -o %PPID /usr/bin/vmtoolsd` +case "$1" in + start) + stat_busy "Starting Open Virtual Machine Tools" + + if [ "$VM_DRAG_AND_DROP" == "yes" ]; then + VMBLOCK=`grep -w vmblock /proc/modules` + [ -z "$VMBLOCK" ] && modprobe vmblock + if [ $? -gt 0 ]; then + stat_fail + exit 1 + fi + + DND_TMPDIR="/tmp/VMwareDnD" + if [ ! -d "$DND_TMPDIR" ]; then + mkdir $DND_TMPDIR + chmod 1777 $DND_TMPDIR + fi + + mount -t vmblock none /proc/fs/vmblock/mountPoint + if [ $? -gt 0 ]; then + stat_fail + exit 1 + fi + fi + + + for m in vmhgfs vmsync; do + VMMOD=`grep -w $m /proc/modules` + [ -z "$VMMOD" ] && \ + { modprobe $m + if [ $? -gt 0 ]; then + stat_fail + exit 1 + fi; } + done + + + [ -z "$PID" ] && /usr/bin/vmtoolsd --background $PIDFILE + if [ $? -gt 0 ]; then + stat_fail + else + add_daemon open-vm-tools + stat_done + fi + ;; + stop) + stat_busy "Stopping Open Virtual Machine Tools" + [ ! -z "$PID" ] && kill $PID &>/dev/null +# if [ $? -gt 0 ]; then +# stat_fail +# exit 1 +# fi + + for m in vmhgfs vmsync vmci; do + VMMOD=`grep -w $m /proc/modules` + [ ! -z "$VMMOD" ] && rmmod $m + if [ $? -gt 0 ]; then + stat_fail + exit 4 + fi + done + + if [ "$VM_DRAG_AND_DROP" == "yes" ]; then + MOUNTPOINT=`grep -w "none /proc/fs/vmblock/mountPoint vmblock" /proc/modules` + [ -z "$MOUNTPOINT" ] && umount /proc/fs/vmblock/mountPoint + if [ $? -gt 0 ]; then + stat_fail + exit 5 + fi + + DND_TMPDIR="/tmp/VMwareDnD" + rm -r $DND_TMPDIR + + VMBLOCK=`grep -w vmblock /proc/modules` + [ ! -z "$VMBLOCK" ] && rmmod vmblock + if [ $? -gt 0 ]; then + stat_fail + exit 6 + fi + fi + + rm_daemon open-vm-tools + stat_done + ;; + restart) + $0 stop + $0 start + ;; + *) + echo "usage: $0 {start|stop|restart}" +esac +exit 0 diff --git a/community-staging/open-vm-tools/scripts-network-FS19541.patch b/community-staging/open-vm-tools/scripts-network-FS19541.patch new file mode 100644 index 000000000..1f65b9824 --- /dev/null +++ b/community-staging/open-vm-tools/scripts-network-FS19541.patch @@ -0,0 +1,40 @@ +--- network 2010-04-28 12:30:51.000000000 +0200 ++++ network.bak 2010-05-20 12:12:50.000000000 +0200 +@@ -76,7 +76,7 @@ + else + echo `date` "[rescue_nic] activating $nic ..." + +- ifup $nic ++ ifconfig $nic up + exitCode=`expr $exitCode \| $?` + fi + done < $activeList +@@ -103,7 +103,7 @@ + TranquilizeNetworkManager() { + # `which' may be a bit noisy, so we'll shush it. + dbusSend=`which dbus-send 2>/dev/null` +- if [ $? -eq 0 ]; then ++ if [ $? -eq 0 ] && [ `pidof dbus-daemon` ]; then + # NetworkManager 0.6 + $dbusSend --system --dest=org.freedesktop.NetworkManager \ + /org/freedesktop/NetworkManager \ +@@ -133,7 +133,7 @@ + WakeNetworkManager() { + # `which' may be a bit noisy, so we'll shush it. + dbusSend=`which dbus-send 2>/dev/null` +- if [ $? -eq 0 ]; then ++ if [ $? -eq 0 ] && [ `pidof dbus-daemon` ]; then + # NetworkManager 0.6 + $dbusSend --system --dest=org.freedesktop.NetworkManager \ + /org/freedesktop/NetworkManager \ +@@ -165,8 +165,8 @@ + + # XXX Are these really necessary? If so, we should have seen customer + # complaints by now. +- which ifup >/dev/null 2>&1 || Panic "ifup not in search path." +- which ifconfig >/dev/null 2>&1 || Panic "ifconfig not in search path." ++# which ifup >/dev/null 2>&1 || Panic "ifup not in search path." ++ which ifconfig >/dev/null 2>&1 || Panic "ifconfig not in search path." + + case "$1" in + poweron-vm) diff --git a/community-staging/open-vm-tools/scripts-network.patch b/community-staging/open-vm-tools/scripts-network.patch new file mode 100644 index 000000000..13ea7f565 --- /dev/null +++ b/community-staging/open-vm-tools/scripts-network.patch @@ -0,0 +1,63 @@ +--- network.org 2010-04-28 10:21:14.000000000 +0000 ++++ network 2010-04-28 10:24:00.000000000 +0000 +@@ -34,51 +34,6 @@ + + + # +-# find_networking_script -- +-# +-# Searches common Linux distro init/rc paths to find a singular network +-# services script. +-# +-# Result: +-# Returns a valid networking script path on success or "error" on failure. +-# +-# Side effects: +-# None. +-# +- +-find_networking_script() { +- local script="error" +- for dir in "/etc/init.d" "/sbin/init.d" "/etc" "/etc/rc.d" ; do +- if [ -d "$dir/rc0.d" ] && +- [ -d "$dir/rc1.d" ] && +- [ -d "$dir/rc2.d" ] && +- [ -d "$dir/rc3.d" ] && +- [ -d "$dir/rc4.d" ] && +- [ -d "$dir/rc5.d" ] && +- [ -d "$dir/rc6.d" ]; then +- +- # Now find the appropriate networking script. +- if [ -d "$dir/init.d" ]; then +- if [ -x "$dir/init.d/network" ]; then +- script="$dir/init.d/network" +- elif [ -x "$dir/init.d/networking" ]; then +- script="$dir/init.d/networking" +- fi +- else +- if [ -x "$dir/network" ]; then +- script="$dir/network" +- elif [ -x "$dir/networking" ]; then +- script="$dir/networking" +- fi +- fi +- fi +- done +- +- echo "$script" +-} +- +- +-# + # save_active_NIC_list -- + # + # Records a list of every active NIC to /var/run/vmware-active-nics. +@@ -205,7 +160,7 @@ + exitCode=0 + activeList=/var/run/vmware-active-nics + +- networkScript=`find_networking_script` ++ networkScript=/etc/rc.d/network + [ "$networkScript" != "error" ] || Panic "Cannot find system networking script." + + # XXX Are these really necessary? If so, we should have seen customer diff --git a/community-staging/open-vm-tools/tools.conf b/community-staging/open-vm-tools/tools.conf new file mode 100644 index 000000000..0bb2681b1 --- /dev/null +++ b/community-staging/open-vm-tools/tools.conf @@ -0,0 +1 @@ +bindir = "/usr/bin" diff --git a/community-staging/open-vm-tools/vmware-guestd b/community-staging/open-vm-tools/vmware-guestd new file mode 100644 index 000000000..ac80c0385 --- /dev/null +++ b/community-staging/open-vm-tools/vmware-guestd @@ -0,0 +1,6 @@ +#%PAM-1.0 + +auth sufficient /lib/security/pam_unix2.so shadow nullok +auth required /lib/security/pam_unix_auth.so shadow nullok +account sufficient /lib/security/pam_unix2.so +account required /lib/security/pam_unix_acct.so diff --git a/community-staging/open-vm-tools/xautostart.conf b/community-staging/open-vm-tools/xautostart.conf new file mode 100644 index 000000000..829f379ce --- /dev/null +++ b/community-staging/open-vm-tools/xautostart.conf @@ -0,0 +1,6 @@ +gnome-panel +ksmserver +startkde +kwrapper +panel +xfce4-panel diff --git a/community-staging/openttd/PKGBUILD b/community-staging/openttd/PKGBUILD new file mode 100644 index 000000000..5a2aedccc --- /dev/null +++ b/community-staging/openttd/PKGBUILD @@ -0,0 +1,38 @@ +# $Id: PKGBUILD 48655 2011-06-03 19:25:38Z stephane $ +# Maintainer: Vesa Kaihlavirta + +pkgname=openttd +pkgver=1.1.0 +pkgrel=2 +pkgdesc='An engine for running Transport Tycoon Deluxe.' +arch=('i686' 'x86_64') +url='http://www.openttd.org' +license=('GPL') +depends=('libpng' 'sdl' 'icu' 'fontconfig' 'lzo2' 'hicolor-icon-theme' 'desktop-file-utils') +install=openttd.install +optdepends=('openttd-opengfx: free graphics' + 'openttd-opensfx: free soundset') +source=("http://binaries.openttd.org/releases/${pkgver}/${pkgname}-${pkgver}-source.tar.xz") +md5sums=('b5b1f2ecc7327505e360047236b09d06') + +build() { + cd ${pkgname}-${pkgver} + + ./configure \ + --prefix-dir=/usr \ + --binary-name=${pkgname} \ + --binary-dir=bin \ + --data-dir=share/${pkgname} \ + --install-dir=${pkgdir} \ + --doc-dir=share/doc/${pkgname} \ + --menu-name="OpenTTD" \ + --personal-dir=.${pkgname} + + make +} + +package() { + cd ${pkgname}-${pkgver} + + make install +} diff --git a/community-staging/openttd/openttd.install b/community-staging/openttd/openttd.install new file mode 100644 index 000000000..85b22a1c5 --- /dev/null +++ b/community-staging/openttd/openttd.install @@ -0,0 +1,17 @@ +post_install() { + gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor > /dev/null 2>&1 + update-desktop-database > /dev/null 2>&1 +} + +post_upgrade() { + post_install $1 +} + +pre_remove() { + update-desktop-database > /dev/null 2>&1 +} + +post_remove() { + gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor > /dev/null 2>&1 + update-desktop-database > /dev/null 2>&1 +} diff --git a/community-staging/parrot/ChangeLog b/community-staging/parrot/ChangeLog new file mode 100644 index 000000000..725287638 --- /dev/null +++ b/community-staging/parrot/ChangeLog @@ -0,0 +1,5 @@ + +2008-01-06 Douglas Soares de Andrade + + * Added for x86_64 + diff --git a/community-staging/parrot/PKGBUILD b/community-staging/parrot/PKGBUILD new file mode 100644 index 000000000..eb5f198b7 --- /dev/null +++ b/community-staging/parrot/PKGBUILD @@ -0,0 +1,44 @@ +# $Id: PKGBUILD 48652 2011-06-03 17:21:22Z stephane $ +# Maintainer: Sergej Pupykin +# Contributer: mpie + +pkgname=parrot +pkgver=3.3.0 +#_rel=devel +_rel=stable +pkgrel=2 +pkgdesc="standalone virtual machine that can be used to execute bytecode compiled dynamic languages" +arch=(i686 x86_64) +url="http://www.parrotcode.org/" +license=('GPL') +depends=('gmp' 'gdbm' 'readline' 'icu' 'openssl' 'libffi') +makedepends=('perl-json') +optdepends=('freeglut') +options=(!emptydirs !makeflags) +source=(ftp://ftp.parrot.org/pub/parrot/releases/${_rel}/$pkgver/parrot-$pkgver.tar.gz) +md5sums=('335d50fbef245bfe6d0bb277e224c728') + +build() { + cd $srcdir/$pkgname-$pkgver + + sed -i 's#auto::sha1##' lib/Parrot/Configure/Step/List.pm + sed -i 's#auto::git_describe##' lib/Parrot/Configure/Step/List.pm + + [ $NOEXTRACT -eq 1 ] || perl Configure.pl --prefix=/usr --parrot_is_shared + + find -type f -name Makefile | while read F; do + grep "$srcdir" $F && sed -i "s#-Wl,-rpath=$srcdir/parrot-$pkgver/blib/lib##" $F || true + grep "$srcdir" $F && sed -i "s#-rpath=$srcdir/parrot-$pkgver/blib/lib##" $F || true + done + + OLD_LIB_PATH=$LD_LIBRARY_PATH + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$srcdir/parrot-$pkgver/blib/lib + make -j1 all parrot_utils docs html RPATH_BLIB= + + export LD_LIBRARY_PATH=`pwd`/blib/lib + make -j1 DESTDIR=$pkgdir install-dev + + sed -i "s#$srcdir#/usr/src#" $pkgdir/usr/lib/parrot/$pkgver/tools/lib/Parrot/Config/Generated.pm + + export LD_LIBRARY_PATH=$OLD_LIB_PATH +} diff --git a/community-staging/sword/PKGBUILD b/community-staging/sword/PKGBUILD new file mode 100644 index 000000000..0ad02180e --- /dev/null +++ b/community-staging/sword/PKGBUILD @@ -0,0 +1,26 @@ +# Maintainer: Stefan Husmann +# Contributor: TripleE + +pkgname=sword +pkgver=1.6.2 +pkgrel=3 +pkgdesc="SWORD libraries for Bible programs" +arch=('i686' 'x86_64') +url="http://www.crosswire.org/sword/index.jsp" +license=('GPL') +depends=('curl' 'icu' 'clucene') +source=(http://www.crosswire.org/ftpmirror/pub/${pkgname}/source/v1.6/${pkgname}-${pkgver}.tar.gz) +md5sums=('a7dc4456e20e915fec46d774b690e305') +backup=('etc/sword.conf') + +build() { + cd "${srcdir}/${pkgname}-${pkgver}" + ./configure --prefix=/usr --sysconfdir=/etc --with-icu + make +} +package() { + cd "${srcdir}/${pkgname}-${pkgver}" + make DESTDIR="${pkgdir}" install + make DESTDIR="${pkgdir}" install_config +} + diff --git a/community-staging/tea/PKGBUILD b/community-staging/tea/PKGBUILD new file mode 100644 index 000000000..4ab5fde5d --- /dev/null +++ b/community-staging/tea/PKGBUILD @@ -0,0 +1,35 @@ +# $Id: PKGBUILD 48620 2011-06-03 13:51:59Z ibiru $ +# Maintainer: Sergej Pupykin +# Maintainer: Andrea Scarpino +# Contributor: Roman Kyrylych +# Contributor: Michal Kaliszka +# Contributor: Zsolt Varadi + +pkgname=tea +pkgver=29.0.3 +pkgrel=2 +pkgdesc="A QT-based text editor for Linux and *BSD. With an ultimate small size TEA provides you hundreds of functions." +arch=('i686' 'x86_64') +url="http://tea-editor.sourceforge.net/" +license=('GPL') +depends=('qt' 'aspell' 'hunspell') +install=tea.install +source=(http://downloads.sourceforge.net/tea-editor/${pkgname}-${pkgver}.tar.bz2 + tea.desktop) +md5sums=('1c900e7f57a0fe72fb4cc481450a5b32' + '377ace3363124f4c086de0babb820761') + +build() { + cd "${srcdir}/${pkgname}-${pkgver}" + + qmake PREFIX=/usr/bin + make +} + +package(){ + cd "${srcdir}/${pkgname}-${pkgver}" + make INSTALL_ROOT="${pkgdir}" install + + install -Dm644 "${srcdir}/tea.desktop" "${pkgdir}/usr/share/applications/tea.desktop" + install -Dm644 icons/tea_icon_v2.png "${pkgdir}/usr/share/pixmaps/tea.png" +} diff --git a/community-staging/tea/tea.desktop b/community-staging/tea/tea.desktop new file mode 100644 index 000000000..818704a26 --- /dev/null +++ b/community-staging/tea/tea.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Tea +Comment=A small programmer's QT editor +Exec=tea %U +Terminal=false +Type=Application +StartupNotify=true +Icon=tea.png +Categories=Application;Utility;TextEditor; diff --git a/community-staging/tea/tea.install b/community-staging/tea/tea.install new file mode 100644 index 000000000..d7904254b --- /dev/null +++ b/community-staging/tea/tea.install @@ -0,0 +1,4 @@ +post_upgrade() { + echo "############################################" + echo "for the old GTK branch of TEA install teagtk" +} diff --git a/community-staging/tracker/PKGBUILD b/community-staging/tracker/PKGBUILD new file mode 100644 index 000000000..f6ec9331b --- /dev/null +++ b/community-staging/tracker/PKGBUILD @@ -0,0 +1,50 @@ +# $Id: PKGBUILD 48646 2011-06-03 17:05:43Z stephane $ +# Maintainer: Sergej Pupykin +# Maintainer: Alexander Fehr + +pkgname=tracker +pkgver=0.10.15 +pkgrel=2 +pkgdesc="Powerful object database, tag/metadata database, search tool and indexer" +arch=('i686' 'x86_64') +url="http://www.gnome.org/projects/tracker/" +license=('GPL') +depends=('upower' 'poppler-glib' 'gstreamer0.10-base' 'libgee' 'gnome-desktop' 'libnotify' 'xdg-utils' 'gtkhtml' + 'libgsf' 'gnome-panel-bonobo' 'exempi' 'networkmanager') +makedepends=('intltool' 'gnome-panel' 'nautilus' 'evolution' 'totem-plparser' 'icu') +optdepends=('nautilus' + 'enca' + 'gtkhtml' + 'gnome-panel' + 'totem-plparser' + 'icu' + 'taglib' + 'giflib') +options=('!libtool') +conflicts=('libtracker') +provides=("libtracker") +install=tracker.install +source=(http://ftp.gnome.org/pub/GNOME/sources/tracker/0.10/tracker-$pkgver.tar.bz2) +md5sums=('c948ef3988b08e81cad3ff980b17a0fd') + +build() { + cd "$srcdir/$pkgname-$pkgver" + + # python2 fix + export PYTHON=`which python2` + for file in tests/functional-tests/*.py; do + sed -i 's_#!/usr/bin/env python_#!/usr/bin/env python2_' $file + sed -i 's_#!/usr/bin/python_#!/usr/bin/python2_' $file + done + + ./configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib/$pkgname \ + --enable-video-extractor=gstreamer --disable-unac --disable-hal \ + --disable-devkit-power --disable-miner-evolution + touch docs/manpages/tracker-search-bar.1 + make +} + +package() { + cd "$srcdir/$pkgname-$pkgver" + make DESTDIR="$pkgdir" install +} diff --git a/community-staging/tracker/tracker.install b/community-staging/tracker/tracker.install new file mode 100644 index 000000000..b95cc069d --- /dev/null +++ b/community-staging/tracker/tracker.install @@ -0,0 +1,11 @@ +post_install() { + which xdg-icon-resource 1>/dev/null 2>/dev/null && xdg-icon-resource forceupdate || true +} + +post_upgrade() { + post_install $1 +} + +post_remove() { + which xdg-icon-resource 1>/dev/null 2>/dev/null && xdg-icon-resource forceupdate || true +} diff --git a/community-staging/xulrunner-oss/PKGBUILD b/community-staging/xulrunner-oss/PKGBUILD new file mode 100644 index 000000000..613d9f41b --- /dev/null +++ b/community-staging/xulrunner-oss/PKGBUILD @@ -0,0 +1,70 @@ +# $Id: PKGBUILD 114705 2011-03-15 15:11:28Z ibiru $ +# Maintainer: Jan de Groot +# Contributor: Alexander Baldeck +pkgname=xulrunner-oss +pkgver=2.0.1 +_ffoxver=4.0.1 +pkgrel=2 +pkgdesc="Mozilla Runtime Environment compiled with OSS support" +arch=('i686' 'x86_64') +license=('MPL' 'GPL' 'LGPL') +depends=('gtk2' 'gcc-libs' 'libidl2' 'mozilla-common' 'nss' 'libxt' 'libxrender' 'hunspell' 'startup-notification' 'mime-types' 'dbus-glib' 'libevent' 'sqlite3>=3.7.4' 'libnotify') +makedepends=('zip' 'pkg-config' 'diffutils' 'python2' 'wireless_tools' 'yasm' 'mesa' 'autoconf2.13') +url="http://wiki.mozilla.org/XUL:Xul_Runner" +source=(http://releases.mozilla.org/pub/mozilla.org/firefox/releases/${_ffoxver}/source/firefox-${_ffoxver}.source.tar.bz2 + mozconfig + mozilla-pkgconfig.patch + xulrunner-version.patch + xulrunner-omnijar.patch + port_gnomevfs_to_gio.patch + oss.patch) +options=('!emptydirs') +conflicts=('xulrunner') +provides=("xulrunner=${pkgver}") +md5sums=('9abda7d23151e97913c8555a64c13f34' + '2358a2ddd35bcdd62ff42442dfe548d9' + '639ea80e823543dd415b90c0ee804186' + 'a0236f6c3e55f60b7888d8cf137ff209' + '0bf82bc6677e3ce57fd20a147fe8d7b1' + '42f83468b296452fb754a81a4317ca64' + '81032ce49c2a5ac15d62155bcc42d3ed') + +build() { + cd "${srcdir}/mozilla-2.0" + cp "${srcdir}/mozconfig" .mozconfig + + #fix libdir/sdkdir - fedora + patch -Np1 -i "${srcdir}/mozilla-pkgconfig.patch" + + #Force installation to the same path for every version + patch -Np1 -i "${srcdir}/xulrunner-version.patch" + + patch -Np1 -i "${srcdir}/xulrunner-omnijar.patch" + + patch -Np1 -i "${srcdir}/port_gnomevfs_to_gio.patch" + + patch -Np0 -i "${srcdir}/oss.patch" + sed -i 's/sydney_audio_alsa/sydney_audio_oss/' media/libsydneyaudio/src/Makefile.in + sed -i '/EXTRA_DSO_LDOPTS += $(MOZ_ALSA_LIBS)/d' layout/build/Makefile.in + sed -i '/EXTRA_DSO_LDOPTS += $(MOZ_ALSA_LIBS)/d' toolkit/library/libxul-config.mk + + unset CFLAGS + unset CXXFLAGS + export CXXFLAGS="-fpermissive" + + make -j1 -f client.mk build MOZ_MAKE_FLAGS="$MAKEFLAGS" +} + +package() { + cd "${srcdir}/mozilla-2.0" + make -j1 -f client.mk DESTDIR="${pkgdir}" install + + #Remove included dictionaries, add symlink to system myspell path. + #Note: this will cause file conflicts when users have installed dictionaries in the old location + rm -rf "${pkgdir}/usr/lib/xulrunner-2.0/dictionaries" + ln -sf /usr/share/myspell/dicts "${pkgdir}/usr/lib/xulrunner-2.0/dictionaries" + + # add xulrunner library path to ld.so.conf + install -d ${pkgdir}/etc/ld.so.conf.d + echo "/usr/lib/xulrunner-2.0" > ${pkgdir}/etc/ld.so.conf.d/xulrunner.conf +} diff --git a/community-staging/xulrunner-oss/mozconfig b/community-staging/xulrunner-oss/mozconfig new file mode 100644 index 000000000..03a352920 --- /dev/null +++ b/community-staging/xulrunner-oss/mozconfig @@ -0,0 +1,56 @@ +. $topsrcdir/xulrunner/config/mozconfig + +ac_add_options --prefix=/usr +ac_add_options --libdir=/usr/lib +ac_add_options --with-system-nspr +ac_add_options --with-system-nss +ac_add_options --with-system-jpeg +ac_add_options --with-system-zlib +ac_add_options --with-system-bz2 +ac_add_options --with-system-png +ac_add_options --with-system-libevent +ac_add_options --enable-system-hunspell +ac_add_options --enable-system-sqlite +ac_add_options --enable-system-cairo +ac_add_options --with-pthreads + +ac_add_options --enable-default-toolkit=cairo-gtk2 +ac_add_options --enable-safe-browsing +ac_add_options --enable-extensions=default +ac_add_options --enable-startup-notification +ac_add_options --enable-pango +ac_add_options --enable-svg +ac_add_options --enable-canvas +ac_add_options --enable-smil +ac_add_options --enable-canvas3d +ac_add_options --enable-places +ac_add_options --enable-shared-js +ac_add_options --enable-url-classifier + +ac_add_options --enable-optimize +ac_add_options --enable-strip +ac_add_options --enable-install-strip +ac_add_options --enable-jemalloc +ac_add_options --enable-xterm-updates +ac_add_options --enable-printing +ac_add_options --enable-xinerama + +ac_add_options --disable-javaxpcom +ac_add_options --disable-crashreporter +ac_add_options --disable-updater +ac_add_options --disable-tests +ac_add_options --disable-xprint +ac_add_options --disable-mochitest +ac_add_options --disable-debug +ac_add_options --disable-installer +ac_add_options --disable-pedantic + +ac_add_options --enable-gio +ac_add_options --disable-gnomevfs +ac_add_options --enable-gconf +ac_add_options --enable-libnotify + +export BUILD_OFFICIAL=1 +export MOZILLA_OFFICIAL=1 +mk_add_options BUILD_OFFICIAL=1 +mk_add_options MOZILLA_OFFICIAL=1 diff --git a/community-staging/xulrunner-oss/mozilla-pkgconfig.patch b/community-staging/xulrunner-oss/mozilla-pkgconfig.patch new file mode 100644 index 000000000..2203efcde --- /dev/null +++ b/community-staging/xulrunner-oss/mozilla-pkgconfig.patch @@ -0,0 +1,60 @@ +diff -Nur mozilla-2.0.orig/xulrunner/installer/libxul-embedding.pc.in mozilla-2.0/xulrunner/installer/libxul-embedding.pc.in +--- mozilla-2.0.orig/xulrunner/installer/libxul-embedding.pc.in 2011-03-03 14:12:04.000000000 -0800 ++++ mozilla-2.0/xulrunner/installer/libxul-embedding.pc.in 2011-03-13 03:25:12.350027359 -0700 +@@ -6,5 +6,6 @@ + Name: libxul-embedding + Description: Static library for version-independent embedding of the Mozilla runtime + Version: %MOZILLA_VERSION% ++Requires: %NSPR_NAME% >= %NSPR_VERSION% + Libs: -L${sdkdir}/lib -lxpcomglue -ldl + Cflags: -DXPCOM_GLUE -I${includedir} %WCHAR_CFLAGS% +diff -Nur mozilla-2.0.orig/xulrunner/installer/libxul.pc.in mozilla-2.0/xulrunner/installer/libxul.pc.in +--- mozilla-2.0.orig/xulrunner/installer/libxul.pc.in 2011-03-03 14:12:04.000000000 -0800 ++++ mozilla-2.0/xulrunner/installer/libxul.pc.in 2011-03-13 03:25:28.010027359 -0700 +@@ -1,5 +1,6 @@ + prefix=%prefix% + sdkdir=%sdkdir% ++libdir=%libdir% + includedir=%includedir% + idldir=%idldir% + +diff -Nur mozilla-2.0.orig/xulrunner/installer/Makefile.in mozilla-2.0/xulrunner/installer/Makefile.in +--- mozilla-2.0.orig/xulrunner/installer/Makefile.in 2011-03-03 14:12:04.000000000 -0800 ++++ mozilla-2.0/xulrunner/installer/Makefile.in 2011-03-13 03:25:55.570027359 -0700 +@@ -121,6 +121,7 @@ + -e "s|%includedir%|$(includedir)|" \ + -e "s|%idldir%|$(idldir)|" \ + -e "s|%sdkdir%|$(sdkdir)|" \ ++ -e "s|%libdir%|$(installdir)|" \ + -e "s|%MOZ_APP_NAME%|$(MOZ_APP_NAME)|" \ + -e "s|%MOZILLA_VERSION%|$(MOZ_APP_VERSION)|" \ + -e "s|%WCHAR_CFLAGS%|$(WCHAR_CFLAGS)|" \ +diff -Nur mozilla-2.0.orig/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in mozilla-2.0/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in +--- mozilla-2.0.orig/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in 2011-03-03 14:12:04.000000000 -0800 ++++ mozilla-2.0/xulrunner/installer/mozilla-gtkmozembed-embedding.pc.in 2011-03-13 03:26:18.676694023 -0700 +@@ -1,5 +1,6 @@ + prefix=%prefix% + sdkdir=%sdkdir% ++libdir=%libdir% + includedir=%includedir% + + Name: mozilla-gtkembedmoz +diff -Nur mozilla-2.0.orig/xulrunner/installer/mozilla-gtkmozembed.pc.in mozilla-2.0/xulrunner/installer/mozilla-gtkmozembed.pc.in +--- mozilla-2.0.orig/xulrunner/installer/mozilla-gtkmozembed.pc.in 2011-03-03 14:12:04.000000000 -0800 ++++ mozilla-2.0/xulrunner/installer/mozilla-gtkmozembed.pc.in 2011-03-13 03:26:41.566694025 -0700 +@@ -1,5 +1,6 @@ + prefix=%prefix% + sdkdir=%sdkdir% ++libdir=%libdir% + includedir=%includedir% + + Name: mozilla-gtkembedmoz +diff -Nur mozilla-2.0.orig/xulrunner/installer/mozilla-js.pc.in mozilla-2.0/xulrunner/installer/mozilla-js.pc.in +--- mozilla-2.0.orig/xulrunner/installer/mozilla-js.pc.in 2011-03-03 14:12:04.000000000 -0800 ++++ mozilla-2.0/xulrunner/installer/mozilla-js.pc.in 2011-03-13 03:27:19.680027357 -0700 +@@ -7,4 +7,4 @@ + Version: %MOZILLA_VERSION% + Requires: %NSPR_NAME% >= %NSPR_VERSION% + Libs: -L${sdkdir}/lib %MOZ_JS_LINK% +-Cflags: -I${includedir} -DXP_UNIX -DJS_THREADSAFE ++Cflags: -I${includedir} -I${includedir}/js -DXP_UNIX -DJS_THREADSAFE diff --git a/community-staging/xulrunner-oss/oss.patch b/community-staging/xulrunner-oss/oss.patch new file mode 100644 index 000000000..ca79879fd --- /dev/null +++ b/community-staging/xulrunner-oss/oss.patch @@ -0,0 +1,31 @@ +--- configure.in 2011-03-16 04:58:10.640027357 -0700 ++++ configure.in.orig 2011-03-16 04:58:39.313360691 -0700 +@@ -6266,20 +6266,6 @@ + AC_DEFINE(MOZ_TREMOR) + fi + +-dnl ======================================================== +-dnl = Check alsa availability on Linux if using sydneyaudio +-dnl ======================================================== +- +-dnl If using sydneyaudio with Linux, ensure that the alsa library is available +-if test -n "$MOZ_SYDNEYAUDIO"; then +- case "$target_os" in +-linux*) +- PKG_CHECK_MODULES(MOZ_ALSA, alsa, , +- [echo "$MOZ_ALSA_PKG_ERRORS" +- AC_MSG_ERROR([Need alsa for Ogg, Wave or WebM decoding on Linux. Disable with --disable-ogg --disable-wave --disable-webm. (On Ubuntu, you might try installing the package libasound2-dev.)])]) +- ;; +- esac +-fi + + dnl ======================================================== + dnl Splashscreen +@@ -9294,7 +9280,6 @@ + AC_SUBST(MOZ_TREMOR) + AC_SUBST(MOZ_WEBM) + AC_SUBST(MOZ_OGG) +-AC_SUBST(MOZ_ALSA_LIBS) + AC_SUBST(VPX_AS) + AC_SUBST(VPX_ASFLAGS) + AC_SUBST(VPX_DASH_C_FLAG) diff --git a/community-staging/xulrunner-oss/port_gnomevfs_to_gio.patch b/community-staging/xulrunner-oss/port_gnomevfs_to_gio.patch new file mode 100644 index 000000000..797baff42 --- /dev/null +++ b/community-staging/xulrunner-oss/port_gnomevfs_to_gio.patch @@ -0,0 +1,1316 @@ +diff -r 49a1b2aa43c5 extensions/gio/Makefile.in +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/extensions/gio/Makefile.in Tue Jan 11 11:17:52 2011 +0100 +@@ -0,0 +1,69 @@ ++# vim:set ts=8 sw=8 sts=8 noet: ++# ***** BEGIN LICENSE BLOCK ***** ++# Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++# ++# The contents of this file are subject to the Mozilla Public License Version ++# 1.1 (the "License"); you may not use this file except in compliance with ++# the License. You may obtain a copy of the License at ++# http://www.mozilla.org/MPL/ ++# ++# Software distributed under the License is distributed on an "AS IS" basis, ++# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++# for the specific language governing rights and limitations under the ++# License. ++# ++# The Original Code is the Mozilla gnome-vfs extension. ++# ++# The Initial Developer of the Original Code is IBM Corporation. ++# ++# Portions created by IBM Corporation are Copyright (C) 2004 ++# IBM Corporation. All Rights Reserved. ++# ++# Contributor(s): ++# Darin Fisher ++# Jan Horak ++# ++# Alternatively, the contents of this file may be used under the terms of ++# either the GNU General Public License Version 2 or later (the "GPL"), or ++# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++# in which case the provisions of the GPL or the LGPL are applicable instead ++# of those above. If you wish to allow use of your version of this file only ++# under the terms of either the GPL or the LGPL, and not to allow others to ++# use your version of this file under the terms of the MPL, indicate your ++# decision by deleting the provisions above and replace them with the notice ++# and other provisions required by the GPL or the LGPL. If you do not delete ++# the provisions above, a recipient may use your version of this file under ++# the terms of any one of the MPL, the GPL or the LGPL. ++# ++# ***** END LICENSE BLOCK ***** ++ ++DEPTH = ../.. ++topsrcdir = @top_srcdir@ ++srcdir = @srcdir@ ++VPATH = @srcdir@ ++ ++include $(DEPTH)/config/autoconf.mk ++ ++MODULE = nkgio ++LIBRARY_NAME = nkgio ++SHORT_LIBNAME = nkgio ++IS_COMPONENT = 1 ++ ++CPPSRCS = \ ++ nsGIOProtocolHandler.cpp \ ++ $(NULL) ++ ++LOCAL_INCLUDES = $(MOZ_GIO_CFLAGS) ++ ++EXTRA_DSO_LDOPTS = \ ++ $(XPCOM_GLUE_LDOPTS) \ ++ $(NSPR_LIBS) \ ++ $(MOZ_GIO_LIBS) \ ++ $(NULL) ++ ++# make sure this component is never statically linked into the main ++# application. this is necessary since we don't want to force users ++# to install gio in order to use the rest of mozilla ;-) ++FORCE_SHARED_LIB= 1 ++ ++include $(topsrcdir)/config/rules.mk +diff -r 49a1b2aa43c5 extensions/gio/makefiles.sh +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/extensions/gio/makefiles.sh Tue Jan 11 11:17:52 2011 +0100 +@@ -0,0 +1,41 @@ ++#! /bin/sh ++# ***** BEGIN LICENSE BLOCK ***** ++# Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++# ++# The contents of this file are subject to the Mozilla Public License Version ++# 1.1 (the "License"); you may not use this file except in compliance with ++# the License. You may obtain a copy of the License at ++# http://www.mozilla.org/MPL/ ++# ++# Software distributed under the License is distributed on an "AS IS" basis, ++# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++# for the specific language governing rights and limitations under the ++# License. ++# ++# The Original Code is Mozilla Build System ++# ++# The Initial Developer of the Original Code is ++# Ben Turner ++# ++# Portions created by the Initial Developer are Copyright (C) 2007 ++# the Initial Developer. All Rights Reserved. ++# ++# Contributor(s): ++# ++# Alternatively, the contents of this file may be used under the terms of ++# either the GNU General Public License Version 2 or later (the "GPL"), or ++# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++# in which case the provisions of the GPL or the LGPL are applicable instead ++# of those above. If you wish to allow use of your version of this file only ++# under the terms of either the GPL or the LGPL, and not to allow others to ++# use your version of this file under the terms of the MPL, indicate your ++# decision by deleting the provisions above and replace them with the notice ++# and other provisions required by the GPL or the LGPL. If you do not delete ++# the provisions above, a recipient may use your version of this file under ++# the terms of any one of the MPL, the GPL or the LGPL. ++# ++# ***** END LICENSE BLOCK ***** ++ ++add_makefiles " ++ extensions/gio/Makefile ++" +diff -r 49a1b2aa43c5 extensions/gio/nsGIOProtocolHandler.cpp +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/extensions/gio/nsGIOProtocolHandler.cpp Tue Jan 11 11:17:52 2011 +0100 +@@ -0,0 +1,1163 @@ ++/* vim:set ts=2 sw=2 et cindent: */ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++ * ++ * The contents of this file are subject to the Mozilla Public License Version ++ * 1.1 (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS IS" basis, ++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++ * for the specific language governing rights and limitations under the ++ * License. ++ * ++ * The Original Code is the Mozilla gnome-vfs extension. ++ * ++ * The Initial Developer of the Original Code is IBM Corporation. ++ * ++ * Portions created by IBM Corporation are Copyright (C) 2004 ++ * IBM Corporation. All Rights Reserved. ++ * ++ * Contributor(s): ++ * Darin Fisher ++ * Jan Horak ++ * ++ * Alternatively, the contents of this file may be used under the terms of ++ * either the GNU General Public License Version 2 or later (the "GPL"), or ++ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++ * in which case the provisions of the GPL or the LGPL are applicable instead ++ * of those above. If you wish to allow use of your version of this file only ++ * under the terms of either the GPL or the LGPL, and not to allow others to ++ * use your version of this file under the terms of the MPL, indicate your ++ * decision by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL or the LGPL. If you do not delete ++ * the provisions above, a recipient may use your version of this file under ++ * the terms of any one of the MPL, the GPL or the LGPL. ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++/* ++ * This code is based on original Mozilla gnome-vfs extension. It implements ++ * input stream provided by GVFS/GIO. ++*/ ++#include "mozilla/ModuleUtils.h" ++#include "nsIPrefService.h" ++#include "nsIPrefBranch2.h" ++#include "nsIObserver.h" ++#include "nsThreadUtils.h" ++#include "nsProxyRelease.h" ++#include "nsIStringBundle.h" ++#include "nsIStandardURL.h" ++#include "nsMimeTypes.h" ++#include "nsNetUtil.h" ++#include "mozilla/Monitor.h" ++#include ++ ++#define MOZ_GIO_SCHEME "moz-gio" ++#define MOZ_GIO_SUPPORTED_PROTOCOLS "network.gio.supported-protocols" ++ ++//----------------------------------------------------------------------------- ++ ++// NSPR_LOG_MODULES=gio:5 ++#ifdef PR_LOGGING ++static PRLogModuleInfo *sGIOLog; ++#define LOG(args) PR_LOG(sGIOLog, PR_LOG_DEBUG, args) ++#else ++#define LOG(args) ++#endif ++ ++ ++//----------------------------------------------------------------------------- ++static nsresult ++MapGIOResult(gint code) ++{ ++ switch (code) ++ { ++ case G_IO_ERROR_NOT_FOUND: return NS_ERROR_FILE_NOT_FOUND; // shows error ++ case G_IO_ERROR_INVALID_ARGUMENT: return NS_ERROR_INVALID_ARG; ++ case G_IO_ERROR_NOT_SUPPORTED: return NS_ERROR_NOT_AVAILABLE; ++ case G_IO_ERROR_NO_SPACE: return NS_ERROR_FILE_NO_DEVICE_SPACE; ++ case G_IO_ERROR_READ_ONLY: return NS_ERROR_FILE_READ_ONLY; ++ case G_IO_ERROR_PERMISSION_DENIED: return NS_ERROR_FILE_ACCESS_DENIED; // wrong password/login ++ case G_IO_ERROR_CLOSED: return NS_BASE_STREAM_CLOSED; // was EOF ++ case G_IO_ERROR_NOT_DIRECTORY: return NS_ERROR_FILE_NOT_DIRECTORY; ++ case G_IO_ERROR_PENDING: return NS_ERROR_IN_PROGRESS; ++ case G_IO_ERROR_EXISTS: return NS_ERROR_FILE_ALREADY_EXISTS; ++ case G_IO_ERROR_IS_DIRECTORY: return NS_ERROR_FILE_IS_DIRECTORY; ++ case G_IO_ERROR_NOT_MOUNTED: return NS_ERROR_NOT_CONNECTED; // shows error ++ case G_IO_ERROR_HOST_NOT_FOUND: return NS_ERROR_UNKNOWN_HOST; // shows error ++ case G_IO_ERROR_CANCELLED: return NS_ERROR_ABORT; ++ case G_IO_ERROR_NOT_EMPTY: return NS_ERROR_FILE_DIR_NOT_EMPTY; ++ case G_IO_ERROR_FILENAME_TOO_LONG: return NS_ERROR_FILE_NAME_TOO_LONG; ++ case G_IO_ERROR_INVALID_FILENAME: return NS_ERROR_FILE_INVALID_PATH; ++ case G_IO_ERROR_TIMED_OUT: return NS_ERROR_NET_TIMEOUT; // shows error ++ case G_IO_ERROR_WOULD_BLOCK: return NS_BASE_STREAM_WOULD_BLOCK; ++ case G_IO_ERROR_FAILED_HANDLED: return NS_ERROR_ABORT; // Cancel on login dialog ++ ++/* unhandled: ++ G_IO_ERROR_NOT_REGULAR_FILE, ++ G_IO_ERROR_NOT_SYMBOLIC_LINK, ++ G_IO_ERROR_NOT_MOUNTABLE_FILE, ++ G_IO_ERROR_TOO_MANY_LINKS, ++ G_IO_ERROR_ALREADY_MOUNTED, ++ G_IO_ERROR_CANT_CREATE_BACKUP, ++ G_IO_ERROR_WRONG_ETAG, ++ G_IO_ERROR_WOULD_RECURSE, ++ G_IO_ERROR_BUSY, ++ G_IO_ERROR_WOULD_MERGE, ++ G_IO_ERROR_TOO_MANY_OPEN_FILES ++*/ ++ // Make GCC happy ++ default: ++ return NS_ERROR_FAILURE; ++ } ++ ++ return NS_ERROR_FAILURE; ++} ++ ++static nsresult ++MapGIOResult(GError *result) ++{ ++ if (!result) ++ return NS_OK; ++ else ++ return MapGIOResult(result->code); ++} ++/** Return values for mount operation. ++ * These enums are used as mount operation return values. ++ */ ++typedef enum { ++ MOUNT_OPERATION_IN_PROGRESS, /** \enum operation in progress */ ++ MOUNT_OPERATION_SUCCESS, /** \enum operation successful */ ++ MOUNT_OPERATION_FAILED /** \enum operation not successful */ ++} MountOperationResult; ++//----------------------------------------------------------------------------- ++/** ++ * Sort function compares according to file type (directory/file) ++ * and alphabethical order ++ * @param a pointer to GFileInfo object to compare ++ * @param b pointer to GFileInfo object to compare ++ * @return -1 when first object should be before the second, 0 when equal, ++ * +1 when second object should be before the first ++ */ ++static gint ++FileInfoComparator(gconstpointer a, gconstpointer b) ++{ ++ GFileInfo *ia = ( GFileInfo *) a; ++ GFileInfo *ib = ( GFileInfo *) b; ++ if (g_file_info_get_file_type(ia) == G_FILE_TYPE_DIRECTORY ++ && g_file_info_get_file_type(ib) != G_FILE_TYPE_DIRECTORY) ++ return -1; ++ if (g_file_info_get_file_type(ib) == G_FILE_TYPE_DIRECTORY ++ && g_file_info_get_file_type(ia) != G_FILE_TYPE_DIRECTORY) ++ return 1; ++ ++ return strcasecmp(g_file_info_get_name(ia), g_file_info_get_name(ib)); ++} ++ ++/* Declaration of mount callback functions */ ++static void mount_enclosing_volume_finished (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data); ++static void mount_operation_ask_password (GMountOperation *mount_op, ++ const char *message, ++ const char *default_user, ++ const char *default_domain, ++ GAskPasswordFlags flags, ++ gpointer user_data); ++//----------------------------------------------------------------------------- ++ ++class nsGIOInputStream : public nsIInputStream ++{ ++ public: ++ NS_DECL_ISUPPORTS ++ NS_DECL_NSIINPUTSTREAM ++ ++ nsGIOInputStream(const nsCString &uriSpec) ++ : mSpec(uriSpec) ++ , mChannel(nsnull) ++ , mHandle(nsnull) ++ , mStream(nsnull) ++ , mBytesRemaining(PR_UINT32_MAX) ++ , mStatus(NS_OK) ++ , mDirList(nsnull) ++ , mDirListPtr(nsnull) ++ , mDirBufCursor(0) ++ , mDirOpen(PR_FALSE) ++ , mMonitorMountInProgress("GIOInputStream::MountFinished") { } ++ ++ ~nsGIOInputStream() { Close(); } ++ ++ void SetChannel(nsIChannel *channel) ++ { ++ // We need to hold an owning reference to our channel. This is done ++ // so we can access the channel's notification callbacks to acquire ++ // a reference to a nsIAuthPrompt if we need to handle an interactive ++ // mount operation. ++ // ++ // However, the channel can only be accessed on the main thread, so ++ // we have to be very careful with ownership. Moreover, it doesn't ++ // support threadsafe addref/release, so proxying is the answer. ++ // ++ // Also, it's important to note that this likely creates a reference ++ // cycle since the channel likely owns this stream. This reference ++ // cycle is broken in our Close method. ++ ++ NS_ADDREF(mChannel = channel); ++ } ++ void SetMountResult(MountOperationResult result, gint error_code); ++ private: ++ nsresult DoOpen(); ++ nsresult DoRead(char *aBuf, PRUint32 aCount, PRUint32 *aCountRead); ++ nsresult SetContentTypeOfChannel(const char *contentType); ++ nsresult MountVolume(); ++ nsresult DoOpenDirectory(); ++ nsresult DoOpenFile(GFileInfo *info); ++ nsCString mSpec; ++ nsIChannel *mChannel; // manually refcounted ++ GFile *mHandle; ++ GFileInputStream *mStream; ++ PRUint64 mBytesRemaining; ++ nsresult mStatus; ++ GList *mDirList; ++ GList *mDirListPtr; ++ nsCString mDirBuf; ++ PRUint32 mDirBufCursor; ++ PRPackedBool mDirOpen; ++ MountOperationResult mMountRes; ++ mozilla::Monitor mMonitorMountInProgress; ++ gint mMountErrorCode; ++}; ++/** ++ * Set result of mount operation and notify monitor waiting for results. ++ * This method is called in main thread as long as it is used only ++ * in mount_enclosing_volume_finished function. ++ * @param result Result of mount operation ++ */ ++void ++nsGIOInputStream::SetMountResult(MountOperationResult result, gint error_code) ++{ ++ mozilla::MonitorAutoEnter mon(mMonitorMountInProgress); ++ mMountRes = result; ++ mMountErrorCode = error_code; ++ mon.Notify(); ++} ++ ++/** ++ * Start mount operation and wait in loop until it is finished. This method is ++ * called from thread which is trying to read from location. ++ */ ++nsresult ++nsGIOInputStream::MountVolume() { ++ GMountOperation* mount_op = g_mount_operation_new(); ++ g_signal_connect (mount_op, "ask-password", ++ G_CALLBACK (mount_operation_ask_password), mChannel); ++ mMountRes = MOUNT_OPERATION_IN_PROGRESS; ++ /* g_file_mount_enclosing_volume uses a dbus request to mount the volume. ++ Callback mount_enclosing_volume_finished is called in main thread ++ (not this thread on which this method is called). */ ++ g_file_mount_enclosing_volume(mHandle, ++ G_MOUNT_MOUNT_NONE, ++ mount_op, ++ NULL, ++ mount_enclosing_volume_finished, ++ this); ++ mozilla::MonitorAutoEnter mon(mMonitorMountInProgress); ++ /* Waiting for finish of mount operation thread */ ++ while (mMountRes == MOUNT_OPERATION_IN_PROGRESS) ++ mon.Wait(); ++ ++ g_object_unref(mount_op); ++ ++ if (mMountRes == MOUNT_OPERATION_FAILED) { ++ return MapGIOResult(mMountErrorCode); ++ } else { ++ return NS_OK; ++ } ++} ++ ++/** ++ * Create list of infos about objects in opened directory ++ * Return: NS_OK when list obtained, otherwise error code according ++ * to failed operation. ++ */ ++nsresult ++nsGIOInputStream::DoOpenDirectory() ++{ ++ GError *error = NULL; ++ ++ GFileEnumerator *f_enum = g_file_enumerate_children(mHandle, ++ "standard::*,time::*", ++ G_FILE_QUERY_INFO_NONE, ++ NULL, ++ &error); ++ if (!f_enum) { ++ nsresult rv = MapGIOResult(error); ++ g_warning("Cannot read from directory: %s", error->message); ++ g_error_free(error); ++ return rv; ++ } ++ // fill list of file infos ++ GFileInfo *info = g_file_enumerator_next_file(f_enum, NULL, &error); ++ while (info) { ++ mDirList = g_list_append(mDirList, info); ++ info = g_file_enumerator_next_file(f_enum, NULL, &error); ++ } ++ g_object_unref(f_enum); ++ if (error) { ++ g_warning("Error reading directory content: %s", error->message); ++ nsresult rv = MapGIOResult(error); ++ g_error_free(error); ++ return rv; ++ } ++ mDirOpen = PR_TRUE; ++ ++ // Sort list of file infos by using FileInfoComparator function ++ mDirList = g_list_sort(mDirList, FileInfoComparator); ++ mDirListPtr = mDirList; ++ ++ // Write base URL (make sure it ends with a '/') ++ mDirBuf.Append("300: "); ++ mDirBuf.Append(mSpec); ++ if (mSpec.get()[mSpec.Length() - 1] != '/') ++ mDirBuf.Append('/'); ++ mDirBuf.Append('\n'); ++ ++ // Write column names ++ mDirBuf.Append("200: filename content-length last-modified file-type\n"); ++ ++ // Write charset (assume UTF-8) ++ // XXX is this correct? ++ mDirBuf.Append("301: UTF-8\n"); ++ SetContentTypeOfChannel(APPLICATION_HTTP_INDEX_FORMAT); ++ return NS_OK; ++} ++ ++/** ++ * Create file stream and set mime type for channel ++ * @param info file info used to determine mime type ++ * @return NS_OK when file stream created successfuly, error code otherwise ++ */ ++nsresult ++nsGIOInputStream::DoOpenFile(GFileInfo *info) ++{ ++ GError *error = NULL; ++ ++ mStream = g_file_read(mHandle, NULL, &error); ++ if (!mStream) { ++ nsresult rv = MapGIOResult(error); ++ g_warning("Cannot read from file: %s", error->message); ++ g_error_free(error); ++ return rv; ++ } ++ ++ const char * content_type = g_file_info_get_content_type(info); ++ if (content_type) { ++ char *mime_type = g_content_type_get_mime_type(content_type); ++ if (mime_type) { ++ if (strcmp(mime_type, APPLICATION_OCTET_STREAM) != 0) { ++ SetContentTypeOfChannel(mime_type); ++ } ++ g_free(mime_type); ++ } ++ } else { ++ g_warning("Missing content type."); ++ } ++ ++ mBytesRemaining = g_file_info_get_size(info); ++ // Update the content length attribute on the channel. We do this ++ // synchronously without proxying. This hack is not as bad as it looks! ++ mChannel->SetContentLength(mBytesRemaining); ++ ++ return NS_OK; ++} ++ ++/** ++ * Start file open operation, mount volume when needed and according to file type ++ * create file output stream or read directory content. ++ * @return NS_OK when file or directory opened successfully, error code otherwise ++ */ ++nsresult ++nsGIOInputStream::DoOpen() ++{ ++ nsresult rv; ++ GError *error = NULL; ++ ++ NS_ASSERTION(mHandle == nsnull, "already open"); ++ ++ mHandle = g_file_new_for_uri( mSpec.get() ); ++ ++ GFileInfo *info = g_file_query_info(mHandle, ++ "standard::*", ++ G_FILE_QUERY_INFO_NONE, ++ NULL, ++ &error); ++ ++ if (error) { ++ if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_NOT_MOUNTED) { ++ // location is not yet mounted, try to mount ++ g_error_free(error); ++ if (NS_IsMainThread()) ++ return NS_ERROR_NOT_CONNECTED; ++ error = NULL; ++ rv = MountVolume(); ++ if (rv != NS_OK) { ++ return rv; ++ } ++ // get info again ++ info = g_file_query_info(mHandle, ++ "standard::*", ++ G_FILE_QUERY_INFO_NONE, ++ NULL, ++ &error); ++ // second try to get file info from remote files after media mount ++ if (!info) { ++ g_warning("Unable to get file info: %s", error->message); ++ rv = MapGIOResult(error); ++ g_error_free(error); ++ return rv; ++ } ++ } else { ++ g_warning("Unable to get file info: %s", error->message); ++ rv = MapGIOResult(error); ++ g_error_free(error); ++ return rv; ++ } ++ } ++ // Get file type to handle directories and file differently ++ GFileType f_type = g_file_info_get_file_type(info); ++ if (f_type == G_FILE_TYPE_DIRECTORY) { ++ // directory ++ rv = DoOpenDirectory(); ++ } else if (f_type != G_FILE_TYPE_UNKNOWN) { ++ // file ++ rv = DoOpenFile(info); ++ } else { ++ g_warning("Unable to get file type."); ++ rv = NS_ERROR_FILE_NOT_FOUND; ++ } ++ if (info) ++ g_object_unref(info); ++ return rv; ++} ++ ++/** ++ * Read content of file or create file list from directory ++ * @param aBuf read destination buffer ++ * @param aCount length of destination buffer ++ * @param aCountRead number of read characters ++ * @return NS_OK when read successfully, NS_BASE_STREAM_CLOSED when end of file, ++ * error code otherwise ++ */ ++nsresult ++nsGIOInputStream::DoRead(char *aBuf, PRUint32 aCount, PRUint32 *aCountRead) ++{ ++ nsresult rv = NS_ERROR_NOT_AVAILABLE; ++ if (mStream) { ++ // file read ++ GError *error = NULL; ++ PRUint32 bytes_read = g_input_stream_read(G_INPUT_STREAM(mStream), ++ aBuf, ++ aCount, ++ NULL, ++ &error); ++ if (error) { ++ rv = MapGIOResult(error); ++ *aCountRead = 0; ++ g_warning("Cannot read from file: %s", error->message); ++ g_error_free(error); ++ return rv; ++ } ++ *aCountRead = bytes_read; ++ mBytesRemaining -= *aCountRead; ++ return NS_OK; ++ } ++ else if (mDirOpen) { ++ // directory read ++ while (aCount && rv != NS_BASE_STREAM_CLOSED) ++ { ++ // Copy data out of our buffer ++ PRUint32 bufLen = mDirBuf.Length() - mDirBufCursor; ++ if (bufLen) ++ { ++ PRUint32 n = PR_MIN(bufLen, aCount); ++ memcpy(aBuf, mDirBuf.get() + mDirBufCursor, n); ++ *aCountRead += n; ++ aBuf += n; ++ aCount -= n; ++ mDirBufCursor += n; ++ } ++ ++ if (!mDirListPtr) // Are we at the end of the directory list? ++ { ++ rv = NS_BASE_STREAM_CLOSED; ++ } ++ else if (aCount) // Do we need more data? ++ { ++ GFileInfo *info = (GFileInfo *) mDirListPtr->data; ++ ++ // Prune '.' and '..' from directory listing. ++ const char * fname = g_file_info_get_name(info); ++ if (fname && fname[0] == '.' && ++ (fname[1] == '\0' || (fname[1] == '.' && fname[2] == '\0'))) ++ { ++ mDirListPtr = mDirListPtr->next; ++ continue; ++ } ++ ++ mDirBuf.Assign("201: "); ++ ++ // The "filename" field ++ nsCString escName; ++ nsCOMPtr nu = do_GetService(NS_NETUTIL_CONTRACTID); ++ if (nu && fname) { ++ nu->EscapeString(nsDependentCString(fname), ++ nsINetUtil::ESCAPE_URL_PATH, escName); ++ ++ mDirBuf.Append(escName); ++ mDirBuf.Append(' '); ++ } ++ ++ // The "content-length" field ++ // XXX truncates size from 64-bit to 32-bit ++ mDirBuf.AppendInt(PRInt32(g_file_info_get_size(info))); ++ mDirBuf.Append(' '); ++ ++ // The "last-modified" field ++ // ++ // NSPR promises: PRTime is compatible with time_t ++ // we just need to convert from seconds to microseconds ++ GTimeVal gtime; ++ g_file_info_get_modification_time(info, >ime); ++ ++ PRExplodedTime tm; ++ PRTime pt = ((PRTime) gtime.tv_sec) * 1000000; ++ PR_ExplodeTime(pt, PR_GMTParameters, &tm); ++ { ++ char buf[64]; ++ PR_FormatTimeUSEnglish(buf, sizeof(buf), ++ "%a,%%20%d%%20%b%%20%Y%%20%H:%M:%S%%20GMT ", &tm); ++ mDirBuf.Append(buf); ++ } ++ ++ // The "file-type" field ++ switch (g_file_info_get_file_type(info)) ++ { ++ case G_FILE_TYPE_REGULAR: ++ mDirBuf.Append("FILE "); ++ break; ++ case G_FILE_TYPE_DIRECTORY: ++ mDirBuf.Append("DIRECTORY "); ++ break; ++ case G_FILE_TYPE_SYMBOLIC_LINK: ++ mDirBuf.Append("SYMBOLIC-LINK "); ++ break; ++ default: ++ break; ++ } ++ mDirBuf.Append('\n'); ++ ++ mDirBufCursor = 0; ++ mDirListPtr = mDirListPtr->next; ++ } ++ } ++ } ++ return rv; ++} ++ ++/** ++ * This class is used to implement SetContentTypeOfChannel. ++ */ ++class nsGIOSetContentTypeEvent : public nsRunnable ++{ ++ public: ++ nsGIOSetContentTypeEvent(nsIChannel *channel, const char *contentType) ++ : mChannel(channel), mContentType(contentType) ++ { ++ // stash channel reference in mChannel. no AddRef here! see note ++ // in SetContentTypeOfchannel. ++ } ++ ++ NS_IMETHOD Run() ++ { ++ mChannel->SetContentType(mContentType); ++ return NS_OK; ++ } ++ ++ private: ++ nsIChannel *mChannel; ++ nsCString mContentType; ++}; ++ ++nsresult ++nsGIOInputStream::SetContentTypeOfChannel(const char *contentType) ++{ ++ // We need to proxy this call over to the main thread. We post an ++ // asynchronous event in this case so that we don't delay reading data, and ++ // we know that this is safe to do since the channel's reference will be ++ // released asynchronously as well. We trust the ordering of the main ++ // thread's event queue to protect us against memory corruption. ++ ++ nsresult rv; ++ nsCOMPtr ev = ++ new nsGIOSetContentTypeEvent(mChannel, contentType); ++ if (!ev) ++ { ++ rv = NS_ERROR_OUT_OF_MEMORY; ++ } ++ else ++ { ++ rv = NS_DispatchToMainThread(ev); ++ } ++ return rv; ++} ++ ++NS_IMPL_THREADSAFE_ISUPPORTS1(nsGIOInputStream, nsIInputStream) ++ ++/** ++ * Free all used memory and close stream. ++ */ ++NS_IMETHODIMP ++nsGIOInputStream::Close() ++{ ++ if (mStream) ++ { ++ g_object_unref(mStream); ++ mStream = nsnull; ++ } ++ ++ if (mHandle) ++ { ++ g_object_unref(mHandle); ++ mHandle = nsnull; ++ } ++ ++ if (mDirList) ++ { ++ // Destroy the list of GIOFileInfo objects... ++ g_list_foreach(mDirList, (GFunc) g_object_unref, nsnull); ++ g_list_free(mDirList); ++ mDirList = nsnull; ++ mDirListPtr = nsnull; ++ } ++ ++ if (mChannel) ++ { ++ nsresult rv = NS_OK; ++ ++ nsCOMPtr thread = do_GetMainThread(); ++ if (thread) ++ rv = NS_ProxyRelease(thread, mChannel); ++ ++ NS_ASSERTION(thread && NS_SUCCEEDED(rv), "leaking channel reference"); ++ mChannel = nsnull; ++ } ++ ++ mSpec.Truncate(); // free memory ++ ++ // Prevent future reads from re-opening the handle. ++ if (NS_SUCCEEDED(mStatus)) ++ mStatus = NS_BASE_STREAM_CLOSED; ++ ++ return NS_OK; ++} ++ ++/** ++ * Return number of remaining bytes available on input ++ * @param aResult remaining bytes ++ */ ++NS_IMETHODIMP ++nsGIOInputStream::Available(PRUint32 *aResult) ++{ ++ if (NS_FAILED(mStatus)) ++ return mStatus; ++ ++ /* When remaining bytes are bigger than max PRUint32 value an aResult must ++ be set to PRUint32 maximum */ ++ if (mBytesRemaining > PR_UINT32_MAX) ++ *aResult = PR_UINT32_MAX; ++ else ++ *aResult = mBytesRemaining; ++ ++ return NS_OK; ++} ++ ++/** ++ * Trying to read from stream. When location is not available it tries to mount it. ++ * @param aBuf buffer to put read data ++ * @param aCount length of aBuf ++ * @param aCountRead number of bytes actually read ++ */ ++NS_IMETHODIMP ++nsGIOInputStream::Read(char *aBuf, ++ PRUint32 aCount, ++ PRUint32 *aCountRead) ++{ ++ *aCountRead = 0; ++ // Check if file is already opened, otherwise open it ++ if (!mStream && !mDirOpen && mStatus == NS_OK) { ++ mStatus = DoOpen(); ++ if (NS_FAILED(mStatus)) { ++ return mStatus; ++ } ++ } ++ ++ mStatus = DoRead(aBuf, aCount, aCountRead); ++ // Check if all data has been read ++ if (mStatus == NS_BASE_STREAM_CLOSED) ++ return NS_OK; ++ ++ // Check whenever any error appears while reading ++ return mStatus; ++} ++ ++NS_IMETHODIMP ++nsGIOInputStream::ReadSegments(nsWriteSegmentFun aWriter, ++ void *aClosure, ++ PRUint32 aCount, ++ PRUint32 *aResult) ++{ ++ // There is no way to implement this using GnomeVFS, but fortunately ++ // that doesn't matter. Because we are a blocking input stream, Necko ++ // isn't going to call our ReadSegments method. ++ NS_NOTREACHED("nsGIOInputStream::ReadSegments"); ++ return NS_ERROR_NOT_IMPLEMENTED; ++} ++ ++NS_IMETHODIMP ++nsGIOInputStream::IsNonBlocking(PRBool *aResult) ++{ ++ *aResult = PR_FALSE; ++ return NS_OK; ++} ++ ++//----------------------------------------------------------------------------- ++ ++/** ++ * Called when finishing mount operation. Result of operation is set in ++ * nsGIOInputStream. This function is called in main thread as an async request ++ * typically from dbus. ++ * @param source_object GFile object which requested the mount ++ * @param res result object ++ * @param user_data pointer to nsGIOInputStream ++ */ ++static void ++mount_enclosing_volume_finished (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ GError *error = NULL; ++ ++ nsGIOInputStream* istream = static_cast(user_data); ++ ++ g_file_mount_enclosing_volume_finish(G_FILE (source_object), res, &error); ++ ++ if (error) { ++ g_warning("Mount failed: %s %d", error->message, error->code); ++ istream->SetMountResult(MOUNT_OPERATION_FAILED, error->code); ++ g_error_free(error); ++ } else { ++ istream->SetMountResult(MOUNT_OPERATION_SUCCESS, 0); ++ } ++} ++ ++/** ++ * This function is called when username or password are requested from user. ++ * This function is called in main thread as async request from dbus. ++ * @param mount_op mount operation ++ * @param message message to show to user ++ * @param default_user preffered user ++ * @param default_domain domain name ++ * @param flags what type of information is required ++ * @param user_data nsIChannel ++ */ ++static void ++mount_operation_ask_password (GMountOperation *mount_op, ++ const char *message, ++ const char *default_user, ++ const char *default_domain, ++ GAskPasswordFlags flags, ++ gpointer user_data) ++{ ++ nsIChannel *channel = (nsIChannel *) user_data; ++ if (!channel) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ // We can't handle request for domain ++ if (flags & G_ASK_PASSWORD_NEED_DOMAIN) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ ++ nsCOMPtr prompt; ++ NS_QueryNotificationCallbacks(channel, prompt); ++ ++ // If no auth prompt, then give up. We could failover to using the ++ // WindowWatcher service, but that might defeat a consumer's purposeful ++ // attempt to disable authentication (for whatever reason). ++ if (!prompt) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ // Parse out the host and port... ++ nsCOMPtr uri; ++ channel->GetURI(getter_AddRefs(uri)); ++ if (!uri) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ ++ nsCAutoString scheme, hostPort; ++ uri->GetScheme(scheme); ++ uri->GetHostPort(hostPort); ++ ++ // It doesn't make sense for either of these strings to be empty. What kind ++ // of funky URI is this? ++ if (scheme.IsEmpty() || hostPort.IsEmpty()) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ // Construct the single signon key. Altering the value of this key will ++ // cause people's remembered passwords to be forgotten. Think carefully ++ // before changing the way this key is constructed. ++ nsAutoString key, realm; ++ ++ NS_ConvertUTF8toUTF16 dispHost(scheme); ++ dispHost.Append(NS_LITERAL_STRING("://")); ++ dispHost.Append(NS_ConvertUTF8toUTF16(hostPort)); ++ ++ key = dispHost; ++ if (*default_domain != '\0') ++ { ++ // We assume the realm string is ASCII. That might be a bogus assumption, ++ // but we have no idea what encoding GnomeVFS is using, so for now we'll ++ // limit ourselves to ISO-Latin-1. XXX What is a better solution? ++ realm.Append('"'); ++ realm.Append(NS_ConvertASCIItoUTF16(default_domain)); ++ realm.Append('"'); ++ key.Append(' '); ++ key.Append(realm); ++ } ++ // Construct the message string... ++ // ++ // We use Necko's string bundle here. This code really should be encapsulated ++ // behind some Necko API, after all this code is based closely on the code in ++ // nsHttpChannel.cpp. ++ nsCOMPtr bundleSvc = ++ do_GetService(NS_STRINGBUNDLE_CONTRACTID); ++ if (!bundleSvc) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ nsCOMPtr bundle; ++ bundleSvc->CreateBundle("chrome://global/locale/commonDialogs.properties", ++ getter_AddRefs(bundle)); ++ if (!bundle) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ nsAutoString nsmessage; ++ ++ if (flags & G_ASK_PASSWORD_NEED_PASSWORD) { ++ if (flags & G_ASK_PASSWORD_NEED_USERNAME) { ++ if (!realm.IsEmpty()) { ++ const PRUnichar *strings[] = { realm.get(), dispHost.get() }; ++ bundle->FormatStringFromName(NS_LITERAL_STRING("EnterLoginForRealm").get(), ++ strings, 2, getter_Copies(nsmessage)); ++ } else { ++ const PRUnichar *strings[] = { dispHost.get() }; ++ bundle->FormatStringFromName(NS_LITERAL_STRING("EnterUserPasswordFor").get(), ++ strings, 1, getter_Copies(nsmessage)); ++ } ++ } else { ++ NS_ConvertUTF8toUTF16 userName(default_user); ++ const PRUnichar *strings[] = { userName.get(), dispHost.get() }; ++ bundle->FormatStringFromName(NS_LITERAL_STRING("EnterPasswordFor").get(), ++ strings, 2, getter_Copies(nsmessage)); ++ } ++ } else { ++ g_warning("Unknown mount operation request (flags: %x)", flags); ++ } ++ ++ if (nsmessage.IsEmpty()) { ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ // Prompt the user... ++ nsresult rv; ++ PRBool retval = PR_FALSE; ++ PRUnichar *user = nsnull, *pass = nsnull; ++ if (default_user) { ++ // user will be freed by PromptUsernameAndPassword ++ user = ToNewUnicode(NS_ConvertUTF8toUTF16(default_user)); ++ } ++ if (flags & G_ASK_PASSWORD_NEED_USERNAME) { ++ rv = prompt->PromptUsernameAndPassword(nsnull, nsmessage.get(), ++ key.get(), ++ nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, ++ &user, &pass, &retval); ++ } else { ++ rv = prompt->PromptPassword(nsnull, nsmessage.get(), ++ key.get(), ++ nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, ++ &pass, &retval); ++ } ++ if (NS_FAILED(rv) || !retval) { // was || user == '\0' || pass == '\0' ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_ABORTED); ++ return; ++ } ++ /* GIO should accept UTF8 */ ++ g_mount_operation_set_username(mount_op, NS_ConvertUTF16toUTF8(user).get()); ++ g_mount_operation_set_password(mount_op, NS_ConvertUTF16toUTF8(pass).get()); ++ nsMemory::Free(user); ++ nsMemory::Free(pass); ++ g_mount_operation_reply(mount_op, G_MOUNT_OPERATION_HANDLED); ++} ++ ++//----------------------------------------------------------------------------- ++ ++class nsGIOProtocolHandler : public nsIProtocolHandler ++ , public nsIObserver ++{ ++ public: ++ NS_DECL_ISUPPORTS ++ NS_DECL_NSIPROTOCOLHANDLER ++ NS_DECL_NSIOBSERVER ++ ++ nsresult Init(); ++ ++ private: ++ void InitSupportedProtocolsPref(nsIPrefBranch *prefs); ++ PRBool IsSupportedProtocol(const nsCString &spec); ++ ++ nsCString mSupportedProtocols; ++}; ++ ++NS_IMPL_ISUPPORTS2(nsGIOProtocolHandler, nsIProtocolHandler, nsIObserver) ++ ++nsresult ++nsGIOProtocolHandler::Init() ++{ ++#ifdef PR_LOGGING ++ sGIOLog = PR_NewLogModule("gio"); ++#endif ++ ++ nsCOMPtr prefs = do_GetService(NS_PREFSERVICE_CONTRACTID); ++ if (prefs) ++ { ++ InitSupportedProtocolsPref(prefs); ++ prefs->AddObserver(MOZ_GIO_SUPPORTED_PROTOCOLS, this, PR_FALSE); ++ } ++ ++ return NS_OK; ++} ++ ++void ++nsGIOProtocolHandler::InitSupportedProtocolsPref(nsIPrefBranch *prefs) ++{ ++ // Get user preferences to determine which protocol is supported. ++ // Gvfs/GIO has a set of supported protocols like obex, network, archive, ++ // computer, dav, cdda, gphoto2, trash, etc. Some of these seems to be ++ // irrelevant to process by browser. By default accept only smb and sftp ++ // protocols so far. ++ nsresult rv = prefs->GetCharPref(MOZ_GIO_SUPPORTED_PROTOCOLS, ++ getter_Copies(mSupportedProtocols)); ++ if (NS_SUCCEEDED(rv)) { ++ mSupportedProtocols.StripWhitespace(); ++ ToLowerCase(mSupportedProtocols); ++ } ++ else ++ mSupportedProtocols.Assign("smb:,sftp:"); // use defaults ++ ++ LOG(("gio: supported protocols \"%s\"\n", mSupportedProtocols.get())); ++} ++ ++PRBool ++nsGIOProtocolHandler::IsSupportedProtocol(const nsCString &aSpec) ++{ ++ const char *specString = aSpec.get(); ++ const char *colon = strchr(specString, ':'); ++ if (!colon) ++ return PR_FALSE; ++ ++ PRUint32 length = colon - specString + 1; ++ ++ // + ':' ++ nsCString scheme(specString, length); ++ ++ char *found = PL_strcasestr(mSupportedProtocols.get(), scheme.get()); ++ if (!found) ++ return PR_FALSE; ++ ++ if (found[length] != ',' && found[length] != '\0') ++ return PR_FALSE; ++ ++ return PR_TRUE; ++} ++ ++NS_IMETHODIMP ++nsGIOProtocolHandler::GetScheme(nsACString &aScheme) ++{ ++ aScheme.Assign(MOZ_GIO_SCHEME); ++ return NS_OK; ++} ++ ++NS_IMETHODIMP ++nsGIOProtocolHandler::GetDefaultPort(PRInt32 *aDefaultPort) ++{ ++ *aDefaultPort = -1; ++ return NS_OK; ++} ++ ++NS_IMETHODIMP ++nsGIOProtocolHandler::GetProtocolFlags(PRUint32 *aProtocolFlags) ++{ ++ // Is URI_STD true of all GnomeVFS URI types? ++ *aProtocolFlags = URI_STD | URI_DANGEROUS_TO_LOAD; ++ return NS_OK; ++} ++ ++NS_IMETHODIMP ++nsGIOProtocolHandler::NewURI(const nsACString &aSpec, ++ const char *aOriginCharset, ++ nsIURI *aBaseURI, ++ nsIURI **aResult) ++{ ++ const nsCString flatSpec(aSpec); ++ LOG(("gio: NewURI [spec=%s]\n", flatSpec.get())); ++ ++ if (!aBaseURI) ++ { ++ // XXX Is it good to support all GIO protocols? ++ if (!IsSupportedProtocol(flatSpec)) ++ return NS_ERROR_UNKNOWN_PROTOCOL; ++ ++ PRInt32 colon_location = flatSpec.FindChar(':'); ++ if (colon_location <= 0) ++ return NS_ERROR_UNKNOWN_PROTOCOL; ++ ++ // Verify that GIO supports this URI scheme. ++ PRBool uri_scheme_supported = PR_FALSE; ++ ++ GVfs *gvfs = g_vfs_get_default(); ++ ++ if (!gvfs) { ++ g_warning("Cannot get GVfs object."); ++ return NS_ERROR_UNKNOWN_PROTOCOL; ++ } ++ ++ const gchar* const * uri_schemes = g_vfs_get_supported_uri_schemes(gvfs); ++ ++ while (*uri_schemes != NULL) { ++ // While flatSpec ends with ':' the uri_scheme does not. Therefore do not ++ // compare last character. ++ if (StringHead(flatSpec, colon_location).Equals(*uri_schemes)) { ++ uri_scheme_supported = PR_TRUE; ++ break; ++ } ++ uri_schemes++; ++ } ++ ++ if (!uri_scheme_supported) { ++ return NS_ERROR_UNKNOWN_PROTOCOL; ++ } ++ } ++ ++ nsresult rv; ++ nsCOMPtr url = ++ do_CreateInstance(NS_STANDARDURL_CONTRACTID, &rv); ++ if (NS_FAILED(rv)) ++ return rv; ++ ++ rv = url->Init(nsIStandardURL::URLTYPE_STANDARD, -1, flatSpec, ++ aOriginCharset, aBaseURI); ++ if (NS_SUCCEEDED(rv)) ++ rv = CallQueryInterface(url, aResult); ++ return rv; ++ ++} ++ ++NS_IMETHODIMP ++nsGIOProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **aResult) ++{ ++ NS_ENSURE_ARG_POINTER(aURI); ++ nsresult rv; ++ ++ nsCAutoString spec; ++ rv = aURI->GetSpec(spec); ++ if (NS_FAILED(rv)) ++ return rv; ++ ++ nsRefPtr stream = new nsGIOInputStream(spec); ++ if (!stream) ++ { ++ rv = NS_ERROR_OUT_OF_MEMORY; ++ } ++ else ++ { ++ // start out assuming an unknown content-type. we'll set the content-type ++ // to something better once we open the URI. ++ rv = NS_NewInputStreamChannel(aResult, ++ aURI, ++ stream, ++ NS_LITERAL_CSTRING(UNKNOWN_CONTENT_TYPE)); ++ if (NS_SUCCEEDED(rv)) ++ stream->SetChannel(*aResult); ++ } ++ return rv; ++} ++ ++NS_IMETHODIMP ++nsGIOProtocolHandler::AllowPort(PRInt32 aPort, ++ const char *aScheme, ++ PRBool *aResult) ++{ ++ // Don't override anything. ++ *aResult = PR_FALSE; ++ return NS_OK; ++} ++ ++NS_IMETHODIMP ++nsGIOProtocolHandler::Observe(nsISupports *aSubject, ++ const char *aTopic, ++ const PRUnichar *aData) ++{ ++ if (strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0) { ++ nsCOMPtr prefs = do_QueryInterface(aSubject); ++ InitSupportedProtocolsPref(prefs); ++ } ++ return NS_OK; ++} ++ ++//----------------------------------------------------------------------------- ++ ++#define NS_GIOPROTOCOLHANDLER_CID \ ++{ /* ee706783-3af8-4d19-9e84-e2ebfe213480 */ \ ++ 0xee706783, \ ++ 0x3af8, \ ++ 0x4d19, \ ++ {0x9e, 0x84, 0xe2, 0xeb, 0xfe, 0x21, 0x34, 0x80} \ ++} ++ ++NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGIOProtocolHandler, Init) ++NS_DEFINE_NAMED_CID(NS_GIOPROTOCOLHANDLER_CID); ++ ++static const mozilla::Module::CIDEntry kVFSCIDs[] = { ++ { &kNS_GIOPROTOCOLHANDLER_CID, false, NULL, nsGIOProtocolHandlerConstructor }, ++ { NULL } ++}; ++ ++static const mozilla::Module::ContractIDEntry kVFSContracts[] = { ++ { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MOZ_GIO_SCHEME, &kNS_GIOPROTOCOLHANDLER_CID }, ++ { NULL } ++}; ++ ++static const mozilla::Module kVFSModule = { ++ mozilla::Module::kVersion, ++ kVFSCIDs, ++ kVFSContracts ++}; ++ ++NSMODULE_DEFN(nsGIOModule) = &kVFSModule; +diff -r 49a1b2aa43c5 netwerk/base/src/nsIOService.cpp +--- a/netwerk/base/src/nsIOService.cpp Tue Dec 21 12:42:59 2010 +0100 ++++ b/netwerk/base/src/nsIOService.cpp Tue Jan 11 11:17:52 2011 +0100 +@@ -454,6 +454,27 @@ + } + + #ifdef MOZ_X11 ++ // check to see whether GVFS can handle this URI scheme. if it can ++ // create a nsIURI for the "scheme:", then we assume it has support for ++ // the requested protocol. otherwise, we failover to using the default ++ // protocol handler. ++ ++ rv = CallGetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX"moz-gio", ++ result); ++ if (NS_SUCCEEDED(rv)) { ++ nsCAutoString spec(scheme); ++ spec.Append(':'); ++ ++ nsIURI *uri; ++ rv = (*result)->NewURI(spec, nsnull, nsnull, &uri); ++ if (NS_SUCCEEDED(rv)) { ++ NS_RELEASE(uri); ++ return rv; ++ } ++ ++ NS_RELEASE(*result); ++ } ++ + // check to see whether GnomeVFS can handle this URI scheme. if it can + // create a nsIURI for the "scheme:", then we assume it has support for + // the requested protocol. otherwise, we failover to using the default diff --git a/community-staging/xulrunner-oss/xulrunner-omnijar.patch b/community-staging/xulrunner-oss/xulrunner-omnijar.patch new file mode 100644 index 000000000..66ec5206c --- /dev/null +++ b/community-staging/xulrunner-oss/xulrunner-omnijar.patch @@ -0,0 +1,1737 @@ +# HG changeset patch +# Parent a7dea879b4b445a23186f438900562155bb39e99 +Bug 620931 part 1 - Use chrome manifest to register resource://gre-resources/ + +diff --git a/layout/style/jar.mn b/layout/style/jar.mn +--- a/layout/style/jar.mn ++++ b/layout/style/jar.mn +@@ -1,8 +1,10 @@ + toolkit.jar: + * res/ua.css (ua.css) + res/html.css (html.css) + res/quirk.css (quirk.css) + res/viewsource.css (viewsource.css) + * res/forms.css (forms.css) + res/arrow.gif (arrow.gif) + res/arrowd.gif (arrowd.gif) ++ ++% resource gre-resources %res/ +diff --git a/netwerk/protocol/res/nsResProtocolHandler.cpp b/netwerk/protocol/res/nsResProtocolHandler.cpp +--- a/netwerk/protocol/res/nsResProtocolHandler.cpp ++++ b/netwerk/protocol/res/nsResProtocolHandler.cpp +@@ -75,17 +75,16 @@ static nsResProtocolHandler *gResHandler + // + // this enables PR_LOG_ALWAYS level information and places all output in + // the file log.txt + // + static PRLogModuleInfo *gResLog; + #endif + + #define kGRE NS_LITERAL_CSTRING("gre") +-#define kGRE_RESOURCES NS_LITERAL_CSTRING("gre-resources") + + //---------------------------------------------------------------------------- + // nsResURL : overrides nsStandardURL::GetFile to provide nsIFile resolution + //---------------------------------------------------------------------------- + + nsresult + nsResURL::EnsureFile() + { +@@ -197,28 +196,16 @@ nsResProtocolHandler::Init() + NS_ENSURE_SUCCESS(rv, rv); + + // + // make resource://gre/ point to the GRE directory + // + rv = AddSpecialDir(NS_GRE_DIR, kGRE); + NS_ENSURE_SUCCESS(rv, rv); + +- // make resource://gre-resources/ point to gre toolkit[.jar]/res +- nsCOMPtr greURI; +- nsCOMPtr greResURI; +- GetSubstitution(kGRE, getter_AddRefs(greURI)); +-#ifdef MOZ_CHROME_FILE_FORMAT_JAR +- NS_NAMED_LITERAL_CSTRING(strGRE_RES_URL, "jar:chrome/toolkit.jar!/res/"); +-#else +- NS_NAMED_LITERAL_CSTRING(strGRE_RES_URL, "chrome/toolkit/res/"); +-#endif +- rv = mIOService->NewURI(strGRE_RES_URL, nsnull, greURI, +- getter_AddRefs(greResURI)); +- SetSubstitution(kGRE_RESOURCES, greResURI); + //XXXbsmedberg Neil wants a resource://pchrome/ for the profile chrome dir... + // but once I finish multiple chrome registration I'm not sure that it is needed + + // XXX dveditz: resource://pchrome/ defeats profile directory salting + // if web content can load it. Tread carefully. + + return rv; + } +@@ -242,22 +229,16 @@ nsResProtocolHandler::Init(nsIFile *aOmn + // these entries should be kept in sync with the normal Init function + + // resource:/// points to jar:omni.jar!/ + SetSubstitution(EmptyCString(), uri); + + // resource://gre/ points to jar:omni.jar!/ + SetSubstitution(kGRE, uri); + +- urlStr += "chrome/toolkit/res/"; +- rv = mIOService->NewURI(urlStr, nsnull, nsnull, getter_AddRefs(uri)); +- NS_ENSURE_SUCCESS(rv, rv); +- +- // resource://gre-resources/ points to jar:omni.jar!/chrome/toolkit/res/ +- SetSubstitution(kGRE_RESOURCES, uri); + return NS_OK; + } + #endif + + #ifdef MOZ_IPC + static PLDHashOperator + EnumerateSubstitution(const nsACString& aKey, + nsIURI* aURI, +# HG changeset patch +# Parent 3038cccba1a071d6b418e15442d0f2d9f3dcb11d +Bug 620931 part 2 - When building --with-libxul-sdk, use the right preferences directory + +diff --git a/browser/locales/Makefile.in b/browser/locales/Makefile.in +--- a/browser/locales/Makefile.in ++++ b/browser/locales/Makefile.in +@@ -183,17 +183,17 @@ install:: $(addsuffix .xml,$(SEARCH_PLUG + $(SYSINSTALL) $(IFLAGS1) $^ $(DESTDIR)$(mozappdir)/searchplugins + + + libs-%: + $(NSINSTALL) -D $(DIST)/install + @$(MAKE) -C ../../toolkit/locales libs-$* BOTH_MANIFESTS=1 + @$(MAKE) -C ../../services/sync/locales AB_CD=$* XPI_NAME=locale-$* BOTH_MANIFESTS=1 + @$(MAKE) -C ../../extensions/spellcheck/locales AB_CD=$* XPI_NAME=locale-$* BOTH_MANIFESTS=1 +- @$(MAKE) libs AB_CD=$* XPI_NAME=locale-$* PREF_DIR=defaults/pref BOTH_MANIFESTS=1 ++ @$(MAKE) libs AB_CD=$* XPI_NAME=locale-$* PREF_DIR=$(PREF_DIR) BOTH_MANIFESTS=1 + @$(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY)/locales AB_CD=$* XPI_NAME=locale-$* BOTH_MANIFESTS=1 + + + repackage-win32-installer: WIN32_INSTALLER_OUT="$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe" + repackage-win32-installer: $(WIN32_INSTALLER_IN) $(SUBMAKEFILES) + @echo "Repackaging $(WIN32_INSTALLER_IN) into $(WIN32_INSTALLER_OUT)." + $(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY) export + $(MAKE) -C ../installer/windows CONFIG_DIR=l10ngen l10ngen/setup.exe l10ngen/7zSD.sfx +diff --git a/toolkit/mozapps/installer/packager.mk b/toolkit/mozapps/installer/packager.mk +--- a/toolkit/mozapps/installer/packager.mk ++++ b/toolkit/mozapps/installer/packager.mk +@@ -307,17 +307,17 @@ OMNIJAR_FILES = \ + res \ + defaults \ + greprefs.js \ + jsloader \ + $(NULL) + + NON_OMNIJAR_FILES += \ + chrome/icons/\* \ +- defaults/pref/channel-prefs.js \ ++ $(PREF_DIR)/channel-prefs.js \ + res/cursors/\* \ + res/MainMenu.nib/\* \ + $(NULL) + + PACK_OMNIJAR = \ + rm -f omni.jar components/binary.manifest && \ + grep -h '^binary-component' components/*.manifest > binary.manifest ; \ + sed -e 's/^binary-component/\#binary-component/' components/components.manifest > components.manifest && \ +# HG changeset patch +# Parent cd8df8030f7ad7530692bd7c4391a8009df56a02 +Bug 620931 part 3 - Allow GRE and XUL application to use omni.jar independently + +We now store two independent locations for an omni.jar, allowing GRE/XRE and +XUL application to each have their own omni.jar. And since xulrunner setups +are very independent from the XUL applications, we implement support for both +omni.jar and non omni.jar cases in the same runtime, with the side effect of +allowing to switch from one to the other manually without rebuilding the +binaries. + +We let the mozilla::Omnijar API handle both cases, so that callers don't need +too much work to support them. + +We also make the preferences service load the same set of preferences in all +the various cases (unified vs. separate, omni.jar vs. no omni.jar). + +The child process launcher for IPC is modified to pass the base directories +needed for the mozilla::Omnijar API initialization in the child process. + +Finally, the startupcache file name canonicalization is modified to separate +APP and GRE resources. + +diff --git a/ipc/glue/GeckoChildProcessHost.cpp b/ipc/glue/GeckoChildProcessHost.cpp +--- a/ipc/glue/GeckoChildProcessHost.cpp ++++ b/ipc/glue/GeckoChildProcessHost.cpp +@@ -440,26 +440,29 @@ GeckoChildProcessHost::PerformAsyncLaunc + // other end of the socketpair() from us + + std::vector childArgv; + + childArgv.push_back(exePath.value()); + + childArgv.insert(childArgv.end(), aExtraOpts.begin(), aExtraOpts.end()); + +-#ifdef MOZ_OMNIJAR + // Make sure the child process can find the omnijar + // See XRE_InitCommandLine in nsAppRunner.cpp +- nsCAutoString omnijarPath; +- if (mozilla::OmnijarPath()) { +- mozilla::OmnijarPath()->GetNativePath(omnijarPath); +- childArgv.push_back("-omnijar"); +- childArgv.push_back(omnijarPath.get()); ++ nsCAutoString path; ++ nsCOMPtr file = mozilla::Omnijar::GetBase(mozilla::Omnijar::GRE); ++ if (file && NS_SUCCEEDED(file->GetNativePath(path))) { ++ childArgv.push_back("-grebase"); ++ childArgv.push_back(path.get()); + } +-#endif ++ file = mozilla::Omnijar::GetBase(mozilla::Omnijar::APP); ++ if (file && NS_SUCCEEDED(file->GetNativePath(path))) { ++ childArgv.push_back("-appbase"); ++ childArgv.push_back(path.get()); ++ } + + childArgv.push_back(pidstring); + + #if defined(MOZ_CRASHREPORTER) + # if defined(OS_LINUX) + int childCrashFd, childCrashRemapFd; + if (!CrashReporter::CreateNotificationPipeForChild( + &childCrashFd, &childCrashRemapFd)) +@@ -552,26 +555,29 @@ GeckoChildProcessHost::PerformAsyncLaunc + for (std::vector::iterator it = aExtraOpts.begin(); + it != aExtraOpts.end(); + ++it) { + cmdLine.AppendLooseValue(UTF8ToWide(*it)); + } + + cmdLine.AppendLooseValue(std::wstring(mGroupId.get())); + +-#ifdef MOZ_OMNIJAR + // Make sure the child process can find the omnijar + // See XRE_InitCommandLine in nsAppRunner.cpp +- nsAutoString omnijarPath; +- if (mozilla::OmnijarPath()) { +- mozilla::OmnijarPath()->GetPath(omnijarPath); +- cmdLine.AppendLooseValue(UTF8ToWide("-omnijar")); +- cmdLine.AppendLooseValue(omnijarPath.get()); ++ nsAutoString path; ++ nsCOMPtr file = mozilla::Omnijar::GetBase(mozilla::Omnijar::GRE); ++ if (file && NS_SUCCEEDED(file->GetPath(path))) { ++ cmdLine.AppendLooseValue(UTF8ToWide("-grebase")); ++ cmdLine.AppendLooseValue(path.get()); + } +-#endif ++ file = mozilla::Omnijar::GetBase(mozilla::Omnijar::APP); ++ if (file && NS_SUCCEEDED(file->GetPath(path))) { ++ cmdLine.AppendLooseValue(UTF8ToWide("-appbase")); ++ cmdLine.AppendLooseValue(path.get()); ++ } + + cmdLine.AppendLooseValue(UTF8ToWide(pidstring)); + + #if defined(MOZ_CRASHREPORTER) + cmdLine.AppendLooseValue( + UTF8ToWide(CrashReporter::GetChildNotificationPipe())); + #endif + +diff --git a/js/src/xpconnect/loader/mozJSComponentLoader.cpp b/js/src/xpconnect/loader/mozJSComponentLoader.cpp +--- a/js/src/xpconnect/loader/mozJSComponentLoader.cpp ++++ b/js/src/xpconnect/loader/mozJSComponentLoader.cpp +@@ -81,16 +81,17 @@ + #include "nsIConsoleService.h" + #include "nsIStorageStream.h" + #include "nsIStringStream.h" + #include "prmem.h" + #if defined(XP_WIN) + #include "nsILocalFileWin.h" + #endif + #include "xpcprivate.h" ++#include "nsIResProtocolHandler.h" + + #ifdef MOZ_ENABLE_LIBXUL + #include "mozilla/scache/StartupCache.h" + #include "mozilla/scache/StartupCacheUtils.h" + #endif + #include "mozilla/Omnijar.h" + + #include "jsdbgapi.h" +@@ -621,34 +622,21 @@ mozJSComponentLoader::LoadModule(nsILoca + + const mozilla::Module* + mozJSComponentLoader::LoadModuleFromJAR(nsILocalFile *aJarFile, + const nsACString &aComponentPath) + { + #if !defined(XPCONNECT_STANDALONE) + nsresult rv; + +- nsCAutoString fullSpec; +- +-#ifdef MOZ_OMNIJAR +- PRBool equal; +- rv = aJarFile->Equals(mozilla::OmnijarPath(), &equal); +- if (NS_SUCCEEDED(rv) && equal) { +- fullSpec = "resource://gre/"; +- } else { +-#endif +- nsCAutoString fileSpec; +- NS_GetURLSpecFromActualFile(aJarFile, fileSpec); +- fullSpec = "jar:"; +- fullSpec += fileSpec; +- fullSpec += "!/"; +-#ifdef MOZ_OMNIJAR +- } +-#endif +- ++ nsCAutoString fullSpec, fileSpec; ++ NS_GetURLSpecFromActualFile(aJarFile, fileSpec); ++ fullSpec = "jar:"; ++ fullSpec += fileSpec; ++ fullSpec += "!/"; + fullSpec += aComponentPath; + + nsCOMPtr uri; + rv = NS_NewURI(getter_AddRefs(uri), fullSpec); + if (NS_FAILED(rv)) + return NULL; + + nsAutoString hashstring; +@@ -833,57 +821,138 @@ class JSScriptHolder + JSScriptHolder(JSContext *cx, JSScript *script) + : mCx(cx), mScript(script) {} + ~JSScriptHolder() { ::JS_DestroyScript(mCx, mScript); } + private: + JSContext *mCx; + JSScript *mScript; + }; + ++static const char baseName[2][5] = { "gre/", "app/" }; ++ ++static inline PRBool ++canonicalizeBase(nsCAutoString &spec, nsACString &out, mozilla::Omnijar::Type aType) ++{ ++ nsCAutoString base; ++ nsresult rv = mozilla::Omnijar::GetURIString(aType, base); ++ ++ if (NS_FAILED(rv) || !base.Length()) ++ return PR_FALSE; ++ ++ if (base.Compare(spec.get(), PR_FALSE, base.Length())) ++ return PR_FALSE; ++ ++ out.Append("/resource/"); ++ out.Append(baseName[aType]); ++ out.Append(Substring(spec, base.Length())); ++ return PR_TRUE; ++} + /** + * PathifyURI transforms mozilla .js uris into useful zip paths + * to make it makes it easier to manipulate startup cache entries + * using standard zip tools. + * Transformations applied: +- * * jsloader/ prefix is used to group mozJSComponentLoader cache entries in ++ * * jsloader/ prefix is used to group mozJSComponentLoader cache entries in + * a top-level zip directory. +- * * In MOZ_OMNIJAR case resource:/// and resource://gre/ URIs refer to the same path +- * so treat both of them as resource://gre/ ++ * * resource:// URIs are resolved to their corresponding file/jar URI to ++ * canonicalize resources URIs other than gre and app. ++ * * Paths under GRE or APP directory have their base path replaced with ++ * resource/gre or resource/app to avoid depending on install location. ++ * * jar:file:///path/to/file.jar!/sub/path urls are replaced with ++ * /path/to/file.jar/sub/path + * * .bin suffix is added to the end of the path to indicate that jsloader/ entries + * are binary representations of JS source. + * For example: +- * resource://gre/modules/XPCOMUtils.jsm becomes +- * jsloader/resource/gre/modules/XPCOMUtils.jsm.bin ++ * resource://gre/modules/XPCOMUtils.jsm or ++ * file://$GRE_DIR/modules/XPCOMUtils.jsm or ++ * jar:file://$GRE_DIR/omni.jar!/modules/XPCOMUtils.jsm become ++ * jsloader/resource/gre/modules/XPCOMUtils.jsm.bin ++ * file://$PROFILE_DIR/extensions/{uuid}/components/component.js becomes ++ * jsloader/$PROFILE_DIR/extensions/%7Buuid%7D/components/component.js.bin ++ * jar:file://$PROFILE_DIR/extensions/some.xpi!/components/component.js becomes ++ * jsloader/$PROFILE_DIR/extensions/some.xpi/components/component.js.bin + */ + static nsresult + PathifyURI(nsIURI *in, nsACString &out) + { +- out = "jsloader/"; +- nsCAutoString scheme; +- nsresult rv = in->GetScheme(scheme); +- NS_ENSURE_SUCCESS(rv, rv); +- out.Append(scheme); +- nsCAutoString host; +- // OK for GetHost to fail since it's not implemented sometimes +- in->GetHost(host); +-#ifdef MOZ_OMNIJAR +- if (scheme.Equals("resource") && host.Length() == 0){ +- host = "gre"; +- } +-#endif +- if (host.Length()) { +- out.Append("/"); +- out.Append(host); +- } +- nsCAutoString path; +- rv = in->GetPath(path); +- NS_ENSURE_SUCCESS(rv, rv); +- out.Append(path); +- out.Append(".bin"); +- return NS_OK; ++ PRBool equals; ++ nsresult rv; ++ nsCOMPtr uri = in; ++ nsCAutoString spec; ++ ++ out = "jsloader"; ++ ++ // Resolve resource:// URIs. At the end of this if/else block, we ++ // have both spec and uri variables identifying the same URI. ++ if (NS_SUCCEEDED(in->SchemeIs("resource", &equals)) && equals) { ++ nsCOMPtr ioService = do_GetIOService(&rv); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsCOMPtr ph; ++ rv = ioService->GetProtocolHandler("resource", getter_AddRefs(ph)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsCOMPtr irph(do_QueryInterface(ph, &rv)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = irph->ResolveURI(in, spec); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = ioService->NewURI(spec, nsnull, nsnull, getter_AddRefs(uri)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ } else { ++ rv = in->GetSpec(spec); ++ NS_ENSURE_SUCCESS(rv, rv); ++ } ++ ++ if (!canonicalizeBase(spec, out, mozilla::Omnijar::GRE) && ++ !canonicalizeBase(spec, out, mozilla::Omnijar::APP)) { ++ if (NS_SUCCEEDED(uri->SchemeIs("file", &equals)) && equals) { ++ nsCOMPtr baseFileURL; ++ baseFileURL = do_QueryInterface(uri, &rv); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsCAutoString path; ++ rv = baseFileURL->GetPath(path); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ out.Append(path); ++ } else if (NS_SUCCEEDED(uri->SchemeIs("jar", &equals)) && equals) { ++ nsCOMPtr jarURI = do_QueryInterface(uri, &rv); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsCOMPtr jarFileURI; ++ rv = jarURI->GetJARFile(getter_AddRefs(jarFileURI)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsCOMPtr jarFileURL; ++ jarFileURL = do_QueryInterface(jarFileURI, &rv); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsCAutoString path; ++ rv = jarFileURL->GetPath(path); ++ NS_ENSURE_SUCCESS(rv, rv); ++ out.Append(path); ++ ++ rv = jarURI->GetJAREntry(path); ++ NS_ENSURE_SUCCESS(rv, rv); ++ out.Append("/"); ++ out.Append(path); ++ } else { // Very unlikely ++ nsCAutoString spec; ++ rv = uri->GetSpec(spec); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ out.Append("/"); ++ out.Append(spec); ++ } ++ } ++ ++ out.Append(".bin"); ++ return NS_OK; + } + + /* static */ + #ifdef MOZ_ENABLE_LIBXUL + nsresult + mozJSComponentLoader::ReadScript(StartupCache* cache, nsIURI *uri, + JSContext *cx, JSScript **script) + { +diff --git a/modules/libjar/nsJAR.cpp b/modules/libjar/nsJAR.cpp +--- a/modules/libjar/nsJAR.cpp ++++ b/modules/libjar/nsJAR.cpp +@@ -171,26 +171,23 @@ nsJAR::Open(nsIFile* zipFile) + if (mLock) return NS_ERROR_FAILURE; // Already open! + + mZipFile = zipFile; + mOuterZipEntry.Truncate(); + + mLock = PR_NewLock(); + NS_ENSURE_TRUE(mLock, NS_ERROR_OUT_OF_MEMORY); + +-#ifdef MOZ_OMNIJAR + // The omnijar is special, it is opened early on and closed late + // this avoids reopening it +- PRBool equals; +- nsresult rv = zipFile->Equals(mozilla::OmnijarPath(), &equals); +- if (NS_SUCCEEDED(rv) && equals) { +- mZip = mozilla::OmnijarReader(); ++ nsZipArchive *zip = mozilla::Omnijar::GetReader(zipFile); ++ if (zip) { ++ mZip = zip; + return NS_OK; + } +-#endif + return mZip->OpenArchive(zipFile); + } + + NS_IMETHODIMP + nsJAR::OpenInner(nsIZipReader *aZipReader, const char *aZipEntry) + { + NS_ENSURE_ARG_POINTER(aZipReader); + NS_ENSURE_ARG_POINTER(aZipEntry); +@@ -234,23 +231,22 @@ nsJAR::Close() + mLock = nsnull; + } + + mParsedManifest = PR_FALSE; + mManifestData.Reset(); + mGlobalStatus = JAR_MANIFEST_NOT_PARSED; + mTotalItemsInManifest = 0; + +-#ifdef MOZ_OMNIJAR +- if (mZip == mozilla::OmnijarReader()) { ++ if ((mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE)) || ++ (mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::APP))) { + mZip.forget(); + mZip = new nsZipArchive(); + return NS_OK; + } +-#endif + return mZip->CloseArchive(); + } + + NS_IMETHODIMP + nsJAR::Test(const char *aEntryName) + { + return mZip->Test(aEntryName); + } +@@ -391,22 +387,21 @@ nsJAR::GetInputStreamWithSpec(const nsAC + NS_IMETHODIMP + nsJAR::GetCertificatePrincipal(const char* aFilename, nsIPrincipal** aPrincipal) + { + //-- Parameter check + if (!aPrincipal) + return NS_ERROR_NULL_POINTER; + *aPrincipal = nsnull; + +-#ifdef MOZ_OMNIJAR + // Don't check signatures in the omnijar - this is only + // interesting for extensions/XPIs. +- if (mZip == mozilla::OmnijarReader()) ++ if ((mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE)) || ++ (mZip == mozilla::Omnijar::GetReader(mozilla::Omnijar::APP))) + return NS_OK; +-#endif + + //-- Parse the manifest + nsresult rv = ParseManifest(); + if (NS_FAILED(rv)) return rv; + if (mGlobalStatus == JAR_NO_MANIFEST) + return NS_OK; + + PRInt16 requestedStatus; +diff --git a/modules/libpref/src/nsPrefService.cpp b/modules/libpref/src/nsPrefService.cpp +--- a/modules/libpref/src/nsPrefService.cpp ++++ b/modules/libpref/src/nsPrefService.cpp +@@ -67,20 +67,18 @@ + + #include "prefapi.h" + #include "prefread.h" + #include "prefapi_private_data.h" + #include "PrefTuple.h" + + #include "nsITimelineService.h" + +-#ifdef MOZ_OMNIJAR + #include "mozilla/Omnijar.h" + #include "nsZipArchive.h" +-#endif + + // Definitions + #define INITIAL_PREF_FILES 10 + static NS_DEFINE_CID(kZipReaderCID, NS_ZIPREADER_CID); + + // Prototypes + static nsresult openPrefFile(nsIFile* aFile); + static nsresult pref_InitInitialObjects(void); +@@ -793,124 +791,144 @@ static nsresult pref_LoadPrefsInDirList( + pref_LoadPrefsInDir(dir, nsnull, 0); + } + } + } + } + return NS_OK; + } + +-//---------------------------------------------------------------------------------------- +-// Initialize default preference JavaScript buffers from +-// appropriate TEXT resources +-//---------------------------------------------------------------------------------------- +-static nsresult pref_InitDefaults() +-{ +- nsCOMPtr greprefsFile; +- nsresult rv; +- +- rv = NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(greprefsFile)); +- NS_ENSURE_SUCCESS(rv, rv); +- +- rv = greprefsFile->AppendNative(NS_LITERAL_CSTRING("greprefs.js")); +- NS_ENSURE_SUCCESS(rv, rv); +- +- rv = openPrefFile(greprefsFile); +- if (NS_FAILED(rv)) { +- NS_WARNING("Error parsing GRE default preferences. Is this an old-style embedding app?"); +- } +- +- return NS_OK; +-} +- +-#ifdef MOZ_OMNIJAR + static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name) + { + nsZipItemPtr manifest(jarReader, name, true); + NS_ENSURE_TRUE(manifest.Buffer(), NS_ERROR_NOT_AVAILABLE); + + PrefParseState ps; + PREF_InitParseState(&ps, PREF_ReaderCallback, NULL); + nsresult rv = PREF_ParseBuf(&ps, manifest, manifest.Length()); + PREF_FinalizeParseState(&ps); + + return rv; + } + +-static nsresult pref_InitAppDefaultsFromOmnijar() +-{ +- nsresult rv; +- +- nsZipArchive* jarReader = mozilla::OmnijarReader(); +- if (!jarReader) +- return pref_InitDefaults(); +- +- rv = pref_ReadPrefFromJar(jarReader, "greprefs.js"); +- NS_ENSURE_SUCCESS(rv, rv); +- +- nsZipFind *findPtr; +- rv = jarReader->FindInit("defaults/pref/*.js$", &findPtr); +- NS_ENSURE_SUCCESS(rv, rv); +- +- nsAutoPtr find(findPtr); +- +- nsTArray prefEntries; +- const char *entryName; +- PRUint16 entryNameLen; +- while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) { +- prefEntries.AppendElement(Substring(entryName, entryName + entryNameLen)); +- } +- +- prefEntries.Sort(); +- for (PRUint32 i = prefEntries.Length(); i--; ) { +- rv = pref_ReadPrefFromJar(jarReader, prefEntries[i].get()); +- if (NS_FAILED(rv)) +- NS_WARNING("Error parsing preferences."); +- } +- +- return NS_OK; +-} +-#endif +- ++//---------------------------------------------------------------------------------------- ++// Initialize default preference JavaScript buffers from ++// appropriate TEXT resources ++//---------------------------------------------------------------------------------------- + static nsresult pref_InitInitialObjects() + { + nsresult rv; + +- // first we parse the GRE default prefs. This also works if we're not using a GRE, +-#ifdef MOZ_OMNIJAR +- rv = pref_InitAppDefaultsFromOmnijar(); +-#else +- rv = pref_InitDefaults(); +-#endif +- NS_ENSURE_SUCCESS(rv, rv); ++ // In omni.jar case, we load the following prefs: ++ // - jar:$gre/omni.jar!/greprefs.js ++ // - jar:$gre/omni.jar!/defaults/pref/*.js ++ // In non omni.jar case, we load: ++ // - $gre/greprefs.js ++ // ++ // When $app == $gre, we additionally load, in all cases: ++ // - $gre/defaults/pref/*.js ++ // This is kept for bug 591866 (channel-prefs.js should not be in omni.jar). ++ // We load all files instead of channel-prefs.js only to have the same ++ // behaviour as $app != $gre. ++ // ++ // When $app != $gre, we additionally load, in omni.jar case: ++ // - jar:$app/omni.jar!/defaults/preferences/*.js ++ // - $app/defaults/preferences/*.js ++ // and in non omni.jar case: ++ // - $app/defaults/preferences/*.js + +- nsCOMPtr defaultPrefDir; +- // now parse the "application" default preferences +- rv = NS_GetSpecialDirectory(NS_APP_PREF_DEFAULTS_50_DIR, getter_AddRefs(defaultPrefDir)); +- NS_ENSURE_SUCCESS(rv, rv); ++ nsZipFind *findPtr; ++ nsAutoPtr find; ++ nsTArray prefEntries; ++ const char *entryName; ++ PRUint16 entryNameLen; + +- /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */ +- static const char* specialFiles[] = { ++ nsZipArchive* jarReader = mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE); ++ if (jarReader) { ++ // Load jar:$gre/omni.jar!/greprefs.js ++ rv = pref_ReadPrefFromJar(jarReader, "greprefs.js"); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ // Load jar:$gre/omni.jar!/defaults/pref/*.js ++ rv = jarReader->FindInit("defaults/pref/*.js$", &findPtr); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ find = findPtr; ++ while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) { ++ prefEntries.AppendElement(Substring(entryName, entryName + entryNameLen)); ++ } ++ ++ prefEntries.Sort(); ++ for (PRUint32 i = prefEntries.Length(); i--; ) { ++ rv = pref_ReadPrefFromJar(jarReader, prefEntries[i].get()); ++ if (NS_FAILED(rv)) ++ NS_WARNING("Error parsing preferences."); ++ } ++ } else { ++ // Load $gre/greprefs.js ++ nsCOMPtr greprefsFile; ++ rv = NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(greprefsFile)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = greprefsFile->AppendNative(NS_LITERAL_CSTRING("greprefs.js")); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = openPrefFile(greprefsFile); ++ if (NS_FAILED(rv)) ++ NS_WARNING("Error parsing GRE default preferences. Is this an old-style embedding app?"); ++ } ++ ++ if (!mozilla::Omnijar::HasOmnijar(mozilla::Omnijar::APP)) { ++ // Load $gre/defaults/pref/*.js ++ nsCOMPtr defaultPrefDir; ++ ++ rv = NS_GetSpecialDirectory(NS_APP_PREF_DEFAULTS_50_DIR, getter_AddRefs(defaultPrefDir)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */ ++ static const char* specialFiles[] = { + #if defined(XP_MAC) || defined(XP_MACOSX) + "macprefs.js" + #elif defined(XP_WIN) + "winpref.js" + #elif defined(XP_UNIX) + "unix.js" +-#if defined(_AIX) ++#if defined(VMS) ++ , "openvms.js" ++#elif defined(_AIX) + , "aix.js" + #endif + #elif defined(XP_OS2) + "os2pref.js" ++#elif defined(XP_BEOS) ++ "beos.js" + #endif +- }; ++ }; + +- rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles, NS_ARRAY_LENGTH(specialFiles)); +- if (NS_FAILED(rv)) { +- NS_WARNING("Error parsing application default preferences."); ++ rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles, NS_ARRAY_LENGTH(specialFiles)); ++ if (NS_FAILED(rv)) ++ NS_WARNING("Error parsing application default preferences."); ++ } ++ ++ // Load jar:$app/omni.jar!/defaults/preferences/*.js ++ nsZipArchive *appJarReader = mozilla::Omnijar::GetReader(mozilla::Omnijar::APP); ++ if (appJarReader) { ++ rv = appJarReader->FindInit("defaults/preferences/*.js$", &findPtr); ++ NS_ENSURE_SUCCESS(rv, rv); ++ find = findPtr; ++ prefEntries.Clear(); ++ while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) { ++ prefEntries.AppendElement(Substring(entryName, entryName + entryNameLen)); ++ } ++ prefEntries.Sort(); ++ for (PRUint32 i = prefEntries.Length(); i--; ) { ++ rv = pref_ReadPrefFromJar(appJarReader, prefEntries[i].get()); ++ if (NS_FAILED(rv)) ++ NS_WARNING("Error parsing preferences."); ++ } + } + + rv = pref_LoadPrefsInDirList(NS_APP_PREFS_DEFAULTS_DIR_LIST); + NS_ENSURE_SUCCESS(rv, rv); + + NS_CreateServicesFromCategory(NS_PREFSERVICE_APPDEFAULTS_TOPIC_ID, + nsnull, NS_PREFSERVICE_APPDEFAULTS_TOPIC_ID); + +diff --git a/netwerk/protocol/res/nsResProtocolHandler.cpp b/netwerk/protocol/res/nsResProtocolHandler.cpp +--- a/netwerk/protocol/res/nsResProtocolHandler.cpp ++++ b/netwerk/protocol/res/nsResProtocolHandler.cpp +@@ -152,97 +152,62 @@ nsResProtocolHandler::nsResProtocolHandl + } + + nsResProtocolHandler::~nsResProtocolHandler() + { + gResHandler = nsnull; + } + + nsresult +-nsResProtocolHandler::AddSpecialDir(const char* aSpecialDir, const nsACString& aSubstitution) +-{ +- nsCOMPtr file; +- nsresult rv = NS_GetSpecialDirectory(aSpecialDir, getter_AddRefs(file)); +- NS_ENSURE_SUCCESS(rv, rv); +- +- nsCOMPtr uri; +- rv = mIOService->NewFileURI(file, getter_AddRefs(uri)); +- NS_ENSURE_SUCCESS(rv, rv); +- +- return SetSubstitution(aSubstitution, uri); +-} +- +-nsresult + nsResProtocolHandler::Init() + { + if (!mSubstitutions.Init(32)) + return NS_ERROR_UNEXPECTED; + + nsresult rv; + + mIOService = do_GetIOService(&rv); + NS_ENSURE_SUCCESS(rv, rv); + +-#ifdef MOZ_OMNIJAR +- nsCOMPtr omniJar(mozilla::OmnijarPath()); +- if (omniJar) +- return Init(omniJar); +-#endif +- +- // these entries should be kept in sync with the omnijar Init function ++ nsCAutoString appURI, greURI; ++ rv = mozilla::Omnijar::GetURIString(mozilla::Omnijar::APP, appURI); ++ NS_ENSURE_SUCCESS(rv, rv); ++ rv = mozilla::Omnijar::GetURIString(mozilla::Omnijar::GRE, greURI); ++ NS_ENSURE_SUCCESS(rv, rv); + + // +- // make resource:/// point to the application directory ++ // make resource:/// point to the application directory or omnijar + // +- rv = AddSpecialDir(NS_OS_CURRENT_PROCESS_DIR, EmptyCString()); ++ nsCOMPtr uri; ++ rv = NS_NewURI(getter_AddRefs(uri), appURI.Length() ? appURI : greURI); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = SetSubstitution(EmptyCString(), uri); + NS_ENSURE_SUCCESS(rv, rv); + + // + // make resource://gre/ point to the GRE directory + // +- rv = AddSpecialDir(NS_GRE_DIR, kGRE); ++ if (appURI.Length()) { // We already have greURI in uri if appURI.Length() is 0. ++ rv = NS_NewURI(getter_AddRefs(uri), greURI); ++ NS_ENSURE_SUCCESS(rv, rv); ++ } ++ ++ rv = SetSubstitution(kGRE, uri); + NS_ENSURE_SUCCESS(rv, rv); + + //XXXbsmedberg Neil wants a resource://pchrome/ for the profile chrome dir... + // but once I finish multiple chrome registration I'm not sure that it is needed + + // XXX dveditz: resource://pchrome/ defeats profile directory salting + // if web content can load it. Tread carefully. + + return rv; + } + +-#ifdef MOZ_OMNIJAR +-nsresult +-nsResProtocolHandler::Init(nsIFile *aOmniJar) +-{ +- nsresult rv; +- nsCOMPtr uri; +- nsCAutoString omniJarSpec; +- NS_GetURLSpecFromActualFile(aOmniJar, omniJarSpec, mIOService); +- +- nsCAutoString urlStr("jar:"); +- urlStr += omniJarSpec; +- urlStr += "!/"; +- +- rv = mIOService->NewURI(urlStr, nsnull, nsnull, getter_AddRefs(uri)); +- NS_ENSURE_SUCCESS(rv, rv); +- +- // these entries should be kept in sync with the normal Init function +- +- // resource:/// points to jar:omni.jar!/ +- SetSubstitution(EmptyCString(), uri); +- +- // resource://gre/ points to jar:omni.jar!/ +- SetSubstitution(kGRE, uri); +- +- return NS_OK; +-} +-#endif +- + #ifdef MOZ_IPC + static PLDHashOperator + EnumerateSubstitution(const nsACString& aKey, + nsIURI* aURI, + void* aArg) + { + nsTArray* resources = + static_cast*>(aArg); +diff --git a/startupcache/StartupCache.cpp b/startupcache/StartupCache.cpp +--- a/startupcache/StartupCache.cpp ++++ b/startupcache/StartupCache.cpp +@@ -237,27 +237,36 @@ StartupCache::GetBuffer(const char* id, + nsZipItemPtr zipItem(mArchive, id, true); + if (zipItem) { + *outbuf = zipItem.Forget(); + *length = zipItem.Length(); + return NS_OK; + } + } + +-#ifdef MOZ_OMNIJAR +- if (mozilla::OmnijarReader()) { ++ if (mozilla::Omnijar::GetReader(mozilla::Omnijar::APP)) { + // no need to checksum omnijarred entries +- nsZipItemPtr zipItem(mozilla::OmnijarReader(), id); ++ nsZipItemPtr zipItem(mozilla::Omnijar::GetReader(mozilla::Omnijar::APP), id); + if (zipItem) { + *outbuf = zipItem.Forget(); + *length = zipItem.Length(); + return NS_OK; + } + } +-#endif ++ ++ if (mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE)) { ++ // no need to checksum omnijarred entries ++ nsZipItemPtr zipItem(mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE), id); ++ if (zipItem) { ++ *outbuf = zipItem.Forget(); ++ *length = zipItem.Length(); ++ return NS_OK; ++ } ++ } ++ + return NS_ERROR_NOT_AVAILABLE; + } + + // Makes a copy of the buffer, client retains ownership of inbuf. + nsresult + StartupCache::PutBuffer(const char* id, const char* inbuf, PRUint32 len) + { + WaitOnWriteThread(); +diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp +--- a/toolkit/xre/nsAppRunner.cpp ++++ b/toolkit/xre/nsAppRunner.cpp +@@ -3897,35 +3897,45 @@ XRE_InitCommandLine(int aArgc, char* aAr + CommandLine::Init(aArgc, canonArgs); + + for (int i = 0; i < aArgc; ++i) + free(canonArgs[i]); + delete[] canonArgs; + #endif + #endif + +-#ifdef MOZ_OMNIJAR +- const char *omnijarPath = nsnull; +- ArgResult ar = CheckArg("omnijar", PR_FALSE, &omnijarPath); ++ const char *path = nsnull; ++ ArgResult ar = CheckArg("grebase", PR_FALSE, &path); + if (ar == ARG_BAD) { +- PR_fprintf(PR_STDERR, "Error: argument -omnijar requires an omnijar path\n"); ++ PR_fprintf(PR_STDERR, "Error: argument -grebase requires a path argument\n"); + return NS_ERROR_FAILURE; + } + +- if (!omnijarPath) ++ if (!path) + return rv; + +- nsCOMPtr omnijar; +- rv = NS_NewNativeLocalFile(nsDependentCString(omnijarPath), PR_TRUE, +- getter_AddRefs(omnijar)); +- if (NS_SUCCEEDED(rv)) +- mozilla::SetOmnijar(omnijar); +-#endif +- +- return rv; ++ nsCOMPtr greBase; ++ rv = XRE_GetFileFromPath(path, getter_AddRefs(greBase)); ++ if (NS_FAILED(rv)) ++ return rv; ++ ++ ar = CheckArg("appbase", PR_FALSE, &path); ++ if (ar == ARG_BAD) { ++ PR_fprintf(PR_STDERR, "Error: argument -appbase requires a path argument\n"); ++ return NS_ERROR_FAILURE; ++ } ++ ++ nsCOMPtr appBase; ++ if (path) { ++ rv = XRE_GetFileFromPath(path, getter_AddRefs(appBase)); ++ if (NS_FAILED(rv)) ++ return rv; ++ } ++ ++ return mozilla::Omnijar::SetBase(greBase, appBase); + } + + nsresult + XRE_DeinitCommandLine() + { + nsresult rv = NS_OK; + + #if defined(MOZ_IPC) +diff --git a/toolkit/xre/nsEmbedFunctions.cpp b/toolkit/xre/nsEmbedFunctions.cpp +--- a/toolkit/xre/nsEmbedFunctions.cpp ++++ b/toolkit/xre/nsEmbedFunctions.cpp +@@ -512,19 +512,17 @@ XRE_InitChildProcess(int aArgc, + } + + // Run the UI event loop on the main thread. + uiMessageLoop.MessageLoop::Run(); + + // Allow ProcessChild to clean up after itself before going out of + // scope and being deleted + process->CleanUp(); +-#ifdef MOZ_OMNIJAR +- mozilla::SetOmnijar(nsnull); +-#endif ++ mozilla::Omnijar::SetBase(nsnull, nsnull); + } + } + + NS_LogTerm(); + return XRE_DeinitCommandLine(); + } + + MessageLoop* +diff --git a/xpcom/build/Makefile.in b/xpcom/build/Makefile.in +--- a/xpcom/build/Makefile.in ++++ b/xpcom/build/Makefile.in +@@ -64,28 +64,25 @@ CSRCS = \ + $(NULL) + + CPPSRCS = \ + $(XPCOM_GLUE_SRC_LCPPSRCS) \ + $(XPCOM_GLUENS_SRC_LCPPSRCS) \ + nsXPComInit.cpp \ + nsXPCOMStrings.cpp \ + Services.cpp \ ++ Omnijar.cpp \ + $(NULL) + + ifndef MOZ_ENABLE_LIBXUL + ifeq (,$(filter-out WINNT WINCE OS2,$(OS_ARCH))) + CPPSRCS += dlldeps.cpp + endif + endif + +-ifdef MOZ_OMNIJAR +-CPPSRCS += Omnijar.cpp +-endif +- + SHARED_LIBRARY_LIBS = \ + $(DEPTH)/chrome/src/$(LIB_PREFIX)chrome_s.$(LIB_SUFFIX) \ + ../ds/$(LIB_PREFIX)xpcomds_s.$(LIB_SUFFIX) \ + ../io/$(LIB_PREFIX)xpcomio_s.$(LIB_SUFFIX) \ + ../components/$(LIB_PREFIX)xpcomcomponents_s.$(LIB_SUFFIX) \ + ../threads/$(LIB_PREFIX)xpcomthreads_s.$(LIB_SUFFIX) \ + ../proxy/src/$(LIB_PREFIX)xpcomproxy_s.$(LIB_SUFFIX) \ + ../base/$(LIB_PREFIX)xpcombase_s.$(LIB_SUFFIX) \ +diff --git a/xpcom/build/Omnijar.cpp b/xpcom/build/Omnijar.cpp +--- a/xpcom/build/Omnijar.cpp ++++ b/xpcom/build/Omnijar.cpp +@@ -16,16 +16,17 @@ + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Michael Wu ++ * Mike Hommey + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your +@@ -33,69 +34,175 @@ + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + #include "Omnijar.h" + +-#include "nsILocalFile.h" +-#include "nsXULAppAPI.h" ++#include "nsIFile.h" + #include "nsZipArchive.h" ++#include "nsNetUtil.h" + +-static nsILocalFile* sOmnijarPath = nsnull; +-static nsZipArchive* sOmnijarReader = nsnull; ++namespace mozilla { + +-static void +-SetupReader() ++nsIFile *Omnijar::sPath[2] = { nsnull, nsnull }; ++PRBool Omnijar::sIsOmnijar[2] = { PR_FALSE, PR_FALSE }; ++ ++#ifdef MOZ_ENABLE_LIBXUL ++nsZipArchive *Omnijar::sReader[2] = { nsnull, nsnull }; ++#endif ++ ++static already_AddRefed ++ComputePath(nsIFile *aPath, PRBool &aIsOmnijar) + { +- if (!sOmnijarPath) { +- return; ++ PRBool isDir; ++ aIsOmnijar = PR_FALSE; ++ if (!aPath || NS_FAILED(aPath->IsDirectory(&isDir)) || !isDir) ++ return nsnull; ++ ++ nsCOMPtr path; ++#ifdef MOZ_ENABLE_LIBXUL ++ // Search for omni.jar in the given directory ++ if (!isDir || NS_FAILED(aPath->Clone(getter_AddRefs(path)))) ++ return nsnull; ++ ++ if (NS_FAILED(path->AppendNative(NS_LITERAL_CSTRING("omni.jar")))) ++ return nsnull; ++ ++ if (NS_FAILED(path->Exists(&aIsOmnijar))) ++ return nsnull; ++#endif ++ ++ if (!aIsOmnijar && NS_FAILED(aPath->Clone(getter_AddRefs(path)))) ++ return nsnull; ++ ++ return path.forget(); ++} ++ ++nsresult ++Omnijar::SetBase(nsIFile *aGrePath, nsIFile *aAppPath) ++{ ++ NS_ABORT_IF_FALSE(aGrePath || !aAppPath, "Omnijar::SetBase(NULL, something) call forbidden"); ++ ++#ifdef MOZ_ENABLE_LIBXUL ++ if (sReader[GRE]) { ++ sReader[GRE]->CloseArchive(); ++ delete sReader[GRE]; ++ } ++ if (sReader[APP]) { ++ sReader[APP]->CloseArchive(); ++ delete sReader[APP]; ++ } ++ sReader[APP] = sReader[GRE] = nsnull; ++#endif ++ ++ nsresult rv; ++ PRBool equals; ++ if (aAppPath) { ++ rv = aAppPath->Equals(aGrePath, &equals); ++ NS_ENSURE_SUCCESS(rv, rv); ++ } else { ++ equals = PR_TRUE; + } + +- nsZipArchive* zipReader = new nsZipArchive(); +- if (!zipReader) { +- NS_IF_RELEASE(sOmnijarPath); +- return; ++ nsCOMPtr grePath = ComputePath(aGrePath, sIsOmnijar[GRE]); ++ nsCOMPtr appPath = ComputePath(equals ? nsnull : aAppPath, sIsOmnijar[APP]); ++ ++ NS_IF_RELEASE(sPath[GRE]); ++ sPath[GRE] = grePath; ++ NS_IF_ADDREF(sPath[GRE]); ++ ++ NS_IF_RELEASE(sPath[APP]); ++ sPath[APP] = appPath; ++ NS_IF_ADDREF(sPath[APP]); ++ ++ return NS_OK; ++} ++ ++already_AddRefed ++Omnijar::GetBase(Type aType) ++{ ++ NS_ABORT_IF_FALSE(sPath[0], "Omnijar not initialized"); ++ ++ if (!sIsOmnijar[aType]) { ++ NS_IF_ADDREF(sPath[aType]); ++ return sPath[aType]; + } + +- if (NS_FAILED(zipReader->OpenArchive(sOmnijarPath))) { ++ nsCOMPtr file, path; ++ if (NS_FAILED(sPath[aType]->Clone(getter_AddRefs(file)))) ++ return nsnull; ++ ++ if (NS_FAILED(file->GetParent(getter_AddRefs(path)))) ++ return nsnull; ++ return path.forget(); ++} ++ ++#ifdef MOZ_ENABLE_LIBXUL ++nsZipArchive * ++Omnijar::GetReader(Type aType) ++{ ++ if (!sIsOmnijar[aType]) ++ return nsnull; ++ ++ if (sReader[aType]) ++ return sReader[aType]; ++ ++ nsZipArchive* zipReader = new nsZipArchive(); ++ if (!zipReader) ++ return nsnull; ++ ++ if (NS_FAILED(zipReader->OpenArchive(sPath[aType]))) { + delete zipReader; +- NS_IF_RELEASE(sOmnijarPath); +- return; ++ return nsnull; + } + +- sOmnijarReader = zipReader; ++ return (sReader[aType] = zipReader); + } + +-nsILocalFile* +-mozilla::OmnijarPath() ++nsZipArchive * ++Omnijar::GetReader(nsIFile *aPath) + { +- if (!sOmnijarReader) +- SetupReader(); ++ PRBool equals; ++ nsresult rv; + +- return sOmnijarPath; ++ if (sIsOmnijar[GRE]) { ++ rv = sPath[GRE]->Equals(aPath, &equals); ++ if (NS_SUCCEEDED(rv) && equals) ++ return GetReader(GRE); ++ } ++ if (sIsOmnijar[APP]) { ++ rv = sPath[APP]->Equals(aPath, &equals); ++ if (NS_SUCCEEDED(rv) && equals) ++ return GetReader(APP); ++ } ++ return nsnull; ++} ++#endif ++ ++nsresult ++Omnijar::GetURIString(Type aType, nsCString &result) ++{ ++ NS_ABORT_IF_FALSE(sPath[0], "Omnijar not initialized"); ++ ++ result = ""; ++ ++ if ((aType == APP) && (!sPath[APP])) ++ return NS_OK; ++ ++ nsCAutoString omniJarSpec; ++ nsresult rv = NS_GetURLSpecFromActualFile(sPath[aType], omniJarSpec); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ if (sIsOmnijar[aType]) { ++ result = "jar:"; ++ result += omniJarSpec; ++ result += "!"; ++ } else { ++ result = omniJarSpec; ++ } ++ result += "/"; ++ return NS_OK; + } + +-nsZipArchive* +-mozilla::OmnijarReader() +-{ +- if (!sOmnijarReader) +- SetupReader(); +- +- return sOmnijarReader; +-} +- +-void +-mozilla::SetOmnijar(nsILocalFile* aPath) +-{ +- NS_IF_RELEASE(sOmnijarPath); +- if (sOmnijarReader) { +- sOmnijarReader->CloseArchive(); +- delete sOmnijarReader; +- sOmnijarReader = nsnull; +- } +- +- sOmnijarPath = aPath; +- NS_IF_ADDREF(sOmnijarPath); +-} +- ++} /* namespace mozilla */ +diff --git a/xpcom/build/Omnijar.h b/xpcom/build/Omnijar.h +--- a/xpcom/build/Omnijar.h ++++ b/xpcom/build/Omnijar.h +@@ -16,16 +16,17 @@ + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Michael Wu ++ * Mike Hommey + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your +@@ -34,29 +35,137 @@ + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + #ifndef mozilla_Omnijar_h + #define mozilla_Omnijar_h + +-class nsILocalFile; ++#include "nscore.h" ++#include "nsTArray.h" ++#include "nsCOMPtr.h" ++#include "nsString.h" ++ ++class nsIFile; + class nsZipArchive; +- +-#ifdef MOZ_OMNIJAR ++class nsIURI; + + namespace mozilla { + ++#ifdef MOZ_ENABLE_LIBXUL ++#define OMNIJAR_EXPORT ++#else ++#define OMNIJAR_EXPORT NS_EXPORT ++#endif ++ ++class OMNIJAR_EXPORT Omnijar { ++private: + /** +- * This returns the path to the omnijar. +- * If the omnijar isn't available, this function will return null. +- * Callers should fallback to flat packaging if null. ++ * Store an nsIFile for either a base directory when there is no omni.jar, ++ * or omni.jar itself. We can store two paths here, one for GRE ++ * (corresponding to resource://gre/) and one for APP ++ * (corresponding to resource:/// and resource://app/), but only ++ * store one when both point to the same location (unified). + */ +-nsILocalFile *OmnijarPath(); +-nsZipArchive *OmnijarReader(); +-void SetOmnijar(nsILocalFile* aPath); ++static nsIFile *sPath[2]; ++/** ++ * Store whether the corresponding sPath is an omni.jar or a directory ++ */ ++static PRBool sIsOmnijar[2]; ++ ++#ifdef MOZ_ENABLE_LIBXUL ++/** ++ * Cached nsZipArchives for the corresponding sPath ++ */ ++static nsZipArchive *sReader[2]; ++#endif ++ ++public: ++enum Type { ++ GRE = 0, ++ APP = 1 ++}; ++ ++/** ++ * Returns whether SetBase has been called at least once with ++ * a valid nsIFile ++ */ ++static PRBool ++IsInitialized() ++{ ++ // GRE path is always set after initialization. ++ return sPath[0] != nsnull; ++} ++ ++/** ++ * Sets the base directories for GRE and APP. APP base directory ++ * may be nsnull, in case the APP and GRE directories are the same. ++ */ ++static nsresult SetBase(nsIFile *aGrePath, nsIFile *aAppPath); ++ ++/** ++ * Returns an nsIFile pointing to the omni.jar file for GRE or APP. ++ * Returns nsnull when there is no corresponding omni.jar. ++ * Also returns nsnull for APP in the unified case. ++ */ ++static already_AddRefed ++GetPath(Type aType) ++{ ++ NS_ABORT_IF_FALSE(sPath[0], "Omnijar not initialized"); ++ ++ if (sIsOmnijar[aType]) { ++ NS_IF_ADDREF(sPath[aType]); ++ return sPath[aType]; ++ } ++ return nsnull; ++} ++ ++/** ++ * Returns whether GRE or APP use an omni.jar. Returns PR_False when ++ * using an omni.jar in the unified case. ++ */ ++static PRBool ++HasOmnijar(Type aType) ++{ ++ return sIsOmnijar[aType]; ++} ++ ++/** ++ * Returns the base directory for GRE or APP. In the unified case, ++ * returns nsnull for APP. ++ */ ++static already_AddRefed GetBase(Type aType); ++ ++/** ++ * Returns a nsZipArchive pointer for the omni.jar file for GRE or ++ * APP. Returns nsnull in the same cases GetPath() would. ++ */ ++#ifdef MOZ_ENABLE_LIBXUL ++static nsZipArchive *GetReader(Type aType); ++#else ++static nsZipArchive *GetReader(Type aType) { return nsnull; } ++#endif ++ ++/** ++ * Returns a nsZipArchive pointer for the given path IAOI the given ++ * path is the omni.jar for either GRE or APP. ++ */ ++#ifdef MOZ_ENABLE_LIBXUL ++static nsZipArchive *GetReader(nsIFile *aPath); ++#else ++static nsZipArchive *GetReader(nsIFile *aPath) { return nsnull; } ++#endif ++ ++/** ++ * Returns the URI string corresponding to the omni.jar or directory ++ * for GRE or APP. i.e. jar:/path/to/omni.jar!/ for omni.jar and ++ * /path/to/base/dir/ otherwise. Returns an empty string for APP in ++ * the unified case. ++ * The returned URI is guaranteed to end with a slash. ++ */ ++static nsresult GetURIString(Type aType, nsCString &result); ++ ++}; /* class Omnijar */ + + } /* namespace mozilla */ + +-#endif /* MOZ_OMNIJAR */ +- + #endif /* mozilla_Omnijar_h */ +diff --git a/xpcom/build/nsXPComInit.cpp b/xpcom/build/nsXPComInit.cpp +--- a/xpcom/build/nsXPComInit.cpp ++++ b/xpcom/build/nsXPComInit.cpp +@@ -462,35 +462,35 @@ NS_InitXPCOM2(nsIServiceManager* *result + nsDirectoryService::gService->Set(NS_XPCOM_LIBRARY_FILE, xpcomLib); + } + + if (appFileLocationProvider) { + rv = nsDirectoryService::gService->RegisterProvider(appFileLocationProvider); + if (NS_FAILED(rv)) return rv; + } + +-#ifdef MOZ_OMNIJAR + NS_TIME_FUNCTION_MARK("Next: Omnijar init"); + +- if (!mozilla::OmnijarPath()) { +- nsCOMPtr omnijar; ++ if (!mozilla::Omnijar::IsInitialized()) { ++ nsCOMPtr greDir, appDir; + nsCOMPtr file; + +- rv = NS_ERROR_FAILURE; + nsDirectoryService::gService->Get(NS_GRE_DIR, + NS_GET_IID(nsIFile), + getter_AddRefs(file)); +- if (file) +- rv = file->Append(NS_LITERAL_STRING("omni.jar")); +- if (NS_SUCCEEDED(rv)) +- omnijar = do_QueryInterface(file); +- if (NS_SUCCEEDED(rv)) +- mozilla::SetOmnijar(omnijar); ++ greDir = do_QueryInterface(file); ++ ++ nsDirectoryService::gService->Get(NS_XPCOM_CURRENT_PROCESS_DIR, ++ NS_GET_IID(nsIFile), ++ getter_AddRefs(file)); ++ appDir = do_QueryInterface(file); ++ ++ rv = mozilla::Omnijar::SetBase(greDir, appDir); ++ NS_ENSURE_SUCCESS(rv, rv); + } +-#endif + + #ifdef MOZ_IPC + if ((sCommandLineWasInitialized = !CommandLine::IsInitialized())) { + NS_TIME_FUNCTION_MARK("Next: IPC command line init"); + + #ifdef OS_WIN + CommandLine::Init(0, nsnull); + #else +@@ -769,18 +769,16 @@ ShutdownXPCOM(nsIServiceManager* servMgr + sCommandLineWasInitialized = false; + } + if (sExitManager) { + delete sExitManager; + sExitManager = nsnull; + } + #endif + +-#ifdef MOZ_OMNIJAR +- mozilla::SetOmnijar(nsnull); +-#endif ++ mozilla::Omnijar::SetBase(nsnull, nsnull); + + NS_LogTerm(); + + return NS_OK; + } + + } // namespace mozilla +diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp +--- a/xpcom/components/nsComponentManager.cpp ++++ b/xpcom/components/nsComponentManager.cpp +@@ -175,18 +175,16 @@ NS_DEFINE_CID(kCategoryManagerCID, NS_CA + #define COMPMGR_TIME_FUNCTION_CONTRACTID(cid) \ + NS_TIME_FUNCTION_MIN_FMT(5, "%s (line %d) (contractid: %s)", MOZ_FUNCTION_NAME, \ + __LINE__, (cid)) + #else + #define COMPMGR_TIME_FUNCTION_CID(cid) do {} while (0) + #define COMPMGR_TIME_FUNCTION_CONTRACTID(cid) do {} while (0) + #endif + +-#define kOMNIJAR_PREFIX NS_LITERAL_CSTRING("resource:///") +- + nsresult + nsGetServiceFromCategory::operator()(const nsIID& aIID, void** aInstancePtr) const + { + nsresult rv; + nsXPIDLCString value; + nsCOMPtr catman; + nsComponentManagerImpl *compMgr = nsComponentManagerImpl::gComponentManager; + if (!compMgr) { +@@ -390,47 +388,44 @@ nsresult nsComponentManagerImpl::Init() + + nsCategoryManager::GetSingleton()->SuppressNotifications(true); + + RegisterModule(&kXPCOMModule, NULL); + + for (PRUint32 i = 0; i < sStaticModules->Length(); ++i) + RegisterModule((*sStaticModules)[i], NULL); + +-#ifdef MOZ_OMNIJAR +- if (mozilla::OmnijarPath()) { +- nsCOMPtr omnijarReader = new nsJAR(); +- rv = omnijarReader->Open(mozilla::OmnijarPath()); +- if (NS_SUCCEEDED(rv)) +- RegisterJarManifest(omnijarReader, "chrome.manifest", false); ++ nsCOMPtr appOmnijar = mozilla::Omnijar::GetPath(mozilla::Omnijar::APP); ++ if (appOmnijar) { ++ cl = sModuleLocations->InsertElementAt(1); // Insert after greDir ++ cl->type = NS_COMPONENT_LOCATION; ++ cl->location = do_QueryInterface(appOmnijar); ++ cl->jar = true; + } +-#endif ++ nsCOMPtr greOmnijar = mozilla::Omnijar::GetPath(mozilla::Omnijar::GRE); ++ if (greOmnijar) { ++ cl = sModuleLocations->InsertElementAt(0); ++ cl->type = NS_COMPONENT_LOCATION; ++ cl->location = do_QueryInterface(greOmnijar); ++ cl->jar = true; ++ } + + for (PRUint32 i = 0; i < sModuleLocations->Length(); ++i) { + ComponentLocation& l = sModuleLocations->ElementAt(i); + if (!l.jar) { + RegisterManifestFile(l.type, l.location, false); + continue; + } + + nsCOMPtr reader = do_CreateInstance(kZipReaderCID, &rv); + rv = reader->Open(l.location); + if (NS_SUCCEEDED(rv)) + RegisterJarManifest(reader, "chrome.manifest", false); + } + +-#ifdef MOZ_OMNIJAR +- if (mozilla::OmnijarPath()) { +- cl = sModuleLocations->InsertElementAt(0); +- cl->type = NS_COMPONENT_LOCATION; +- cl->location = mozilla::OmnijarPath(); +- cl->jar = true; +- } +-#endif +- + nsCategoryManager::GetSingleton()->SuppressNotifications(false); + + mStatus = NORMAL; + + return NS_OK; + } + + void +# HG changeset patch +# Parent ff1b810f78226d7f4010909d3cde05a57fdcf20c +Bug 620931 part 4 - Fix resource://app/ to always point to the same as resource:/// + +diff --git a/netwerk/protocol/res/nsResProtocolHandler.cpp b/netwerk/protocol/res/nsResProtocolHandler.cpp +--- a/netwerk/protocol/res/nsResProtocolHandler.cpp ++++ b/netwerk/protocol/res/nsResProtocolHandler.cpp +@@ -74,16 +74,17 @@ static nsResProtocolHandler *gResHandler + // set NSPR_LOG_FILE=log.txt + // + // this enables PR_LOG_ALWAYS level information and places all output in + // the file log.txt + // + static PRLogModuleInfo *gResLog; + #endif + ++#define kAPP NS_LITERAL_CSTRING("app") + #define kGRE NS_LITERAL_CSTRING("gre") + + //---------------------------------------------------------------------------- + // nsResURL : overrides nsStandardURL::GetFile to provide nsIFile resolution + //---------------------------------------------------------------------------- + + nsresult + nsResURL::EnsureFile() +@@ -179,16 +180,22 @@ nsResProtocolHandler::Init() + nsCOMPtr uri; + rv = NS_NewURI(getter_AddRefs(uri), appURI.Length() ? appURI : greURI); + NS_ENSURE_SUCCESS(rv, rv); + + rv = SetSubstitution(EmptyCString(), uri); + NS_ENSURE_SUCCESS(rv, rv); + + // ++ // make resource://app/ point to the application directory or omnijar ++ // ++ rv = SetSubstitution(kAPP, uri); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ // + // make resource://gre/ point to the GRE directory + // + if (appURI.Length()) { // We already have greURI in uri if appURI.Length() is 0. + rv = NS_NewURI(getter_AddRefs(uri), greURI); + NS_ENSURE_SUCCESS(rv, rv); + } + + rv = SetSubstitution(kGRE, uri); +diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp +--- a/toolkit/xre/nsXREDirProvider.cpp ++++ b/toolkit/xre/nsXREDirProvider.cpp +@@ -300,19 +300,16 @@ nsXREDirProvider::GetFile(const char* aP + } + } + else if (!strcmp(aProperty, XRE_EXECUTABLE_FILE) && gArgv[0]) { + nsCOMPtr lf; + rv = XRE_GetBinaryPath(gArgv[0], getter_AddRefs(lf)); + if (NS_SUCCEEDED(rv)) + file = lf; + } +- else if (!strcmp(aProperty, "resource:app")) { +- rv = GetAppDir()->Clone(getter_AddRefs(file)); +- } + + else if (!strcmp(aProperty, NS_APP_PROFILE_DIR_STARTUP) && mProfileDir) { + return mProfileDir->Clone(aFile); + } + else if (!strcmp(aProperty, NS_APP_PROFILE_LOCAL_DIR_STARTUP)) { + if (mProfileLocalDir) + return mProfileLocalDir->Clone(aFile); + +# HG changeset patch +# Parent 7d2228db71a299afca60babff632a967d2d6c456 +Bug 620931 part 5 - Enable omni.jar by default on xulrunner + +diff --git a/xulrunner/confvars.sh b/xulrunner/confvars.sh +--- a/xulrunner/confvars.sh ++++ b/xulrunner/confvars.sh +@@ -36,15 +36,16 @@ + # + # ***** END LICENSE BLOCK ***** + + MOZ_APP_NAME=xulrunner + MOZ_APP_DISPLAYNAME=XULRunner + MOZ_UPDATER=1 + MOZ_XULRUNNER=1 + MOZ_ENABLE_LIBXUL=1 ++MOZ_CHROME_FILE_FORMAT=omni + MOZ_STATIC_BUILD_UNSUPPORTED=1 + MOZ_APP_VERSION=$MOZILLA_VERSION + if test "$MOZ_STORAGE"; then + MOZ_PLACES=1 + fi + MOZ_EXTENSIONS_DEFAULT=" gnomevfs" + MOZ_URL_CLASSIFIER=1 diff --git a/community-staging/xulrunner-oss/xulrunner-version.patch b/community-staging/xulrunner-oss/xulrunner-version.patch new file mode 100644 index 000000000..8e81b23ea --- /dev/null +++ b/community-staging/xulrunner-oss/xulrunner-version.patch @@ -0,0 +1,12 @@ +diff -Nur mozilla-2.0.orig/xulrunner/installer/Makefile.in mozilla-2.0/xulrunner/installer/Makefile.in +--- mozilla-2.0.orig/xulrunner/installer/Makefile.in 2011-03-03 14:12:04.000000000 -0800 ++++ mozilla-2.0/xulrunner/installer/Makefile.in 2011-03-13 01:58:19.663360705 -0800 +@@ -44,6 +44,8 @@ + + include $(DEPTH)/config/autoconf.mk + ++MOZ_APP_VERSION="2.0" ++ + NO_PKG_FILES = \ + xulrunner-config \ + regchrome* \ diff --git a/community-staging/yaz/PKGBUILD b/community-staging/yaz/PKGBUILD new file mode 100644 index 000000000..bf42c005f --- /dev/null +++ b/community-staging/yaz/PKGBUILD @@ -0,0 +1,38 @@ +# $Id: PKGBUILD 48643 2011-06-03 16:57:46Z stephane $ +# Maintainer: Ray Rashif +# Contributor: Andrea Scarpino +# Contributor: Stefan Husmann +# Contributor: William Rea +# Contributor: Robert Emil Berge + +pkgname=yaz +pkgver=4.1.7 +pkgrel=2 +pkgdesc="A toolkit supporting the development of Z39.50/SRW/SRU clients and servers" +arch=('i686' 'x86_64') +license=('BSD') +url="http://www.indexdata.dk/yaz" +depends=('openssl' 'libxslt' 'icu') +options=('!libtool') +source=("http://ftp.indexdata.dk/pub/$pkgname/$pkgname-$pkgver.tar.gz") +md5sums=('d4b94fc70bfc105fc034c4b51b7b5cae') + +build() { + cd "$srcdir/$pkgname-$pkgver" + + ./configure --prefix=/usr \ + --enable-shared=yaz \ + --with-openssl=/usr + make +} + +package() { + cd "$srcdir/$pkgname-$pkgver" + + make DESTDIR="$pkgdir/" install + + install -Dm644 LICENSE \ + "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +# vim:set ts=2 sw=2 et: -- cgit v1.2.3-54-g00ecf