ooo-build r15488 - in trunk: . patches/dev300
- From: strba svn gnome org
- To: svn-commits-list gnome org
- Subject: ooo-build r15488 - in trunk: . patches/dev300
- Date: Fri, 6 Mar 2009 15:35:50 +0000 (UTC)
Author: strba
Date: Fri Mar 6 15:35:50 2009
New Revision: 15488
URL: http://svn.gnome.org/viewvc/ooo-build?rev=15488&view=rev
Log:
Backporting CWS moz2seamonkey01
Added:
trunk/patches/dev300/cws-moz2seamonkey01-configure.diff
trunk/patches/dev300/cws-moz2seamonkey01-moz.diff
Modified:
trunk/ChangeLog
trunk/configure.in
trunk/download.in
trunk/patches/dev300/apply
Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in (original)
+++ trunk/configure.in Fri Mar 6 15:35:50 2009
@@ -805,7 +805,7 @@
PREBUILT_EXTENSIONAIDS_TIMESTAMP=20081125
AC_SUBST(PREBUILT_EXTENSIONAIDS_TIMESTAMP)
-BUILD_MOZILLA_SOURCE='mozilla-source-1.7.5.tar.gz'
+BUILD_MOZILLA_SOURCE='seamonkey-1.1.13.source.tar.gz'
AC_SUBST(BUILD_MOZILLA_SOURCE)
AGFA_MONOTYPE_FONTS_SOURCE='agfa-monotype-fonts.tar.gz'
Modified: trunk/download.in
==============================================================================
--- trunk/download.in (original)
+++ trunk/download.in Fri Mar 6 15:35:50 2009
@@ -84,7 +84,8 @@
# Win32 ant binaries ...
'apache-ant-.*' => 'http://archive.apache.org/dist/ant/binaries',
# Mozilla source and libraries
- 'mozilla-source-1\.7\.5.*' => 'http://download.go-oo.org/src/',
+ 'mozilla-source-1\.7\.5.*' => 'http://download.go-oo.org/src/',
+ 'seamonkey-1\.1\.13.*' => 'http://download.go-oo.org/src/',
'glib-1\.2\..*' => 'http://ftp.gtk.org/pub/gtk/v1.2/',
'libIDL-.*' => 'http://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/source/',
'wintools\.zip' => 'http://ftp.mozilla.org/pub/mozilla.org/mozilla/source/',
Modified: trunk/patches/dev300/apply
==============================================================================
--- trunk/patches/dev300/apply (original)
+++ trunk/patches/dev300/apply Fri Mar 6 15:35:50 2009
@@ -337,6 +337,8 @@
[ CWSBackports ]
#basic runtime fixes
basic-add-missing-includes-after-cws-npower10.diff
+cws-moz2seamonkey01-moz.diff
+cws-moz2seamonkey01-configure.diff
[ CWSBackports < ooo310-m1 ]
#api changes
@@ -1426,7 +1428,7 @@
SectionOwner => fridrich
# Mozilla build-bits to not break on Solaris 11
-moz-solaris11-makefiles.diff, fridrich
+# moz-solaris11-makefiles.diff, fridrich
[ BuildBits ]
Added: trunk/patches/dev300/cws-moz2seamonkey01-configure.diff
==============================================================================
--- (empty file)
+++ trunk/patches/dev300/cws-moz2seamonkey01-configure.diff Fri Mar 6 15:35:50 2009
@@ -0,0 +1,109 @@
+Index: configure.in
+===================================================================
+--- configure.in (.../tags/DEV300_m41/configure.in) (revision 269003)
++++ configure.in (.../cws/moz2seamonkey01/configure.in) (revision 269003)
+@@ -1733,12 +1733,15 @@
+ AC_MSG_RESULT([found Compiler version $CCNUMVER.])
+ if test "$CCNUMVER" -ge "001500000000"; then
+ COMEX=12
++ MSVSVER=2008
+ AC_MSG_RESULT([found .NET 2008 / VS 9.0.])
+ elif test "$CCNUMVER" -ge "001400000000"; then
+ COMEX=11
++ MSVSVER=2005
+ AC_MSG_RESULT([found .NET 2005.])
+ elif test "$CCNUMVER" -ge "001300102240"; then
+ COMEX=10
++ MSVSVER=2003
+ AC_MSG_RESULT([found .NET 2003.])
+ else
+ AC_MSG_ERROR([Compiler too old. Use Microsoft C/C++ .NET 2003/2005 compiler.])
+@@ -4097,9 +4100,14 @@
+
+ AC_MSG_CHECKING([for toolkit mozilla should use])
+ if test -z "$with_mozilla_toolkit"; then
+- if test "$_os" != "WINNT"; then
+- MOZILLA_TOOLKIT=gtk2
+- AC_MSG_RESULT([gtk2])
++ if test "$_os" != "WINNT" ; then
++ if test "$_os" = "Darwin" ; then
++ MOZILLA_TOOLKIT=mac
++ AC_MSG_RESULT([mac])
++ else
++ MOZILLA_TOOLKIT=gtk2
++ AC_MSG_RESULT([gtk2])
++ fi
+ fi
+ else
+ MOZILLA_TOOLKIT=$with_mozilla_toolkit
+@@ -4121,7 +4129,7 @@
+ enable_build_mozilla=
+ fi
+
+-AC_MSG_CHECKING([whether to build Mozilla])
++AC_MSG_CHECKING([whether to build Mozilla/SeaMonkey])
+ if test -n "$enable_build_mozilla"; then
+ BUILD_MOZAB="TRUE"
+ AC_MSG_RESULT([yes])
+@@ -4131,17 +4139,25 @@
+ fi
+
+ if test "$BUILD_MOZAB" = "TRUE"; then
++ if test "$_os" = "WINNT"; then
++ if test "$WITH_MINGWIN" != "yes"; then
++ # compiling with MSVC. Only supported platform here is MSVS2005 at the moment.
++ if test "$MSVSVER" != "2005"; then
++ AC_MSG_ERROR([Building SeaMonkey is supported with Microsoft Visual Studio .NET 2005 only.])
++ fi
++ else
++ AC_MSG_WARN([Building SeaMonkey with mingwin is not tested, and likely to break.])
++ echo "Building SeaMonkey with mingwin is not tested, and likely to break." >> warn
++ fi
++ fi
++
+ if test -z "$MOZILLA_VERSION"; then
+- MOZILLA_VERSION=1.7.5
++ MOZILLA_VERSION=1.1.13
+ fi
+- if test "$MOZILLA_VERSION" = "1.7b" ; then
+- MOZILLA_SOURCE_VERSION="mozilla-source-1.7b-source"
+- else
+- MOZILLA_SOURCE_VERSION="mozilla-source-${MOZILLA_VERSION}"
+- fi
++ MOZILLA_SOURCE_VERSION="seamonkey-${MOZILLA_VERSION}.source"
+ for e in gz bz2; do
+ AC_MSG_CHECKING([for $MOZILLA_SOURCE_VERSION.tar.$e])
+- if test ! -e "./moz/download/$MOZILLA_SOURCE_VERSION.tar.$e" && test "$HAVE_MOZILLA_TARBALL" != "y"; then
++ if test ! -e "moz/download/$MOZILLA_SOURCE_VERSION.tar.$e" && test "$HAVE_MOZILLA_TARBALL" != "y"; then
+ AC_MSG_RESULT([not found])
+ HAVE_MOZILLA_TARBALL=n
+ else
+@@ -4150,22 +4166,16 @@
+ fi
+ done
+ if test "$HAVE_MOZILLA_TARBALL" != "y"; then
+- AC_MSG_ERROR([Mozilla source archive not found.
++ AC_MSG_ERROR([Mozilla/SeaMonkey source archive not found.
+ Please copy $MOZILLA_SOURCE_VERSION.tar.bz2 or $MOZILLA_SOURCE_VERSION.tar.gz to moz/download/.
+ The archives can be found here:
+-http://ftp.mozilla.org/pub/mozilla.org/mozilla/releases/mozilla$MOZILLA_VERSION/source/])
++http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/$MOZILLA_VERSION/])
+ fi
+ if test "$_os" = "WINNT"; then
+- AC_MSG_CHECKING([for glib and libIDL binaries])
+- if test ! -e "./moz/download/vc71-glib-1.2.10-bin.zip" \
+- -o ! -e "./moz/download/vc71-libIDL-0.6.8-bin.zip" \
+- -o ! -e "./moz/download/wintools.zip" ; then
+-AC_MSG_ERROR([One or more of the following archives is missing in moz/download/
+- vc71-glib-1.2.10-bin.zip
+- vc71-libIDL-0.6.8-bin.zip
+-(from ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/historic/vc71/)
+- wintools.zip
+-(from http://ftp.mozilla.org/pub/mozilla.org/mozilla/source/wintools.zip)])
++ AC_MSG_CHECKING([for moztools binaries])
++ if test ! -e "moz/download/vc8-moztools.zip" ; then
++ AC_MSG_ERROR([The following file is missing in moz/download: vc8-moztools.zip
++(from ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/historic/vc8/)])
+ else
+ AC_MSG_RESULT([ok])
+ fi
Added: trunk/patches/dev300/cws-moz2seamonkey01-moz.diff
==============================================================================
--- (empty file)
+++ trunk/patches/dev300/cws-moz2seamonkey01-moz.diff Fri Mar 6 15:35:50 2009
@@ -0,0 +1,7529 @@
+--- moz/extractfiles.mk (.../tags/DEV300_m41/moz) (revision 268999)
++++ moz/extractfiles.mk (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -41,6 +41,7 @@
+ plc4 \
+ plds4 \
+ xpcom \
++ xpcom_core \
+ xpcom_compat \
+ nss3 \
+ ssl3 \
+@@ -61,13 +62,7 @@
+ msgbaseutil \
+ ldap50 \
+ prldap50
+-.IF "$(OS)"=="SOLARIS"
+-.IF "$(CPU)"=="S"
+-BIN_RUNTIMELIST+= \
+- freebl_hybrid_3
+ .ENDIF
+-.ENDIF #"$(OS)"=="SOLARIS"
+-.ENDIF
+
+ COMPONENT_RUNTIMELIST= \
+ addrbook \
+@@ -101,7 +96,8 @@
+ xpcom_io.xpt \
+ xpcom_xpti.xpt \
+ addrbook.xpt \
+- mozldap.xpt
++ mozldap.xpt \
++ pref.xpt
+
+ .IF "$(GUI)"=="WNT"
+ COMREGISTRY_FILELIST+= xpcom_thread.xpt
+@@ -127,6 +123,7 @@
+ libnslber32v50.a \
+ libnsldap32v50.a \
+ libnspr4.a \
++ libxpcom_core.dll.a \
+ libxpcom.dll.a \
+ libnss3.a \
+ libsmime3.a
+@@ -137,6 +134,7 @@
+ nslber32v50.lib \
+ nsldap32v50.lib \
+ nspr4.lib \
++ xpcom_core.lib \
+ xpcom.lib \
+ plc4.lib \
+ plds4.lib \
+@@ -150,6 +148,7 @@
+ libmozreg_s.a \
+ liblber50.a \
+ libnspr4$(DLLPOST) \
++ libxpcom_core$(DLLPOST) \
+ libxpcom$(DLLPOST) \
+ libmsgbaseutil$(DLLPOST) \
+ libldap50$(DLLPOST) \
+@@ -266,8 +265,14 @@
+ .ENDIF
+
+ # zip runtime files to mozruntime.zip
++.IF "$(OS)"=="MACOSX" || "$(OS)"=="LINUX"
++ cd $(RUNTIME_DIR) && sh ..$/..$/..$/$(MOZ_BIN_DIR)$/run-mozilla.sh .$/regxpcom$(REG_SUBFIX)
++.ELSE
++.IF "$(OS)"!="WNT"
+ cd $(RUNTIME_DIR) && .$/regxpcom$(REG_SUBFIX)
+ $(COPY) $(RUNTIME_DIR)$/components$/xpti.dat $(RUNTIME_DIR)$/components$/xptitemp.dat
++.ENDIF
++.ENDIF
+ $(RM) $(RUNTIME_DIR)$/regxpcom$(REG_SUBFIX)
+ cd $(RUNTIME_DIR) && zip -r ..$/..$/bin$/mozruntime.zip *
+
+--- moz/makefile.mk (.../tags/DEV300_m41/moz) (revision 268999)
++++ moz/makefile.mk (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -41,7 +41,6 @@
+ # --- Files --------------------------------------------------------
+ # ----- pkg-config start -------
+ .INCLUDE .IGNORE : pkgroot.mk
+-
+ .IF "$(PKGCONFIG_ROOT)"!=""
+ PKG_CONFIG:=$(PKGCONFIG_ROOT)$/bin$/pkg-config
+ PKG_CONFIG_PATH:=$(PKGCONFIG_ROOT)$/lib$/pkgconfig
+@@ -58,32 +57,32 @@
+ .IF "$(SYSBASE)"!="" && "$(OS)" == "LINUX"
+ # hmm... rather gcc specific switches...
+ CFLAGS:=-isystem $(SYSBASE)/usr/include -B$(SYSBASE)/usr/lib
+-LDFLAGS:=-L$(SYSBASE)/lib -L$(SYSBASE)/usr/lib -LX11
++LDFLAGS:=-L$(SYSBASE)/lib -L$(SYSBASE)/usr/lib -L$(SYSBASE)/usr/X11R6/lib
+ SYSBASE_X11:=--x-includes=$(SYSBASE)/usr/include/X11 --x-libraries=$(SYSBASE)/usr/X11R6/lib
+ .EXPORT : CFLAGS LDFLAGS
+ .ENDIF # "$(SYSBASE)"!="" && "$(OS)" == "LINUX"
+
+ # ----- pkg-config end -------
+
+-MOZILLA_VERSION*=1.7.5
+-.IF "$(MOZILLA_VERSION)"=="1.7b"
+-TARFILE_NAME=mozilla-source-1.7b-source
+-.ELSE
+-TARFILE_NAME=mozilla-source-$(MOZILLA_VERSION)
+-.ENDIF
++MOZILLA_VERSION*=1.1.13
++TARFILE_NAME=seamonkey-$(MOZILLA_VERSION).source
++
+ TARFILE_ROOTDIR=mozilla
++PATCH_FILE_NAME=seamonkey-source-$(MOZILLA_VERSION).patch
+
+-PATCH_FILE_NAME=mozilla-source-$(MOZILLA_VERSION).patch
++# This file is needed for the W32 build when BUILD_MOZAB is set
++# (currently only vc8/vs2005 is supported when BUILD_MOZAB is set)
++MOZTOOLS_ZIPFILE_NAME*=vc8-moztools.zip
+
+-# These files are needed for the W32 build when BUILD_MOZAB is set
+-LIBIDL_VC71_ZIPFILE_NAME*=vc71-libIDL-0.6.8-bin.zip
+-LIBGLIB_VC71_ZIPFILE_NAME*=vc71-glib-1.2.10-bin.zip
+-WINTOOLS_ZIPFILE_NAME*=wintools.zip
+-
+ ADDITIONAL_FILES=mailnews$/addrbook$/src$/nsAbMD5sum.cpp
+
+ CONFIGURE_DIR=
+-MOZILLA_CONFIGURE_FLAGS= $(SYSBASE_X11) --disable-tests \
++.IF "$(GUIBASE)"!="aqua"
++MOZILLA_CONFIGURE_FLAGS += $(SYSBASE_X11)
++.ENDIF
++
++MOZILLA_CONFIGURE_FLAGS += --disable-tests \
++ --enable-application=suite \
+ --enable-ldap \
+ --enable-crypto \
+ --enable-optimize \
+@@ -95,7 +94,6 @@
+ --disable-debug \
+ --disable-xprint \
+ --disable-postscript \
+- --disable-freetype2 \
+ --without-system-zlib \
+ --disable-installer \
+ --disable-accessibility \
+@@ -104,20 +102,40 @@
+ --disable-oji \
+ --disable-profilesharing \
+ --disable-boehm \
+- --disable-jsloader
++ --disable-jsloader \
++ --disable-canvas \
++ --disable-xft \
++ --disable-freetype2 \
++ --disable-gnomeui \
++ --disable-image-encoders \
++ --disable-plugins \
++ --disable-printing \
++ --enable-extensions="pref"
+
++#.IF "$(GUI)"!="WNT"
++#MOZILLA_CONFIGURE_FLAGS += --enable-system-cairo
++#.ENDIF
++
+ #disable profilelocking to share profile with mozilla
+ #disable activex and activex-scripting to remove the dependence of Microsoft_SDK\src\mfc\atlbase.h
+ #disable gnomevfs to remove the needed of gnome develop files
+ #disable others to save build times
+
+ .IF "$(GUI)"=="UNX"
++.IF "$(GUIBASE)"=="aqua"
++MACDEVSDK*=/Developer/SDKs/MacOSX10.4u.sdk
++MOZILLA_CONFIGURE_FLAGS+= \
++ --with-macos-sdk=$(MACDEVSDK) \
++ --disable-glibtest \
++ --enable-macos-target=10.4 \
++ --disable-libxul
++DEFAULT_MOZILLA_TOOLKIT=mac
++.ELSE
+ #We do not need mozilla ui, but libIDL version are decided by default toolkit.
+ #default-toolkit=xlib need libIDL < 0.68
+ #default-toolkit=gtk2 need libIDL > 0.8 (know as libIDL2)
+-.IF "x$(DEFAULT_MOZILLA_TOOLKIT)"=="x"
+-DEFAULT_MOZILLA_TOOLKIT=gtk2
+-.ENDIF
++DEFAULT_MOZILLA_TOOLKIT*=gtk2
++.ENDIF # "$(GUIBASE)"=="aqua"
+ MOZILLA_CONFIGURE_FLAGS+= --enable-default-toolkit=$(DEFAULT_MOZILLA_TOOLKIT)
+ .ENDIF
+
+@@ -145,6 +163,10 @@
+ .IF "$(OS)"=="SOLARIS" && "$(CPUNAME)"=="SPARC" && "$(CPU)"=="U"
+ PKG_CONFIG_PATH=/usr/lib/64/pkgconfig
+ .EXPORT: PKG_CONFIG_PATH
++MAKE=/usr/sfw/bin/gmake
++.EXPORT: MAKE
++CFLAGS=-I/usr/sfw/include
++.EXPORT: CFLAGS
+ .ENDIF
+ .IF "$(COM)"=="C52" && "$(CPUNAME)"=="SPARC" && "$(CPU)"=="U"
+ CFLAGS=-m64
+@@ -152,7 +174,7 @@
+ .EXPORT: CFLAGS ASFLAGS
+ .ENDIF
+
+-MOZDIR=$(MISC)$/build$/mozilla
++MOZDIR=$(MISC)$/build$/seamonkey
+ MOZTARGET=$(OS)$(COM)$(CPU)
+
+ .IF "$(GUI)"=="WNT"
+@@ -186,33 +208,23 @@
+ .ENDIF
+
+ # Variables to install/use our own wintools
+-MOZTOOLSUNPACK:=$(MISC)$/build$/moztoolsunpack
+-MOZTOOLSINST:=$(MISC)$/build$/moztoolsinst
++MOZTOOLS_EXTRACT:=$(MISC)$/build$/moztools
+ .IF "$(USE_SHELL)"!="4nt"
+-MOZ_TOOLS_DOS:=$(shell @cygpath -ad "$(MISC)")\build\moztoolsinst
++MOZ_TOOLS_DOS:=$(shell @cygpath -ad "$(MISC)")\build\moztools\vc8-moztools
+ .IF "$(COM)"=="GCC"
+-PATH!:=$(PATH):$(shell @cygpath $(MOZ_TOOLS_DOS))/bin:$(shell @cygpath $(MOZ_TOOLS_DOS))/vc71/bin
++PATH!:=$(PATH):$(shell @cygpath $(MOZ_TOOLS_DOS))/bin
+ .ELSE
+-PATH!:=$(shell @cygpath $(MOZ_TOOLS_DOS))/vc71/bin:$(shell @cygpath $(MOZ_TOOLS_DOS))/bin:$(PATH)
++PATH!:=$(shell @cygpath $(MOZ_TOOLS_DOS))/bin:$(PATH)
+ .ENDIF
+-.IF "$(USE_SHELL)"=="tcsh"
+-SET_MOZ_TOOLS_INSTALL_BAT:=setenv MOZ_TOOLS "$(MOZ_TOOLS_DOS)"
+-.ELIF "$(USE_SHELL)"=="bash"
+-SET_MOZ_TOOLS_INSTALL_BAT:=export "MOZ_TOOLS=$(MOZ_TOOLS_DOS)"
+-.ELSE
+-SET_MOZ_TOOLS_INSTALL_BAT:=MOZ_TOOLS="$(MOZ_TOOLS_DOS)"; export MOZ_TOOLS
+-.ENDIF
+ .ELSE # "$(USE_SHELL)"!="4nt"
+ # MOZ_TOOLS must contain an absolute path
+-MOZ_TOOLS_DOS:=$(shell @echo % SFN[$(MISC)])\build\moztoolsinst
+-PATH!:=$(MOZ_TOOLS_DOS)\vc71\bin;$(MOZ_TOOLS_DOS)\bin;$(PATH)
+-SET_MOZ_TOOLS_INSTALL_BAT:=set MOZ_TOOLS=$(MOZ_TOOLS_DOS)
++MOZ_TOOLS_DOS:=$(shell @echo % SFN[$(MISC)])\build\moztools\vc8-moztools
++PATH!:=$(MOZ_TOOLS_DOS)\bin;$(PATH)
+ .ENDIF # "$(USE_SHELL)"!="4nt"
++
+ MOZ_TOOLS:=$(subst,\,/ $(MOZ_TOOLS_DOS))
+-GLIB_PREFIX:=$(MOZ_TOOLS)/vc71
+-LIBIDL_PREFIX:=$(MOZ_TOOLS)/vc71
+
+-.EXPORT : PATH MOZ_TOOLS GLIB_PREFIX LIBIDL_PREFIX
++.EXPORT : PATH MOZ_TOOLS
+ .ENDIF # "$(GUI)"=="WNT"
+
+ # --- Targets ------------------------------------------------------
+@@ -227,7 +239,7 @@
+ .INCLUDE : tg_ext.mk
+
+ .IF "$(GUI)"=="WNT"
+-NEEDWINTOOLSFLAGFILE:=$(MISC)$/build$/wintools.complete
++NEEDWINTOOLSFLAGFILE:=$(MISC)$/build$/moztools.complete
+ .ENDIF # "$(GUI)"=="WNT"
+
+ ALLTAR: $(NEEDWINTOOLSFLAGFILE) \
+@@ -245,29 +257,19 @@
+
+ # Unpack/setup Windows build tools
+ .IF "$(GUI)"=="WNT"
+-$(PACKAGE_DIR)$/$(UNTAR_FLAG_FILE) : $(MISC)$/build$/wintools.complete
++$(PACKAGE_DIR)$/$(UNTAR_FLAG_FILE) : $(MISC)$/build$/moztools.complete
+
+-$(MISC)$/build$/wintools.unpack : $(PRJ)$/download$/$(WINTOOLS_ZIPFILE_NAME)
+- -$(RENAME) $(MOZTOOLSUNPACK) $(MOZTOOLSUNPACK)_removeme
+- -$(RENAME) $(MOZTOOLSINST) $(MOZTOOLSINST)_removeme
+- -rm -rf $(MOZTOOLSUNPACK)_removeme $(MOZTOOLSINST)_removeme
+- @-$(MKDIRHIER) $(MOZTOOLSUNPACK)
+- unzip $(PRJ)$/download$/$(WINTOOLS_ZIPFILE_NAME) -d $(MOZTOOLSUNPACK)
+- $(TOUCH) $(MISC)$/build$/wintools.unpack
++$(MISC)$/build$/moztools.unpack : $(PRJ)$/download$/$(MOZTOOLS_ZIPFILE_NAME)
++ -$(RENAME) $(MOZTOOLS_EXTRACT) $(MOZTOOLS_EXTRACT)_removeme
++ -rm -rf $(MOZTOOLS_EXTRACT)_removeme
++ @-$(MKDIRHIER) $(MOZTOOLS_EXTRACT)
++ unzip $(PRJ)$/download$/$(MOZTOOLS_ZIPFILE_NAME) -d $(MOZTOOLS_EXTRACT)
++# chmod is also needed for W32-4nt build (when cygwin unzip is used)
++ -chmod -R +x $(MOZTOOLS_EXTRACT)$/vc8-moztools$/bin
++ $(TOUCH) $(MISC)$/build$/moztools.unpack
+
+-$(MISC)$/build$/wintools.install : $(MISC)$/build$/wintools.unpack
+- cd $(MOZTOOLSUNPACK)$/buildtools$/windows && $(SET_MOZ_TOOLS_INSTALL_BAT) && cmd /c install.bat
+- $(TOUCH) $(MISC)$/build$/wintools.install
+-
+-$(MISC)$/build$/wintools.complete : \
+- $(MISC)$/build$/wintools.install \
+- $(PRJ)$/download$/$(LIBIDL_VC71_ZIPFILE_NAME) \
+- $(PRJ)$/download$/$(LIBGLIB_VC71_ZIPFILE_NAME)
+- unzip $(PRJ)$/download$/$(LIBIDL_VC71_ZIPFILE_NAME) -d $(MOZTOOLSINST)
+- unzip $(PRJ)$/download$/$(LIBGLIB_VC71_ZIPFILE_NAME) -d $(MOZTOOLSINST)
+-# chmod is also needed for W32-4nt build (when cygwin unzip is used)
+- -chmod -R +x $(MOZTOOLSINST)$/vc71$/bin
+- $(TOUCH) $(MISC)$/build$/wintools.complete
++$(MISC)$/build$/moztools.complete : $(MISC)$/build$/moztools.unpack
++ $(TOUCH) $(MISC)$/build$/moztools.complete
+ .ENDIF # "$(GUI)"=="WNT"
+
+ zip: \
+--- moz/seamonkey-source-1.1.13.patch (.../tags/DEV300_m41/moz) (revision 0)
++++ moz/seamonkey-source-1.1.13.patch (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -0,0 +1,6880 @@
++--- misc/mozilla/build/autoconf/mozconfig-find 2007-02-16 03:19:06.000000000 +0100
+++++ misc/build/mozilla/build/autoconf/mozconfig-find 2008-08-19 10:12:04.000000000 +0200
++@@ -51,10 +51,7 @@
++ "$topsrcdir/.mozconfig" \
++ "$topsrcdir/mozconfig" \
++ "$topsrcdir/mozconfig.sh" \
++- "$topsrcdir/myconfig.sh" \
++- "$HOME/.mozconfig" \
++- "$HOME/.mozconfig.sh" \
++- "$HOME/.mozmyconfig.sh"
+++ "$topsrcdir/myconfig.sh"
++ do
++ if test -f "$_config"; then
++ echo "$_config";
++--- misc/mozilla/build/cygwin-wrapper 2004-08-19 01:18:55.000000000 +0200
+++++ misc/build/mozilla/build/cygwin-wrapper 2008-08-14 16:22:21.000000000 +0200
++@@ -1,4 +1,4 @@
++-#!/bin/sh
+++#!/bin/bash
++ #
++ # Stupid wrapper to avoid win32 dospath/cygdrive issues
++ # Try not to spawn programs from within this file. If the stuff in here looks royally
++@@ -57,12 +57,36 @@
++ i=-I${mountpoint}/${driveletter}/${pathname}
++ fi
++ else
++- eval 'leader=${i%%'${mountpoint}'/[a-zA-Z]/*}'
++- if ! test "${leader}" = "${i}"; then
++- eval 'pathname=${i#'${leader}${mountpoint}'/[a-zA-Z]/}'
++- eval 'no_mountpoint=${i#'${leader}${mountpoint}'/}'
++- driveletter=${no_mountpoint%%/*}
++- i=${leader}${driveletter}:/${pathname}
+++ # The original version missed mounted paths, the new version below
+++ # doesn't transform /para as this is most likely a parameter.
+++ eval 'notinpath=${i%%'${mountpoint}'/[a-zA-Z]/*}'
+++ if ! test "$notinpath" = "$i"; then
+++ # found $mountpoint
+++ eval 'restpath=${i#'${notinpath}${mountpoint}'/[a-zA-Z]/}'
+++ eval 'withdrive=${i#'${notinpath}${mountpoint}'/}'
+++ driveletter=${withdrive%%/*}
+++ i=${notinpath}${driveletter}:/${restpath}
+++ else
+++ # check for potential path. Precheck using shell methods
+++ doconvert=""
+++ # Shortcut -X<path> when path does not begin with '/'
+++ noswitch=${i#-[a-zA-Z]}
+++ if test "$noswitch" != "$i"; then
+++ test "${noswitch#/}" != "$noswitch" && doconvert="1"
+++ fi
+++ # Precheck for possible path. Consider only absolute paths that contain at least
+++ # a second / to prevent converting of /abc parameters.
+++ test -z "$doconvert" -a "${i#/[a-zA-Z0-9_.-]*/}" != "$i" && doconvert="1"
+++ if test -n "$doconvert"; then
+++ # Can be a path. If forking grep would be faster or we could require bash 3
+++ # this regexp would be all that's needed to find pathnames that need converting
+++ pathname=`echo $i | grep -oE '^(-[a-zA-Z])?/[a-zA-Z0-9_.-]+/[a-zA-Z0-9_./-]+$'`
+++ eval 'notinpath=${i%'${pathname}'}'
+++ if test "$notinpath" != "$i" -a "$pathname" != "${pathname#/}"; then
+++ pathname=`cygpath -am "$pathname"`
+++ i=${notinpath}${pathname}
+++ fi
+++ fi
++ fi
++ fi
++ fi
++--- misc/mozilla/config/Makefile.in 2006-12-22 14:50:41.000000000 +0100
+++++ misc/build/mozilla/config/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -166,7 +166,7 @@
++
++ ifdef MOZ_ENABLE_GTK2
++ GLIB_CFLAGS = $(MOZ_GTK2_CFLAGS)
++- GLIB_LIBS = $(MOZ_GTK2_LIBS)
+++ GLIB_LIBS = $(filter -lglib% -L%,$(MOZ_GTK2_LIBS))
++ endif
++
++ build_number: FORCE
++--- misc/mozilla/config/autoconf.mk.in 2006-09-14 20:07:03.000000000 +0200
+++++ misc/build/mozilla/config/autoconf.mk.in 2008-11-07 16:08:52.937500000 +0100
++@@ -543,6 +543,7 @@
++ MOZ_TOOLS_DIR = @MOZ_TOOLS_DIR@
++ MOZ_DEBUG_SYMBOLS = @MOZ_DEBUG_SYMBOLS@
++ MOZ_QUANTIFY = @MOZ_QUANTIFY@
+++MSMANIFEST_TOOL = @MSMANIFEST_TOOL@
++
++ #python options
++ PYTHON = @MOZ_PYTHON@
++--- misc/mozilla/config/config.mk 2008-01-29 20:30:22.000000000 +0100
+++++ misc/build/mozilla/config/config.mk 2008-08-14 16:22:21.000000000 +0200
++@@ -758,6 +758,23 @@
++ endif
++
++ #
+++# Shared library RUNPATH linker option(s)
+++#
+++ifeq ($(OS_ARCH),Linux)
+++EXTRA_DSO_LDOPTS += -Wl,-rpath,\$$ORIGIN:\$$ORIGIN/../ure-link/lib
+++ifdef IS_COMPONENT
+++EXTRA_DSO_LDOPTS += -Wl,-rpath,\$$ORIGIN/..:\$$ORIGIN/../../ure-link/lib
+++endif # IS_COMPONENT
+++endif # Linux
+++
+++ifeq ($(OS_ARCH),SunOS)
+++EXTRA_DSO_LDOPTS += -R '$$ORIGIN'
+++ifdef IS_COMPONENT
+++EXTRA_DSO_LDOPTS += -R '$$ORIGIN/..'
+++endif # IS_COMPONENT
+++endif # SunOS
+++
+++#
++ # Include any personal overrides the user might think are needed.
++ #
++ -include $(MY_CONFIG)
++--- misc/mozilla/config/rules.mk 2008-01-29 20:30:22.000000000 +0100
+++++ misc/build/mozilla/config/rules.mk 2009-02-16 14:05:23.000000000 +0100
++@@ -529,8 +529,9 @@
++ ifeq ($(OS_ARCH),WINNT)
++ ifdef GNU_CC
++ ifndef IS_COMPONENT
++-DSO_LDOPTS += -Wl,--out-implib -Wl,$(IMPORT_LIBRARY)
+++DSO_LDOPTS += -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(IMPORT_LIBRARY)
++ endif
+++DSO_LDOPTS += -Wl,--enable-runtime-pseudo-reloc -Wl,-Map -Wl,$(LIB_PREFIX)$(LIBRARY_NAME).map
++ endif
++ endif
++
++@@ -811,6 +810,12 @@
++
++ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
++ $(LD) -NOLOGO -OUT:$@ -PDB:$(PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(PROGOBJS) $(RESFILE) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;1; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
++ else
++ ifeq ($(CPP_PROG_LINK),1)
++ $(CCC) -o $@ $(CXXFLAGS) $(WRAP_MALLOC_CFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(BIN_FLAGS) $(WRAP_MALLOC_LIB) $(PROFILER_LIBS) $(EXE_DEF_FILE)
++@@ -843,6 +848,12 @@
++ else
++ ifeq (_WINNT,$(GNU_CC)_$(HOST_OS_ARCH))
++ $(HOST_LD) -NOLOGO -OUT:$@ -PDB:$(PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;1; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
++ else
++ $(HOST_CC) -o $@ $(HOST_CFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
++ endif
++@@ -866,6 +877,12 @@
++ else
++ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
++ $(LD) -nologo -out:$@ -pdb:$(PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;1; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
++ else
++ ifeq ($(CPP_PROG_LINK),1)
++ $(CCC) $(WRAP_MALLOC_CFLAGS) $(CXXFLAGS) -o $@ $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(WRAP_MALLOC_LIB) $(PROFILER_LIBS) $(BIN_FLAGS)
++@@ -1019,6 +1036,14 @@
++ endif # SHARED_LIBRARY_LIBS
++ endif # NO_LD_ARCHIVE_FLAGS
++ $(MKSHLIB) $(SHLIB_LDSTARTFILE) $(OBJS) $(LOBJS) $(SUB_SHLOBJS) $(RESFILE) $(LDFLAGS) $(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) $(DEF_FILE) $(SHLIB_LDENDFILE)
+++ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;2; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
+++endif # WINNT && !GCC
++ @rm -f foodummyfilefoo $(SUB_SHLOBJS) $(DELETE_AFTER_LINK)
++ else # os2 vacpp
++ $(MKSHLIB) -O:$@ -DLL -INC:_dllentry $(LDFLAGS) $(OBJS) $(LOBJS) $(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) $(DEF_FILE)
++@@ -1043,7 +1070,7 @@
++ if test -d $(@D); then \
++ echo "Building deps for $<"; \
++ touch $(_MDDEPFILE) && \
++- $(MKDEPEND) -o'.$(OBJ_SUFFIX)' -f$(_MDDEPFILE) $(DEFINES) $(ACDEFINES) $(INCLUDES) $< >/dev/null 2>&1 && \
+++ $(MKDEPEND) -o'.$(OBJ_SUFFIX)' -f$(_MDDEPFILE) $(DEFINES) $(ACDEFINES) $(filter-out -I/so/env% ,$(INCLUDES)) $< >/dev/null 2>&1 && \
++ mv $(_MDDEPFILE) $(_MDDEPFILE).old && \
++ cat $(_MDDEPFILE).old | sed -e "s|^$(srcdir)/||" -e "s|^$(win_srcdir)/||" > $(_MDDEPFILE) && rm -f $(_MDDEPFILE).old ; \
++ fi
++@@ -1053,7 +1080,7 @@
++ if test -d $(@D); then \
++ echo "Building deps for $<"; \
++ touch $(_MDDEPFILE) && \
++- $(MKDEPEND) -o'.$(OBJ_SUFFIX)' -f$(_MDDEPFILE) $(DEFINES) $(ACDEFINES) $(INCLUDES) $< >/dev/null 2>&1 && \
+++ $(MKDEPEND) -o'.$(OBJ_SUFFIX)' -f$(_MDDEPFILE) $(DEFINES) $(ACDEFINES) $(filter-out -I/so/env% ,$(INCLUDES)) $< >/dev/null 2>&1 && \
++ mv $(_MDDEPFILE) $(_MDDEPFILE).old && \
++ cat $(_MDDEPFILE).old | sed -e "s|^$(<D)/||g" > $(_MDDEPFILE) && rm -f $(_MDDEPFILE).old ; \
++ fi
++@@ -1325,6 +1352,7 @@
++
++ $(XPIDL_GEN_DIR)/%.h: %.idl $(XPIDL_COMPILE) $(XPIDL_GEN_DIR)/.done
++ $(REPORT_BUILD)
+++ echo "PATH=" $(PATH)
++ $(ELOG) $(XPIDL_COMPILE) -m header -w -I$(srcdir) -I$(IDL_DIR) -o $(XPIDL_GEN_DIR)/$* $(_VPATH_SRCS)
++ @if test -n "$(findstring $*.h, $(EXPORTS) $(SDK_HEADERS))"; \
++ then echo "*** WARNING: file $*.h generated from $*.idl overrides $(srcdir)/$*.h"; else true; fi
++@@ -1696,14 +1724,14 @@
++ define MAKE_DEPS_NOAUTO
++ set -e ; \
++ touch $@ && \
++- $(MKDEPEND) -w1024 -o'.$(OBJ_SUFFIX)' -f$@ $(DEFINES) $(ACDEFINES) $(INCLUDES) $(srcdir)/$(<F) >/dev/null 2>&1 && \
+++ $(MKDEPEND) -w1024 -o'.$(OBJ_SUFFIX)' -f$@ $(DEFINES) $(ACDEFINES) $(filter-out -I/so/env% ,$(INCLUDES)) $(srcdir)/$(<F) >/dev/null 2>&1 && \
++ mv $@ $ old && cat $ old | sed "s|^$(srcdir)/||g" > $@ && rm -f $ old
++ endef
++ else
++ define MAKE_DEPS_NOAUTO
++ set -e ; \
++ touch $@ && \
++- $(MKDEPEND) -w1024 -o'.$(OBJ_SUFFIX)' -f$@ $(DEFINES) $(ACDEFINES) $(INCLUDES) $< >/dev/null 2>&1 && \
+++ $(MKDEPEND) -w1024 -o'.$(OBJ_SUFFIX)' -f$@ $(DEFINES) $(ACDEFINES) $(filter-out -I/so/env% ,$(INCLUDES)) $< >/dev/null 2>&1 && \
++ mv $@ $ old && cat $ old | sed "s|^$(<D)/||g" > $@ && rm -f $ old
++ endef
++ endif # WINNT
++--- misc/mozilla/configure 2008-10-30 23:05:30.000000000 +0100
+++++ misc/build/mozilla/configure 2009-02-12 15:20:18.597579000 +0100
++@@ -1068,6 +1068,8 @@
++ GCONF_VERSION=1.2.1
++ LIBGNOME_VERSION=2.0
++
+++MSMANIFEST_TOOL=
+++
++ MISSING_X=
++ for ac_prog in gawk mawk nawk awk
++ do
++@@ -3022,9 +3024,26 @@
++ _CC_SUITE=7
++ elif test "$_CC_MAJOR_VERSION" = "14"; then
++ _CC_SUITE=8
+++ CXXFLAGS="$CXXFLAGS -Zc:wchar_t-"
++ else
++ { echo "configure: error: This version of the MSVC compiler, $CC_VERSION , is unsupported." 1>&2; exit 1; }
++ fi
+++
+++ # bug #249782
+++ # ensure that mt.exe is Microsoft (R) Manifest Tool and not magnetic tape manipulation utility (or something else)
+++ if test "$_CC_SUITE" -ge "8"; then
+++ MSMT_TOOL=`mt 2>&1|grep 'Microsoft (R) Manifest Tool'`
+++ if test -n "MSMT_TOOL"; then
+++ MSMANIFEST_TOOL_VERSION=`echo ${MSMANIFEST_TOOL}|grep -Po "(^|\s)[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?(\s|$)"`
+++ if test -z "MSMANIFEST_TOOL_VERSION"; then
+++ echo "configure: warning: Unknown version of the Microsoft (R) Manifest Tool." 1>&2
+++ fi
+++ MSMANIFEST_TOOL=1
+++ unset MSMT_TOOL
+++ else
+++ { echo "Microsoft (R) Manifest Tool must be in your \$PATH." 1>&2; exit 1; }
+++ fi
+++ fi
++
++ # Check linker version
++ _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
++@@ -5726,6 +5745,7 @@
++ if test "`echo ${srcdir} | grep -c ^/ 2>/dev/null`" = 0; then
++ _pwd=`pwd`
++ CYGWIN_WRAPPER="${_pwd}/${srcdir}/build/cygwin-wrapper"
+++ CYGWIN_WRAPPER=`cygpath -u $CYGWIN_WRAPPER`
++ fi
++ if test "`${PERL} -v | grep -c cygwin 2>/dev/null`" = 0; then
++ AS_PERL=1
++@@ -6036,7 +6056,7 @@
++ CXXFLAGS="$CXXFLAGS -fpascal-strings -no-cpp-precomp -fno-common"
++ DLL_SUFFIX=".dylib"
++ DSO_LDOPTS=''
++- STRIP="$STRIP -x -S"
+++ STRIP="$STRIP -X -S" # MACOSX 10.5 strip -x sometimes fails
++ _PLATFORM_DEFAULT_TOOLKIT='mac'
++ MOZ_ENABLE_POSTSCRIPT=
++ TARGET_NSPR_MDCPUCFG='\"md/_darwin.cfg\"'
++@@ -6075,7 +6095,7 @@
++ ;;
++
++ *-freebsd*)
++- if test `test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` != "elf"; then
+++ if test `test -x /usr/bin/objformat && /usr/bin/objformat || echo elf` != "elf"; then
++ DLL_SUFFIX=".so.1.0"
++ DSO_LDOPTS="-shared"
++ fi
++@@ -6718,7 +6738,7 @@
++ MOZ_USER_DIR="Mozilla"
++
++ if test "$MOZTOOLS"; then
++- MOZ_TOOLS_DIR=`echo $MOZTOOLS | sed -e 's|\\\\|/|g'`
+++ MOZ_TOOLS_DIR=`echo $MOZTOOLS`
++ else
++ { echo "configure: error: MOZTOOLS is not set" 1>&2; exit 1; }
++ fi
++@@ -8614,6 +8634,8 @@
++ case $target in
++ *-hpux11.*)
++ ;;
+++*-freebsd*)
+++ ;;
++ *)
++ echo $ac_n "checking for gethostbyname_r in -lc_r""... $ac_c" 1>&6
++ echo "configure:8620: checking for gethostbyname_r in -lc_r" >&5
++@@ -12259,7 +12281,7 @@
++ gtk2)
++ MOZ_ENABLE_GTK2=1
++ MOZ_ENABLE_XREMOTE=1
++- MOZ_ENABLE_COREXFONTS=${MOZ_ENABLE_COREXFONTS-}
+++ MOZ_ENABLE_COREXFONTS=${MOZ_ENABLE_COREXFONTS-1}
++ TK_CFLAGS='$(MOZ_GTK2_CFLAGS)'
++ TK_LIBS='$(MOZ_GTK2_LIBS)'
++ cat >> confdefs.h <<\EOF
++@@ -19233,7 +19255,8 @@
++ MOZ_CAIRO_LIBS="-lmozcairo -lmozlibpixman $CAIRO_FT_LIBS"
++
++ if test "$MOZ_X11"; then
++- MOZ_CAIRO_LIBS="$MOZ_CAIRO_LIBS $XLDFLAGS -lXrender $XLIBS -lfontconfig -lfreetype"
+++# MOZ_CAIRO_LIBS="$MOZ_CAIRO_LIBS $XLDFLAGS -lXrender $XLIBS -lfontconfig -lfreetype"
+++ MOZ_CAIRO_LIBS="$MOZ_CAIRO_LIBS $XLDFLAGS $XLIBS -lfontconfig -lfreetype"
++ fi
++ if test "$MOZ_WIDGET_TOOLKIT" = "windows"; then
++ MOZ_CAIRO_LIBS="$MOZ_CAIRO_LIBS -lgdi32"
++@@ -20076,8 +20099,12 @@
++ WIN_TOP_SRC=`cd $srcdir; pwd -W`
++ ;;
++ cygwin*|msvc*|mks*)
++- HOST_CC="\$(CYGWIN_WRAPPER) $HOST_CC"
++- HOST_CXX="\$(CYGWIN_WRAPPER) $HOST_CXX"
+++# Don't add the wrapper for the HOST_* versions as they contain an
+++# unexpanded $CC and therfore wil get the wrapper below.
+++ if test -n "$GNU_CC"; then
+++ HOST_CC="\$(CYGWIN_WRAPPER) $HOST_CC"
+++ HOST_CXX="\$(CYGWIN_WRAPPER) $HOST_CXX"
+++ fi
++ CC="\$(CYGWIN_WRAPPER) $CC"
++ CXX="\$(CYGWIN_WRAPPER) $CXX"
++ CPP="\$(CYGWIN_WRAPPER) $CPP"
++--- misc/mozilla/configure.in 2008-10-30 23:05:31.000000000 +0100
+++++ misc/build/mozilla/configure.in 2009-02-05 20:12:45.456777753 +0100
++@@ -126,6 +126,8 @@
++ GCONF_VERSION=1.2.1
++ LIBGNOME_VERSION=2.0
++
+++MSMANIFEST_TOOL=
+++
++ dnl Set various checks
++ dnl ========================================================
++ MISSING_X=
++@@ -425,9 +427,26 @@
++ _CC_SUITE=7
++ elif test "$_CC_MAJOR_VERSION" = "14"; then
++ _CC_SUITE=8
+++ CXXFLAGS="$CXXFLAGS -Zc:wchar_t-"
++ else
++ AC_MSG_ERROR([This version of the MSVC compiler, $CC_VERSION , is unsupported.])
++ fi
+++
+++ # bug #249782
+++ # ensure that mt.exe is Microsoft (R) Manifest Tool and not magnetic tape manipulation utility (or something else)
+++ if test "$_CC_SUITE" -ge "8"; then
+++ MSMT_TOOL=`mt 2>&1|grep 'Microsoft (R) Manifest Tool'`
+++ if test -n "MSMT_TOOL"; then
+++ MSMANIFEST_TOOL_VERSION=`echo ${MSMANIFEST_TOOL}|grep -Po "(^|\s)[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?(\s|$)"`
+++ if test -z "MSMANIFEST_TOOL_VERSION"; then
+++ AC_MSG_WARN([Unknown version of the Microsoft (R) Manifest Tool.])
+++ fi
+++ MSMANIFEST_TOOL=1
+++ unset MSMT_TOOL
+++ else
+++ AC_MSG_ERROR([Microsoft (R) Manifest Tool must be in your \$PATH.])
+++ fi
+++ fi
++
++ # Check linker version
++ _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
++@@ -1530,7 +1549,7 @@
++ CXXFLAGS="$CXXFLAGS -fpascal-strings -no-cpp-precomp -fno-common"
++ DLL_SUFFIX=".dylib"
++ DSO_LDOPTS=''
++- STRIP="$STRIP -x -S"
+++ STRIP="$STRIP -X -S" # MACOSX 10.5 strip -x sometimes fails
++ _PLATFORM_DEFAULT_TOOLKIT='mac'
++ MOZ_ENABLE_POSTSCRIPT=
++ TARGET_NSPR_MDCPUCFG='\"md/_darwin.cfg\"'
++@@ -1552,7 +1571,7 @@
++ ;;
++
++ *-freebsd*)
++- if test `test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` != "elf"; then
+++ if test `test -x /usr/bin/objformat && /usr/bin/objformat || echo elf` != "elf"; then
++ DLL_SUFFIX=".so.1.0"
++ DSO_LDOPTS="-shared"
++ fi
++@@ -2749,6 +2768,8 @@
++ case $target in
++ *-hpux11.*)
++ ;;
+++*-freebsd*)
+++ ;;
++ *)
++ AC_CHECK_LIB(c_r, gethostbyname_r)
++ ;;
++@@ -7321,6 +7342,7 @@
++ AC_SUBST(USE_N32)
++ AC_SUBST(CC_VERSION)
++ AC_SUBST(CXX_VERSION)
+++AC_SUBST(MSMANIFEST_TOOL)
++
++ if test "$USING_HCC"; then
++ CC='${topsrcdir}/build/hcc'
++@@ -7416,8 +7438,12 @@
++ WIN_TOP_SRC=`cd $srcdir; pwd -W`
++ ;;
++ cygwin*|msvc*|mks*)
++- HOST_CC="\$(CYGWIN_WRAPPER) $HOST_CC"
++- HOST_CXX="\$(CYGWIN_WRAPPER) $HOST_CXX"
+++# Don't add the wrapper for the HOST_* versions as they contain an
+++# unexpanded $CC and therfore wil get the wrapper below.
+++ if test -n "$GNU_CC"; then
+++ HOST_CC="\$(CYGWIN_WRAPPER) $HOST_CC"
+++ HOST_CXX="\$(CYGWIN_WRAPPER) $HOST_CXX"
+++ fi
++ CC="\$(CYGWIN_WRAPPER) $CC"
++ CXX="\$(CYGWIN_WRAPPER) $CXX"
++ CPP="\$(CYGWIN_WRAPPER) $CPP"
++--- misc/mozilla/directory/c-sdk/build.mk 2006-02-03 15:44:29.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/build.mk 2008-08-14 16:22:21.000000000 +0200
++@@ -384,7 +384,7 @@
++ ifdef NS_USE_GCC
++ LINK_EXE = $(CC) -o $@ $(LDFLAGS) $(LCFLAGS) $(DEPLIBS) $(OBJS) $(EXTRA_LIBS) $(PLATFORMLIBS)
++ LINK_LIB = $(AR) cr $@ $(OBJS)
++-LINK_DLL = $(CC) -shared -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(@:.$(DLL_SUFFIX)=.$(LIB_SUFFIX)) $(LLFLAGS) $(DLL_LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS) $(EXTRA_DLL_LIBS)
+++LINK_DLL = $(CC) -shared -Wl,--enable-runtime-pseudo-reloc -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(LIB_PREFIX)$(@:.$(DLL_SUFFIX)=.$(LIB_SUFFIX)) $(LLFLAGS) $(DLL_LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS) $(EXTRA_DLL_LIBS)
++ else
++ DEBUG_LINK_OPT=-DEBUG
++ ifeq ($(BUILD_OPT), 1)
++--- misc/mozilla/directory/c-sdk/config/FreeBSD.mk 2006-02-03 15:41:11.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/config/FreeBSD.mk 2008-08-14 16:22:21.000000000 +0200
++@@ -70,7 +70,7 @@
++
++ ARCH = freebsd
++
++-MOZ_OBJFORMAT := $(shell test -x /usr/bin/objformat && /usr/bin/objformat || echo aout)
+++MOZ_OBJFORMAT := $(shell test -x /usr/bin/objformat && /usr/bin/objformat || echo elf)
++
++ ifeq ($(MOZ_OBJFORMAT),elf)
++ DLL_SUFFIX = so
++--- misc/mozilla/directory/c-sdk/config/autoconf.mk.in 2006-02-23 00:58:25.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/config/autoconf.mk.in 2008-08-14 16:22:21.000000000 +0200
++@@ -25,6 +25,7 @@
++ LIB_SUFFIX = @LIB_SUFFIX@
++ LIB_PREFIX = @LIB_PREFIX@
++ DLL_SUFFIX = @DLL_SUFFIX@
+++DLL_PREFIX = @DLL_PREFIX@
++ ASM_SUFFIX = @ASM_SUFFIX@
++ PROG_SUFFIX = @PROG_SUFFIX@
++ MOD_NAME = @NSPR_MODNAME@
++--- misc/mozilla/directory/c-sdk/config/cygwin-wrapper 2004-08-19 01:18:55.000000000 +0200
+++++ misc/build/mozilla/directory/c-sdk/config/cygwin-wrapper 2008-08-14 16:22:21.000000000 +0200
++@@ -1,4 +1,4 @@
++-#!/bin/sh
+++#!/bin/bash
++ #
++ # Stupid wrapper to avoid win32 dospath/cygdrive issues
++ # Try not to spawn programs from within this file. If the stuff in here looks royally
++--- misc/mozilla/directory/c-sdk/configure 2006-02-23 01:58:13.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/configure 2008-08-14 16:22:21.000000000 +0200
++@@ -2738,6 +2738,7 @@
++ LIB_SUFFIX=a
++ LIB_PREFIX=lib
++ DLL_SUFFIX=so
+++DLL_PREFIX=lib
++ ASM_SUFFIX=s
++ MKSHLIB='$(LD) $(DSO_LDOPTS) -o $@'
++ PR_MD_ASFILES=
++@@ -3444,7 +3445,7 @@
++ EOF
++
++ CFLAGS="$CFLAGS $(DSO_CFLAGS) -ansi -Wall"
++- MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+++ MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo elf`
++ if test "$MOZ_OBJFORMAT" = "elf"; then
++ DLL_SUFFIX=so
++ else
++@@ -3811,6 +3812,7 @@
++ MKSHLIB='$(CC) $(DSO_LDOPTS) -o $@'
++ DSO_CFLAGS=-fPIC
++ DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)'
+++ DSO_LDOPTS="$DSO_LDOPTS -Wl,-rpath,'$\$ORIGIN:$\$ORIGIN/../ure-link/lib'"
++ OS_LIBS="$OS_LIBS -lc"
++ _OPTIMIZE_FLAGS=-O2
++ _DEBUG_FLAGS="-g -fno-inline" # most people on linux use gcc/gdb, and that
++@@ -3880,7 +3882,8 @@
++ CC="$CC -mno-cygwin"
++ CXX="$CXX -mno-cygwin"
++ DLL_SUFFIX=dll
++- MKSHLIB='$(CC) -shared -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(IMPORT_LIBRARY) -o $@'
+++ DLL_PREFIX=
+++ MKSHLIB='$(CC) -shared -Wl,--enable-runtime-pseudo-reloc -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(IMPORT_LIBRARY) -o $@'
++ # Use temp file for windres (bug 213281)
++ RC="$WINDRES -O coff --use-temp-file"
++ else
++@@ -3897,6 +3900,7 @@
++ LIB_SUFFIX=lib
++ LIB_PREFIX=
++ DLL_SUFFIX=dll
+++ DLL_PREFIX=
++
++ CFLAGS="$CFLAGS -W3 -nologo -GF -Gy"
++ DLLFLAGS='-OUT:"$@"'
++@@ -4293,6 +4297,7 @@
++ NSINSTALL=nsinstall
++ LIB_PREFIX=
++ LIB_SUFFIX=lib
+++ DLL_PREFIX=
++ DLL_SUFFIX=dll
++ DLLTOOL=''
++ RC=rc.exe
++@@ -4660,6 +4665,7 @@
++ LD=/usr/ccs/bin/ld
++ RANLIB=/usr/ccs/bin/ranlib
++ DSO_LDOPTS='-G -h $(notdir $@)'
+++ DSO_LDOPTS="$DSO_LDOPTS -R '$\$ORIGIN'"
++ if test -n "$GNU_CC"; then
++ DSO_CFLAGS=-fPIC
++ else
++@@ -5844,6 +5850,7 @@
++ s% LIB_SUFFIX@%$LIB_SUFFIX%g
++ s% LIB_PREFIX@%$LIB_PREFIX%g
++ s% DLL_SUFFIX@%$DLL_SUFFIX%g
+++s% DLL_PREFIX@%$DLL_PREFIX%g
++ s% ASM_SUFFIX@%$ASM_SUFFIX%g
++ s% PROG_SUFFIX@%$PROG_SUFFIX%g
++ s% MKSHLIB@%$MKSHLIB%g
++--- misc/mozilla/directory/c-sdk/configure.in 2007-07-15 16:41:07.000000000 +0200
+++++ misc/build/mozilla/directory/c-sdk/configure.in 2008-08-14 16:22:21.000000000 +0200
++@@ -549,6 +549,7 @@
++ LIB_SUFFIX=a
++ LIB_PREFIX=lib
++ DLL_SUFFIX=so
+++DLL_PREFIX=lib
++ ASM_SUFFIX=s
++ MKSHLIB='$(LD) $(DSO_LDOPTS) -o $@'
++ PR_MD_ASFILES=
++@@ -1037,7 +1038,7 @@
++ AC_DEFINE(FREEBSD)
++ AC_DEFINE(HAVE_BSD_FLOCK)
++ CFLAGS="$CFLAGS $(DSO_CFLAGS) -ansi -Wall"
++- MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+++ MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo elf`
++ if test "$MOZ_OBJFORMAT" = "elf"; then
++ DLL_SUFFIX=so
++ else
++@@ -1285,6 +1286,7 @@
++ MKSHLIB='$(CC) $(DSO_LDOPTS) -o $@'
++ DSO_CFLAGS=-fPIC
++ DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)'
+++ DSO_LDOPTS="$DSO_LDOPTS -Wl,-rpath,'$\$ORIGIN:$\$ORIGIN/../ure-link/lib'"
++ OS_LIBS="$OS_LIBS -lc"
++ _OPTIMIZE_FLAGS=-O2
++ _DEBUG_FLAGS="-g -fno-inline" # most people on linux use gcc/gdb, and that
++@@ -1336,6 +1338,8 @@
++ CC="$CC -mno-cygwin"
++ CXX="$CXX -mno-cygwin"
++ DLL_SUFFIX=dll
+++ DLL_SUFFIX=dll
+++ DLL_PREFIX=
++ MKSHLIB='$(CC) -shared -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(IMPORT_LIBRARY) -o $@'
++ # Use temp file for windres (bug 213281)
++ RC="$WINDRES -O coff --use-temp-file"
++@@ -1353,6 +1357,7 @@
++ LIB_SUFFIX=lib
++ LIB_PREFIX=
++ DLL_SUFFIX=dll
+++ DLL_PREFIX=
++
++ CFLAGS="$CFLAGS -W3 -nologo -GF -Gy"
++ DLLFLAGS='-OUT:"$@"'
++@@ -1820,6 +1825,7 @@
++ LD=/usr/ccs/bin/ld
++ RANLIB=/usr/ccs/bin/ranlib
++ DSO_LDOPTS='-G -h $(notdir $@)'
+++ DSO_LDOPTS="$DSO_LDOPTS -R '$\$ORIGIN'"
++ if test -n "$GNU_CC"; then
++ DSO_CFLAGS=-fPIC
++ else
++@@ -2410,6 +2416,7 @@
++ AC_SUBST(LIB_SUFFIX)
++ AC_SUBST(LIB_PREFIX)
++ AC_SUBST(DLL_SUFFIX)
+++AC_SUBST(DLL_PREFIX)
++ AC_SUBST(ASM_SUFFIX)
++ AC_SUBST(PROG_SUFFIX)
++ AC_SUBST(MKSHLIB)
++--- misc/mozilla/directory/c-sdk/ldap/include/Makefile.in 2006-02-03 15:44:33.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/ldap/include/Makefile.in 2008-11-02 21:55:34.929250000 +0100
++@@ -85,6 +85,11 @@
++
++ ###########################################################################
++
+++ifeq ($(TERM),cygwin)
+++INCLUDEDIR:=$(shell cygpath -u $(INCLUDEDIR))
+++GENHEADERS:=$(shell cygpath -u $(GENHEADERS))
+++endif
+++
++ all export:: $(INCLUDEDIR) $(GENHEADERS)
++ $(NSINSTALL) -D $(PRIVATEINCDIR)
++ $(INSTALL) $(INSTALLFLAGS) -m 644 $(HEADERS) $(INCLUDEDIR)
++--- misc/mozilla/directory/c-sdk/ldap/libraries/libldap/Makefile.in 2006-02-03 15:44:42.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/ldap/libraries/libldap/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -109,7 +109,7 @@
++ HDIR = $(topsrcdir)/ldap/include
++
++ LIBLDAP = $(addprefix $(OBJDIR_NAME)/, $(LIB_PREFIX)$(LDAP_LIBNAME).$(LIB_SUFFIX))
++-DLLLDAP = $(addprefix $(OBJDIR_NAME)/, $(LIB_PREFIX)$(LDAP_LIBNAME).$(DLL_SUFFIX))
+++DLLLDAP = $(addprefix $(OBJDIR_NAME)/, $(DLL_PREFIX)$(LDAP_LIBNAME).$(DLL_SUFFIX))
++
++ INSTALLDIR = $(DIST)/$(OBJDIR_NAME)
++
++@@ -320,6 +320,10 @@
++ -$(RM) $(SO_FILES_TO_REMOVE)
++ endif
++ $(LINK_DLL) $(LDAP_EXPORT_FLAGS) $(EXTRA_LIBS)
+++ if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;2; \
+++ rm -f $ manifest; \
+++ fi
++
++ veryclean:: clean
++
++--- misc/mozilla/directory/c-sdk/ldap/libraries/libprldap/Makefile.in 2006-02-03 15:44:49.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/ldap/libraries/libprldap/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -62,7 +62,7 @@
++ LIBPRLDAP =
++ endif
++ DLLPRLDAP = $(addprefix $(OBJDIR_NAME)/, \
++- $(LIB_PREFIX)$(PRLDAP_LIBNAME).$(DLL_SUFFIX))
+++ $(DLL_PREFIX)$(PRLDAP_LIBNAME).$(DLL_SUFFIX))
++
++ INSTALLDIR = $(DIST)/$(OBJDIR_NAME)
++
++--- misc/mozilla/directory/c-sdk/ldap/libraries/libssldap/Makefile 2004-08-26 01:02:30.000000000 +0200
+++++ misc/build/mozilla/directory/c-sdk/ldap/libraries/libssldap/Makefile 2008-08-14 16:22:21.000000000 +0200
++@@ -41,7 +41,7 @@
++ HDIR = $(topsrcdir)/ldap/include
++
++ LIBSSLDAP = $(addprefix $(SSLOBJDEST)/, $(LIB_PREFIX)$(SSLDAP_LIBNAME).$(LIB_SUFFIX))
++-DLLSSLDAP = $(addprefix $(SSLOBJDEST)/, $(LIB_PREFIX)$(SSLDAP_LIBNAME).$(DLL_SUFFIX))
+++DLLSSLDAP = $(addprefix $(SSLOBJDEST)/, $(DLL_PREFIX)$(SSLDAP_LIBNAME).$(DLL_SUFFIX))
++
++ INSTALLDIR = $(DIST)/$(OBJDIR_NAME)
++
++@@ -76,7 +92,7 @@
++
++ # variable definitions for exported symbols
++ ifeq ($(OS_ARCH), WINNT)
++- SSLDAP_EXPORT_DEFS= $(srcdir)/../msdos/winsock/nsldapssl32.def
+++ SSLDAP_EXPORT_DEFS= $(win_srcdir)/../msdos/winsock/nsldapssl32.def
++ else
++ SSLDAP_EXPORT_DEFS= $(SSLOBJDEST)/libldap_ssl.exp
++ endif
++--- misc/mozilla/directory/c-sdk/ldap/libraries/libssldap/Makefile.in 2006-02-03 15:44:49.000000000 +0100
+++++ misc/build/mozilla/directory/c-sdk/ldap/libraries/libssldap/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -56,7 +56,7 @@
++ HDIR = $(topsrcdir)/ldap/include
++
++ LIBSSLDAP = $(addprefix $(SSLOBJDEST)/, $(LIB_PREFIX)$(SSLDAP_LIBNAME).$(LIB_SUFFIX))
++-DLLSSLDAP = $(addprefix $(SSLOBJDEST)/, $(LIB_PREFIX)$(SSLDAP_LIBNAME).$(DLL_SUFFIX))
+++DLLSSLDAP = $(addprefix $(SSLOBJDEST)/, $(DLL_PREFIX)$(SSLDAP_LIBNAME).$(DLL_SUFFIX))
++
++ INSTALLDIR = $(DIST)/$(OBJDIR_NAME)
++
++--- misc/mozilla/embedding/browser/gtk/src/Makefile.in 2006-03-22 19:22:41.000000000 +0100
+++++ misc/build/mozilla/embedding/browser/gtk/src/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -112,14 +112,14 @@
++ gtkmozembed_internal.h
++
++ ifdef MOZ_ENABLE_GTK
++-EXTRA_DSO_LDOPTS = \
+++EXTRA_DSO_LDOPTS += \
++ $(MOZ_COMPONENT_LIBS) \
++ -lgtksuperwin \
++ $(NULL)
++ endif
++
++ ifdef MOZ_ENABLE_GTK2
++-EXTRA_DSO_LDOPTS = \
+++EXTRA_DSO_LDOPTS += \
++ $(MOZ_COMPONENT_LIBS) \
++ $(NULL)
++ endif
++--- misc/mozilla/embedding/browser/gtk/tests/Makefile.in 2006-03-24 17:10:37.000000000 +0100
+++++ misc/build/mozilla/embedding/browser/gtk/tests/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -63,10 +63,11 @@
++ TestGtkEmbedNotebook.cpp \
++ TestGtkEmbedSocket.cpp \
++ TestGtkEmbedChild.cpp
++-endif
++
++ SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=)
++
+++endif
+++
++ # ENABLE_GNOME=1
++
++ ifdef ENABLE_GNOME
++--- misc/mozilla/embedding/components/printingui/src/mac/printpde/Makefile.in 2005-06-20 21:24:51.000000000 +0200
+++++ misc/build/mozilla/embedding/components/printingui/src/mac/printpde/Makefile.in 2009-02-19 13:11:39.000000000 +0100
++@@ -68,25 +68,15 @@
++
++ unexport CC CXX
++
++-ABS_topsrcdir := $(shell cd $(topsrcdir); pwd)
++-ifneq ($(ABS_topsrcdir),$(MOZ_BUILD_ROOT))
++-export::
++- rsync -a --exclude .DS_Store --exclude "CVS/" $(srcdir)/$(PROJECT) .
++- ln -fs $(srcdir)/src
++- ln -fs $(srcdir)/res
++- ln -fs $(srcdir)/public
++- ln -fs $(srcdir)/Info-*.plist .
++-endif
++-
++ libs::
++ # Bug 297227: The next line doesn't need to stay around forever, only
++ # long enough to clean up existing depend builds from when xcodebuild
++ # was being instructed to "install"
++ if test -e build/UninstalledProducts ; then $(MAKE) clean ; rm -rf $(DIST)/package/PrintPDE.plugin ; fi
++
++- $(PBBUILD) $(PROJECT_ARG) -target PrintPDE -buildstyle $(BUILDSTYLE) $(PBBUILD_ARG)
++- mkdir -p $(DIST)/package
++- $(INSTALL) $(XCODE_PRODUCT_DIR)/PrintPDE.plugin $(DIST)/package
+++# $(PBBUILD) $(PROJECT_ARG) -target PrintPDE -buildstyle $(BUILDSTYLE) $(PBBUILD_ARG)
+++# mkdir -p $(DIST)/package
+++# $(INSTALL) $(XCODE_PRODUCT_DIR)/PrintPDE.plugin $(DIST)/package
++
++ clean clobber::
++ rm -rf build
++--- misc/mozilla/embedding/config/Makefile.in 2007-10-08 21:08:15.000000000 +0200
+++++ misc/build/mozilla/embedding/config/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -110,7 +110,7 @@
++ $(NSINSTALL) -t $(srcdir)/installed-chrome.txt $(DIST)/Embed/chrome
++ $(NSINSTALL) -t $(srcdir)/readme.html $(DIST)/Embed
++ ifndef MINIMO
++- -$(NSINSTALL) -t $(DEPTH)/embedding/lite/$(LIB_PREFIX)embed_lite$(DLL_SUFFIX) $(DIST)/Embed/components
+++ -$(NSINSTALL) -t $(DEPTH)/embedding/lite/$(DLL_PREFIX)embed_lite$(DLL_SUFFIX) $(DIST)/Embed/components
++ endif
++ ifeq ($(OS_ARCH),WINNT)
++ ifeq ($(WINAPP),mfcembed)
++--- misc/mozilla/extensions/pref/autoconfig/src/Makefile.in 2006-02-03 15:41:09.000000000 +0100
+++++ misc/build/mozilla/extensions/pref/autoconfig/src/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -85,7 +85,7 @@
++ endif
++
++
++-EXTRA_DSO_LDOPTS = \
+++EXTRA_DSO_LDOPTS += \
++ $(LIBS_DIR) \
++ $(MOZ_JS_LIBS) \
++ $(MOZ_COMPONENT_LIBS) \
++--- misc/mozilla/extensions/sql/build/Makefile.in 2004-11-29 18:39:08.000000000 +0100
+++++ misc/build/mozilla/extensions/sql/build/Makefile.in 2008-08-18 14:03:04.000000000 +0200
++@@ -55,5 +55,5 @@
++ bin/components/sqlpgsql.xpt \
++ bin/components/sqlsqlite.xpt \
++ bin/components/sqlmysql.xpt \
++- bin/components/$(LIB_PREFIX)sql$(DLL_SUFFIX) \
+++ bin/components/$(DLL_PREFIX)sql$(DLL_SUFFIX) \
++ bin/chrome/sql.jar
++--- misc/mozilla/gfx/idl/nsIFreeType2.idl 2004-04-16 01:30:02.000000000 +0200
+++++ misc/build/mozilla/gfx/idl/nsIFreeType2.idl 2008-08-14 16:22:21.000000000 +0200
++@@ -76,10 +76,11 @@
++ native FT_Sfnt_Tag(FT_Sfnt_Tag);
++ native FT_Size(FT_Size);
++
++-[ptr] native FTC_Image_Desc_p(FTC_Image_Desc);
+++[ptr] native FTC_ImageType_p(FTC_ImageType);
++ native FTC_Face_Requester(FTC_Face_Requester);
++ native FTC_Font(FTC_Font);
++-native FTC_Image_Cache(FTC_Image_Cache);
+++native FTC_FaceID(FTC_FaceID);
+++native FTC_ImageCache(FTC_ImageCache);
++ native FTC_Manager(FTC_Manager);
++
++ // #ifdef MOZ_SVG
++@@ -99,7 +100,7 @@
++
++ readonly attribute FT_Library library;
++ readonly attribute FTC_Manager FTCacheManager;
++- readonly attribute FTC_Image_Cache ImageCache;
+++ readonly attribute FTC_ImageCache ImageCache;
++
++ void doneFace(in FT_Face face);
++ void doneFreeType(in FT_Library lib);
++@@ -115,16 +116,16 @@
++ void outlineDecompose(in FT_Outline_p outline,
++ in const_FT_Outline_Funcs_p funcs, in voidPtr p);
++ void setCharmap(in FT_Face face, in FT_CharMap charmap);
++- void imageCacheLookup(in FTC_Image_Cache cache, in FTC_Image_Desc_p desc,
+++ void imageCacheLookup(in FTC_ImageCache cache, in FTC_ImageType_p desc,
++ in FT_UInt gindex, out FT_Glyph glyph);
++- void managerLookupSize(in FTC_Manager manager, in FTC_Font font,
++- out FT_Face face, out FT_Size size);
+++ void managerLookupFace(in FTC_Manager manager, in FTC_FaceID face_id,
+++ out FT_Face face);
++ void managerDone(in FTC_Manager manager);
++ void managerNew(in FT_Library lib, in FT_UInt max_faces,
++ in FT_UInt max_sizes, in FT_ULong max_bytes,
++ in FTC_Face_Requester requester, in FT_Pointer req_data,
++ out FTC_Manager manager);
++- void imageCacheNew(in FTC_Manager manager, out FTC_Image_Cache cache);
+++ void imageCacheNew(in FTC_Manager manager, out FTC_ImageCache cache);
++ /* #ifdef MOZ_SVG */
++ void glyphTransform(in FT_Glyph glyph, in FT_Matrix_p matrix,
++ in FT_Vector_p delta);
++--- misc/mozilla/gfx/src/freetype/nsFreeType.cpp 2005-07-13 20:21:10.000000000 +0200
+++++ misc/build/mozilla/gfx/src/freetype/nsFreeType.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -111,7 +111,7 @@
++ {"FT_Outline_Decompose", NS_FT2_OFFSET(nsFT_Outline_Decompose), PR_TRUE},
++ {"FT_Set_Charmap", NS_FT2_OFFSET(nsFT_Set_Charmap), PR_TRUE},
++ {"FTC_Image_Cache_Lookup", NS_FT2_OFFSET(nsFTC_Image_Cache_Lookup), PR_TRUE},
++- {"FTC_Manager_Lookup_Size", NS_FT2_OFFSET(nsFTC_Manager_Lookup_Size), PR_TRUE},
+++ {"FTC_Manager_LookupFace", NS_FT2_OFFSET(nsFTC_Manager_LookupFace), PR_TRUE},
++ {"FTC_Manager_Done", NS_FT2_OFFSET(nsFTC_Manager_Done), PR_TRUE},
++ {"FTC_Manager_New", NS_FT2_OFFSET(nsFTC_Manager_New), PR_TRUE},
++ {"FTC_Image_Cache_New", NS_FT2_OFFSET(nsFTC_Image_Cache_New), PR_TRUE},
++@@ -288,7 +288,7 @@
++ }
++
++ NS_IMETHODIMP
++-nsFreeType2::ImageCacheLookup(FTC_Image_Cache cache, FTC_Image_Desc *desc,
+++nsFreeType2::ImageCacheLookup(FTC_ImageCache cache, FTC_ImageType *desc,
++ FT_UInt glyphID, FT_Glyph *glyph)
++ {
++ // call the FreeType2 function via the function pointer
++@@ -297,11 +297,11 @@
++ }
++
++ NS_IMETHODIMP
++-nsFreeType2::ManagerLookupSize(FTC_Manager manager, FTC_Font font,
++- FT_Face *face, FT_Size *size)
+++nsFreeType2::ManagerLookupFace(FTC_Manager manager, FTC_FaceID font,
+++ FT_Face *face)
++ {
++ // call the FreeType2 function via the function pointer
++- FT_Error error = nsFTC_Manager_Lookup_Size(manager, font, face, size);
+++ FT_Error error = nsFTC_Manager_LookupFace(manager, font, face);
++ return error ? NS_ERROR_FAILURE : NS_OK;
++ }
++
++@@ -326,7 +326,7 @@
++ }
++
++ NS_IMETHODIMP
++-nsFreeType2::ImageCacheNew(FTC_Manager manager, FTC_Image_Cache *cache)
+++nsFreeType2::ImageCacheNew(FTC_Manager manager, FTC_ImageCache *cache)
++ {
++ // call the FreeType2 function via the function pointer
++ FT_Error error = nsFTC_Image_Cache_New(manager, cache);
++@@ -395,7 +395,7 @@
++ }
++
++ NS_IMETHODIMP
++-nsFreeType2::GetImageCache(FTC_Image_Cache *aCache)
+++nsFreeType2::GetImageCache(FTC_ImageCache *aCache)
++ {
++ *aCache = mImageCache;
++ return NS_OK;
++--- misc/mozilla/gfx/src/freetype/nsFreeType.h 2005-05-01 19:36:19.000000000 +0200
+++++ misc/build/mozilla/gfx/src/freetype/nsFreeType.h 2008-08-14 16:22:21.000000000 +0200
++@@ -120,13 +120,13 @@
++ typedef FT_Error (*FT_New_Face_t)(FT_Library, const char*, FT_Long, FT_Face*);
++ typedef FT_Error (*FT_Set_Charmap_t)(FT_Face face, FT_CharMap charmap);
++ typedef FT_Error (*FTC_Image_Cache_Lookup_t)
++- (FTC_Image_Cache, FTC_Image_Desc*, FT_UInt, FT_Glyph*);
++-typedef FT_Error (*FTC_Manager_Lookup_Size_t)
++- (FTC_Manager, FTC_Font, FT_Face*, FT_Size*);
+++ (FTC_ImageCache, FTC_ImageType*, FT_UInt, FT_Glyph*);
+++typedef FT_Error (*FTC_Manager_LookupFace_t)
+++ (FTC_Manager, FTC_FaceID, FT_Face*);
++ typedef FT_Error (*FTC_Manager_Done_t)(FTC_Manager);
++ typedef FT_Error (*FTC_Manager_New_t)(FT_Library, FT_UInt, FT_UInt, FT_ULong,
++ FTC_Face_Requester, FT_Pointer, FTC_Manager*);
++-typedef FT_Error (*FTC_Image_Cache_New_t)(FTC_Manager, FTC_Image_Cache*);
+++typedef FT_Error (*FTC_Image_Cache_New_t)(FTC_Manager, FTC_ImageCache*);
++ // #ifdef MOZ_SVG
++ typedef FT_Error (*FT_Glyph_Transform_t)(FT_Glyph, FT_Matrix*, FT_Vector*);
++ typedef FT_Error (*FT_Get_Kerning_t)
++@@ -181,7 +181,7 @@
++ FT_Outline_Decompose_t nsFT_Outline_Decompose;
++ FT_Set_Charmap_t nsFT_Set_Charmap;
++ FTC_Image_Cache_Lookup_t nsFTC_Image_Cache_Lookup;
++- FTC_Manager_Lookup_Size_t nsFTC_Manager_Lookup_Size;
+++ FTC_Manager_LookupFace_t nsFTC_Manager_LookupFace;
++ FTC_Manager_Done_t nsFTC_Manager_Done;
++ FTC_Manager_New_t nsFTC_Manager_New;
++ FTC_Image_Cache_New_t nsFTC_Image_Cache_New;
++@@ -229,7 +229,7 @@
++ PRLibrary *mSharedLib;
++ FT_Library mFreeTypeLibrary;
++ FTC_Manager mFTCacheManager;
++- FTC_Image_Cache mImageCache;
+++ FTC_ImageCache mImageCache;
++
++ static nsHashtable *sFontFamilies;
++ static nsHashtable *sRange1CharSetNames;
++--- misc/mozilla/gfx/src/gtk/Makefile.in 2006-07-20 07:12:33.000000000 +0200
+++++ misc/build/mozilla/gfx/src/gtk/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -211,6 +211,10 @@
++ CXXFLAGS += $(MOZ_GTK_CFLAGS) $(MOZ_GTK2_CFLAGS)
++ CFLAGS += $(MOZ_GTK_CFLAGS) $(MOZ_GTK2_CFLAGS)
++
+++ifeq ($(OS_ARCH), Darwin)
+++EXTRA_DSO_LDOPTS += $(XLDFLAGS) $(XLIBS)
+++endif
+++
++ ifeq ($(OS_ARCH), SunOS)
++ ifndef GNU_CC
++ # When using Sun's WorkShop compiler, including
++--- misc/mozilla/gfx/src/ps/nsFontMetricsPS.cpp 2006-12-22 14:51:16.000000000 +0100
+++++ misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -1870,10 +1870,10 @@
++
++ mPixelSize = NSToIntRound(app2dev * mFont->size);
++
++- mImageDesc.font.face_id = (void*)mEntry;
++- mImageDesc.font.pix_width = mPixelSize;
++- mImageDesc.font.pix_height = mPixelSize;
++- mImageDesc.image_type = 0;
+++ mImageDesc->face_id = (FTC_FaceID)&mEntry;
+++ mImageDesc->width = mPixelSize;
+++ mImageDesc->height = mPixelSize;
+++ mImageDesc->flags = 0;
++
++ nsresult rv;
++ mFt2 = do_GetService(NS_FREETYPE2_CONTRACTID, &rv);
++@@ -1907,7 +1907,7 @@
++ if (!face)
++ return 0;
++
++- FTC_Image_Cache iCache;
+++ FTC_ImageCache iCache;
++ nsresult rv = mFt2->GetImageCache(&iCache);
++ if (NS_FAILED(rv)) {
++ NS_ERROR("Failed to get Image Cache");
++@@ -1945,8 +1945,8 @@
++
++ FTC_Manager cManager;
++ mFt2->GetFTCacheManager(&cManager);
++- nsresult rv = mFt2->ManagerLookupSize(cManager, &mImageDesc.font,
++- &face, nsnull);
+++ nsresult rv = mFt2->ManagerLookupFace(cManager, mImageDesc->face_id,
+++ &face);
++ NS_ASSERTION(rv==0, "failed to get face/size");
++ if (rv)
++ return nsnull;
++@@ -2392,16 +2392,16 @@
++ mEntry->GetFamilyName(fontName);
++ mEntry->GetStyleName(styleName);
++
++- mImageDesc.font.face_id = (void*)mEntry;
+++ mImageDesc->face_id = (FTC_FaceID)&mEntry;
++ // TT glyph has no relation to size
++- mImageDesc.font.pix_width = 16;
++- mImageDesc.font.pix_height = 16;
++- mImageDesc.image_type = 0;
+++ mImageDesc->width = 16;
+++ mImageDesc->height = 16;
+++ mImageDesc->flags = 0;
++ FT_Face face = nsnull;
++ FTC_Manager cManager;
++ mFt2->GetFTCacheManager(&cManager);
++- nsresult rv = mFt2->ManagerLookupSize(cManager, &mImageDesc.font,
++- &face, nsnull);
+++ nsresult rv = mFt2->ManagerLookupFace(cManager, mImageDesc->face_id,
+++ &face);
++ if (NS_FAILED(rv))
++ return;
++
++--- misc/mozilla/gfx/src/ps/nsFontMetricsPS.h 2005-06-28 20:29:10.000000000 +0200
+++++ misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.h 2008-08-20 15:42:50.000000000 +0200
++@@ -424,7 +424,7 @@
++ nsCOMPtr<nsITrueTypeFontCatalogEntry> mFaceID;
++ nsCOMPtr<nsIFreeType2> mFt2;
++ PRUint16 mPixelSize;
++- FTC_Image_Desc mImageDesc;
+++ FTC_ImageType mImageDesc;
++ nsCString mFontNameBase; // the base name of type 1 (sub) fonts
++ nscoord mHeight;
++
++@@ -493,7 +493,7 @@
++ protected:
++ nsCOMPtr<nsITrueTypeFontCatalogEntry> mEntry;
++ nsCOMPtr<nsIFreeType2> mFt2;
++- FTC_Image_Desc mImageDesc;
+++ FTC_ImageType mImageDesc;
++ };
++ #endif // MOZ_ENABLE_FREETYPE2
++ #endif // MOZ_ENABLE_XFT
++--- misc/mozilla/gfx/src/windows/nsDeviceContextWin.cpp 2006-01-29 17:51:00.000000000 +0100
+++++ misc/build/mozilla/gfx/src/windows/nsDeviceContextWin.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -330,7 +330,11 @@
++ memcpy(name, ptrLogFont->lfFaceName, LF_FACESIZE*2);
++ else {
++ MultiByteToWideChar(CP_ACP, 0, ptrLogFont->lfFaceName,
+++#ifdef __MINGW32__
+++ strlen(ptrLogFont->lfFaceName) + 1, NS_REINTERPRET_CAST(LPWSTR, name), sizeof(name)/sizeof(name[0]));
+++#else
++ strlen(ptrLogFont->lfFaceName) + 1, name, sizeof(name)/sizeof(name[0]));
+++#endif
++ }
++ aFont->name = name;
++
++@@ -577,7 +581,11 @@
++ LOGFONT logFont;
++ logFont.lfCharSet = DEFAULT_CHARSET;
++ logFont.lfPitchAndFamily = 0;
+++#ifdef __MINGW32__
+++ int outlen = WideCharToMultiByte(CP_ACP, 0, NS_REINTERPRET_CAST(LPCWSTR, aFontName.get()), aFontName.Length() + 1,
+++#else
++ int outlen = WideCharToMultiByte(CP_ACP, 0, aFontName.get(), aFontName.Length() + 1,
+++#endif
++ logFont.lfFaceName, sizeof(logFont.lfFaceName), nsnull, nsnull);
++
++ // somehow the WideCharToMultiByte failed, let's try the old code
++@@ -894,7 +902,11 @@
++ if(acp)
++ {
++ int outlen = ::WideCharToMultiByte( CP_ACP, 0,
+++#ifdef __MINGW32__
+++ NS_REINTERPRET_CAST(LPCWSTR, PromiseFlatString(aStr).get()), aStr.Length(),
+++#else
++ PromiseFlatString(aStr).get(), aStr.Length(),
+++#endif
++ acp, acplen, NULL, NULL);
++ if ( outlen > 0)
++ acp[outlen] = '\0'; // null terminate
++--- misc/mozilla/gfx/src/windows/nsFontMetricsWin.cpp 2007-07-15 16:43:45.000000000 +0200
+++++ misc/build/mozilla/gfx/src/windows/nsFontMetricsWin.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -1363,7 +1363,11 @@
++ PRUnichar fname[LF_FACESIZE];
++ fname[0] = 0;
++ MultiByteToWideChar(CP_ACP, 0, aFontName,
+++#ifdef __MINGW32__
+++ strlen(aFontName) + 1, NS_REINTERPRET_CAST(LPWSTR, fname), sizeof(fname)/sizeof(fname[0]));
+++#else
++ strlen(aFontName) + 1, fname, sizeof(fname)/sizeof(fname[0]));
+++#endif
++ name.Assign(NS_LITERAL_CSTRING("encoding.") + NS_ConvertUCS2toUTF8(fname) + NS_LITERAL_CSTRING(".ttf"));
++ }
++
++@@ -2236,7 +2240,11 @@
++ }
++ // get the final rightBearing and width. Possible kerning is taken into account.
++ SIZE size;
+++#ifdef __MIGW32__
+++ ::GetTextExtentPointW(aDC, NS_REINTERPRET_CAST(LPCWSTR, aString), aLength, &size);
+++#else
++ ::GetTextExtentPointW(aDC, aString, aLength, &size);
+++#endif
++ size.cx -= aOverhangCorrection;
++ aBoundingMetrics.width = size.cx;
++ aBoundingMetrics.rightBearing = size.cx - gm.gmCellIncX + gm.gmptGlyphOrigin.x + gm.gmBlackBoxX;
++@@ -2630,7 +2638,11 @@
++ PRUnichar name[LF_FACESIZE];
++ name[0] = 0;
++ MultiByteToWideChar(CP_ACP, 0, logFont->lfFaceName,
+++#ifdef __MINGW32__
+++ strlen(logFont->lfFaceName) + 1, NS_REINTERPRET_CAST(LPWSTR, name), sizeof(name)/sizeof(name[0]));
+++#else
++ strlen(logFont->lfFaceName) + 1, name, sizeof(name)/sizeof(name[0]));
+++#endif
++
++ nsGlobalFont* font = new nsGlobalFont;
++ if (!font) {
++@@ -4286,14 +4298,22 @@
++
++ static PRBool
++ NS_ExtTextOutW(HDC aDC, nsFontWin* aFont, PRInt32 aX, PRInt32 aY, UINT uOptions,
+++#ifdef __MINGW32__
+++ LPCRECT lprc, const PRUnichar* aString, UINT aLength, INT *lpDx)
+++#else
++ LPCRECT lprc, LPCWSTR aString, UINT aLength, INT *lpDx)
+++#endif
++ {
++ RECT clipRect;
++ if (!lpDx && !lprc && aFont->FillClipRect(aX, aY, aLength, uOptions, clipRect)) {
++ lprc = &clipRect;
++ uOptions |= ETO_CLIPPED;
++ }
+++#ifdef __MINGW32__
+++ return ::ExtTextOutW(aDC, aX, aY, uOptions, lprc, NS_REINTERPRET_CAST(LPCWSTR, aString), aLength, lpDx);
+++#else
++ return ::ExtTextOutW(aDC, aX, aY, uOptions, lprc, aString, aLength, lpDx);
+++#endif
++ }
++
++ void
++@@ -4359,7 +4379,11 @@
++ {
++ DEBUG_VERIFY_FONT_HASGLYPH(this, aString, aLength);
++ SIZE size;
+++#ifdef __MINGW32__
+++ ::GetTextExtentPoint32W(aDC, NS_REINTERPRET_CAST(LPCWSTR, aString), aLength, &size);
+++#else
++ ::GetTextExtentPoint32W(aDC, aString, aLength, &size);
+++#endif
++ size.cx -= mOverhangCorrection;
++ return size.cx;
++ }
++@@ -4385,7 +4409,11 @@
++ // Clip out the extra underline/strikethru caused by the
++ // bug in WIN95.
++ SIZE size;
+++#ifdef __MINGW32__
+++ ::GetTextExtentPoint32W(aDC, NS_REINTERPRET_CAST(LPCWSTR, aString), aLength, &size);
+++#else
++ ::GetTextExtentPoint32W(aDC, aString, aLength, &size);
+++#endif
++ size.cx -= mOverhangCorrection;
++ RECT clipRect;
++ clipRect.top = aY - size.cy;
++@@ -4466,7 +4494,11 @@
++ if (!mIsWide)
++ ::GetTextExtentPoint32A(aDC, buffer.get(), destLength, &size);
++ else
+++#ifdef __MINGW32__
+++ ::GetTextExtentPoint32W(aDC, NS_REINTERPRET_CAST(LPCWSTR, buffer.get()), destLength / 2, &size);
+++#else
++ ::GetTextExtentPoint32W(aDC, (const PRUnichar*) buffer.get(), destLength / 2, &size);
+++#endif
++ size.cx -= mOverhangCorrection;
++
++ return size.cx;
++@@ -4649,7 +4681,11 @@
++ if (NS_FAILED(rv) || !aLength) return 0;
++
++ SIZE size;
+++#ifdef __MINGW32__
+++ ::GetTextExtentPoint32W(aDC, NS_REINTERPRET_CAST(LPCWSTR, buffer.get()), aLength, &size);
+++#else
++ ::GetTextExtentPoint32W(aDC, buffer.get(), aLength, &size);
+++#endif
++ size.cx -= mOverhangCorrection;
++
++ return size.cx;
++@@ -4828,13 +4864,21 @@
++ {
++ *aResultLength = 0;
++ // Get the number of bytes needed for the conversion
+++#ifdef __MINGW32__
+++ int nb = WideCharToMultiByte(mCodePage, 0, NS_REINTERPRET_CAST(LPCWSTR, aString), aLength,
+++#else
++ int nb = WideCharToMultiByte(mCodePage, 0, aString, aLength,
+++#endif
++ nsnull, 0, nsnull, nsnull);
++
++ if (!nb || !aResult.EnsureElemCapacity(nb)) return;
++ char* buf = aResult.get();
++ // Convert the Unicode string to ANSI
+++#ifdef __MINGW32__
+++ *aResultLength = WideCharToMultiByte(mCodePage, 0, NS_REINTERPRET_CAST(LPCWSTR, aString), aLength,
+++#else
++ *aResultLength = WideCharToMultiByte(mCodePage, 0, aString, aLength,
+++#endif
++ buf, nb, nsnull, nsnull);
++ }
++
++--- misc/mozilla/gfx/src/windows/nsRenderingContextWin.cpp 2006-06-30 01:18:35.000000000 +0200
+++++ misc/build/mozilla/gfx/src/windows/nsRenderingContextWin.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -2935,17 +2935,29 @@
++
++ GCP_RESULTSW gcpResult;
++ gcpResult.lStructSize = sizeof(GCP_RESULTS);
+++#ifdef __MINGW32__
+++ gcpResult.lpOutString = NS_REINTERPRET_CAST(LPWSTR, outStr); // Output string
+++#else
++ gcpResult.lpOutString = outStr; // Output string
+++#endif
++ gcpResult.lpOrder = nsnull; // Ordering indices
++ gcpResult.lpDx = distanceArray; // Distances between character cells
++ gcpResult.lpCaretPos = nsnull; // Caret positions
++ gcpResult.lpClass = nsnull; // Character classifications
+++#ifdef __MINGW32__
+++ gcpResult.lpGlyphs = NS_REINTERPRET_CAST(LPWSTR, glyphArray); // Character glyphs
+++#else
++ gcpResult.lpGlyphs = glyphArray; // Character glyphs
+++#endif
++ gcpResult.nGlyphs = 2; // Array size
++
++ PRUnichar inStr[] = {araAin, one};
++
+++#ifdef __MINGW32__
+++ if (::GetCharacterPlacementW(mDC, NS_REINTERPRET_CAST(LPCWSTR, inStr), 2, 0, &gcpResult, GCP_REORDER)
+++#else
++ if (::GetCharacterPlacementW(mDC, inStr, 2, 0, &gcpResult, GCP_REORDER)
+++#endif
++ && (inStr[0] == outStr[1]) ) {
++ gBidiInfo = GCP_REORDER | GCP_GLYPHSHAPE;
++ #ifdef NS_DEBUG
++@@ -2956,7 +2968,11 @@
++ const PRUnichar hebAlef = 0x05D0;
++ inStr[0] = hebAlef;
++ inStr[1] = one;
+++#ifdef __MINGW32__
+++ if (::GetCharacterPlacementW(mDC, NS_REINTERPRET_CAST(LPCWSTR, inStr), 2, 0, &gcpResult, GCP_REORDER)
+++#else
++ if (::GetCharacterPlacementW(mDC, inStr, 2, 0, &gcpResult, GCP_REORDER)
+++#endif
++ && (inStr[0] == outStr[1]) ) {
++ gBidiInfo = GCP_REORDER;
++ #ifdef NS_DEBUG
++--- misc/mozilla/gfx/src/x11shared/nsFontFreeType.cpp 2004-04-17 23:52:34.000000000 +0200
+++++ misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -177,7 +177,7 @@
++ FTC_Manager mgr;
++ nsresult rv;
++ mFt2->GetFTCacheManager(&mgr);
++- rv = mFt2->ManagerLookupSize(mgr, &mImageDesc.font, &face, nsnull);
+++ rv = mFt2->ManagerLookupFace(mgr, mImageDesc->face_id, &face);
++ NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get face/size");
++ if (NS_FAILED(rv))
++ return nsnull;
++@@ -191,22 +191,15 @@
++ PRBool embedded_bimap = PR_FALSE;
++ mFaceID = aFaceID;
++ mPixelSize = aPixelSize;
++- mImageDesc.font.face_id = (void*)mFaceID;
++- mImageDesc.font.pix_width = aPixelSize;
++- mImageDesc.font.pix_height = aPixelSize;
++- mImageDesc.image_type = 0;
+++ mImageDesc->face_id = (FTC_FaceID)&mFaceID;
+++ mImageDesc->width = aPixelSize;
+++ mImageDesc->height = aPixelSize;
+++ mImageDesc->flags = 0;
++
++ if (aPixelSize < nsFreeType2::gAntiAliasMinimum) {
++- mImageDesc.image_type |= ftc_image_mono;
++ anti_alias = PR_FALSE;
++ }
++
++- if (nsFreeType2::gFreeType2Autohinted)
++- mImageDesc.image_type |= ftc_image_flag_autohinted;
++-
++- if (nsFreeType2::gFreeType2Unhinted)
++- mImageDesc.image_type |= ftc_image_flag_unhinted;
++-
++ PRUint32 num_embedded_bitmaps, i;
++ PRInt32* embedded_bitmapheights;
++ mFaceID->GetEmbeddedBitmapHeights(&num_embedded_bitmaps,
++@@ -218,7 +211,6 @@
++ if (embedded_bitmapheights[i] == aPixelSize) {
++ embedded_bimap = PR_TRUE;
++ // unhinted must be set for embedded bitmaps to be used
++- mImageDesc.image_type |= ftc_image_flag_unhinted;
++ break;
++ }
++ }
++@@ -312,7 +304,7 @@
++ if (!face)
++ return NS_ERROR_FAILURE;
++
++- FTC_Image_Cache icache;
+++ FTC_ImageCache icache;
++ mFt2->GetImageCache(&icache);
++ if (!icache)
++ return NS_ERROR_FAILURE;
++@@ -401,7 +393,7 @@
++ if (!face)
++ return 0;
++
++- FTC_Image_Cache icache;
+++ FTC_ImageCache icache;
++ mFt2->GetImageCache(&icache);
++ if (!icache)
++ return 0;
++@@ -723,7 +715,7 @@
++ if (y%4==0) (*blendPixelFunc)(sub_image, y, ascent-1, black, 255/2);
++ #endif
++
++- FTC_Image_Cache icache;
+++ FTC_ImageCache icache;
++ mFt2->GetImageCache(&icache);
++ if (!icache)
++ return 0;
++--- misc/mozilla/gfx/src/x11shared/nsFontFreeType.h 2004-04-17 23:52:34.000000000 +0200
+++++ misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.h 2008-08-14 16:22:21.000000000 +0200
++@@ -110,7 +110,7 @@
++ XImage *GetXImage(PRUint32 width, PRUint32 height);
++ nsITrueTypeFontCatalogEntry *mFaceID;
++ PRUint16 mPixelSize;
++- FTC_Image_Desc mImageDesc;
+++ FTC_ImageType mImageDesc;
++ nsCOMPtr<nsIFreeType2> mFt2;
++ };
++
++--- misc/mozilla/jpeg/jmorecfg.h 2004-12-12 01:57:39.000000000 +0100
+++++ misc/build/mozilla/jpeg/jmorecfg.h 2008-08-18 09:06:05.000000000 +0200
++@@ -108,7 +108,7 @@
++ /* Defines for MMX/SSE2 support. */
++
++ #if defined(XP_WIN32) && defined(_M_IX86) && !defined(__GNUC__)
++-#define HAVE_MMX_INTEL_MNEMONICS
+++//#define HAVE_MMX_INTEL_MNEMONICS
++
++ /* SSE2 code appears broken for some cpus (bug 247437) */
++ /* #define HAVE_SSE2_INTEL_MNEMONICS */
++--- misc/mozilla/js/src/xpconnect/src/Makefile.in 2006-01-31 02:57:35.000000000 +0100
+++++ misc/build/mozilla/js/src/xpconnect/src/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -163,4 +163,3 @@
++ endif
++ endif
++ endif
++-
++--- misc/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp 2006-03-16 18:09:14.000000000 +0100
+++++ misc/build/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -423,19 +423,19 @@
++ return;
++ }
++
++- FTC_Image_Desc imageDesc;
++- imageDesc.font.face_id=(void*)font_data.font_entry.get(); // XXX do we need to addref?
+++ FTC_ImageType imageDesc;
+++ imageDesc->face_id=(FTC_FaceID)font_data.font_entry.get(); // XXX do we need to addref?
++ float twipstopixel = GetTwipsToPixels();
++ float scale = GetPixelScale();
++- imageDesc.font.pix_width = (int)((float)(font_data.font.size)*twipstopixel/scale);
++- imageDesc.font.pix_height = (int)((float)(font_data.font.size)*twipstopixel/scale);
++- imageDesc.image_type |= ftc_image_grays;
+++ imageDesc->width = (int)((float)(font_data.font.size)*twipstopixel/scale);
+++ imageDesc->height = (int)((float)(font_data.font.size)*twipstopixel/scale);
+++ imageDesc->flags |= /* ftc_image_grays */0;
++
++ // get the face
++ nsresult rv;
++ FTC_Manager mgr;
++ nsSVGLibartFreetype::ft2->GetFTCacheManager(&mgr);
++- rv = nsSVGLibartFreetype::ft2->ManagerLookupSize(mgr, &imageDesc.font, &mFace, nsnull);
+++ rv = nsSVGLibartFreetype::ft2->ManagerLookupFace(mgr, imageDesc->face_id, &mFace);
++ NS_ASSERTION(mFace, "failed to get face/size");
++ }
++
++--- misc/mozilla/mailnews/addrbook/src/Makefile.in 2007-05-03 03:39:37.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/Makefile.in 2008-10-16 12:59:35.000000000 +0200
++@@ -106,6 +106,7 @@
++ nsVCard.cpp \
++ nsVCardObj.cpp \
++ nsMsgVCardService.cpp \
+++ nsAbMD5sum.cpp \
++ nsAbLDIFService.cpp \
++ $(NULL)
++
++@@ -114,7 +115,9 @@
++ nsDirPrefs.h \
++ nsAbCardProperty.h \
++ nsAbMDBCardProperty.h \
++- nsVCardObj.h \
+++ nsVCardObj.h \
+++ nsAbAddressCollecter.h \
+++ nsAbDirectoryQuery.h \
++ $(NULL)
++
++ ifeq ($(OS_ARCH),WINNT)
++--- misc/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 2005-05-11 06:16:53.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 2008-08-14 16:22:21.000000000 +0200
++@@ -43,6 +43,7 @@
++ #include "nsIAbBooleanExpression.h"
++ #include "nsCOMPtr.h"
++ #include "nsString.h"
+++#include "nsAbUtils.h"
++
++ class nsIAbLDAPAttributeMap;
++
++@@ -74,6 +75,16 @@
++ nsIAbBooleanConditionString* condition,
++ nsCString& filter,
++ int flags);
+++ static void GenerateMultipleFilter(
+++ nsAbBooleanConditionType conditionType,
+++ nsCString& filter,
+++ NS_ConvertUCS2toUTF8 &vUTF8,
+++ CharPtrArrayGuard *pAttrs);
+++ static void GenerateSingleFilter(
+++ nsAbBooleanConditionType conditionType,
+++ nsCString& filter,
+++ NS_ConvertUCS2toUTF8 &vUTF8,
+++ const char *ldapProperty);
++ };
++
++ #endif
++--- misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp 2007-02-18 23:18:13.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp 2008-08-20 12:16:50.000000000 +0200
++@@ -126,11 +126,13 @@
++
++ // use mURINoQuery to get a prefName
++ nsCAutoString prefName;
++- prefName = nsDependentCString(mURINoQuery.get() + kLDAPDirectoryRootLen) + NS_LITERAL_CSTRING(".uri");
+++ prefName = nsDependentCString(mURINoQuery.get() + kLDAPDirectoryRootLen);
++
++ // turn moz-abldapdirectory://ldap_2.servers.nscpphonebook into -> "ldap_2.servers.nscpphonebook.uri"
++ nsXPIDLCString URI;
++- rv = prefs->GetCharPref(prefName.get(), getter_Copies(URI));
+++ nsCAutoString uriPrefName;
+++ uriPrefName = prefName + NS_LITERAL_CSTRING(".uri");
+++ rv = prefs->GetCharPref(uriPrefName.get(), getter_Copies(URI));
++ if (NS_FAILED(rv))
++ {
++ /*
++@@ -154,6 +156,27 @@
++ nsCAutoString tempLDAPURL(mURINoQuery);
++ tempLDAPURL.ReplaceSubstring("moz-abldapdirectory:", "ldap:");
++ rv = mURL->SetSpec(tempLDAPURL);
+++ NS_ENSURE_SUCCESS(rv,rv);
+++
+++ nsCAutoString aHost;
+++ mURL->GetHost(aHost);
+++ aHost.ReplaceChar('.','_');
+++ prefName = nsDependentCString("ldap_2.servers.") + aHost;
+++ PRBool useSSL=0;
+++ rv = prefs->GetBoolPref(
+++ PromiseFlatCString(prefName
+++ + NS_LITERAL_CSTRING(".UseSSL")).get(),
+++ &useSSL
+++ );
+++
+++ // If use SSL,ldap url will look like this ldaps://host:port/.....
+++ if (!NS_FAILED(rv) && useSSL)
+++ {
+++ tempLDAPURL.ReplaceSubstring("ldap:", "ldaps:");
+++ rv = mURL->SetSpec(tempLDAPURL);
+++ }
+++ //NS_FAILED(rv) means ldap_2.servers.nscpphonebook.UseSSL not exist
+++ rv = 0;
++ }
++ else
++ {
++@@ -164,24 +187,29 @@
++ // get the login information, if there is any
++ //
++ rv = prefs->GetCharPref(
++- PromiseFlatCString(
++- Substring(mURINoQuery, kLDAPDirectoryRootLen,
++- mURINoQuery.Length() - kLDAPDirectoryRootLen)
+++ PromiseFlatCString(prefName
++ + NS_LITERAL_CSTRING(".auth.dn")).get(),
++ getter_Copies(mLogin));
++ if (NS_FAILED(rv)) {
++ mLogin.Truncate(); // zero out mLogin
++ }
++
+++ // get the password information, if there is any
+++ //
+++ rv = prefs->GetCharPref(
+++ PromiseFlatCString(prefName
+++ + NS_LITERAL_CSTRING(".auth.pwd")).get(),
+++ getter_Copies(mPassword));
+++ if (NS_FAILED(rv)) {
+++ mPassword.Truncate(); // zero out mLogin
+++ }
++ // get the protocol version, if there is any. using a string pref
++ // here instead of an int, as protocol versions sometimes have names like
++ // "4bis".
++ //
++ nsXPIDLCString protocolVersion;
++ rv = prefs->GetCharPref(
++- PromiseFlatCString(
++- Substring(mURINoQuery, kLDAPDirectoryRootLen,
++- mURINoQuery.Length() - kLDAPDirectoryRootLen)
+++ PromiseFlatCString(prefName
++ + NS_LITERAL_CSTRING(".protocolVersion")).get(),
++ getter_Copies(protocolVersion));
++
++--- misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2006-12-22 14:51:38.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2008-08-20 15:01:16.000000000 +0200
++@@ -74,7 +74,7 @@
++ PRInt32 resultLimit = -1,
++ PRInt32 timeOut = 0);
++ virtual ~nsAbQueryLDAPMessageListener ();
++-
+++ void SetPassword(const nsAString& aPassword){m_sPassword = aPassword;};
++ protected:
++ nsresult OnLDAPMessageBind (nsILDAPMessage *aMessage);
++ nsresult OnLDAPMessageSearchEntry (nsILDAPMessage *aMessage,
++@@ -108,6 +108,8 @@
++ PRBool mCanceled;
++ PRBool mWaitingForPrevQueryToFinish;
++
+++ nsAutoString m_sPassword;
+++
++ nsCOMPtr<nsILDAPOperation> mSearchOperation;
++
++ PRLock* mLock;
++@@ -272,7 +274,7 @@
++
++ // If mLogin is set, we're expected to use it to get a password.
++ //
++- if (!mDirectoryQuery->mLogin.IsEmpty()) {
+++ if (!mDirectoryQuery->mLogin.IsEmpty() && !m_sPassword.Length()) {
++ // XXX hack until nsUTF8AutoString exists
++ #define nsUTF8AutoString nsCAutoString
++ nsUTF8AutoString spec;
++@@ -415,10 +417,13 @@
++ rv = ldapOperation->Init(mConnection, proxyListener, nsnull);
++ NS_ENSURE_SUCCESS(rv, rv);
++
++- // Bind
++- rv = ldapOperation->SimpleBind(NS_ConvertUCS2toUTF8(passwd));
+++
+++ // Bind
+++ if (m_sPassword.Length())
+++ rv = ldapOperation->SimpleBind(NS_ConvertUCS2toUTF8(m_sPassword));
+++ else
+++ rv = ldapOperation->SimpleBind(NS_ConvertUCS2toUTF8(passwd));
++ NS_ENSURE_SUCCESS(rv, rv);
++-
++ return rv;
++ }
++
++@@ -707,7 +712,7 @@
++ rv = getLdapReturnAttributes (arguments, returnAttributes);
++ NS_ENSURE_SUCCESS(rv, rv);
++
++-
+++
++ // Get the filter
++ nsCOMPtr<nsISupports> supportsExpression;
++ rv = arguments->GetExpression (getter_AddRefs (supportsExpression));
++@@ -828,6 +833,10 @@
++ if (msgListener)
++ {
++ msgListener->mUrl = url;
+++ msgListener->mQueryListener = listener;
+++ msgListener->mResultLimit = resultLimit;
+++ msgListener->mTimeOut = timeOut;
+++ msgListener->mQueryArguments = arguments;
++ return msgListener->DoSearch();
++ }
++ }
++@@ -845,6 +854,11 @@
++ timeOut);
++ if (_messageListener == NULL)
++ return NS_ERROR_OUT_OF_MEMORY;
+++
+++ nsAutoString wPassword;
+++ wPassword.AssignWithConversion(mPassword.get());
+++ _messageListener->SetPassword(wPassword);
+++
++ mListener = _messageListener;
++ *_retval = 1;
++
++--- misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 2004-07-24 21:50:29.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 2008-08-14 16:22:21.000000000 +0200
++@@ -72,6 +72,7 @@
++ friend class nsAbQueryLDAPMessageListener;
++ nsresult Initiate ();
++ nsXPIDLCString mLogin; // authenticate to the LDAP server as...
+++ nsXPIDLCString mPassword; // password to the LDAP server as...
++ nsCOMPtr<nsILDAPURL> mDirectoryUrl; // the URL for the server
++ PRUint32 mProtocolVersion; // version of LDAP (see nsILDAPConnection.idl)
++
++--- misc/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2008-08-14 16:30:14.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -1 +1,633 @@
++-dummy
+++/*
+++ * 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 Netscape security libraries.
+++ *
+++ * The Initial Developer of the Original Code is Netscape
+++ * Communications Corporation. Portions created by Netscape are
+++ * Copyright (C) 1994-2000 Netscape Communications Corporation. All
+++ * Rights Reserved.
+++ *
+++ * Contributor(s):
+++ *
+++ * Alternatively, the contents of this file may be used under the
+++ * terms of the GNU General Public License Version 2 or later (the
+++ * "GPL"), in which case the provisions of the GPL are applicable
+++ * instead of those above. If you wish to allow use of your
+++ * version of this file only under the terms of the GPL and not to
+++ * allow others to use your version of this file under the MPL,
+++ * indicate your decision by deleting the provisions above and
+++ * replace them with the notice and other provisions required by
+++ * the GPL. If you do not delete the provisions above, a recipient
+++ * may use your version of this file under either the MPL or the
+++ * GPL.
+++ */
+++#include <stdio.h>
+++#include <stdlib.h>
+++
+++#include "prerr.h"
+++
+++#include "prtypes.h"
+++#include "prlong.h"
+++#include "plstr.h"
+++#include "nsMemory.h"
+++
+++#define MD5_HASH_LEN 16
+++#define MD5_BUFFER_SIZE 64
+++#define MD5_END_BUFFER (MD5_BUFFER_SIZE - 8)
+++
+++#define CV0_1 0x67452301
+++#define CV0_2 0xefcdab89
+++#define CV0_3 0x98badcfe
+++#define CV0_4 0x10325476
+++
+++#define T1_0 0xd76aa478
+++#define T1_1 0xe8c7b756
+++#define T1_2 0x242070db
+++#define T1_3 0xc1bdceee
+++#define T1_4 0xf57c0faf
+++#define T1_5 0x4787c62a
+++#define T1_6 0xa8304613
+++#define T1_7 0xfd469501
+++#define T1_8 0x698098d8
+++#define T1_9 0x8b44f7af
+++#define T1_10 0xffff5bb1
+++#define T1_11 0x895cd7be
+++#define T1_12 0x6b901122
+++#define T1_13 0xfd987193
+++#define T1_14 0xa679438e
+++#define T1_15 0x49b40821
+++
+++#define T2_0 0xf61e2562
+++#define T2_1 0xc040b340
+++#define T2_2 0x265e5a51
+++#define T2_3 0xe9b6c7aa
+++#define T2_4 0xd62f105d
+++#define T2_5 0x02441453
+++#define T2_6 0xd8a1e681
+++#define T2_7 0xe7d3fbc8
+++#define T2_8 0x21e1cde6
+++#define T2_9 0xc33707d6
+++#define T2_10 0xf4d50d87
+++#define T2_11 0x455a14ed
+++#define T2_12 0xa9e3e905
+++#define T2_13 0xfcefa3f8
+++#define T2_14 0x676f02d9
+++#define T2_15 0x8d2a4c8a
+++
+++#define T3_0 0xfffa3942
+++#define T3_1 0x8771f681
+++#define T3_2 0x6d9d6122
+++#define T3_3 0xfde5380c
+++#define T3_4 0xa4beea44
+++#define T3_5 0x4bdecfa9
+++#define T3_6 0xf6bb4b60
+++#define T3_7 0xbebfbc70
+++#define T3_8 0x289b7ec6
+++#define T3_9 0xeaa127fa
+++#define T3_10 0xd4ef3085
+++#define T3_11 0x04881d05
+++#define T3_12 0xd9d4d039
+++#define T3_13 0xe6db99e5
+++#define T3_14 0x1fa27cf8
+++#define T3_15 0xc4ac5665
+++
+++#define T4_0 0xf4292244
+++#define T4_1 0x432aff97
+++#define T4_2 0xab9423a7
+++#define T4_3 0xfc93a039
+++#define T4_4 0x655b59c3
+++#define T4_5 0x8f0ccc92
+++#define T4_6 0xffeff47d
+++#define T4_7 0x85845dd1
+++#define T4_8 0x6fa87e4f
+++#define T4_9 0xfe2ce6e0
+++#define T4_10 0xa3014314
+++#define T4_11 0x4e0811a1
+++#define T4_12 0xf7537e82
+++#define T4_13 0xbd3af235
+++#define T4_14 0x2ad7d2bb
+++#define T4_15 0xeb86d391
+++
+++#define R1B0 0
+++#define R1B1 1
+++#define R1B2 2
+++#define R1B3 3
+++#define R1B4 4
+++#define R1B5 5
+++#define R1B6 6
+++#define R1B7 7
+++#define R1B8 8
+++#define R1B9 9
+++#define R1B10 10
+++#define R1B11 11
+++#define R1B12 12
+++#define R1B13 13
+++#define R1B14 14
+++#define R1B15 15
+++
+++#define R2B0 1
+++#define R2B1 6
+++#define R2B2 11
+++#define R2B3 0
+++#define R2B4 5
+++#define R2B5 10
+++#define R2B6 15
+++#define R2B7 4
+++#define R2B8 9
+++#define R2B9 14
+++#define R2B10 3
+++#define R2B11 8
+++#define R2B12 13
+++#define R2B13 2
+++#define R2B14 7
+++#define R2B15 12
+++
+++#define R3B0 5
+++#define R3B1 8
+++#define R3B2 11
+++#define R3B3 14
+++#define R3B4 1
+++#define R3B5 4
+++#define R3B6 7
+++#define R3B7 10
+++#define R3B8 13
+++#define R3B9 0
+++#define R3B10 3
+++#define R3B11 6
+++#define R3B12 9
+++#define R3B13 12
+++#define R3B14 15
+++#define R3B15 2
+++
+++#define R4B0 0
+++#define R4B1 7
+++#define R4B2 14
+++#define R4B3 5
+++#define R4B4 12
+++#define R4B5 3
+++#define R4B6 10
+++#define R4B7 1
+++#define R4B8 8
+++#define R4B9 15
+++#define R4B10 6
+++#define R4B11 13
+++#define R4B12 4
+++#define R4B13 11
+++#define R4B14 2
+++#define R4B15 9
+++
+++#define S1_0 7
+++#define S1_1 12
+++#define S1_2 17
+++#define S1_3 22
+++
+++#define S2_0 5
+++#define S2_1 9
+++#define S2_2 14
+++#define S2_3 20
+++
+++#define S3_0 4
+++#define S3_1 11
+++#define S3_2 16
+++#define S3_3 23
+++
+++#define S4_0 6
+++#define S4_1 10
+++#define S4_2 15
+++#define S4_3 21
+++
+++struct MD5ContextStr {
+++ PRUint32 lsbInput;
+++ PRUint32 msbInput;
+++ PRUint32 cv[4];
+++ union {
+++ PRUint8 b[64];
+++ PRUint32 w[16];
+++ } u;
+++};
+++typedef struct MD5ContextStr MD5Context;
+++
+++#define inBuf u.b
+++
+++int MD5_Hash(unsigned char *dest, const char *src);
+++int MD5_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length);
+++MD5Context * MD5_NewContext(void);
+++void MD5_DestroyContext(MD5Context *cx, PRBool freeit);
+++void MD5_Begin(MD5Context *cx);
+++static void md5_compress(MD5Context *cx);
+++void MD5_Update(MD5Context *cx, const unsigned char *input, unsigned int inputLen);
+++void MD5_End(MD5Context *cx, unsigned char *digest,
+++ unsigned int *digestLen, unsigned int maxDigestLen);
+++unsigned int MD5_FlattenSize(MD5Context *cx);
+++int MD5_Flatten(MD5Context *cx, unsigned char *space);
+++MD5Context * MD5_Resurrect(unsigned char *space, void *arg);
+++void MD5_TraceState(MD5Context *cx);
+++
+++int
+++MD5_Hash(unsigned char *dest, const char *src)
+++{
+++ return MD5_HashBuf(dest, (unsigned char *)src, PL_strlen(src));
+++}
+++
+++int
+++MD5_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length)
+++{
+++ unsigned int len;
+++ MD5Context *cx = MD5_NewContext();
+++ if (cx == NULL) {
+++// PORT_SetError(PR_OUT_OF_MEMORY_ERROR);
+++ return -1;
+++ }
+++ MD5_Begin(cx);
+++ MD5_Update(cx, src, src_length);
+++ MD5_End(cx, dest, &len, MD5_HASH_LEN);
+++ MD5_DestroyContext(cx, PR_TRUE);
+++ return 0;
+++}
+++
+++MD5Context *
+++MD5_NewContext(void)
+++{
+++ MD5Context *cx = (MD5Context *)malloc(sizeof(MD5Context));
+++ if (cx == NULL) {
+++// PORT_SetError(PR_OUT_OF_MEMORY_ERROR);
+++ return NULL;
+++ }
+++ return cx;
+++}
+++
+++void
+++MD5_DestroyContext(MD5Context *cx, PRBool freeit)
+++{
+++ if (freeit) {
+++ free(cx);
+++ }
+++}
+++
+++void
+++MD5_Begin(MD5Context *cx)
+++{
+++ cx->lsbInput = 0;
+++ cx->msbInput = 0;
+++ memset(cx->inBuf, 0, sizeof(cx->inBuf));
+++ cx->cv[0] = CV0_1;
+++ cx->cv[1] = CV0_2;
+++ cx->cv[2] = CV0_3;
+++ cx->cv[3] = CV0_4;
+++}
+++
+++#define cls(i32, s) (tmp = i32, tmp << s | tmp >> (32 - s))
+++
+++#define MASK 0x00ff00ff
+++#ifdef IS_LITTLE_ENDIAN
+++#define lendian(i32) \
+++ (i32)
+++#else
+++#define lendian(i32) \
+++ (tmp = i32 >> 16 | i32 << 16, (tmp & MASK) << 8 | tmp >> 8 & MASK)
+++#endif
+++
+++#if defined(SOLARIS) || defined(HPUX)
+++#define addto64(sumhigh, sumlow, addend) \
+++ sumlow += addend; sumhigh += (sumlow < addend);
+++#else
+++#define addto64(sumhigh, sumlow, addend) \
+++ sumlow += addend; if (sumlow < addend) ++sumhigh;
+++#endif
+++
+++#define F(X, Y, Z) \
+++ ((X & Y) | ((~X) & Z))
+++
+++#define G(X, Y, Z) \
+++ ((X & Z) | (Y & (~Z)))
+++
+++#define H(X, Y, Z) \
+++ (X ^ Y ^ Z)
+++
+++#define I(X, Y, Z) \
+++ (Y ^ (X | (~Z)))
+++
+++#define FF(a, b, c, d, bufint, s, ti) \
+++ a = b + cls(a + F(b, c, d) + bufint + ti, s)
+++
+++#define GG(a, b, c, d, bufint, s, ti) \
+++ a = b + cls(a + G(b, c, d) + bufint + ti, s)
+++
+++#define HH(a, b, c, d, bufint, s, ti) \
+++ a = b + cls(a + H(b, c, d) + bufint + ti, s)
+++
+++#define II(a, b, c, d, bufint, s, ti) \
+++ a = b + cls(a + I(b, c, d) + bufint + ti, s)
+++
+++static void
+++md5_compress(MD5Context *cx)
+++{
+++ PRUint32 a, b, c, d;
+++ PRUint32 tmp;
+++ a = cx->cv[0];
+++ b = cx->cv[1];
+++ c = cx->cv[2];
+++ d = cx->cv[3];
+++#ifndef IS_LITTLE_ENDIAN
+++ cx->u.w[0] = lendian(cx->u.w[0]);
+++ cx->u.w[1] = lendian(cx->u.w[1]);
+++ cx->u.w[2] = lendian(cx->u.w[2]);
+++ cx->u.w[3] = lendian(cx->u.w[3]);
+++ cx->u.w[4] = lendian(cx->u.w[4]);
+++ cx->u.w[5] = lendian(cx->u.w[5]);
+++ cx->u.w[6] = lendian(cx->u.w[6]);
+++ cx->u.w[7] = lendian(cx->u.w[7]);
+++ cx->u.w[8] = lendian(cx->u.w[8]);
+++ cx->u.w[9] = lendian(cx->u.w[9]);
+++ cx->u.w[10] = lendian(cx->u.w[10]);
+++ cx->u.w[11] = lendian(cx->u.w[11]);
+++ cx->u.w[12] = lendian(cx->u.w[12]);
+++ cx->u.w[13] = lendian(cx->u.w[13]);
+++ cx->u.w[14] = lendian(cx->u.w[14]);
+++ cx->u.w[15] = lendian(cx->u.w[15]);
+++#endif
+++ FF(a, b, c, d, cx->u.w[R1B0 ], S1_0, T1_0);
+++ FF(d, a, b, c, cx->u.w[R1B1 ], S1_1, T1_1);
+++ FF(c, d, a, b, cx->u.w[R1B2 ], S1_2, T1_2);
+++ FF(b, c, d, a, cx->u.w[R1B3 ], S1_3, T1_3);
+++ FF(a, b, c, d, cx->u.w[R1B4 ], S1_0, T1_4);
+++ FF(d, a, b, c, cx->u.w[R1B5 ], S1_1, T1_5);
+++ FF(c, d, a, b, cx->u.w[R1B6 ], S1_2, T1_6);
+++ FF(b, c, d, a, cx->u.w[R1B7 ], S1_3, T1_7);
+++ FF(a, b, c, d, cx->u.w[R1B8 ], S1_0, T1_8);
+++ FF(d, a, b, c, cx->u.w[R1B9 ], S1_1, T1_9);
+++ FF(c, d, a, b, cx->u.w[R1B10], S1_2, T1_10);
+++ FF(b, c, d, a, cx->u.w[R1B11], S1_3, T1_11);
+++ FF(a, b, c, d, cx->u.w[R1B12], S1_0, T1_12);
+++ FF(d, a, b, c, cx->u.w[R1B13], S1_1, T1_13);
+++ FF(c, d, a, b, cx->u.w[R1B14], S1_2, T1_14);
+++ FF(b, c, d, a, cx->u.w[R1B15], S1_3, T1_15);
+++ GG(a, b, c, d, cx->u.w[R2B0 ], S2_0, T2_0);
+++ GG(d, a, b, c, cx->u.w[R2B1 ], S2_1, T2_1);
+++ GG(c, d, a, b, cx->u.w[R2B2 ], S2_2, T2_2);
+++ GG(b, c, d, a, cx->u.w[R2B3 ], S2_3, T2_3);
+++ GG(a, b, c, d, cx->u.w[R2B4 ], S2_0, T2_4);
+++ GG(d, a, b, c, cx->u.w[R2B5 ], S2_1, T2_5);
+++ GG(c, d, a, b, cx->u.w[R2B6 ], S2_2, T2_6);
+++ GG(b, c, d, a, cx->u.w[R2B7 ], S2_3, T2_7);
+++ GG(a, b, c, d, cx->u.w[R2B8 ], S2_0, T2_8);
+++ GG(d, a, b, c, cx->u.w[R2B9 ], S2_1, T2_9);
+++ GG(c, d, a, b, cx->u.w[R2B10], S2_2, T2_10);
+++ GG(b, c, d, a, cx->u.w[R2B11], S2_3, T2_11);
+++ GG(a, b, c, d, cx->u.w[R2B12], S2_0, T2_12);
+++ GG(d, a, b, c, cx->u.w[R2B13], S2_1, T2_13);
+++ GG(c, d, a, b, cx->u.w[R2B14], S2_2, T2_14);
+++ GG(b, c, d, a, cx->u.w[R2B15], S2_3, T2_15);
+++ HH(a, b, c, d, cx->u.w[R3B0 ], S3_0, T3_0);
+++ HH(d, a, b, c, cx->u.w[R3B1 ], S3_1, T3_1);
+++ HH(c, d, a, b, cx->u.w[R3B2 ], S3_2, T3_2);
+++ HH(b, c, d, a, cx->u.w[R3B3 ], S3_3, T3_3);
+++ HH(a, b, c, d, cx->u.w[R3B4 ], S3_0, T3_4);
+++ HH(d, a, b, c, cx->u.w[R3B5 ], S3_1, T3_5);
+++ HH(c, d, a, b, cx->u.w[R3B6 ], S3_2, T3_6);
+++ HH(b, c, d, a, cx->u.w[R3B7 ], S3_3, T3_7);
+++ HH(a, b, c, d, cx->u.w[R3B8 ], S3_0, T3_8);
+++ HH(d, a, b, c, cx->u.w[R3B9 ], S3_1, T3_9);
+++ HH(c, d, a, b, cx->u.w[R3B10], S3_2, T3_10);
+++ HH(b, c, d, a, cx->u.w[R3B11], S3_3, T3_11);
+++ HH(a, b, c, d, cx->u.w[R3B12], S3_0, T3_12);
+++ HH(d, a, b, c, cx->u.w[R3B13], S3_1, T3_13);
+++ HH(c, d, a, b, cx->u.w[R3B14], S3_2, T3_14);
+++ HH(b, c, d, a, cx->u.w[R3B15], S3_3, T3_15);
+++ II(a, b, c, d, cx->u.w[R4B0 ], S4_0, T4_0);
+++ II(d, a, b, c, cx->u.w[R4B1 ], S4_1, T4_1);
+++ II(c, d, a, b, cx->u.w[R4B2 ], S4_2, T4_2);
+++ II(b, c, d, a, cx->u.w[R4B3 ], S4_3, T4_3);
+++ II(a, b, c, d, cx->u.w[R4B4 ], S4_0, T4_4);
+++ II(d, a, b, c, cx->u.w[R4B5 ], S4_1, T4_5);
+++ II(c, d, a, b, cx->u.w[R4B6 ], S4_2, T4_6);
+++ II(b, c, d, a, cx->u.w[R4B7 ], S4_3, T4_7);
+++ II(a, b, c, d, cx->u.w[R4B8 ], S4_0, T4_8);
+++ II(d, a, b, c, cx->u.w[R4B9 ], S4_1, T4_9);
+++ II(c, d, a, b, cx->u.w[R4B10], S4_2, T4_10);
+++ II(b, c, d, a, cx->u.w[R4B11], S4_3, T4_11);
+++ II(a, b, c, d, cx->u.w[R4B12], S4_0, T4_12);
+++ II(d, a, b, c, cx->u.w[R4B13], S4_1, T4_13);
+++ II(c, d, a, b, cx->u.w[R4B14], S4_2, T4_14);
+++ II(b, c, d, a, cx->u.w[R4B15], S4_3, T4_15);
+++ cx->cv[0] += a;
+++ cx->cv[1] += b;
+++ cx->cv[2] += c;
+++ cx->cv[3] += d;
+++}
+++
+++void
+++MD5_Update(MD5Context *cx, const unsigned char *input, unsigned int inputLen)
+++{
+++ PRUint32 bytesToConsume;
+++ PRUint32 inBufIndex = cx->lsbInput & 63;
+++
+++ /* Add the number of input bytes to the 64-bit input counter. */
+++ addto64(cx->msbInput, cx->lsbInput, inputLen);
+++ if (inBufIndex) {
+++ /* There is already data in the buffer. Fill with input. */
+++ bytesToConsume = PR_MIN(inputLen, MD5_BUFFER_SIZE - inBufIndex);
+++ memcpy(&cx->inBuf[inBufIndex], input, bytesToConsume);
+++ if (inBufIndex + bytesToConsume >= MD5_BUFFER_SIZE)
+++ /* The buffer is filled. Run the compression function. */
+++ md5_compress(cx);
+++ /* Remaining input. */
+++ inputLen -= bytesToConsume;
+++ input += bytesToConsume;
+++ }
+++
+++ /* Iterate over 64-byte chunks of the message. */
+++ while (inputLen >= MD5_BUFFER_SIZE) {
+++ memcpy(cx->inBuf, input, MD5_BUFFER_SIZE);
+++ md5_compress(cx);
+++ inputLen -= MD5_BUFFER_SIZE;
+++ input += MD5_BUFFER_SIZE;
+++ }
+++
+++ /* Tail of message (message bytes mod 64). */
+++ if (inputLen)
+++ memcpy(cx->inBuf, input, inputLen);
+++}
+++
+++static const unsigned char padbytes[] = {
+++ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+++};
+++
+++void
+++MD5_End(MD5Context *cx, unsigned char *digest,
+++ unsigned int *digestLen, unsigned int maxDigestLen)
+++{
+++#ifndef IS_LITTLE_ENDIAN
+++ PRUint32 tmp;
+++#endif
+++ PRUint32 lowInput, highInput;
+++ PRUint32 inBufIndex = cx->lsbInput & 63;
+++
+++ if (maxDigestLen < MD5_HASH_LEN) {
+++// PORT_SetError(SEC_ERROR_INVALID_ARGS);
+++ return;
+++ }
+++
+++ /* Copy out the length of bits input before padding. */
+++ lowInput = cx->lsbInput;
+++ highInput = (cx->msbInput << 3) | (lowInput >> 29);
+++ lowInput <<= 3;
+++
+++ if (inBufIndex < MD5_END_BUFFER) {
+++ MD5_Update(cx, padbytes, MD5_END_BUFFER - inBufIndex);
+++ } else {
+++ MD5_Update(cx, padbytes,
+++ MD5_END_BUFFER + MD5_BUFFER_SIZE - inBufIndex);
+++ }
+++
+++ /* Store the number of bytes input (before padding) in final 64 bits. */
+++ cx->u.w[14] = lendian(lowInput);
+++ cx->u.w[15] = lendian(highInput);
+++
+++ /* Final call to compress. */
+++ md5_compress(cx);
+++
+++ /* Copy the resulting values out of the chain variables into return buf. */
+++ *digestLen = MD5_HASH_LEN;
+++#ifndef IS_LITTLE_ENDIAN
+++ cx->cv[0] = lendian(cx->cv[0]);
+++ cx->cv[1] = lendian(cx->cv[1]);
+++ cx->cv[2] = lendian(cx->cv[2]);
+++ cx->cv[3] = lendian(cx->cv[3]);
+++#endif
+++ memcpy(digest, cx->cv, MD5_HASH_LEN);
+++}
+++
+++unsigned int
+++MD5_FlattenSize(MD5Context *cx)
+++{
+++ return sizeof(*cx);
+++}
+++
+++int
+++MD5_Flatten(MD5Context *cx, unsigned char *space)
+++{
+++ memcpy(space, cx, sizeof(*cx));
+++ return 0;
+++}
+++
+++MD5Context *
+++MD5_Resurrect(unsigned char *space, void *arg)
+++{
+++ MD5Context *cx = MD5_NewContext();
+++ if (cx)
+++ memcpy(cx, space, sizeof(*cx));
+++ return cx;
+++}
+++
+++void
+++MD5_TraceState(MD5Context *cx)
+++{
+++// PORT_SetError(PR_NOT_IMPLEMENTED_ERROR);
+++}
+++
+++int
+++md5_stream (FILE *stream, unsigned char *dest)
+++{
+++ /* Important: BLOCKSIZE must be a multiple of 64. */
+++#define BLOCKSIZE 4096
+++ unsigned int len;
+++ MD5Context *cx = MD5_NewContext();
+++ if (cx == NULL) {
+++// PORT_SetError(PR_OUT_OF_MEMORY_ERROR);
+++ return -1;
+++ }
+++
+++ unsigned char buffer[BLOCKSIZE + 72];
+++ size_t sum;
+++
+++ /* Initialize the computation context. */
+++ MD5_Begin(cx);
+++
+++ /* Iterate over full file contents. */
+++ while (1)
+++ {
+++ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+++ computation function processes the whole buffer so that with the
+++ next round of the loop another block can be read. */
+++ size_t n;
+++ sum = 0;
+++
+++ /* Read block. Take care for partial reads. */
+++ do
+++ {
+++ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+++
+++ sum += n;
+++ }
+++ while (sum < BLOCKSIZE && n != 0);
+++ if (n == 0 && ferror (stream))
+++ return 1;
+++
+++ /* If end of file is reached, end the loop. */
+++ if (n == 0)
+++ break;
+++
+++ /* Process buffer with BLOCKSIZE bytes. Note that
+++ BLOCKSIZE % 64 == 0
+++ */
+++ MD5_Update(cx, buffer, BLOCKSIZE);
+++ }
+++
+++ /* Add the last bytes if necessary. */
+++ if (sum > 0)
+++ MD5_Update(cx, buffer, sum);
+++
+++ MD5_End(cx, dest, &len, MD5_HASH_LEN);
+++ MD5_DestroyContext(cx, PR_TRUE);
+++ return len;
+++
+++}
+++
+++int getMD5sum(const char * fileName,char * sum)
+++{
+++ unsigned char bin_sum[16];
+++ int len=0;
+++ if (fileName)
+++ {
+++ FILE *fp=fopen(fileName,"rb");
+++ if (fp)
+++ {
+++ len=md5_stream(fp,bin_sum);
+++ memset(sum,0,33);
+++ for (int i = 0; i < len; ++i)
+++ sprintf (sum,"%s%02x",sum, bin_sum[i]);
+++ fclose(fp);
+++ return 0;
+++ }
+++ }
+++ return 1;
+++}
+++
+++int testMD5sum(const char * fileName,char * sum)
+++{
+++ char newSum[33]="";
+++ if (getMD5sum(fileName,newSum))
+++ return 1;
+++ return strcmp(newSum,sum);
+++}
++--- misc/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp 2006-12-22 14:51:38.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -273,8 +273,7 @@
++ if (mCardDatabase)
++ {
++ mCardDatabase->EditCard(this, PR_TRUE);
++- mCardDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
++- return NS_OK;
+++ return mCardDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
++ }
++ else
++ return NS_ERROR_FAILURE;
++--- misc/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 2008-01-29 20:31:58.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -561,7 +561,7 @@
++ }
++ }
++ }
++- mDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
+++ rv = mDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
++ }
++ return rv;
++ }
++@@ -707,6 +707,7 @@
++ return NS_ERROR_NOT_IMPLEMENTED;
++
++ nsresult rv = NS_OK;
+++
++ if (!mDatabase)
++ rv = GetAbDatabase();
++
++@@ -736,10 +737,11 @@
++ mDatabase->CreateNewListCardAndAddToDB(this, m_dbRowID, newCard, PR_TRUE /* notify */);
++ else
++ mDatabase->CreateNewCardAndAddToDB(newCard, PR_TRUE);
++- mDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
+++ rv = mDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
++
+++ NS_ENSURE_SUCCESS(rv, rv);
++ NS_IF_ADDREF(*addedCard = newCard);
++- return NS_OK;
+++ return rv;
++ }
++
++ NS_IMETHODIMP nsAbMDBDirectory::DropCard(nsIAbCard* aCard, PRBool needToCopyCard)
++--- misc/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 2004-07-31 20:04:18.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -94,6 +94,7 @@
++ {
++ index_DisplayName = 0,
++ index_EmailAddress,
+++ index_SecondEmailAddress,
++ index_FirstName,
++ index_LastName,
++ index_NickName,
++@@ -121,32 +122,34 @@
++
++ static const ULONG OutlookCardMAPIProps [] =
++ {
++- PR_DISPLAY_NAME_W,
++- PR_EMAIL_ADDRESS_W,
++- PR_GIVEN_NAME_W,
++- PR_SURNAME_W,
++- PR_NICKNAME_W,
++- PR_BUSINESS_TELEPHONE_NUMBER_W,
++- PR_HOME_TELEPHONE_NUMBER_W,
++- PR_BUSINESS_FAX_NUMBER_W,
++- PR_PAGER_TELEPHONE_NUMBER_W,
++- PR_MOBILE_TELEPHONE_NUMBER_W,
++- PR_HOME_ADDRESS_CITY_W,
++- PR_HOME_ADDRESS_STATE_OR_PROVINCE_W,
++- PR_HOME_ADDRESS_POSTAL_CODE_W,
++- PR_HOME_ADDRESS_COUNTRY_W,
++- PR_BUSINESS_ADDRESS_CITY_W,
++- PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_W,
++- PR_BUSINESS_ADDRESS_POSTAL_CODE_W,
++- PR_BUSINESS_ADDRESS_COUNTRY_W,
++- PR_TITLE_W,
++- PR_DEPARTMENT_NAME_W,
++- PR_COMPANY_NAME_W,
++- PR_BUSINESS_HOME_PAGE_W,
++- PR_PERSONAL_HOME_PAGE_W,
++- PR_COMMENT_W
+++ PR_DISPLAY_NAME_A,//0x8035001E
+++ PR_EMAIL_ADDRESS_A,//0x8034001E
+++ PR_SECOND_EMAIL_ADDRESS_A,//Second Email Address
+++ PR_GIVEN_NAME_A,
+++ PR_SURNAME_A,
+++ PR_NICKNAME_A,
+++ PR_BUSINESS_TELEPHONE_NUMBER_A,
+++ PR_HOME_TELEPHONE_NUMBER_A,
+++ PR_BUSINESS_FAX_NUMBER_A,
+++ PR_PAGER_TELEPHONE_NUMBER_A,
+++ PR_MOBILE_TELEPHONE_NUMBER_A,
+++ PR_HOME_ADDRESS_CITY_A,
+++ PR_HOME_ADDRESS_STATE_OR_PROVINCE_A,
+++ PR_HOME_ADDRESS_POSTAL_CODE_A,
+++ PR_HOME_ADDRESS_COUNTRY_A,
+++ PR_BUSINESS_ADDRESS_CITY_A,
+++ PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_A,
+++ PR_BUSINESS_ADDRESS_POSTAL_CODE_A,
+++ PR_BUSINESS_ADDRESS_COUNTRY_A,
+++ PR_TITLE_A,
+++ PR_DEPARTMENT_NAME_A,
+++ PR_COMPANY_NAME_A,
+++ PR_BUSINESS_HOME_PAGE_A,
+++ PR_PERSONAL_HOME_PAGE_A,
+++ PR_COMMENT_A
++ } ;
++
+++
++ nsresult nsAbOutlookCard::Init(const char *aUri)
++ {
++ nsresult retCode = nsRDFResource::Init(aUri) ;
++@@ -173,6 +176,7 @@
++ SetDisplayName(unichars [index_DisplayName]->get()) ;
++ SetNickName(unichars [index_NickName]->get()) ;
++ SetPrimaryEmail(unichars [index_EmailAddress]->get()) ;
+++ SetSecondEmail(unichars [index_SecondEmailAddress]->get()) ;
++ SetWorkPhone(unichars [index_WorkPhoneNumber]->get()) ;
++ SetHomePhone(unichars [index_HomePhoneNumber]->get()) ;
++ SetFaxNumber(unichars [index_WorkFaxNumber]->get()) ;
++@@ -207,12 +211,12 @@
++ nsAutoString unichar ;
++ nsAutoString unicharBis ;
++
++- if (mapiAddBook->GetPropertyUString(*mMapiData, PR_HOME_ADDRESS_STREET_W, unichar)) {
+++ if (mapiAddBook->GetPropertyUString(*mMapiData, PR_HOME_ADDRESS_STREET_A, unichar)) {
++ splitString(unichar, unicharBis) ;
++ SetHomeAddress(unichar.get()) ;
++ SetHomeAddress2(unicharBis.get()) ;
++ }
++- if (mapiAddBook->GetPropertyUString(*mMapiData, PR_BUSINESS_ADDRESS_STREET_W, unichar)) {
+++ if (mapiAddBook->GetPropertyUString(*mMapiData, PR_BUSINESS_ADDRESS_STREET_A, unichar)) {
++ splitString(unichar, unicharBis) ;
++ SetWorkAddress(unichar.get()) ;
++ SetWorkAddress2(unicharBis.get()) ;
++@@ -290,6 +294,7 @@
++ SetDisplayName(properties [index_DisplayName]) ;
++ GetNickName(getter_Copies(properties [index_NickName])) ;
++ GetPrimaryEmail(getter_Copies(properties [index_EmailAddress])) ;
+++ GetSecondEmail(getter_Copies(properties [index_SecondEmailAddress])) ;
++ GetWorkPhone(getter_Copies(properties [index_WorkPhoneNumber])) ;
++ GetHomePhone(getter_Copies(properties [index_HomePhoneNumber])) ;
++ GetFaxNumber(getter_Copies(properties [index_WorkFaxNumber])) ;
++@@ -309,9 +314,16 @@
++ GetWebPage1(getter_Copies(properties [index_WorkWebPage])) ;
++ GetWebPage2(getter_Copies(properties [index_HomeWebPage])) ;
++ GetNotes(getter_Copies(properties [index_Comments])) ;
++- if (!mapiAddBook->SetPropertiesUString(*mMapiData, OutlookCardMAPIProps,
++- index_LastProp, properties)) {
++- PRINTF(("Cannot set general properties.\n")) ;
+++
+++ int i=0;
+++ for (i=0;i<index_LastProp;i++)
+++ {
+++ if (!mapiAddBook->SetPropertyUString(*mMapiData,
+++ OutlookCardMAPIProps[i],
+++ properties[i]))
+++ {
+++ PRINTF(("Cannot set properties:%d.\n",OutlookCardMAPIProps[i])) ;
+++ }
++ }
++ delete [] properties ;
++ nsXPIDLString unichar ;
++--- misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp 2004-04-17 20:32:14.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -124,8 +124,8 @@
++ nsCAutoString uri ;
++ nsCOMPtr<nsIRDFResource> resource ;
++
++- for (ULONG i = 0 ; i < folders.mNbEntries ; ++ i) {
++- folders.mEntries [i].ToString(entryId) ;
+++ for (ULONG i = 0 ; i < folders.GetSize() ; ++ i) {
+++ folders[i].ToString(entryId) ;
++ buildAbWinUri(kOutlookDirectoryScheme, abType, uri) ;
++ uri.Append(entryId) ;
++
++--- misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp 2006-12-22 14:51:38.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -126,7 +126,7 @@
++ PRINTF(("Cannot get type.\n")) ;
++ return NS_ERROR_FAILURE ;
++ }
++- if (!mapiAddBook->GetPropertyUString(*mMapiData, PR_DISPLAY_NAME_W, unichars)) {
+++ if (!mapiAddBook->GetPropertyUString(*mMapiData, PR_DISPLAY_NAME_A, unichars)) {
++ PRINTF(("Cannot get name.\n")) ;
++ return NS_ERROR_FAILURE ;
++ }
++@@ -163,45 +163,85 @@
++ return retCode;
++ }
++
+++nsresult nsAbOutlookDirectory::BuildCardFromURI(const nsCString& uriName,nsIAbCard **aNewCard,
+++ PRBool aSearchForOld, PRBool& aIsNewCard)
+++{
+++ nsresult retCode = NS_OK ;
+++ if (aSearchForOld) {
+++ nsCStringKey key(uriName) ;
+++ nsCOMPtr<nsISupports> existingCard = mCardList.Get(&key) ;
+++
+++ if (existingCard) {
+++ nsCOMPtr<nsIAbCard> card(do_QueryInterface(existingCard, &retCode)) ;
+++
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ NS_IF_ADDREF(*aNewCard = card) ;
+++ aIsNewCard = PR_FALSE ;
+++ return retCode ;
+++ }
+++ }
+++ aIsNewCard = PR_TRUE ;
+++ nsCOMPtr<nsIRDFResource> resource ;
+++
+++ nsCOMPtr<nsIAbCard> childCard = do_CreateInstance(NS_ABOUTLOOKCARD_CONTRACTID, &retCode);
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ resource = do_QueryInterface(childCard, &retCode) ;
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ retCode = resource->Init(uriName.get()) ;
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ NS_IF_ADDREF(*aNewCard = childCard);
+++ return retCode ;
+++}
+++
++ NS_IMETHODIMP nsAbOutlookDirectory::GetChildCards(nsIEnumerator **aCards)
++ {
++ if (!aCards) { return NS_ERROR_NULL_POINTER ; }
++ *aCards = nsnull ;
++ nsCOMPtr<nsISupportsArray> cardList ;
+++ nsCStringArray uriList ;
+++ nsAbWinHelperGuard mapiAddBook (mAbWinType) ;
++ nsresult retCode ;
++
++- mCardList.Reset() ;
++ if (mIsQueryURI) {
++ retCode = StartSearch() ;
++- NS_NewISupportsArray(getter_AddRefs(cardList)) ;
++ }
++ else {
++- retCode = GetChildCards(getter_AddRefs(cardList), nsnull) ;
+++ retCode = GetChildCards(uriList, nsnull) ;
++ }
+++ NS_NewISupportsArray(getter_AddRefs(cardList)) ;
++ if (NS_SUCCEEDED(retCode)) {
++ // Fill the results array and update the card list
++ // Also update the address list and notify any changes.
++ PRUint32 nbCards = 0 ;
++- nsCOMPtr<nsISupports> element ;
+++ nsCAutoString uriName;
+++ nsCOMPtr <nsIAbCard> childCard;
+++ PRBool searchForOldCards = 0; //(mCardList.Count() != 0) ;
+++
+++ nbCards = uriList.Count();
+++ NS_NewISupportsArray(getter_AddRefs(m_AddressList));
++
++- cardList->Enumerate(aCards) ;
++- cardList->Count(&nbCards) ;
++ for (PRUint32 i = 0 ; i < nbCards ; ++ i) {
++- cardList->GetElementAt(i, getter_AddRefs(element)) ;
++- nsVoidKey newKey (NS_STATIC_CAST(void *, element)) ;
++- nsCOMPtr<nsISupports> oldElement = mCardList.Get(&newKey) ;
+++ PRBool isNewCard = PR_FALSE ;
++
++- if (!oldElement) {
+++ uriList.CStringAt(i,uriName);
+++ retCode = BuildCardFromURI(uriName,getter_AddRefs(childCard), searchForOldCards, isNewCard);
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ cardList->AppendElement(childCard);
+++
+++ if (isNewCard) {
++ // We are dealing with a new element (probably directly
++ // added from Outlook), we may need to sync m_AddressList
++- mCardList.Put(&newKey, element) ;
++- nsCOMPtr<nsIAbCard> card (do_QueryInterface(element, &retCode)) ;
+++ nsCStringKey newKey(uriName) ;
+++
+++ mCardList.Put(&newKey, childCard) ;
+++ nsCOMPtr<nsIAbCard> card (do_QueryInterface(childCard, &retCode)) ;
++
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
++ PRBool isMailList = PR_FALSE ;
++
++ retCode = card->GetIsMailList(&isMailList) ;
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++
++ if (isMailList) {
++ // We can have mailing lists only in folder,
++ // we must add the directory to m_AddressList
++@@ -224,18 +264,33 @@
++ NotifyItemAddition(card) ;
++ }
++ }
++- else {
++- NS_ASSERTION(oldElement == element, "Different card stored") ;
++ }
++ }
+++ return cardList->Enumerate(aCards) ;
++ }
+++
+++static nsresult ExtractUriFromCard(nsIAbCard *aCard, nsCString& aUri) {
+++ nsresult retCode = NS_OK ;
+++ nsCOMPtr<nsIRDFResource> resource (do_QueryInterface(aCard, &retCode)) ;
+++
+++ // Receiving a non-RDF card is accepted
+++ if (NS_FAILED(retCode)) { return NS_OK ; }
+++ nsXPIDLCString uri ;
+++
+++ retCode = resource->GetValue(getter_Copies(uri)) ;
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ aUri = uri.get() ;
++ return retCode ;
++ }
++
++ NS_IMETHODIMP nsAbOutlookDirectory::HasCard(nsIAbCard *aCard, PRBool *aHasCard)
++ {
++ if (!aCard || !aHasCard) { return NS_ERROR_NULL_POINTER ; }
++- nsVoidKey key (NS_STATIC_CAST(void *, aCard)) ;
+++ *aHasCard = PR_FALSE ;
+++ nsCString uri ;
+++
+++ ExtractUriFromCard(aCard, uri) ;
+++ nsCStringKey key(uri) ;
++
++ *aHasCard = mCardList.Exists(&key) ;
++ return NS_OK ;
++@@ -317,7 +372,10 @@
++ PRINTF(("Cannot delete card %s.\n", entryString.get())) ;
++ }
++ else {
++- nsVoidKey key (NS_STATIC_CAST(void *, element)) ;
+++ nsCString uri ;
+++
+++ ExtractUriFromCard(card, uri) ;
+++ nsCStringKey key(uri) ;
++
++ mCardList.Remove(&key) ;
++ if (m_IsMailList) { m_AddressList->RemoveElement(element) ; }
++@@ -386,7 +444,10 @@
++ }
++ retCode = CreateCard(aData, addedCard) ;
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
++- nsVoidKey newKey (NS_STATIC_CAST(void *, *addedCard)) ;
+++ nsCString uri ;
+++
+++ ExtractUriFromCard(*addedCard, uri) ;
+++ nsCStringKey newKey(uri) ;
++
++ mCardList.Put(&newKey, *addedCard) ;
++ if (m_IsMailList) { m_AddressList->AppendElement(*addedCard) ; }
++@@ -457,7 +518,7 @@
++ if (!mapiAddBook->IsOK()) { return NS_ERROR_FAILURE ; }
++ retCode = GetDirName(getter_Copies(name)) ;
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
++- if (!mapiAddBook->SetPropertyUString(*mMapiData, PR_DISPLAY_NAME_W, name.get())) {
+++ if (!mapiAddBook->SetPropertyUString(*mMapiData, PR_DISPLAY_NAME_A, name.get())) {
++ return NS_ERROR_FAILURE ;
++ }
++ retCode = CommitAddressList() ;
++@@ -518,6 +579,7 @@
++ {"DisplayName", PR_DISPLAY_NAME_A},
++ {"NickName", PR_NICKNAME_A},
++ {"PrimaryEmail", PR_EMAIL_ADDRESS_A},
+++ {"SecondEmail",PR_SECOND_EMAIL_ADDRESS_A},
++ {"WorkPhone", PR_BUSINESS_TELEPHONE_NUMBER_A},
++ {"HomePhone", PR_HOME_TELEPHONE_NUMBER_A},
++ {"FaxNumber", PR_BUSINESS_FAX_NUMBER_A},
++@@ -1027,7 +1089,10 @@
++
++ nsresult nsAbOutlookDirectory::OnSearchFoundCard(nsIAbCard *aCard)
++ {
++- nsVoidKey newKey (NS_STATIC_CAST(void *, aCard)) ;
+++ nsCString uri ;
+++
+++ ExtractUriFromCard(aCard, uri) ;
+++ nsCStringKey newKey(uri) ;
++ nsresult retCode = NS_OK ;
++
++ mCardList.Put(&newKey, aCard) ;
++@@ -1051,14 +1116,14 @@
++ retCode = BuildRestriction(aArguments, arguments) ;
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
++ nsCOMPtr<nsISupportsArray> resultsArray ;
+++ nsCStringArray uriArray ;
++ PRUint32 nbResults = 0 ;
++
++- retCode = GetChildCards(getter_AddRefs(resultsArray),
+++ retCode = GetChildCards(uriArray,
++ arguments.rt == RES_COMMENT ? nsnull : &arguments) ;
++ DestroyRestriction(arguments) ;
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
++- retCode = resultsArray->Count(&nbResults) ;
++- NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ nbResults = uriArray.Count() ;
++ nsCOMPtr<nsIAbDirectoryQueryResult> result ;
++ nsAbDirectoryQueryResult *newResult = nsnull ;
++
++@@ -1066,15 +1131,18 @@
++ nbResults = NS_STATIC_CAST(PRUint32, aResultLimit) ;
++ }
++ PRUint32 i = 0 ;
++- nsCOMPtr<nsISupports> element ;
++ nsCOMPtr<nsISupportsArray> propertyValues ;
++
+++ nsCAutoString uriName;
+++ nsCOMPtr <nsIAbCard> card;
+++
++ for (i = 0 ; i < nbResults ; ++ i) {
++- retCode = resultsArray->GetElementAt(i, getter_AddRefs(element)) ;
++- NS_ENSURE_SUCCESS(retCode, retCode) ;
++- nsCOMPtr<nsIAbCard> card (do_QueryInterface(element, &retCode)) ;
+++ PRBool isNewCard = PR_FALSE ;
++
+++ uriArray.CStringAt(i,uriName);
+++ retCode = BuildCardFromURI(uriName,getter_AddRefs(card), PR_FALSE, isNewCard);
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++
++ FillPropertyValues(card, aArguments, getter_AddRefs(propertyValues)) ;
++ newResult = new nsAbDirectoryQueryResult(0, aArguments,
++ nsIAbDirectoryQueryResult::queryResultMatch,
++@@ -1099,13 +1167,43 @@
++ if (!aCards) { return NS_ERROR_NULL_POINTER ; }
++ *aCards = nsnull ;
++ nsresult retCode = NS_OK ;
++- nsCOMPtr<nsISupportsArray> cards ;
+++
+++ nsCOMPtr<nsISupportsArray> cards;
+++ retCode = NS_NewISupportsArray(getter_AddRefs(cards));
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++
+++ nsCStringArray uriList;
+++ retCode = GetChildCards(uriList,aRestriction);
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++
+++ nsCAutoString uriName;
+++ nsCOMPtr <nsIAbCard> childCard;
+++ PRUint32 nbURIs = 0 ;
+++ nbURIs = uriList.Count();
+++ PRUint32 i = 0 ;
+++
+++ for (i = 0 ; i < nbURIs ; ++ i) {
+++ PRBool isNewCard = PR_FALSE ;
+++
+++ uriList.CStringAt(i,uriName);
+++ retCode = BuildCardFromURI(uriName,getter_AddRefs(childCard), PR_TRUE, isNewCard);
+++ NS_ENSURE_SUCCESS(retCode, retCode) ;
+++ cards->AppendElement(childCard);
+++ }
+++
+++ NS_IF_ADDREF(*aCards = cards);
+++ return retCode ;
+++}
+++
+++nsresult nsAbOutlookDirectory::GetChildCards(nsCStringArray& aURI,
+++ void *aRestriction)
+++{
+++ nsresult retCode = NS_OK ;
++ nsAbWinHelperGuard mapiAddBook (mAbWinType) ;
++ nsMapiEntryArray cardEntries ;
++ LPSRestriction restriction = (LPSRestriction) aRestriction ;
++
++ if (!mapiAddBook->IsOK()) { return NS_ERROR_FAILURE ; }
++- retCode = NS_NewISupportsArray(getter_AddRefs(cards)) ;
++ NS_ENSURE_SUCCESS(retCode, retCode) ;
++ if (!mapiAddBook->GetCards(*mMapiData, restriction, cardEntries)) {
++ PRINTF(("Cannot get cards.\n")) ;
++@@ -1114,22 +1212,14 @@
++ nsCAutoString entryId ;
++ nsCAutoString uriName ;
++ nsCOMPtr<nsIRDFResource> resource ;
++- nsCOMPtr <nsIAbCard> childCard;
++-
++- for (ULONG card = 0 ; card < cardEntries.mNbEntries ; ++ card) {
++- cardEntries.mEntries [card].ToString(entryId) ;
+++ aURI.Clear();
+++
+++ for (ULONG card = 0 ; card < cardEntries.GetSize() ; ++ card) {
+++ cardEntries [card].ToString(entryId) ;
++ buildAbWinUri(kOutlookCardScheme, mAbWinType, uriName) ;
++ uriName.Append(entryId) ;
++- childCard = do_CreateInstance(NS_ABOUTLOOKCARD_CONTRACTID, &retCode);
++- NS_ENSURE_SUCCESS(retCode, retCode) ;
++- resource = do_QueryInterface(childCard, &retCode) ;
++- NS_ENSURE_SUCCESS(retCode, retCode) ;
++- retCode = resource->Init(uriName.get()) ;
++- NS_ENSURE_SUCCESS(retCode, retCode) ;
++- cards->AppendElement(childCard) ;
+++ aURI.AppendCString(uriName);
++ }
++- *aCards = cards ;
++- NS_ADDREF(*aCards) ;
++ return retCode ;
++ }
++
++@@ -1153,8 +1243,8 @@
++ nsCAutoString uriName ;
++ nsCOMPtr <nsIRDFResource> resource ;
++
++- for (ULONG node = 0 ; node < nodeEntries.mNbEntries ; ++ node) {
++- nodeEntries.mEntries [node].ToString(entryId) ;
+++ for (ULONG node = 0 ; node < nodeEntries.GetSize() ; ++ node) {
+++ nodeEntries [node].ToString(entryId) ;
++ buildAbWinUri(kOutlookDirectoryScheme, mAbWinType, uriName) ;
++ uriName.Append(entryId) ;
++ retCode = gRDFService->GetResource(uriName, getter_AddRefs(resource)) ;
++@@ -1275,7 +1365,7 @@
++ // In the case of a mailing list, we cannot directly create a new card,
++ // we have to create a temporary one in a real folder (to be able to use
++ // templates) and then copy it to the mailing list.
++- if (m_IsMailList) {
+++ if (m_IsMailList && mAbWinType == nsAbWinType_OutlookExp) {
++ nsMapiEntry parentEntry ;
++ nsMapiEntry temporaryEntry ;
++
++--- misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 2004-04-17 20:32:14.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 2008-08-14 16:22:21.000000000 +0200
++@@ -46,6 +46,7 @@
++ #include "nsHashtable.h"
++
++ #include "nsISupportsArray.h"
+++#include "nsVoidArray.h"
++
++ struct nsMapiEntry ;
++
++@@ -92,6 +93,8 @@
++ protected:
++ // Retrieve hierarchy as cards, with an optional restriction
++ nsresult GetChildCards(nsISupportsArray **aCards, void *aRestriction) ;
+++ // Retrieve hierarchy as URIs, with an optional restriction
+++ nsresult GetChildCards(nsCStringArray& aURI, void *aRestriction) ;
++ // Retrieve hierarchy as directories
++ nsresult GetChildNodes(nsISupportsArray **aNodes) ;
++ // Create a new card
++@@ -103,6 +106,9 @@
++ nsresult CommitAddressList(void) ;
++ // Read MAPI repository
++ nsresult UpdateAddressList(void) ;
+++ // Search for an existing card or build a new one
+++ nsresult BuildCardFromURI(const nsCString& uriName,nsIAbCard **aNewCard,
+++ PRBool aSearchForOld, PRBool& aIsNewCard) ;
++
++ nsMapiEntry *mMapiData ;
++ // Container for the query threads
++--- misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 2005-05-07 08:11:28.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -42,6 +42,9 @@
++ #define USES_IID_IABContainer
++ #define USES_IID_IMAPITable
++ #define USES_IID_IDistList
+++#define USES_IID_IMsgStore
+++#define USES_IID_IMessage
+++#define USES_IID_IMAPIFolder
++
++ #include "nsAbWinHelper.h"
++ #include "nsMapiAddressBook.h"
++@@ -59,19 +62,6 @@
++
++ #define PRINTF(args) PR_LOG(gAbWinHelperLog, PR_LOG_DEBUG, args)
++
++-// Small utility to ensure release of all MAPI interfaces
++-template <class tInterface> struct nsMapiInterfaceWrapper
++-{
++- tInterface mInterface ;
++-
++- nsMapiInterfaceWrapper(void) : mInterface(NULL) {}
++- ~nsMapiInterfaceWrapper(void) {
++- if (mInterface != NULL) { mInterface->Release() ; }
++- }
++- operator LPUNKNOWN *(void) { return NS_REINTERPRET_CAST(LPUNKNOWN *, &mInterface) ; }
++- tInterface operator -> (void) const { return mInterface ; }
++- operator tInterface *(void) { return &mInterface ; }
++-} ;
++
++ static void assignEntryID(LPENTRYID& aTarget, LPENTRYID aSource, ULONG aByteCount)
++ {
++@@ -249,24 +239,28 @@
++ MOZ_DECL_CTOR_COUNTER(nsMapiEntryArray)
++
++ nsMapiEntryArray::nsMapiEntryArray(void)
++-: mEntries(NULL), mNbEntries(0)
++ {
++ MOZ_COUNT_CTOR(nsMapiEntryArray) ;
++ }
++
++ nsMapiEntryArray::~nsMapiEntryArray(void)
++ {
++- if (mEntries) { delete [] mEntries ; }
+++ CleanUp();
++ MOZ_COUNT_DTOR(nsMapiEntryArray) ;
++ }
++-
+++void nsMapiEntryArray::AddItem(nsMapiEntry * aEntries)
+++{
+++ m_array.AppendElement(aEntries);
+++}
++ void nsMapiEntryArray::CleanUp(void)
++ {
++- if (mEntries != NULL) {
++- delete [] mEntries ;
++- mEntries = NULL ;
++- mNbEntries = 0 ;
+++ nsMapiEntry *pEntries;
+++ for (int i = 0; i < m_array.Count(); i++)
+++ {
+++ pEntries = (nsMapiEntry *)m_array.ElementAt( i);
+++ delete pEntries;
++ }
+++ m_array.Clear();
++ }
++
++ MOZ_DECL_CTOR_COUNTER(nsAbWinHelper)
++@@ -280,100 +274,55 @@
++ // same protection (MAPI is supposed to be thread-safe).
++ PRLock *nsAbWinHelper::mMutex = PR_NewLock() ;
++
+++int nsAbWinHelper::m_clients = 0;
+++
+++PRUnichar * nsAbWinHelper::m_pUniBuff = NULL;
+++int nsAbWinHelper::m_uniBuffLen = 0;
+++char * nsAbWinHelper::m_pCStrBuff = NULL;
+++int nsAbWinHelper::m_cstrBuffLen = 0;
+++
++ nsAbWinHelper::nsAbWinHelper(void)
++-: mAddressBook(NULL), mLastError(S_OK)
+++:mLastError(S_OK)
++ {
++ MOZ_COUNT_CTOR(nsAbWinHelper) ;
+++ m_clients++;
++ }
++
++ nsAbWinHelper::~nsAbWinHelper(void)
++ {
++ MOZ_COUNT_DTOR(nsAbWinHelper) ;
++-}
++-
++-BOOL nsAbWinHelper::GetFolders(nsMapiEntryArray& aFolders)
+++ m_clients--;
+++ if (!m_clients)
++ {
++- aFolders.CleanUp() ;
++- nsMapiInterfaceWrapper<LPABCONT> rootFolder ;
++- nsMapiInterfaceWrapper<LPMAPITABLE> folders ;
++- ULONG objType = 0 ;
++- ULONG rowCount = 0 ;
++- SRestriction restriction ;
++- SPropTagArray folderColumns ;
++-
++- mLastError = mAddressBook->OpenEntry(0, NULL, NULL, 0, &objType,
++- rootFolder) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot open root %08x.\n", mLastError)) ;
++- return FALSE ;
+++ delete [] m_pUniBuff;
+++ m_pUniBuff = NULL;
+++ m_uniBuffLen = 0;
+++ delete [] m_pCStrBuff;
+++ m_pCStrBuff = NULL;
+++ m_cstrBuffLen = 0;
++ }
++- mLastError = rootFolder->GetHierarchyTable(0, folders) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot get hierarchy %08x.\n", mLastError)) ;
++- return FALSE ;
++ }
++- // We only take into account modifiable containers,
++- // otherwise, we end up with all the directory services...
++- restriction.rt = RES_BITMASK ;
++- restriction.res.resBitMask.ulPropTag = PR_CONTAINER_FLAGS ;
++- restriction.res.resBitMask.relBMR = BMR_NEZ ;
++- restriction.res.resBitMask.ulMask = AB_MODIFIABLE ;
++- mLastError = folders->Restrict(&restriction, 0) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot restrict table %08x.\n", mLastError)) ;
++- }
++- folderColumns.cValues = 1 ;
++- folderColumns.aulPropTag [0] = PR_ENTRYID ;
++- mLastError = folders->SetColumns(&folderColumns, 0) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot set columns %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- mLastError = folders->GetRowCount(0, &rowCount) ;
++- if (HR_SUCCEEDED(mLastError)) {
++- aFolders.mEntries = new nsMapiEntry [rowCount] ;
++- aFolders.mNbEntries = 0 ;
++- do {
++- LPSRowSet rowSet = NULL ;
++-
++- rowCount = 0 ;
++- mLastError = folders->QueryRows(1, 0, &rowSet) ;
++- if (HR_SUCCEEDED(mLastError)) {
++- rowCount = rowSet->cRows ;
++- if (rowCount > 0) {
++- nsMapiEntry& current = aFolders.mEntries [aFolders.mNbEntries ++] ;
++- SPropValue& currentValue = rowSet->aRow->lpProps [0] ;
++-
++- current.Assign(currentValue.Value.bin.cb,
++- NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ;
++- }
++- MyFreeProws(rowSet) ;
++- }
++- else {
++- PRINTF(("Cannot query rows %08x.\n", mLastError)) ;
++- }
++- } while (rowCount > 0) ;
++- }
++- return HR_SUCCEEDED(mLastError) ;
++-}
+++
++
++ BOOL nsAbWinHelper::GetCards(const nsMapiEntry& aParent, LPSRestriction aRestriction,
++ nsMapiEntryArray& aCards)
++ {
++ aCards.CleanUp() ;
++- return GetContents(aParent, aRestriction, &aCards.mEntries, aCards.mNbEntries, 0) ;
+++ return GetContents(aParent, aRestriction, &aCards, 0) ;
++ }
++
++ BOOL nsAbWinHelper::GetNodes(const nsMapiEntry& aParent, nsMapiEntryArray& aNodes)
++ {
++ aNodes.CleanUp() ;
++- return GetContents(aParent, NULL, &aNodes.mEntries, aNodes.mNbEntries, MAPI_DISTLIST) ;
+++ return GetContents(aParent, NULL, &aNodes, MAPI_DISTLIST) ;
++ }
++
++ BOOL nsAbWinHelper::GetCardsCount(const nsMapiEntry& aParent, ULONG& aNbCards)
++ {
++- aNbCards = 0 ;
++- return GetContents(aParent, NULL, NULL, aNbCards, 0) ;
+++ nsMapiEntryArray aCards;
+++ BOOL ret=GetContents(aParent, NULL, &aCards, 0) ;
+++ aNbCards=aCards.GetSize();
+++ return ret;
++ }
++
++ BOOL nsAbWinHelper::GetPropertyString(const nsMapiEntry& aObject,
++@@ -390,7 +339,7 @@
++ aName = values->Value.lpszA ;
++ }
++ else if (PROP_TYPE(values->ulPropTag) == PT_UNICODE) {
++- aName.AssignWithConversion(values->Value.lpszW) ;
+++ UnicodeToCStr(values->Value.lpszW,aName) ;
++ }
++ }
++ FreeBuffer(values) ;
++@@ -410,7 +359,7 @@
++ aName = values->Value.lpszW ;
++ }
++ else if (PROP_TYPE(values->ulPropTag) == PT_STRING8) {
++- aName.AssignWithConversion(values->Value.lpszA) ;
+++ CStrToUnicode(values->Value.lpszA,aName) ;
++ }
++ }
++ FreeBuffer(values) ;
++@@ -431,16 +380,22 @@
++ ULONG i = 0 ;
++
++ for (i = 0 ; i < valueCount ; ++ i) {
++- if (PROP_ID(values [i].ulPropTag) == PROP_ID(aPropertyTags [i])) {
+++ if (PROP_TYPE( values [i].ulPropTag) != PT_ERROR && values [i].Value.l != MAPI_E_NOT_FOUND){
++ if (PROP_TYPE(values [i].ulPropTag) == PT_STRING8) {
++ nsAutoString temp ;
++
++- temp.AssignWithConversion (values [i].Value.lpszA) ;
+++ CStrToUnicode(values [i].Value.lpszA,temp) ;
++ aNames.AppendString(temp) ;
++ }
++ else if (PROP_TYPE(values [i].ulPropTag) == PT_UNICODE) {
++ aNames.AppendString(nsAutoString (values [i].Value.lpszW)) ;
++ }
+++ else if (aPropertyTags [i] == PR_EMAIL_ADDRESS_A) {
+++ nsAutoString temp ;
+++
+++ CStrToUnicode (values [i].Value.lpszA,temp) ;
+++ aNames.AppendString(temp) ;
+++ }
++ else {
++ aNames.AppendString(nsAutoString((const PRUnichar *) "")) ;
++ }
++@@ -466,7 +421,6 @@
++ if (!GetMAPIProperties(aObject, &aPropertyTag, 1, values, valueCount)) { return FALSE ; }
++ if (valueCount == 1 && values != NULL && PROP_TYPE(values->ulPropTag) == PT_SYSTIME) {
++ SYSTEMTIME readableTime ;
++-
++ if (FileTimeToSystemTime(&values->Value.ft, &readableTime)) {
++ aYear = readableTime.wYear ;
++ aMonth = readableTime.wMonth ;
++@@ -518,7 +472,7 @@
++ nsMapiInterfaceWrapper<LPMAPIPROP> subObject ;
++ ULONG objType = 0 ;
++
++- mLastError = mAddressBook->OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
+++ mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
++ &IID_IMAPIContainer, 0, &objType,
++ container) ;
++ if (HR_FAILED(mLastError)) {
++@@ -537,7 +491,7 @@
++ SBinary entry ;
++ SBinaryArray entryArray ;
++
++- mLastError = mAddressBook->OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
+++ mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
++ &IID_IABContainer, MAPI_MODIFY, &objType,
++ container) ;
++ if (HR_FAILED(mLastError)) {
++@@ -567,14 +521,15 @@
++ value.Value.lpszW = NS_CONST_CAST(WCHAR *, aValue) ;
++ }
++ else if (PROP_TYPE(aPropertyTag) == PT_STRING8) {
++- alternativeValue.AssignWithConversion(aValue) ;
+++ UnicodeToCStr(aValue,alternativeValue) ;
++ value.Value.lpszA = NS_CONST_CAST(char *, alternativeValue.get()) ;
++ }
++ else {
++ PRINTF(("Property %08x is not a string.\n", aPropertyTag)) ;
++ return TRUE ;
++ }
++- return SetMAPIProperties(aObject, 1, &value) ;
+++ LPSPropValue values=&value;
+++ return SetMAPIProperties(aObject, 1, values) ;
++ }
++
++ BOOL nsAbWinHelper::SetPropertiesUString(const nsMapiEntry& aObject, const ULONG *aPropertiesTag,
++@@ -595,7 +550,7 @@
++ values [currentValue ++].Value.lpszW = NS_CONST_CAST(WCHAR *, aValues [i].get()) ;
++ }
++ else if (PROP_TYPE(aPropertiesTag [i]) == PT_STRING8) {
++- alternativeValue.AssignWithConversion(aValues [i].get()) ;
+++ UnicodeToCStr(aValues [i].get(),alternativeValue) ;
++ char *av = nsCRT::strdup(alternativeValue.get()) ;
++ if (!av) {
++ retCode = FALSE ;
++@@ -633,7 +588,8 @@
++ readableTime.wSecond = 0 ;
++ readableTime.wMilliseconds = 0 ;
++ if (SystemTimeToFileTime(&readableTime, &value.Value.ft)) {
++- return SetMAPIProperties(aObject, 1, &value) ;
+++ LPSPropValue values=&value;
+++ return SetMAPIProperties(aObject, 1, values) ;
++ }
++ return TRUE ;
++ }
++@@ -645,7 +601,7 @@
++ nsMapiInterfaceWrapper<LPABCONT> container ;
++ ULONG objType = 0 ;
++
++- mLastError = mAddressBook->OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId,
++ &IID_IABContainer, MAPI_MODIFY, &objType,
++ container) ;
++ if (HR_FAILED(mLastError)) {
++@@ -708,7 +664,7 @@
++ nsMapiInterfaceWrapper<LPABCONT> container ;
++ ULONG objType = 0 ;
++
++- mLastError = mAddressBook->OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId,
++ &IID_IABContainer, MAPI_MODIFY, &objType,
++ container) ;
++ if (HR_FAILED(mLastError)) {
++@@ -773,7 +729,7 @@
++ nsMapiInterfaceWrapper<LPABCONT> container ;
++ ULONG objType = 0 ;
++
++- mLastError = mAddressBook->OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
+++ mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
++ &IID_IABContainer, MAPI_MODIFY, &objType,
++ container) ;
++ if (HR_FAILED(mLastError)) {
++@@ -810,194 +766,77 @@
++ return TRUE ;
++ }
++
++-BOOL nsAbWinHelper::GetDefaultContainer(nsMapiEntry& aContainer)
++-{
++- LPENTRYID entryId = NULL ;
++- ULONG byteCount = 0 ;
++-
++- mLastError = mAddressBook->GetPAB(&byteCount, &entryId) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot get PAB %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- aContainer.Assign(byteCount, entryId) ;
++- FreeBuffer(entryId) ;
++- return TRUE ;
++-}
++
++-enum
++-{
++- ContentsColumnEntryId = 0,
++- ContentsColumnObjectType,
++- ContentsColumnsSize
++-} ;
++
++-static const SizedSPropTagArray(ContentsColumnsSize, ContentsColumns) =
++-{
++- ContentsColumnsSize,
++- {
++- PR_ENTRYID,
++- PR_OBJECT_TYPE
++- }
++-} ;
++
++-BOOL nsAbWinHelper::GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
++- nsMapiEntry **aList, ULONG& aNbElements, ULONG aMapiType)
+++void nsAbWinHelper::MyFreeProws(LPSRowSet aRowset)
++ {
++- if (aList != NULL) { *aList = NULL ; }
++- aNbElements = 0 ;
++- nsMapiInterfaceWrapper<LPMAPICONTAINER> parent ;
++- nsMapiInterfaceWrapper<LPMAPITABLE> contents ;
++- ULONG objType = 0 ;
++- ULONG rowCount = 0 ;
+++ if (aRowset == NULL) { return ; }
+++ ULONG i = 0 ;
++
++- mLastError = mAddressBook->OpenEntry(aParent.mByteCount, aParent.mEntryId,
++- &IID_IMAPIContainer, 0, &objType,
++- parent) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot open parent %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- // Here, flags for WAB and MAPI could be different, so this works
++- // only as long as we don't want to use any flag in GetContentsTable
++- mLastError = parent->GetContentsTable(0, contents) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot get contents %08x.\n", mLastError)) ;
++- return FALSE ;
+++ for (i = 0 ; i < aRowset->cRows ; ++ i) {
+++ FreeBuffer(aRowset->aRow [i].lpProps) ;
++ }
++- if (aRestriction != NULL) {
++- mLastError = contents->Restrict(aRestriction, 0) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot set restriction %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- }
++- mLastError = contents->SetColumns((LPSPropTagArray) &ContentsColumns, 0) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot set columns %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- mLastError = contents->GetRowCount(0, &rowCount) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot get result count %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- if (aList != NULL) { *aList = new nsMapiEntry [rowCount] ; }
++- aNbElements = 0 ;
++- do {
++- LPSRowSet rowSet = NULL ;
++-
++- rowCount = 0 ;
++- mLastError = contents->QueryRows(1, 0, &rowSet) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot query rows %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- rowCount = rowSet->cRows ;
++- if (rowCount > 0 &&
++- (aMapiType == 0 ||
++- rowSet->aRow->lpProps[ContentsColumnObjectType].Value.ul == aMapiType)) {
++- if (aList != NULL) {
++- nsMapiEntry& current = (*aList) [aNbElements] ;
++- SPropValue& currentValue = rowSet->aRow->lpProps[ContentsColumnEntryId] ;
++-
++- current.Assign(currentValue.Value.bin.cb,
++- NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ;
+++ FreeBuffer(aRowset) ;
+++ }
+++void nsAbWinHelper::CStrToUnicode( const char *pStr, nsString& result)
+++{
+++ result.Truncate( 0);
+++ int wLen = MultiByteToWideChar( CP_ACP, 0, pStr, -1, m_pUniBuff, 0);
+++ if (wLen >= m_uniBuffLen)
+++ {
+++ delete [] m_pUniBuff;
+++ m_pUniBuff = new PRUnichar[wLen + 64];
+++ m_uniBuffLen = wLen + 64;
++ }
++- ++ aNbElements ;
+++ if (wLen)
+++ {
+++ MultiByteToWideChar( CP_ACP, 0, pStr, -1, m_pUniBuff, m_uniBuffLen);
+++ result = m_pUniBuff;
++ }
++- MyFreeProws(rowSet) ;
++- } while (rowCount > 0) ;
++- return TRUE ;
++ }
++-
++-BOOL nsAbWinHelper::GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags,
++- ULONG aNbProperties, LPSPropValue& aValue,
++- ULONG& aValueCount)
+++void nsAbWinHelper::UnicodeToCStr( const PRUnichar *pUStr,nsCString& result)
++ {
++- nsMapiInterfaceWrapper<LPMAPIPROP> object ;
++- ULONG objType = 0 ;
++- LPSPropTagArray properties = NULL ;
++- ULONG i = 0 ;
++-
++- mLastError = mAddressBook->OpenEntry(aObject.mByteCount, aObject.mEntryId,
++- &IID_IMAPIProp, 0, &objType,
++- object) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
++- return FALSE ;
+++ result.Truncate( 0);
+++ int cLen = WideCharToMultiByte( CP_ACP, 0, pUStr, -1, m_pCStrBuff, 0,NULL,NULL);
+++ if (cLen >= m_cstrBuffLen) {
+++ if (m_pCStrBuff)
+++ delete [] m_pCStrBuff;
+++ m_pCStrBuff = new char[cLen + 64];
+++ m_cstrBuffLen = cLen + 64;
++ }
++- AllocateBuffer(CbNewSPropTagArray(aNbProperties),
++- NS_REINTERPRET_CAST(void **, &properties)) ;
++- properties->cValues = aNbProperties ;
++- for (i = 0 ; i < aNbProperties ; ++ i) {
++- properties->aulPropTag [i] = aPropertyTags [i] ;
++- }
++- mLastError = object->GetProps(properties, 0, &aValueCount, &aValue) ;
++- FreeBuffer(properties) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot get props %08x.\n", mLastError)) ;
+++ if (cLen) {
+++ WideCharToMultiByte( CP_ACP, 0, pUStr, -1, m_pCStrBuff, m_cstrBuffLen,NULL,NULL);
+++ result = m_pCStrBuff;
++ }
++- return HR_SUCCEEDED(mLastError) ;
++ }
++
++-BOOL nsAbWinHelper::SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties,
++- const LPSPropValue& aValues)
++-{
++- nsMapiInterfaceWrapper<LPMAPIPROP> object ;
++- ULONG objType = 0 ;
++- LPSPropProblemArray problems = NULL ;
+++static nsAbWinHelper *getOutlookAddressBook(void) {
+++ static nsMapiAddressBook *addressBook = NULL ;
++
++- mLastError = mAddressBook->OpenEntry(aObject.mByteCount, aObject.mEntryId,
++- &IID_IMAPIProp, MAPI_MODIFY, &objType,
++- object) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- mLastError = object->SetProps(aNbProperties, aValues, &problems) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot update the object %08x.\n", mLastError)) ;
++- return FALSE ;
++- }
++- if (problems != NULL) {
++- for (ULONG i = 0 ; i < problems->cProblem ; ++ i) {
++- PRINTF(("Problem %d: index %d code %08x.\n", i,
++- problems->aProblem [i].ulIndex,
++- problems->aProblem [i].scode)) ;
++- }
++- }
++- mLastError = object->SaveChanges(0) ;
++- if (HR_FAILED(mLastError)) {
++- PRINTF(("Cannot commit changes %08x.\n", mLastError)) ;
++- }
++- return HR_SUCCEEDED(mLastError) ;
+++ if (addressBook == NULL) { addressBook = new nsMapiAddressBook ; }
+++ return addressBook ;
++ }
++
++-void nsAbWinHelper::MyFreeProws(LPSRowSet aRowset)
++-{
++- if (aRowset == NULL) { return ; }
++- ULONG i = 0 ;
+++static nsAbWinHelper *getOutlookExpAddressBook(void) {
+++ static nsWabAddressBook *addressBook = NULL ;
++
++- for (i = 0 ; i < aRowset->cRows ; ++ i) {
++- FreeBuffer(aRowset->aRow [i].lpProps) ;
++- }
++- FreeBuffer(aRowset) ;
+++ if (addressBook == NULL) { addressBook = new nsWabAddressBook ; }
+++ return addressBook ;
++ }
++
++ nsAbWinHelperGuard::nsAbWinHelperGuard(PRUint32 aType)
++ : mHelper(NULL)
++ {
++ switch(aType) {
++- case nsAbWinType_Outlook: mHelper = new nsMapiAddressBook ; break ;
++- case nsAbWinType_OutlookExp: mHelper = new nsWabAddressBook ; break ;
+++ case nsAbWinType_Outlook: mHelper = getOutlookAddressBook() ; break ;
+++ case nsAbWinType_OutlookExp: mHelper = getOutlookExpAddressBook() ; break ;
++ default: break ;
++ }
++ }
++
++ nsAbWinHelperGuard::~nsAbWinHelperGuard(void)
++ {
++- delete mHelper ;
++ }
++
++ const char *kOutlookDirectoryScheme = "moz-aboutlookdirectory://" ;
++--- misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 2004-04-17 20:32:14.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 2008-08-14 16:22:21.000000000 +0200
++@@ -45,6 +45,24 @@
++ #include "nsVoidArray.h"
++ #include "nsXPIDLString.h"
++
+++#define PR_SECOND_EMAIL_ADDRESS_A 0x8033001E
+++#define PR_SCREEN_NAME_A 0x805B001E
+++
+++
+++// Small utility to ensure release of all MAPI interfaces
+++template <class tInterface> struct nsMapiInterfaceWrapper
+++{
+++ tInterface mInterface ;
+++
+++ nsMapiInterfaceWrapper(void) : mInterface(NULL) {}
+++ ~nsMapiInterfaceWrapper(void) {
+++ if (mInterface ) { mInterface->Release() ; }
+++ }
+++ operator LPUNKNOWN *(void) { return NS_REINTERPRET_CAST(LPUNKNOWN *, &mInterface) ; }
+++ tInterface operator -> (void) const { return mInterface ; }
+++ operator tInterface *(void) { return &mInterface ; }
+++} ;
+++
++ struct nsMapiEntry
++ {
++ ULONG mByteCount ;
++@@ -62,14 +80,28 @@
++
++ struct nsMapiEntryArray
++ {
++- nsMapiEntry *mEntries ;
++- ULONG mNbEntries ;
++
++ nsMapiEntryArray(void) ;
++ ~nsMapiEntryArray(void) ;
++
++- const nsMapiEntry& operator [] (int aIndex) const { return mEntries [aIndex] ; }
+++ void AddItem(nsMapiEntry * aEntries);
+++ void AddItem( ULONG mByteCount , LPENTRYID mEntryId )
+++ {
+++ nsMapiEntry * aEntries=new nsMapiEntry();
+++ aEntries->Assign(mByteCount,mEntryId);
+++ AddItem(aEntries);
+++ }
+++
+++ ULONG GetSize( void) { return( m_array.Count());}
+++ nsMapiEntry& operator [] (int aIndex) { return *(nsMapiEntry*)m_array.ElementAt(aIndex); }
+++ nsMapiEntry* ElementAt(int aIndex) { return (nsMapiEntry*)m_array.ElementAt(aIndex); }
++ void CleanUp(void) ;
+++ void Remove(nsMapiEntry * aEntries){ m_array.RemoveElement(aEntries); }
+++ void Remove(int index){ m_array.RemoveElementAt(index); }
+++ ULONG IndexOf(nsMapiEntry * aEntries){return m_array.IndexOf(aEntries);};
+++private:
+++ nsVoidArray m_array;
+++
++ } ;
++
++ class nsAbWinHelper
++@@ -79,7 +111,7 @@
++ virtual ~nsAbWinHelper(void) ;
++
++ // Get the top address books
++- BOOL GetFolders(nsMapiEntryArray& aFolders) ;
+++ virtual BOOL GetFolders(nsMapiEntryArray& aFolders) =0;
++ // Get a list of entries for cards/mailing lists in a folder/mailing list
++ BOOL GetCards(const nsMapiEntry& aParent, LPSRestriction aRestriction,
++ nsMapiEntryArray& aCards) ;
++@@ -97,18 +129,14 @@
++ BOOL GetPropertiesUString(const nsMapiEntry& aObject, const ULONG *aPropertiesTag,
++ ULONG aNbProperties, nsStringArray& aValues) ;
++ // Get the value of a MAPI property of type SYSTIME
++- BOOL GetPropertyDate(const nsMapiEntry& aObject, ULONG aPropertyTag,
+++ virtual BOOL GetPropertyDate(const nsMapiEntry& aObject, ULONG aPropertyTag,
++ WORD& aYear, WORD& aMonth, WORD& aDay) ;
++- // Get the value of a MAPI property of type LONG
++- BOOL GetPropertyLong(const nsMapiEntry& aObject, ULONG aPropertyTag, ULONG& aValue) ;
++ // Get the value of a MAPI property of type BIN
++ BOOL GetPropertyBin(const nsMapiEntry& aObject, ULONG aPropertyTag, nsMapiEntry& aValue) ;
++ // Tests if a container contains an entry
++ BOOL TestOpenEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aEntry) ;
++- // Delete an entry in the address book
++- BOOL DeleteEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aEntry) ;
++ // Set the value of a MAPI property of type string in unicode
++- BOOL SetPropertyUString (const nsMapiEntry& aObject, ULONG aPropertyTag,
+++ virtual BOOL SetPropertyUString (const nsMapiEntry& aObject, ULONG aPropertyTag,
++ const PRUnichar *aValue) ;
++ // Same as previous, but with a bunch of properties in one call
++ BOOL SetPropertiesUString(const nsMapiEntry& aObject, const ULONG *aPropertiesTag,
++@@ -117,32 +145,44 @@
++ BOOL SetPropertyDate(const nsMapiEntry& aObject, ULONG aPropertyTag,
++ WORD aYear, WORD aMonth, WORD aDay) ;
++ // Create entry in the address book
++- BOOL CreateEntry(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry) ;
+++ virtual BOOL CreateEntry(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry) ;
+++ // Delete an entry in the address book
+++ virtual BOOL DeleteEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aEntry) ;
++ // Create a distribution list in the address book
++- BOOL CreateDistList(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry) ;
+++ virtual BOOL CreateDistList(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry) ;
++ // Copy an existing entry in the address book
++- BOOL CopyEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aSource, nsMapiEntry& aTarget) ;
+++ virtual BOOL CopyEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aSource, nsMapiEntry& aTarget) ;
++ // Get a default address book container
++- BOOL GetDefaultContainer(nsMapiEntry& aContainer) ;
+++ virtual BOOL GetDefaultContainer(nsMapiEntry& aContainer) =0;
++ // Is the helper correctly initialised?
++- BOOL IsOK(void) const { return mAddressBook != NULL ; }
+++ virtual BOOL IsOK(void) =0;/*const { return mAddressBook != NULL ; }*/
+++
+++ // Get the value of a MAPI property of type LONG
+++ virtual BOOL GetPropertyLong(const nsMapiEntry& aObject, ULONG aPropertyTag, ULONG& aValue) ;
++
++ protected:
++ HRESULT mLastError ;
++- LPADRBOOK mAddressBook ;
++ static PRUint32 mEntryCounter ;
++ static PRLock *mMutex ;
++
+++ virtual HRESULT OpenEntry(ULONG cbEntryID,
+++ LPENTRYID lpEntryID,
+++ LPCIID lpInterface,
+++ ULONG ulFlags,
+++ ULONG FAR * lpulObjType,
+++ LPUNKNOWN FAR * lppUnk
+++ ) = 0;
+++
++ // Retrieve the contents of a container, with an optional restriction
++- BOOL GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
++- nsMapiEntry **aList, ULONG &aNbElements, ULONG aMapiType) ;
+++ virtual BOOL GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
+++ nsMapiEntryArray *aList, ULONG aMapiType) =0;
++ // Retrieve the values of a set of properties on a MAPI object
++- BOOL GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags,
+++ virtual BOOL GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags,
++ ULONG aNbProperties,
++- LPSPropValue& aValues, ULONG& aValueCount) ;
+++ LPSPropValue& aValues, ULONG& aValueCount) =0;
++ // Set the values of a set of properties on a MAPI object
++- BOOL SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties,
++- const LPSPropValue& aValues) ;
+++ virtual BOOL SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties,
+++ LPSPropValue& aValues) =0;
++ // Clean-up a rowset returned by QueryRows
++ void MyFreeProws(LPSRowSet aSet) ;
++ // Allocation of a buffer for transmission to interfaces
++@@ -150,7 +190,16 @@
++ // Destruction of a buffer provided by the interfaces
++ virtual void FreeBuffer(LPVOID aBuffer) = 0 ;
++
+++ static void CStrToUnicode( const char *pStr, nsString& result);
+++ static void UnicodeToCStr( const PRUnichar *pStr, nsCString& result);
+++
++ private:
+++ static int m_clients;
+++ static PRUnichar * m_pUniBuff;
+++ static int m_uniBuffLen;
+++ static char * m_pCStrBuff;
+++ static int m_cstrBuffLen;
+++
++ } ;
++
++ enum nsAbWinType
++@@ -168,6 +217,7 @@
++
++ nsAbWinHelper *operator ->(void) { return mHelper ; }
++
+++ static void FreeWinAbLibrarys();
++ private:
++ nsAbWinHelper *mHelper ;
++ } ;
++--- misc/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 2006-12-22 14:51:39.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 2008-08-20 15:09:45.000000000 +0200
++@@ -100,6 +100,9 @@
++
++ static const char kMailListAddressFormat[] = "Address%d";
++
+++extern int getMD5sum(const char * fileName,char * sum);
+++extern int testMD5sum(const char * fileName,char * sum);
+++
++ static NS_DEFINE_CID(kCMorkFactory, NS_MORK_CID);
++
++ nsAddrDatabase::nsAddrDatabase()
++@@ -171,6 +174,7 @@
++ m_LastRecordKey(0),
++ m_dbDirectory(nsnull)
++ {
+++ memset(m_dbMd5Sum,0,33);
++ }
++
++ nsAddrDatabase::~nsAddrDatabase()
++@@ -790,7 +794,11 @@
++ if (NS_FAILED(ret))
++ ret = NS_ERROR_FILE_ACCESS_DENIED;
++ }
++-
+++
+++ ret = getMD5sum(nativeFileName,m_dbMd5Sum);
+++ if (ret == 1)
+++ ret = NS_ERROR_FAILURE;
+++
++ nsCRT::free(nativeFileName);
++
++ if (NS_SUCCEEDED(ret) && thumb)
++@@ -883,6 +891,17 @@
++ {
++ nsresult err = NS_OK;
++ nsIMdbThumb *commitThumb = nsnull;
+++
+++ const char *pFilename = m_dbName.GetCString(); /* do not free */
+++ char *nativeFileName = nsCRT::strdup(pFilename);
+++#if defined(XP_PC) || defined(XP_MAC)
+++ UnixToNative(nativeFileName);
+++#endif
+++ if (testMD5sum(nativeFileName,m_dbMd5Sum))
+++ {
+++ nsCRT::free(nativeFileName);
+++ return NS_ERROR_FILE_ACCESS_DENIED;
+++ }
++
++ if (commitType == nsAddrDBCommitType::kLargeCommit ||
++ commitType == nsAddrDBCommitType::kSessionCommit)
++@@ -936,6 +955,10 @@
++ // ### do something with error, but clear it now because mork errors out on commits.
++ if (m_mdbEnv)
++ m_mdbEnv->ClearErrors();
+++ if (NS_SUCCEEDED(err) && getMD5sum(nativeFileName,m_dbMd5Sum))
+++ err = NS_ERROR_FAILURE;
+++ nsCRT::free(nativeFileName);
+++
++ return err;
++ }
++
++--- misc/mozilla/mailnews/addrbook/src/nsAddrDatabase.h 2006-12-22 14:51:39.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.h 2008-08-14 16:29:20.000000000 +0200
++@@ -394,6 +394,7 @@
++ nsIMdbTable *m_mdbPabTable;
++ nsIMdbTable *m_mdbDeletedCardsTable;
++ nsFileSpec m_dbName;
+++ char m_dbMd5Sum[33];
++ PRBool m_mdbTokensInitialized;
++ nsVoidArray /*<nsIAddrDBListener>*/ *m_ChangeListeners;
++
++--- misc/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp 2004-11-05 16:13:32.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -40,6 +40,22 @@
++
++ #include "prlog.h"
++
+++static char * stristr(const char *big, const char *little)
+++{
+++ PRUint32 len;
+++
+++ if (!big || !little || !*big || !*little)
+++ return 0;
+++ len = strlen(little);
+++
+++ for( ; *big; big++ )
+++ if(!_strnicmp (big, little, 1) && ! _strnicmp (big, little, len) )
+++ return (char *)big;
+++
+++ return (char *)0;
+++
+++}
+++
++ #ifdef PR_LOGGING
++ static PRLogModuleInfo* gMapiAddressBookLog
++ = PR_NewLogModule("nsMapiAddressBookLog");
++@@ -47,6 +63,60 @@
++
++ #define PRINTF(args) PR_LOG(gMapiAddressBookLog, PR_LOG_DEBUG, args)
++
+++#define OUTLOOK_EMAIL_DIAPLAY_MAPI_ID 0x00008005 //use to get and set display
+++#define OUTLOOK_EMAIL1_MAPI_ID 0x00008084 //use to get and set primary email address
+++#define OUTLOOK_EMAIL2_MAPI_ID 0x00008094 //use to get and set second email address
+++#define OUTLOOK_EMAIL_SCREEN_NAME 0x8061001E //use to get and set screen name
+++#define OUTLOOK_EMAIL_ORGID 0x00008085 //use to get orginal entryid to add to distlist
+++#define OUTLOOK_EMAIL_LIST1 0x00008054 //use to get distlist table
+++#define OUTLOOK_EMAIL_LIST2 0x00008055 //use to set distlist table
+++
+++static const TagMap TagMaps[]={
+++ {PR_DISPLAY_NAME_A, OUTLOOK_EMAIL_DIAPLAY_MAPI_ID, PT_STRING8},
+++ {PR_EMAIL_ADDRESS_A, OUTLOOK_EMAIL1_MAPI_ID, PT_STRING8},
+++ {PR_SECOND_EMAIL_ADDRESS_A, OUTLOOK_EMAIL2_MAPI_ID, PT_STRING8},
+++ {PR_SCREEN_NAME_A, OUTLOOK_EMAIL_SCREEN_NAME, PT_STRING8}};
+++
+++enum {
+++ ieidPR_ENTRYID = 0,
+++ ieidPR_OBJECT_TYPE,
+++ ieidPR_DISPLAY_NAME,
+++ ieidPR_MESSAGE_CLASS,
+++ ieidPR_STORE_ENTRYID,
+++ ieidPR_MESSAGE_RECIPIENTS,
+++ ieidMax
+++};
+++
+++static const SizedSPropTagArray(ieidMax, ptaEid)=
+++{
+++ ieidMax,
+++ {
+++ PR_ENTRYID,
+++ PR_OBJECT_TYPE,
+++ PR_DISPLAY_NAME,
+++ PR_MESSAGE_CLASS,
+++ PR_STORE_ENTRYID,
+++ PR_MESSAGE_RECIPIENTS
+++ }
+++};
+++
+++enum
+++{
+++ ContentsColumnEntryId = 0,
+++ ContentsColumnObjectType,
+++ ContentsColumnMessageClass,
+++ ContentsColumnsSize
+++} ;
+++
+++static const SizedSPropTagArray(ContentsColumnsSize, ContentsColumns) =
+++{
+++ ContentsColumnsSize,
+++ {
+++ PR_ENTRYID,
+++ PR_OBJECT_TYPE,
+++ PR_MESSAGE_CLASS
+++ }
+++} ;
++
++ HMODULE nsMapiAddressBook::mLibrary = NULL ;
++ PRInt32 nsMapiAddressBook::mLibUsage = 0 ;
++@@ -59,7 +129,7 @@
++ BOOL nsMapiAddressBook::mInitialized = FALSE ;
++ BOOL nsMapiAddressBook::mLogonDone = FALSE ;
++ LPMAPISESSION nsMapiAddressBook::mRootSession = NULL ;
++-LPADRBOOK nsMapiAddressBook::mRootBook = NULL ;
+++#define MAPI_NO_COINIT 8
++
++ BOOL nsMapiAddressBook::LoadMapiLibrary(void)
++ {
++@@ -91,7 +161,7 @@
++ mMAPILogonEx = NS_REINTERPRET_CAST(LPMAPILOGONEX,
++ GetProcAddress(mLibrary, "MAPILogonEx")) ;
++ if (!mMAPILogonEx) { return FALSE ; }
++- MAPIINIT_0 mapiInit = { MAPI_INIT_VERSION, MAPI_MULTITHREAD_NOTIFICATIONS } ;
+++ MAPIINIT_0 mapiInit = { MAPI_INIT_VERSION, MAPI_MULTITHREAD_NOTIFICATIONS | MAPI_NO_COINIT } ;
++ HRESULT retCode = mMAPIInitialize(&mapiInit) ;
++
++ if (HR_FAILED(retCode)) {
++@@ -105,22 +175,19 @@
++ MAPI_NEW_SESSION,
++ &mRootSession) ;
++ if (HR_FAILED(retCode)) {
++- PRINTF(("Cannot logon to MAPI %08x.\n", retCode)) ; return FALSE ;
+++ PRINTF(("Cannot logon to MAPI %08x.\n", retCode)) ;
+++ return FALSE ;
++ }
++ mLogonDone = TRUE ;
++- retCode = mRootSession->OpenAddressBook(0, NULL, 0, &mRootBook) ;
++- if (HR_FAILED(retCode)) {
++- PRINTF(("Cannot open MAPI address book %08x.\n", retCode)) ;
++- }
+++
++ return HR_SUCCEEDED(retCode) ;
++ }
++
++ void nsMapiAddressBook::FreeMapiLibrary(void)
++ {
++ if (mLibrary) {
++- if (-- mLibUsage == 0) {
+++ if (--mLibUsage < 0) {
++ {
++- if (mRootBook) { mRootBook->Release() ; }
++ if (mRootSession) {
++ if (mLogonDone) {
++ mRootSession->Logoff(NULL, 0, 0) ;
++@@ -134,6 +201,7 @@
++ }
++ }
++ FreeLibrary(mLibrary) ;
+++ mRootSession = NULL;
++ mLibrary = NULL ;
++ }
++ }
++@@ -145,7 +213,6 @@
++ : nsAbWinHelper()
++ {
++ BOOL result = Initialize() ;
++-
++ NS_ASSERTION(result == TRUE, "Couldn't initialize Mapi Helper") ;
++ MOZ_COUNT_CTOR(nsMapiAddressBook) ;
++ }
++@@ -153,22 +220,882 @@
++ nsMapiAddressBook::~nsMapiAddressBook(void)
++ {
++ nsAutoLock guard(mMutex) ;
++-
+++ CleanUpMDB();
++ FreeMapiLibrary() ;
++ MOZ_COUNT_DTOR(nsMapiAddressBook) ;
++ }
++
+++LPSPropValue nsMapiAddressBook::GetMapiProperty( LPMAPIPROP pProp, ULONG tag)
+++{
+++ if (!pProp)
+++ return( NULL);
+++
+++ int sz = CbNewSPropTagArray( 1);
+++ SPropTagArray *pTag = (SPropTagArray *) new char[sz];
+++ pTag->cValues = 1;
+++ pTag->aulPropTag[0] = tag;
+++ LPSPropValue lpProp = NULL;
+++ ULONG cValues = 0;
+++ HRESULT hr = pProp->GetProps( pTag, 0, &cValues, &lpProp);
+++ delete pTag;
+++ if (HR_FAILED( hr) || (cValues != 1)) {
+++ if (lpProp)
+++ mMAPIFreeBuffer( lpProp);
+++ return( NULL);
+++ }
+++ else {
+++ if (PROP_TYPE( lpProp->ulPropTag) == PT_ERROR) {
+++ if (lpProp->Value.l == MAPI_E_NOT_FOUND) {
+++ mMAPIFreeBuffer( lpProp);
+++ lpProp = NULL;
+++ }
+++ }
+++ }
+++
+++ return( lpProp);
+++}
+++BOOL nsMapiAddressBook::GetEntryIdFromProp( LPSPropValue pVal, ULONG& cbEntryId, LPENTRYID& lpEntryId, BOOL delVal)
+++{
+++ if (!pVal)
+++ return( FALSE);
+++
+++ BOOL bResult = TRUE;
+++ switch (PROP_TYPE(pVal->ulPropTag))
+++ {
+++ case PT_BINARY:
+++ cbEntryId = pVal->Value.bin.cb;
+++ mMAPIAllocateBuffer( cbEntryId, (LPVOID *) &lpEntryId);
+++ memcpy( lpEntryId, pVal->Value.bin.lpb, cbEntryId);
+++ break;
+++
+++ default:
+++ PRINTF(( "EntryId not in BINARY prop value\n"));
+++ bResult = FALSE;
+++ break;
+++ }
+++
+++ if (pVal && delVal)
+++ mMAPIFreeBuffer( pVal);
+++
+++ return( bResult);
+++}
+++
+++BOOL nsMapiAddressBook::HandleContentsItem(ULONG oType, ULONG cb, LPENTRYID pEntry,nsMapiEntryArray& aFolders)
+++{
+++ LPMDB lpMsgStore;
+++ ULONG objType=0;
+++ HRESULT hr;
+++
+++ if (oType == MAPI_MESSAGE)
+++ return FALSE;
+++ if (oType == MAPI_STORE)
+++ {
+++ hr=mRootSession->OpenEntry(
+++ cb,
+++ pEntry,
+++ &IID_IMsgStore,
+++ MAPI_BEST_ACCESS,
+++ &objType,
+++ (IUnknown**)&lpMsgStore);
+++ if (FAILED(hr))
+++ return FALSE ;
+++ //Add MDB to a list to make it can be released when class destroyed.
+++ //We must leave it openned or else we can't open address store in it.
+++ AddToMDBArray(lpMsgStore);
+++
+++ LPSPropValue pVal;
+++ pVal=GetMapiProperty(lpMsgStore,PR_IPM_SUBTREE_ENTRYID);
+++
+++
+++ if (pVal) {
+++ ULONG cbEntry;
+++ LPENTRYID pEntry;
+++ nsMapiInterfaceWrapper<LPMAPICONTAINER> lpSubTree;
+++
+++ if (GetEntryIdFromProp( pVal, cbEntry, pEntry)) {
+++ // Open up the folder!
+++ BOOL bResult = TRUE;
+++ bResult = lpMsgStore->OpenEntry(
+++ cbEntry,
+++ pEntry,
+++ NULL,
+++ MAPI_BEST_ACCESS,
+++ &objType,
+++ lpSubTree);
+++ mMAPIFreeBuffer( pEntry);
+++ if (!bResult && *(LPMAPICONTAINER*)&lpSubTree) {
+++ // Iterate the subtree with the results going into the folder list
+++ bResult = IterateHierarchy(*(LPMAPICONTAINER*)&lpSubTree,aFolders);
+++ }
+++ else {
+++ PRINTF(( "GetStoreFolders: Error opening sub tree.\n"));
+++ }
+++ }
+++ else {
+++ PRINTF(( "GetStoreFolders: Error getting entryID from sub tree property val.\n"));
+++ }
+++ }
+++ else {
+++ PRINTF(( "GetStoreFolders: Error getting sub tree property.\n"));
+++ }
+++ }
+++ else
+++ {
+++ PRINTF(("Type:%d\n",oType));
+++ }
+++
+++ return TRUE ;
+++}
+++
+++BOOL nsMapiAddressBook::IterateHierarchy(LPMAPICONTAINER pFolder,nsMapiEntryArray& aFolders, ULONG flags)
+++{
+++ // flags can be CONVENIENT_DEPTH or 0
+++ // CONVENIENT_DEPTH will return all depths I believe instead
+++ // of just children
+++ HRESULT hr;
+++ nsMapiInterfaceWrapper<LPMAPITABLE> lpTable;
+++ hr = pFolder->GetHierarchyTable( CONVENIENT_DEPTH , lpTable);
+++ if (HR_FAILED(hr)) {
+++ PRINTF(( "IterateHierarchy: GetContentsTable failed: 0x%lx, %d\n", (long)hr, (int)hr));
+++ return( FALSE);
+++}
+++
+++ ULONG rowCount;
+++ hr = lpTable->GetRowCount( 0, &rowCount);
+++ if (!rowCount) {
+++ return( TRUE);
+++ }
+++
+++ hr = lpTable->SetColumns( (LPSPropTagArray)&ptaEid, 0);
+++ if (HR_FAILED(hr)) {
+++ PRINTF(( "IterateHierarchy: SetColumns failed: 0x%lx, %d\n", (long)hr, (int)hr));
+++ return( FALSE);
+++ }
+++
+++ hr = lpTable->SeekRow( BOOKMARK_BEGINNING, 0, NULL);
+++ if (HR_FAILED(hr)) {
+++ PRINTF(( "IterateHierarchy: SeekRow failed: 0x%lx, %d\n", (long)hr, (int)hr));
+++ return( FALSE);
+++ }
+++
+++ int cNumRows = 0;
+++ LPSRowSet lpRow;
+++ BOOL keepGoing = TRUE;
+++ BOOL bResult = TRUE;
+++ do {
+++
+++ lpRow = NULL;
+++ hr = lpTable->QueryRows( 1, 0, &lpRow);
+++
+++ if (HR_FAILED(hr))
+++{
+++ PRINTF(( "QueryRows failed: 0x%lx, %d\n", (long)hr, (int)hr));
+++ bResult = FALSE;
+++ break;
+++ }
+++
+++ if (lpRow){
+++ cNumRows = lpRow->cRows;
+++
+++ if (cNumRows) {
+++ LPENTRYID lpEntry = (LPENTRYID) lpRow->aRow[0].lpProps[ieidPR_ENTRYID].Value.bin.lpb;
+++ ULONG cb = lpRow->aRow[0].lpProps[ieidPR_ENTRYID].Value.bin.cb;
+++ ULONG oType = lpRow->aRow[0].lpProps[ieidPR_OBJECT_TYPE].Value.ul;
+++
+++ keepGoing = HandleHierarchyItem( oType, cb, lpEntry,aFolders);
+++
+++ }
+++ MyFreeProws(lpRow);
+++ }
+++
+++ } while ( SUCCEEDED(hr) && cNumRows && lpRow && keepGoing);
+++
+++
+++ if (bResult && !keepGoing)
+++ bResult = FALSE;
+++
+++ return( bResult);
+++}
+++BOOL nsMapiAddressBook::HandleHierarchyItem( ULONG oType, ULONG cb, LPENTRYID pEntry,nsMapiEntryArray& aFolders)
+++{
+++ ULONG objType=0;
+++ if (oType == MAPI_FOLDER)
+++ {
+++ nsMapiInterfaceWrapper<LPMAPICONTAINER> pFolder ;
+++ if (!mRootSession->OpenEntry(
+++ cb,
+++ pEntry,
+++ 0,
+++ MAPI_BEST_ACCESS,
+++ &objType,
+++ pFolder))
+++ {
+++ LPSPropValue pVal;
+++
+++
+++ pVal = GetMapiProperty(*(LPMAPICONTAINER*)&pFolder, PR_CONTAINER_CLASS);
+++ if (pVal)
+++ {
+++ if (strcmp("IPF.Contact",pVal->Value.lpszA) == 0)
+++ {
+++ SPropValue *currentValue=GetMapiProperty( *(LPMAPICONTAINER*)&pFolder, PR_ENTRYID);
+++
+++ aFolders.AddItem(currentValue->Value.bin.cb,
+++ NS_REINTERPRET_CAST(LPENTRYID, currentValue->Value.bin.lpb)) ;
+++
+++ }
+++ }
+++ }
+++ }
+++ else
+++ {
+++ PRINTF(( "GetStoreFolders - HandleHierarchyItem: Unhandled ObjectType: %ld\n", oType));
+++ }
+++
+++ return( TRUE);
+++}
+++
+++
+++BOOL nsMapiAddressBook::GetFolders(nsMapiEntryArray& aFolders)
+++{
+++ aFolders.CleanUp() ;
+++ nsMapiInterfaceWrapper<LPMAPICONTAINER> rootFolder ;
+++ nsMapiInterfaceWrapper<LPMAPITABLE> folders ;
+++ ULONG objType = 0 ;
+++ ULONG rowCount = 0 ;
+++
+++ nsMapiInterfaceWrapper<LPMAPITABLE> lpTable;
+++
+++ mLastError = mRootSession->GetMsgStoresTable( 0, lpTable);
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open MAPI MsgStores %08x.\n", mLastError));
+++ return mLastError;
+++ }
+++
+++ mLastError = lpTable->GetRowCount( 0, &rowCount);
+++
+++ mLastError = lpTable->SetColumns( (LPSPropTagArray)&ptaEid, 0);
+++ if (FAILED(mLastError))
+++ return( mLastError);
+++ mLastError = lpTable->SeekRow( BOOKMARK_BEGINNING, 0, NULL);
+++ if (FAILED(mLastError))
+++ return mLastError;
+++
+++ int cNumRows = 0;
+++ LPSRowSet lpRow;
+++ BOOL keepGoing = TRUE;
+++ BOOL bResult = TRUE;
+++ do {
+++
+++ lpRow = NULL;
+++ mLastError = lpTable->QueryRows( 1, 0, &lpRow);
+++
+++ if (HR_FAILED(mLastError)){
+++ bResult = FALSE;
+++ break;
+++ }
+++
+++ if (lpRow){
+++ cNumRows = lpRow->cRows;
+++
+++ if (cNumRows) {
+++ LPENTRYID lpEID = (LPENTRYID) lpRow->aRow[0].lpProps[ieidPR_ENTRYID].Value.bin.lpb;
+++ ULONG cbEID = lpRow->aRow[0].lpProps[ieidPR_ENTRYID].Value.bin.cb;
+++ ULONG oType = lpRow->aRow[0].lpProps[ieidPR_OBJECT_TYPE].Value.ul;
+++
+++
+++ keepGoing = HandleContentsItem( oType, cbEID, lpEID,aFolders);
+++ }
+++ MyFreeProws( lpRow);
+++ }
+++
+++ } while ( SUCCEEDED(mLastError) && cNumRows && lpRow && keepGoing);
+++
+++
+++ return HR_SUCCEEDED(mLastError) ;
+++}
+++BOOL nsMapiAddressBook::CorrectRestriction(const LPMAPIPROP aMapiProp,ULONG aRestrictionNum, LPSRestriction aRestriction)
+++{
+++ ULONG conditionType = 0 ;
+++ ULONG ulResIndex;
+++ if (!aRestriction)
+++ return FALSE;
+++ for (ulResIndex=0;ulResIndex < aRestrictionNum;ulResIndex++)
+++ {
+++ conditionType = aRestriction[ulResIndex].rt;
+++ switch (conditionType)
+++ {
+++ case RES_EXIST :
+++ aRestriction[ulResIndex].res.resExist.ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resExist.ulPropTag);
+++ break ;
+++ case RES_BITMASK :
+++ aRestriction[ulResIndex].res.resBitMask.ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resBitMask.ulPropTag);
+++ break ;
+++ case RES_CONTENT :
+++ aRestriction[ulResIndex].res.resContent.ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resContent.ulPropTag);
+++ aRestriction[ulResIndex].res.resContent.lpProp->ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resContent.lpProp->ulPropTag);
+++ break ;
+++ case RES_PROPERTY :
+++ aRestriction[ulResIndex].res.resProperty.ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resProperty.ulPropTag);
+++ aRestriction[ulResIndex].res.resProperty.lpProp->ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resProperty.lpProp->ulPropTag);
+++ break ;
+++ case RES_SIZE :
+++ aRestriction[ulResIndex].res.resSize.ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resSize.ulPropTag);
+++ break ;
+++ case RES_COMPAREPROPS :
+++ aRestriction[ulResIndex].res.resCompareProps.ulPropTag1 =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resCompareProps.ulPropTag1);
+++ aRestriction[ulResIndex].res.resCompareProps.ulPropTag2 =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resCompareProps.ulPropTag2);
+++ break ;
+++ case RES_NOT :
+++ CorrectRestriction(aMapiProp,1,aRestriction[ulResIndex].res.resNot.lpRes);
+++ break;
+++ case RES_AND :
+++ CorrectRestriction(aMapiProp,
+++ aRestriction[ulResIndex].res.resAnd.cRes,
+++ aRestriction[ulResIndex].res.resAnd.lpRes);
+++ break;
+++ case RES_OR :
+++ CorrectRestriction(aMapiProp,
+++ aRestriction[ulResIndex].res.resOr.cRes,
+++ aRestriction[ulResIndex].res.resOr.lpRes);
+++ break;
+++
+++ case RES_COMMENT :
+++ CorrectRestriction(aMapiProp,1,aRestriction[ulResIndex].res.resComment.lpRes);
+++ aRestriction[ulResIndex].res.resComment.lpProp->ulPropTag =
+++ GetRealMapiPropertyTag(aMapiProp,aRestriction[ulResIndex].res.resComment.lpProp->ulPropTag);
+++ break;
+++ case RES_SUBRESTRICTION :
+++ CorrectRestriction(aMapiProp,1,aRestriction[ulResIndex].res.resSub.lpRes);
+++ break;
+++ default:
+++ return FALSE;
+++ }
+++ }
+++ return TRUE;
+++}
+++BOOL nsMapiAddressBook::Filter( LPSRestriction aRestriction,nsMapiEntryArray * aList)
+++{
+++ if (!aRestriction)
+++ return FALSE;
+++
+++ ULONG conditionType = 0 ;
+++
+++ nsMapiEntryArray listOut;
+++ ULONG listindex=0;
+++
+++ nsMapiEntryArray listDel;
+++ ULONG delindex=0;
+++
+++ ULONG listsize;
+++ ULONG resCount = 0;
+++ ULONG resIndex = 0;
+++
+++ listsize = aList->GetSize();
+++ conditionType = aRestriction->rt;
+++ switch (conditionType)
+++ {
+++ case RES_EXIST :
+++ case RES_BITMASK :
+++ case RES_CONTENT :
+++ case RES_PROPERTY :
+++ case RES_SIZE :
+++ case RES_COMPAREPROPS :
+++ case RES_COMMENT :
+++ case RES_SUBRESTRICTION :
+++ {
+++ while(listindex < aList->GetSize())
+++ {
+++ if (!FilterOnOneRow(aList->ElementAt(listindex),aRestriction))
+++ aList->Remove(listindex);
+++ else
+++ listindex++;
+++ }
+++ }
+++ break;
+++ case RES_NOT :
+++ aRestriction->res.resNot.ulReserved = 1;
+++ case RES_AND :
+++ case RES_OR :
+++ {
+++ if (conditionType == RES_OR)
+++ {
+++ for(listindex=0;listindex<aList->GetSize();listindex++)
+++ {
+++ listDel.AddItem(aList->ElementAt(listindex));
+++ }
+++ }
+++
+++ resCount = aRestriction->res.resAnd.cRes;
+++ //notice that SAndRestriction ,SNotRestriction ,SOrRestriction
+++ //use the same struct
+++ for (resIndex = 0;resIndex < resCount;resIndex++)
+++ {
+++ //can't call listOut.CleanUp() here
+++ //because it will destroy all Element too
+++ while(listOut.GetSize())
+++ {
+++ listOut.Remove(0);
+++ }
+++
+++ for(listindex=0;listindex<aList->GetSize();listindex++)
+++ {
+++ listOut.AddItem(aList->ElementAt(listindex));
+++ }
+++
+++ Filter(&aRestriction->res.resAnd.lpRes[resIndex],&listOut);
+++ if (conditionType == RES_NOT)
+++ {
+++ for(listindex=0;listindex<listOut.GetSize();listindex++)
+++ {
+++ aList->Remove(listOut.ElementAt(listindex));
+++ }
+++ }
+++ else if (conditionType == RES_AND )
+++ {
+++ for(listindex=0;listindex<listOut.GetSize();listindex++)
+++ {
+++ if (!aList->IndexOf(listOut.ElementAt(listindex)))
+++ {
+++ aList->Remove(listOut.ElementAt(listindex));
+++ }
+++ }
+++ }
+++ else if (conditionType == RES_OR )
+++ {
+++ for(listindex=0;listindex<listOut.GetSize();listindex++)
+++ {
+++ listDel.Remove(listOut.ElementAt(listindex));
+++ }
+++ if (listDel.GetSize() == 0)
+++ {
+++ break;
+++ }
+++ }
+++ }
+++ if (conditionType == RES_OR)
+++ {
+++ for(listindex=0;listindex<listDel.GetSize();listindex++)
+++ {
+++ aList->Remove(listDel.ElementAt(listindex));
+++ }
+++ }
+++ }
+++
+++ }
+++ while(listDel.GetSize())
+++ {
+++ listDel.Remove(0);
+++ }
+++ while(listOut.GetSize())
+++ {
+++ listOut.Remove(0);
+++ }
+++
+++
+++ return TRUE;
+++}
+++
+++BOOL nsMapiAddressBook::FilterOnOneRow(nsMapiEntry *aEntry,LPSRestriction aRestriction)
+++{
+++ LPMAPIPROP object ;
+++ ULONG objType = 0 ;
+++ LPSPropValue realValue = NULL ;
+++ LPSPropValue resValue = NULL ;
+++ ULONG valueCount = 0 ;
+++
+++ mLastError = OpenEntry(aEntry->mByteCount, aEntry->mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ (IUnknown **)&object) ;
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ ULONG conditionType = 0 ;
+++ conditionType = aRestriction->rt;
+++
+++ switch (conditionType)
+++ {
+++ case RES_EXIST :
+++ if (!GetMAPIProperties(*aEntry,&aRestriction->res.resExist.ulPropTag,1,realValue,valueCount))
+++ return FALSE;
+++ resValue = NULL;
+++ break ;
+++ case RES_CONTENT :
+++ if (!GetMAPIProperties(*aEntry,&aRestriction->res.resContent.ulPropTag,1,realValue,valueCount))
+++ return FALSE;
+++ resValue = aRestriction->res.resContent.lpProp;
+++ break ;
+++ case RES_PROPERTY :
+++ if (!GetMAPIProperties(*aEntry,&aRestriction->res.resProperty.ulPropTag,1,realValue,valueCount))
+++ return FALSE;
+++ resValue = aRestriction->res.resProperty.lpProp;
+++ break ;
+++ case RES_BITMASK :
+++ return FALSE; //not support
+++ break ;
+++ case RES_SIZE :
+++ return FALSE;//not been used now
+++ break ;
+++ case RES_COMPAREPROPS :
+++ return FALSE;//not been used now
+++ break ;
+++ case RES_NOT :
+++ return FALSE;//not need care here
+++ break;
+++ case RES_AND :
+++ return FALSE;//not need care here
+++ break;
+++ case RES_OR :
+++ return FALSE;//not need care here
+++ break;
+++ case RES_COMMENT :
+++ return TRUE;//comment
+++ break;
+++ case RES_SUBRESTRICTION :
+++ return FALSE;//not been used now
+++ break ;
+++}
+++ return AtomyFilter(aRestriction,realValue,resValue);
+++
+++}
+++
+++BOOL nsMapiAddressBook::AtomyFilter(LPSRestriction aRestriction,LPSPropValue aRealValue,LPSPropValue aFilterValue)
+++{
+++ ULONG conditionType = 0 ;
+++ conditionType = aRestriction->rt;
+++
+++ BOOL bTagEq=(aRealValue &&
+++ PROP_TYPE( aRealValue->ulPropTag ) != PT_ERROR) &&
+++ aFilterValue;
+++ // PROP_TYPE( aRealValue->ulPropTag ) == PROP_TYPE( aFilterValue->ulPropTag ));
+++ switch (conditionType)
+++ {
+++ case RES_EXIST :
+++ return (aRealValue && PROP_TYPE( aRealValue->ulPropTag ) != PT_ERROR) ;
+++ break ;
+++ case RES_CONTENT :
+++ if (bTagEq)
+++ {
+++ switch(aRestriction->res.resContent.ulFuzzyLevel)
+++ {
+++ case FL_FULLSTRING :
+++ return !stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA);
+++ break;
+++ case FL_PREFIX :
+++ return stristr(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) == aRealValue->Value.lpszA;
+++ break;
+++ case FL_SUBSTRING :
+++ default:
+++ return stristr(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) != NULL;
+++ break;
+++ }
+++ }
+++ return FALSE;
+++ break ;
+++ case RES_PROPERTY :
+++ if (bTagEq)
+++ {
+++ switch(aRestriction->res.resProperty.relop)
+++ {
+++ case RELOP_GE :
+++ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) >= 0;
+++ break;
+++ case RELOP_GT :
+++ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) > 0;
+++ break;
+++ case RELOP_LE :
+++ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) <= 0;
+++ break;
+++ case RELOP_LT :
+++ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) < 0;
+++ break;
+++ case RELOP_EQ :
+++ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) == 0;
+++ break;
+++ case RELOP_NE :
+++ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) != 0;
+++ break;
+++ case RELOP_RE :
+++ default:
+++ return stristr(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) != NULL;
+++ break;
+++
+++ }
+++ }
+++ return FALSE;
+++ break ;
+++ case RES_BITMASK :
+++ return FALSE; //not support
+++ break ;
+++ case RES_SIZE :
+++ return FALSE;//not been used now
+++ break ;
+++ case RES_COMPAREPROPS :
+++ return FALSE;//not been used now
+++ break ;
+++ case RES_NOT :
+++ return FALSE;//not need care here
+++ break;
+++ case RES_AND :
+++ return FALSE;//not need care here
+++ break;
+++ case RES_OR :
+++ return FALSE;//not need care here
+++ break;
+++ case RES_COMMENT :
+++ return TRUE;//comment
+++ break;
+++ case RES_SUBRESTRICTION :
+++ return FALSE;//not been used now
+++ break ;
+++ }
+++ return TRUE;
+++}
+++
+++BOOL nsMapiAddressBook::GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
+++ nsMapiEntryArray *aList, ULONG aMapiType)
+++{
+++ if (aList)
+++ aList->CleanUp();
+++
+++ nsMapiInterfaceWrapper<LPMAPICONTAINER> parent ;
+++ nsMapiInterfaceWrapper<LPMAPITABLE> contents ;
+++ ULONG objType = 0 ;
+++ ULONG rowCount = 0 ;
+++
+++
+++ nsMapiInterfaceWrapper<LPMAPIPROP> pFolder;
+++ nsCString cs;
+++ aParent.ToString(cs);
+++
+++ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ 0, MAPI_BEST_ACCESS, &objType, pFolder);
+++ if (HR_FAILED(mLastError))
+++ {
+++ PRINTF(("Cannot open folder %08x.\n", mLastError)) ;
+++ return FALSE;
+++ }
+++
+++
+++ LPSPropValue msgClass=GetMapiProperty(*(LPMAPIPROP*)&pFolder,PR_MESSAGE_CLASS);
+++ if (msgClass && strcmp("IPM.DistList",msgClass->Value.lpszA) == 0)
+++ {
+++ HRESULT hr;
+++ LPSPropValue aValue = NULL ;
+++ ULONG aValueCount = 0 ;
+++
+++ LPSPropTagArray properties = NULL ;
+++ mMAPIAllocateBuffer(CbNewSPropTagArray(1),
+++ (void **)&properties);
+++ properties->cValues = 1;
+++ properties->aulPropTag [0] = GetEmailPropertyTag(*(LPMAPIPROP*)&pFolder,OUTLOOK_EMAIL_LIST1);
+++ hr = pFolder->GetProps(properties, 0, &aValueCount, &aValue) ;
+++
+++ SBinaryArray *sa=&aValue->Value.MVbin;
+++
+++ LPENTRYID lpEID;
+++ ULONG cbEID;
+++
+++ ULONG idx;
+++ nsMapiEntry testEntry;
+++ nsCString sClass;
+++ for (idx=0;sa->lpbin && idx<sa->cValues ;idx++)
+++ {
+++ lpEID= (LPENTRYID) sa->lpbin[idx].lpb;
+++ cbEID = sa->lpbin[idx].cb;
+++ testEntry.Assign(sa->lpbin[idx].cb,NS_REINTERPRET_CAST(LPENTRYID,sa->lpbin[idx].lpb));
+++
+++ if (GetPropertyString(testEntry,PR_MESSAGE_CLASS,sClass)) //Error get property
+++ {
+++ aList->AddItem(cbEID,lpEID);
+++ }
+++ }
+++ Filter(aRestriction,aList);
+++ }
+++ else
+++ {
+++ if (aRestriction && !CorrectRestriction(*(LPMAPICONTAINER*)&pFolder,1,aRestriction))
+++ return FALSE;
+++ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ &IID_IMAPIContainer, MAPI_BEST_ACCESS, &objType,
+++ parent) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open parent %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ mLastError = parent->GetContentsTable(0, contents) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot get contents %08x.\n", mLastError)) ;
+++ return FALSE;
+++ }
+++ if (aRestriction) {
+++ mLastError = contents->Restrict(aRestriction, TBL_BATCH) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set restriction %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ }
+++ mLastError = contents->SetColumns((LPSPropTagArray)&ContentsColumns, 0);
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set columns %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ mLastError = contents->GetRowCount(0, &rowCount) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot get result count %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ do {
+++ LPSRowSet rowSet = NULL ;
+++
+++ rowCount = 0 ;
+++ mLastError = contents->QueryRows(1, 0, &rowSet) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot query rows %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ rowCount = rowSet->cRows ;
+++ if (rowCount > 0 && aList)
+++ {
+++ if (aMapiType == 0 || rowSet->aRow->lpProps[ContentsColumnObjectType].Value.ul == aMapiType)
+++ {
+++ SPropValue& currentValue = rowSet->aRow->lpProps[ContentsColumnEntryId] ;
+++ aList->AddItem(currentValue.Value.bin.cb,
+++ NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ;
+++ }
+++ else if (aMapiType == MAPI_DISTLIST)
+++ {
+++ if (strcmp("IPM.DistList",rowSet->aRow->lpProps[ContentsColumnMessageClass].Value.lpszA)==0)
+++ {
+++ SPropValue& currentValue = rowSet->aRow->lpProps[ContentsColumnEntryId] ;
+++ aList->AddItem(currentValue.Value.bin.cb,
+++ NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ;
+++
+++ }
+++}
+++
+++ }
+++ MyFreeProws(rowSet) ;
+++ } while (rowCount > 0) ;
+++ }
+++
+++
+++ return TRUE ;
+++}
+++
+++BOOL nsMapiAddressBook::GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags,
+++ ULONG aNbProperties, LPSPropValue& aValue,
+++ ULONG& aValueCount)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object ;
+++ ULONG objType = 0 ;
+++ LPSPropTagArray properties = NULL ;
+++ ULONG i = 0 ;
+++
+++ mLastError = OpenEntry(aObject.mByteCount, aObject.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ object) ;
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ AllocateBuffer(CbNewSPropTagArray(aNbProperties),
+++ NS_REINTERPRET_CAST(void **, &properties));
+++ properties->cValues = aNbProperties ;
+++ for (i = 0 ; i < aNbProperties ; ++ i)
+++ {
+++ properties->aulPropTag [i] = GetRealMapiPropertyTag(*(LPMAPIPROP*)&object,aPropertyTags [i],TRUE);
+++ }
+++ mLastError = object->GetProps(properties, 0 , &aValueCount, &aValue) ;
+++ FreeBuffer(properties) ;
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Error get props %08x.\n", mLastError)) ;
+++ }
+++ return HR_SUCCEEDED(mLastError);
+++}
+++
+++BOOL nsMapiAddressBook::SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties,
+++ LPSPropValue& aValues)
+++{
+++ nsMapiInterfaceWrapper<LPMESSAGE> object;
+++ ULONG objType = 0 ;
+++ LPSPropProblemArray problems = NULL ;
+++ ULONG i = 0 ;
+++
+++ LPMDB lpMsgStore=GetMsgStore(aObject);
+++
+++ if (!lpMsgStore)
+++ {
+++ return FALSE;
+++ }
+++ mLastError = lpMsgStore->OpenEntry(aObject.mByteCount, aObject.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS , &objType,
+++ object) ;
+++ lpMsgStore->Release();
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ for (i = 0 ; i < aNbProperties ; ++ i)
+++ {
+++ aValues[i].ulPropTag = GetRealMapiPropertyTag(*(LPMESSAGE*)&object,aValues[i].ulPropTag,TRUE);
+++ }
+++ mLastError = object->SetProps(aNbProperties, aValues, &problems) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot update the object %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ if (problems) {
+++ for (ULONG i = 0 ; i < problems->cProblem ; ++ i) {
+++ PRINTF(("Problem %d: index %d code %08x.\n", i,
+++ problems->aProblem [i].ulIndex,
+++ problems->aProblem [i].scode)) ;
+++ }
+++ }
+++ mLastError = object->SaveChanges(0) ;
+++ if (MAPI_E_OBJECT_CHANGED == mLastError)
+++ {
+++ mLastError = object->SaveChanges(FORCE_SAVE ) ;
+++ }
+++ return HR_SUCCEEDED(mLastError) ;
+++}
+++
+++BOOL nsMapiAddressBook::GetDefaultContainer(nsMapiEntry& aContainer)
+++{
+++ return FALSE ;
+++}
+++
+++BOOL nsMapiAddressBook::IsOK(void)
+++{
+++ return mRootSession && mLibUsage;
+++}
+++
++ BOOL nsMapiAddressBook::Initialize(void)
++ {
++- if (mAddressBook) { return TRUE ; }
+++
++ nsAutoLock guard(mMutex) ;
++
++ if (!LoadMapiLibrary()) {
++ PRINTF(("Cannot load library.\n")) ;
++ return FALSE ;
++ }
++- mAddressBook = mRootBook ;
++- return TRUE ;
+++ return TRUE;
++ }
++
++ void nsMapiAddressBook::AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer)
++@@ -181,7 +1108,803 @@
++ mMAPIFreeBuffer(aBuffer) ;
++ }
++
+++ULONG nsMapiAddressBook::GetEmailPropertyTag(LPMAPIPROP lpProp, LONG nameID)
+++{
+++ static GUID emailGUID =
+++ {
+++ 0x00062004, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46
+++ };
+++
+++
+++ MAPINAMEID mapiNameID;
+++ mapiNameID.lpguid = &emailGUID;
+++ mapiNameID.ulKind = MNID_ID;
+++ mapiNameID.Kind.lID = nameID;
+++
+++ LPMAPINAMEID lpMapiNames = &mapiNameID;
+++ LPSPropTagArray lpMailTagArray = NULL;
+++
+++ HRESULT result = lpProp->GetIDsFromNames(1L, &lpMapiNames, 0, &lpMailTagArray);
+++ if (result == S_OK)
+++ {
+++ ULONG lTag = lpMailTagArray->aulPropTag[0];
+++ mMAPIFreeBuffer(lpMailTagArray);
+++ return lTag;
+++ }
+++ return 0L;
+++}
+++ULONG nsMapiAddressBook::GetRealMapiPropertyTag(LPMAPIPROP lpProp, LONG aPropertyTag,BOOL aTest)
+++{
+++ LPSPropValue addr;
+++ ULONG upRealTag=aPropertyTag;
+++ ULONG lSize=sizeof(TagMaps) / sizeof(TagMap);
+++
+++ for(int i=0; i<lSize; i++)
+++ {
+++ if (TagMaps[i].AddressTag == aPropertyTag)
+++ {
+++
+++ ULONG kPriEmailColumn=GetEmailPropertyTag(lpProp,TagMaps[i].NameID);
+++ if (aTest)
+++ {
+++ if (PR_DISPLAY_NAME_A == aPropertyTag)
+++ {
+++ //We need not change PR_DISPLAY_NAME_A tag if we are not using an address
+++ LPSPropValue msgClass=GetMapiProperty(lpProp,PR_MESSAGE_CLASS);
+++ if (msgClass && !strcmp("IPM.Contact",msgClass->Value.lpszA))
+++ {
+++ if (kPriEmailColumn)
+++ upRealTag = kPriEmailColumn | TagMaps[i].TypeMask;
+++ }
+++ else
+++ {
+++ FreeBuffer(msgClass);
+++ upRealTag = aPropertyTag;
+++ }
+++ }
+++ else //PR_DISPLAY_NAME_A == aPropertyTag
+++ {
+++ addr=GetMapiProperty(lpProp,aPropertyTag);
+++ if (!addr || PROP_TYPE( addr->ulPropTag) == PT_ERROR ||
+++ addr->Value.l == MAPI_E_NOT_FOUND)
+++ {
+++ if (kPriEmailColumn)
+++ upRealTag = kPriEmailColumn | TagMaps[i].TypeMask;
+++ }
+++ }
+++ }
+++ else //aTest
+++ {
+++ if (kPriEmailColumn)
+++ upRealTag = kPriEmailColumn | TagMaps[i].TypeMask;
+++ }
+++
+++ break; //we find it,exit
+++ }
+++ }
+++
+++ return upRealTag;
+++}
+++
+++BOOL nsMapiAddressBook::GetPropertyLong(const nsMapiEntry& aObject,
+++ ULONG aPropertyTag,
+++ ULONG& aValue)
+++{
+++ aValue = 0 ;
+++ LPSPropValue values = NULL ;
+++ ULONG valueCount = 0 ;
+++
+++ if (PR_OBJECT_TYPE == aPropertyTag)
+++ {
+++ nsMapiInterfaceWrapper<LPMAPIFOLDER> pFolder ;
+++ ULONG objType=0;
+++ mLastError = OpenEntry(aObject.mByteCount,aObject.mEntryId,
+++ NULL,MAPI_BEST_ACCESS,&objType, pFolder);
+++ if (HR_FAILED(mLastError))
+++ {
+++ PRINTF(("Cannot open folder %08x.\n", mLastError)) ;
+++ return FALSE;
+++ }
+++ LPSPropValue msgClass=GetMapiProperty(*(LPMAPIFOLDER*)&pFolder,PR_MESSAGE_CLASS);
+++ if (msgClass && strcmp("IPM.DistList",msgClass->Value.lpszA) == 0)
+++ {
+++ FreeBuffer(msgClass);
+++ aValue = MAPI_DISTLIST;
+++ return TRUE;
+++ }
+++ }
++
+++ if (!GetMAPIProperties(aObject, &aPropertyTag, 1, values, valueCount))
+++ return FALSE ;
++
+++ if (valueCount == 1 && values && PROP_TYPE(values->ulPropTag) == PT_LONG) {
+++ aValue = values->Value.ul ;
+++ }
+++ FreeBuffer(values) ;
+++ return TRUE ;
+++}
+++
+++BOOL nsMapiAddressBook::GetPropertyDate(const nsMapiEntry& aObject, ULONG aPropertyTag,
+++ WORD& aYear, WORD& aMonth, WORD& aDay)
+++{
+++ aYear = 0;
+++ aMonth = 0;
+++ aDay = 0;
+++ LPSPropValue values = NULL ;
+++ ULONG valueCount = 0 ;
+++
+++ if (!GetMAPIProperties(aObject, &aPropertyTag, 1, values, valueCount))
+++ return FALSE ;
+++
+++ if (valueCount == 1 && values && PROP_TYPE(values->ulPropTag) == PT_SYSTIME) {
+++ SYSTEMTIME readableTime ;
+++ FILETIME localTime ;
+++ FileTimeToLocalFileTime(&values->Value.ft,&localTime);
+++ if (FileTimeToSystemTime(&localTime, &readableTime)) {
+++ aYear = readableTime.wYear ;
+++ aMonth = readableTime.wMonth ;
+++ aDay = readableTime.wDay ;
+++ }
+++ }
+++ FreeBuffer(values) ;
+++ return TRUE ;
+++}
+++
+++HRESULT nsMapiAddressBook::OpenEntry(ULONG cbEntryID,
+++ LPENTRYID lpEntryID,
+++ LPCIID lpInterface,
+++ ULONG ulFlags,
+++ ULONG FAR * lpulObjType,
+++ LPUNKNOWN FAR * lppUnk
+++ )
+++{
+++
+++ int err;
+++ HRESULT rv;
+++ __try
+++ {
+++ rv=mRootSession->OpenEntry(cbEntryID,
+++ lpEntryID,
+++ lpInterface,
+++ ulFlags ,
+++ lpulObjType,
+++ lppUnk
+++ );
+++ }__except(err)
+++ {
+++ return (-1);
+++ }
+++
+++ if (HR_FAILED(rv) && !m_MDBArray.Count())
+++ {
+++ //There are no openned Message store,so we have to open them all
+++ nsMapiEntryArray aFolders;
+++ if (GetFolders(aFolders))
+++ {
+++ __try
+++ {
+++ rv=mRootSession->OpenEntry(cbEntryID,
+++ lpEntryID,
+++ lpInterface,
+++ ulFlags ,
+++ lpulObjType,
+++ lppUnk
+++ );
+++ }__except(err)
+++ {
+++ return (-1);
+++ }
+++ }
+++ }
+++ return rv;
+++
+++}
+++
+++BOOL nsMapiAddressBook::AddEntryToList(const nsMapiEntry& aDistlist, const nsMapiEntry& aNewEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> container ;
+++ ULONG objType = 0 ;
+++
+++ nsMapiEntry parentEntry;
+++ if (!GetEntryParent(aDistlist,parentEntry))
+++ return FALSE;
+++
+++ LPMDB lpMsgStore=GetMsgStore(parentEntry);
+++
+++ if (!lpMsgStore)
+++ return FALSE;
+++ mLastError = lpMsgStore->OpenEntry(aDistlist.mByteCount, aDistlist.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ container) ;
+++ lpMsgStore->Release();
+++
+++ if (HR_FAILED(mLastError))
+++ return FALSE ;
+++
+++
+++ /*
+++ When add mail address to distlist,Mapi need update 2 tag.
+++ */
+++ //update OUTLOOK_EMAIL_LIST1
+++ ULONG listTag=GetEmailPropertyTag(*(LPMAPIPROP*)&container,OUTLOOK_EMAIL_LIST1) | PT_MV_BINARY;
+++ SBinaryArray oldChilds;
+++ LPSBinary bins=NULL;
+++ SBinaryArray newChilds;
+++ LPSPropValue oldChildValue = NULL ;
+++ ULONG valueCount = 0 ;
+++
+++ if (!GetMAPIProperties(aDistlist, &listTag, 1, oldChildValue, valueCount))
+++ {
+++ PRINTF(("Cannot get old childs %08x.\n", mLastError)) ;
+++ return FALSE;
+++ }
+++
+++ if (! (oldChildValue->Value.l == MAPI_E_NOT_FOUND))
+++ {
+++ oldChilds = oldChildValue->Value.MVbin;
+++ newChilds.cValues=oldChilds.cValues + 1;
+++ mMAPIAllocateBuffer(sizeof(SBinary) * newChilds.cValues,(void**)& bins);
+++ newChilds.lpbin = bins;
+++ for (ULONG i=0;i<oldChilds.cValues;i++)
+++ {
+++ newChilds.lpbin[i].lpb = oldChilds.lpbin[i].lpb;
+++ newChilds.lpbin[i].cb = oldChilds.lpbin[i].cb;
+++ }
+++ }
+++ else
+++ {
+++ newChilds.cValues = 1;
+++ mMAPIAllocateBuffer(sizeof(SBinary) * newChilds.cValues,(void**)& bins);
+++ newChilds.lpbin = bins;
+++ }
+++
+++ nsMapiEntry orgEntryID;
+++ if (!GetPropertyBin(aNewEntry,
+++ GetEmailPropertyTag(*(LPMAPIPROP*)&container,OUTLOOK_EMAIL_ORGID) | PT_BINARY,
+++ orgEntryID))
+++ {
+++ return FALSE;
+++ }
+++ newChilds.lpbin[newChilds.cValues-1].lpb = NS_REINTERPRET_CAST(unsigned char *, orgEntryID.mEntryId);
+++ newChilds.lpbin[newChilds.cValues-1].cb = orgEntryID.mByteCount;
+++
+++ SPropValue childs;
+++ childs.ulPropTag = listTag;
+++ childs.Value.MVbin = newChilds;
+++
+++ LPSPropProblemArray problems = NULL ;
+++ mLastError = container->SetProps(1, &childs, &problems) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set childs %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ //update OUTLOOK_EMAIL_LIST2
+++ listTag = GetEmailPropertyTag(*(LPMAPIPROP*)&container,OUTLOOK_EMAIL_LIST2) | PT_MV_BINARY;
+++ if (!GetMAPIProperties(aDistlist, &listTag, 1, oldChildValue, valueCount))
+++ {
+++ PRINTF(("Cannot get old childs %08x.\n", mLastError)) ;
+++ return FALSE;
+++ }
+++
+++ if (! (oldChildValue->Value.l == MAPI_E_NOT_FOUND))
+++ {
+++ oldChilds = oldChildValue->Value.MVbin;
+++ newChilds.cValues=oldChilds.cValues + 1;
+++ mMAPIAllocateBuffer(sizeof(SBinary) * newChilds.cValues,(void**)& bins);
+++ newChilds.lpbin = bins;
+++ for (ULONG i=0;i<oldChilds.cValues;i++)
+++ {
+++ newChilds.lpbin[i].lpb = oldChilds.lpbin[i].lpb;
+++ newChilds.lpbin[i].cb = oldChilds.lpbin[i].cb;
+++ }
+++ }
+++ else
+++ {
+++ newChilds.cValues = 1;
+++ mMAPIAllocateBuffer(sizeof(SBinary) * newChilds.cValues,(void**)& bins);
+++ newChilds.lpbin = bins;
+++ }
+++
+++ /*
+++ Need more work here.
+++ There are two kind of mail address in outlook DistList.
+++ One is sample,not include in parent folder.
+++ The other is a link to a unattached address in parents folders.
+++ Currently we can only add first kind of address to a outlook distlist.
+++ */
+++
+++ newChilds.lpbin[newChilds.cValues-1].lpb = NS_REINTERPRET_CAST(unsigned char *, orgEntryID.mEntryId);
+++ newChilds.lpbin[newChilds.cValues-1].cb = orgEntryID.mByteCount;
+++
+++ childs.ulPropTag = listTag;
+++ childs.Value.MVbin = newChilds;
+++
+++ mLastError = container->SetProps(1, &childs, &problems) ;
+++ if (HR_FAILED(mLastError))
+++ {
+++ PRINTF(("Cannot set childs %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ mMAPIFreeBuffer(bins);
+++
+++ mLastError = container->SaveChanges(KEEP_OPEN_READONLY) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot commit new entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ return TRUE ;
+++}
+++BOOL nsMapiAddressBook::DeleteEntryFromList(const nsMapiEntry& aDistlist, const nsMapiEntry& aNewEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> container ;
+++ ULONG objType = 0 ;
+++
+++ nsMapiEntry parentEntry;
+++ if (!GetEntryParent(aDistlist,parentEntry))
+++ return FALSE;
+++
+++ LPMDB lpMsgStore=GetMsgStore(parentEntry);
+++ if (!lpMsgStore)
+++ return FALSE;
+++
+++ mLastError = lpMsgStore->OpenEntry(aDistlist.mByteCount, aDistlist.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ container) ;
+++ lpMsgStore->Release();
+++
+++ if (HR_FAILED(mLastError))
+++ return FALSE ;
+++ /*
+++ When delete mail address from distlist,Mapi need update 2 tag.
+++ */
+++ //update OUTLOOK_EMAIL_LIST1
+++ ULONG listTag=GetEmailPropertyTag(*(LPMAPIPROP*)&container,OUTLOOK_EMAIL_LIST1) | PT_MV_BINARY;
+++
+++ SBinaryArray oldChilds;
+++ LPSBinary bins=NULL;
+++ SBinaryArray newChilds;
+++ LPSPropValue oldChildValue = NULL ;
+++ ULONG valueCount = 0 ;
+++
+++ newChilds.lpbin=NULL;
+++
+++ ULONG lDeleteEntry=0;
+++ ULONG newIndex=0;
+++ ULONG oldIndex=0;
+++ if (!GetMAPIProperties(aDistlist, &listTag, 1, oldChildValue, valueCount))
+++ {
+++ PRINTF(("Cannot get old childs %08x.\n", mLastError)) ;
+++ return FALSE;
+++ }
+++
+++ if (! (oldChildValue->Value.l == MAPI_E_NOT_FOUND))
+++ {
+++ oldChilds = oldChildValue->Value.MVbin;
+++ newChilds.cValues=oldChilds.cValues - 1;
+++ mMAPIAllocateBuffer(sizeof(SBinary) * newChilds.cValues,(void**)& bins);
+++ newChilds.lpbin = bins;
+++ for (oldIndex=0;oldIndex<oldChilds.cValues;oldIndex++)
+++ {
+++ if ( oldChilds.lpbin[oldIndex].cb == aNewEntry.mByteCount &&
+++ !memcmp((void*)(oldChilds.lpbin[oldIndex].lpb+4),
+++ (void*)(aNewEntry.mEntryId->ab),
+++ oldChilds.lpbin[oldIndex].cb-4))
+++ {
+++ lDeleteEntry=oldIndex;
+++ }
+++ else
+++ {
+++ newChilds.lpbin[newIndex].lpb = oldChilds.lpbin[oldIndex].lpb;
+++ newChilds.lpbin[newIndex].cb = oldChilds.lpbin[oldIndex].cb;
+++ newIndex++;
+++ }
+++ }
+++ }
+++ else
+++ return FALSE;
+++
+++
+++ SPropValue childs;
+++ LPSPropProblemArray problems = NULL ;
+++
+++ if (newChilds.cValues == 0)
+++ {
+++ SPropTagArray delTags;
+++ delTags.cValues = 1;
+++ delTags.aulPropTag[0] = listTag;
+++
+++ mLastError = container->DeleteProps(&delTags, &problems) ;
+++ }
+++ else
+++ {
+++ childs.ulPropTag = listTag;
+++ childs.Value.MVbin = newChilds;
+++ mLastError = container->SetProps(1, &childs, &problems) ;
+++ }
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set childs %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ //update OUTLOOK_EMAIL_LIST2
+++ listTag = GetEmailPropertyTag(*(LPMAPIPROP*)&container,OUTLOOK_EMAIL_LIST2) | PT_MV_BINARY;
+++ if (!GetMAPIProperties(aDistlist, &listTag, 1, oldChildValue, valueCount))
+++ {
+++ PRINTF(("Cannot get old childs %08x.\n", mLastError)) ;
+++ return FALSE;
+++ }
+++
+++ newIndex=0;
+++ if (! (oldChildValue->Value.l == MAPI_E_NOT_FOUND))
+++ {
+++ oldChilds = oldChildValue->Value.MVbin;
+++ newChilds.cValues=oldChilds.cValues - 1;
+++ mMAPIAllocateBuffer(sizeof(SBinary) * newChilds.cValues,(void**)& bins);
+++ newChilds.lpbin = bins;
+++ for (oldIndex=0;oldIndex<oldChilds.cValues;oldIndex++)
+++ {
+++ if (oldIndex != lDeleteEntry)
+++ {
+++ newChilds.lpbin[newIndex].lpb = oldChilds.lpbin[oldIndex].lpb;
+++ newChilds.lpbin[newIndex].cb = oldChilds.lpbin[oldIndex].cb;
+++ newIndex++;
+++ }
+++ }
+++ }
+++ else
+++ {
+++ newChilds.cValues = 1;
+++ mMAPIAllocateBuffer(sizeof(SBinary) * newChilds.cValues,(void**)& bins);
+++ newChilds.lpbin = bins;
+++ }
++
++
+++
+++ if (newChilds.cValues == 0)
+++ {
+++ SPropTagArray delTags;
+++ delTags.cValues = 1;
+++ delTags.aulPropTag[0] = listTag;
+++
+++ mLastError = container->DeleteProps(&delTags, &problems) ;
+++ }
+++ else
+++ {
+++ childs.ulPropTag = listTag;
+++ childs.Value.MVbin = newChilds;
+++ mLastError = container->SetProps(1, &childs, &problems) ;
+++ }
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set childs %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ mMAPIFreeBuffer(bins);
+++
+++ mLastError = container->SaveChanges(KEEP_OPEN_READONLY) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot commit new entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ return TRUE ;
+++}
+++
+++BOOL nsMapiAddressBook::GetEntryParent(const nsMapiEntry& aParent, nsMapiEntry& aParentEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object ;
+++ ULONG objType = 0 ;
+++ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ (IUnknown **)&object) ;
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ SPropValue *parentID=GetMapiProperty(*(LPMAPIPROP*)&object, PR_PARENT_ENTRYID);
+++
+++ if (parentID->Value.l == MAPI_E_NOT_FOUND)
+++ return FALSE;
+++ aParentEntry.Assign(parentID->Value.bin.cb, NS_REINTERPRET_CAST(LPENTRYID, parentID->Value.bin.lpb));
+++ return TRUE;
+++}
+++BOOL nsMapiAddressBook::CreateEntryInList(const nsMapiEntry& aDistlist, nsMapiEntry& aNewEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> container ;
+++ ULONG objType = 0 ;
+++
+++ nsMapiEntry parentEntry;
+++ if (!GetEntryParent(aDistlist,parentEntry))
+++ {
+++ return FALSE;
+++ }
+++ nsMapiInterfaceWrapper<LPMESSAGE> newEntry ;
+++ if (!CreateEntry(parentEntry,aNewEntry)) //Create a entry in parent folder
+++ return FALSE;
+++
+++ return AddEntryToList(aDistlist,aNewEntry);
+++}
+++
+++BOOL nsMapiAddressBook::CreateEntry(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIFOLDER> container ;
+++ ULONG objType = 0 ;
+++
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object;
+++ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ object) ;
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return NULL ;
+++ }
+++ LPSPropValue msgClass=GetMapiProperty(*(LPMAPIPROP*)&object,PR_MESSAGE_CLASS);
+++
+++ if (msgClass && strcmp("IPM.DistList",msgClass->Value.lpszA) == 0)
+++ return CreateEntryInList(aParent,aNewEntry); //Create entry in DistList
+++
+++ LPMDB lpMsgStore=GetMsgStore(aParent);
+++
+++ if (!lpMsgStore)
+++ return FALSE;
+++
+++ mLastError = lpMsgStore->OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ &IID_IMAPIFolder, MAPI_BEST_ACCESS, &objType,
+++ container) ;
+++ lpMsgStore->Release();
+++
+++ if (HR_FAILED(mLastError))
+++ return FALSE;
+++
+++ nsMapiInterfaceWrapper<LPMESSAGE> newEntry ;
+++
+++ mLastError = container->CreateMessage(&IID_IMessage,
+++ 0,
+++ newEntry) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot create new entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ SPropValue messageclass ;
+++ LPSPropProblemArray problems = NULL ;
+++ nsCString tempName ;
+++
+++ messageclass.ulPropTag = PR_MESSAGE_CLASS_A ;
+++ tempName.Assign("IPM.Contact") ;
+++ messageclass.Value.lpszA = NS_CONST_CAST(char *, tempName.get()) ;
+++ mLastError = newEntry->SetProps(1, &messageclass, &problems) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set temporary name %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ mLastError = newEntry->SaveChanges(KEEP_OPEN_READONLY) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot commit new entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ SPropTagArray property ;
+++ LPSPropValue value = NULL ;
+++ ULONG valueCount = 0 ;
+++
+++ property.cValues = 1 ;
+++ property.aulPropTag [0] = PR_ENTRYID ;
+++ mLastError = newEntry->GetProps(&property, 0, &valueCount, &value) ;
+++ if (HR_FAILED(mLastError) || valueCount != 1) {
+++ PRINTF(("Cannot get entry id %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ aNewEntry.Assign(value->Value.bin.cb, NS_REINTERPRET_CAST(LPENTRYID, value->Value.bin.lpb)) ;
+++ FreeBuffer(value) ;
+++ return TRUE ;
+++}
+++
+++BOOL nsMapiAddressBook::CreateDistList(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIFOLDER> container ;
+++ ULONG objType = 0 ;
+++
+++ LPMDB lpMsgStore=GetMsgStore(aParent);
+++ if (!lpMsgStore)
+++ return FALSE;
+++ mLastError = lpMsgStore->OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ &IID_IMAPIFolder, MAPI_BEST_ACCESS, &objType,
+++ container) ;
+++ lpMsgStore->Release();
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open container %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ nsMapiInterfaceWrapper<LPMESSAGE> newEntry ;
+++ mLastError = container->CreateMessage(&IID_IMAPIProp,
+++ 0,
+++ newEntry) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot create new entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ SPropValue messageclass ;
+++ LPSPropProblemArray problems = NULL ;
+++ nsCString tempName ;
+++
+++ messageclass.ulPropTag = PR_MESSAGE_CLASS_A ;
+++ tempName.Assign("IPM.DistList") ;
+++ messageclass.Value.lpszA = NS_CONST_CAST(char *, tempName.get()) ;
+++ mLastError = newEntry->SetProps(1, &messageclass, &problems) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set PR_MESSAGE_CLASS_A %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ mLastError = newEntry->SaveChanges(KEEP_OPEN_READONLY) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot commit new entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ ULONG valueCount = 0 ;
+++ SPropTagArray property ;
+++ LPSPropValue value = NULL ;
+++
+++ property.cValues = 1 ;
+++ property.aulPropTag [0] = PR_ENTRYID ;
+++ mLastError = newEntry->GetProps(&property, 0, &valueCount, &value) ;
+++ if (HR_FAILED(mLastError) || valueCount != 1) {
+++ PRINTF(("Cannot get entry id %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ aNewEntry.Assign(value->Value.bin.cb, NS_REINTERPRET_CAST(LPENTRYID, value->Value.bin.lpb)) ;
+++
+++ FreeBuffer(value) ;
+++ return TRUE ;
+++}
+++
+++
+++BOOL nsMapiAddressBook::CopyEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aSource,
+++ nsMapiEntry& aTarget)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIFOLDER> container ;
+++ nsMapiInterfaceWrapper<LPMAPIFOLDER> targetFolder ;
+++ ULONG objType = 0 ;
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object;
+++ mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ object) ;
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ LPSPropValue msgClass=GetMapiProperty(*(LPMAPIPROP*)&object,PR_MESSAGE_CLASS);
+++
+++ if (msgClass && strcmp("IPM.DistList",msgClass->Value.lpszA) == 0)
+++ {
+++ //Add Entry To DistList
+++ if (!AddEntryToList(aContainer,aSource))
+++ return FALSE;
+++ aTarget.Assign(aSource.mByteCount,aSource.mEntryId);
+++ return TRUE;
+++ }
+++
+++ SBinary entry ;
+++ SBinaryArray entryArray ;
+++
+++ entry.cb = aSource.mByteCount ;
+++ entry.lpb = NS_REINTERPRET_CAST(LPBYTE, aSource.mEntryId) ;
+++ entryArray.cValues = 1 ;
+++ entryArray.lpbin = &entry ;
+++
+++ mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
+++ &IID_IMAPIFolder, MAPI_BEST_ACCESS, &objType,
+++ container) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open container %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ mLastError = OpenEntry(aTarget.mByteCount, aTarget.mEntryId,
+++ &IID_IMAPIFolder, MAPI_BEST_ACCESS, &objType,
+++ targetFolder) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open Target folder %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ nsMapiInterfaceWrapper<LPMAPIPROP> newEntry ;
+++
+++ mLastError = container->CopyMessages(&entryArray,
+++ &IID_IMessage,
+++ (void*)&targetFolder,
+++ 0,
+++ NULL,
+++ NULL) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot create new entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ return TRUE ;
+++}
+++
+++BOOL nsMapiAddressBook::DeleteEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIFOLDER> container ;
+++ ULONG objType = 0 ;
+++ SBinary entry ;
+++ SBinaryArray entryArray ;
+++
+++
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object;
+++ mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType,
+++ object) ;
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ LPSPropValue msgClass=GetMapiProperty(*(LPMAPIPROP*)&object,PR_MESSAGE_CLASS);
+++
+++ if (msgClass && strcmp("IPM.DistList",msgClass->Value.lpszA) == 0)
+++ return DeleteEntryFromList(aContainer,aEntry); //Delete Entry from DistList
+++
+++ LPMDB lpMsgStore=GetMsgStore(aContainer);
+++ if (!lpMsgStore)
+++ return FALSE;
+++
+++ mLastError = lpMsgStore->OpenEntry(aContainer.mByteCount, aContainer.mEntryId,
+++ &IID_IMAPIFolder, MAPI_BEST_ACCESS, &objType,
+++ container) ;
+++ lpMsgStore->Release();
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open container %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ entry.cb = aEntry.mByteCount ;
+++ entry.lpb = NS_REINTERPRET_CAST(LPBYTE, aEntry.mEntryId) ;
+++ entryArray.cValues = 1 ;
+++ entryArray.lpbin = &entry ;
+++ mLastError = container->DeleteMessages(&entryArray, 0,0,0) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot delete entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ return TRUE ;
+++}
+++
+++//Use to open message store in write mode
+++LPMDB nsMapiAddressBook::GetMsgStore(const nsMapiEntry& aEntry)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object;
+++ ULONG objType=0;
+++
+++ mLastError = OpenEntry(aEntry.mByteCount, aEntry.mEntryId,
+++ &IID_IMAPIProp, MAPI_BEST_ACCESS , &objType,
+++ object) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return NULL ;
+++ }
+++ SPropValue *svMsgSore=GetMapiProperty( *(LPMAPIPROP*)&object, PR_STORE_ENTRYID);;
+++
+++ LPMDB lpMsgStore=NULL;
+++ mLastError=mRootSession->OpenMsgStore(0,
+++ svMsgSore->Value.bin.cb,
+++ (ENTRYID*)svMsgSore->Value.bin.lpb,
+++ &IID_IMsgStore,
+++ MAPI_BEST_ACCESS ,
+++ &lpMsgStore);
+++
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open MsgStore %08x.\n", mLastError)) ;
+++ return NULL ;
+++ }
+++
+++ return lpMsgStore;
+++}
++--- misc/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h 2004-04-17 20:32:14.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h 2008-08-14 16:22:21.000000000 +0200
++@@ -40,12 +40,42 @@
++
++ #include "nsAbWinHelper.h"
++
+++struct TagMap
+++{
+++ ULONG AddressTag;
+++ ULONG NameID;
+++ ULONG TypeMask;
+++};
++ class nsMapiAddressBook : public nsAbWinHelper
++ {
++ public :
++ nsMapiAddressBook(void) ;
++ virtual ~nsMapiAddressBook(void) ;
++
+++ // Get the top address books
+++ virtual BOOL GetFolders(nsMapiEntryArray& aFolders);
+++
+++ // Get a default address book container
+++ virtual BOOL GetDefaultContainer(nsMapiEntry& aContainer);
+++ // Is the helper correctly initialised?
+++ virtual BOOL IsOK(void);
+++ virtual BOOL GetPropertyLong(const nsMapiEntry& aObject,
+++ ULONG aPropertyTag,
+++ ULONG& aValue);
+++ // Get the value of a MAPI property of type SYSTIME
+++ virtual BOOL GetPropertyDate(const nsMapiEntry& aObject, ULONG aPropertyTag,
+++ WORD& aYear, WORD& aMonth, WORD& aDay);
+++ // Create entry in the address book
+++ virtual BOOL CreateEntry(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry) ;
+++ // Delete an entry in the address book
+++ virtual BOOL DeleteEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aEntry) ;
+++ // Create a distribution list in the address book
+++ virtual BOOL CreateDistList(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry) ;
+++ // Copy an existing entry in the address book
+++ virtual BOOL CopyEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aSource, nsMapiEntry& aTarget) ;
+++
+++ static void FreeMapiLibrary(void) ;
+++
++ protected :
++ // Class members to handle the library/entry points
++ static HMODULE mLibrary ;
++@@ -67,19 +97,77 @@
++ static BOOL mInitialized ;
++ static BOOL mLogonDone ;
++ static LPMAPISESSION mRootSession ;
++- static LPADRBOOK mRootBook ;
+++
++
++ // Load the MAPI environment
++ BOOL Initialize(void) ;
+++
+++ virtual HRESULT OpenEntry(ULONG cbEntryID,
+++ LPENTRYID lpEntryID,
+++ LPCIID lpInterface,
+++ ULONG ulFlags,
+++ ULONG FAR * lpulObjType,
+++ LPUNKNOWN FAR * lppUnk
+++ );
+++
+++
+++ // Retrieve the contents of a container, with an optional restriction
+++ virtual BOOL GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
+++ nsMapiEntryArray *aList, ULONG aMapiType) ;
+++ // Retrieve the values of a set of properties on a MAPI object
+++ virtual BOOL GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags,
+++ ULONG aNbProperties,
+++ LPSPropValue& aValues, ULONG& aValueCount) ;
+++ // Set the values of a set of properties on a MAPI object
+++ virtual BOOL SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties,
+++ LPSPropValue& aValues);
+++
+++
++ // Allocation of a buffer for transmission to interfaces
++ virtual void AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer) ;
++ // Destruction of a buffer provided by the interfaces
++ virtual void FreeBuffer(LPVOID aBuffer) ;
++ // Library management
++ static BOOL LoadMapiLibrary(void) ;
++- static void FreeMapiLibrary(void) ;
+++
+++ BOOL HandleContentsItem(ULONG oType, ULONG cb, LPENTRYID pEntry,nsMapiEntryArray& aFolders);
+++ LPSPropValue GetMapiProperty( LPMAPIPROP pProp, ULONG tag);
+++ BOOL GetEntryIdFromProp( LPSPropValue pVal, ULONG& cbEntryId, LPENTRYID& lpEntryId, BOOL delVal=FALSE);
+++ BOOL HandleHierarchyItem( ULONG oType, ULONG cb, LPENTRYID pEntry,nsMapiEntryArray& aFolders);
+++ BOOL IterateHierarchy(IMAPIContainer * pFolder, nsMapiEntryArray& aFolders,ULONG flags=0);
+++ ULONG GetEmailPropertyTag(LPMAPIPROP lpProp, LONG nameID);
+++ ULONG GetRealMapiPropertyTag(LPMAPIPROP lpProp, LONG aPropertyTag,BOOL aTest=FALSE);
+++ LPMDB GetMsgStore(const nsMapiEntry& aEntry);
+++ BOOL CreateEntryInList(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry);
+++ BOOL AddEntryToList(const nsMapiEntry& aParent,const nsMapiEntry& aNewEntry);
+++ BOOL DeleteEntryFromList(const nsMapiEntry& aDistlist, const nsMapiEntry& aNewEntry);
+++ BOOL GetEntryParent(const nsMapiEntry& aParent, nsMapiEntry& aParentEntry);
+++ BOOL CorrectRestriction(const LPMAPIPROP aMapiProp,ULONG aRestrictionNum, LPSRestriction aRestriction);
+++
+++ //filter
+++ BOOL Filter( LPSRestriction aRestriction,nsMapiEntryArray * aList);
+++ BOOL FilterOnOneRow(nsMapiEntry *aEntry,LPSRestriction aRestriction);
+++ BOOL AtomyFilter(LPSRestriction aRestriction,LPSPropValue aRealValue,LPSPropValue aFilterValue);
+++
+++ void AddToMDBArray(LPMDB aMDB)
+++ {
+++ m_MDBArray.AppendElement(aMDB);
+++ }
+++ void CleanUpMDB()
+++ {
+++ LPMDB mdb;
+++ for (int i = 0; i < m_MDBArray.Count(); i++)
+++ {
+++ mdb = (LPMDB)m_MDBArray.ElementAt(i);
+++ mdb->Release();
+++ }
+++ m_MDBArray.Clear();
+++ }
++
++ private :
+++ //use to keep all openned MsgStore,if we not open a message store,we can't open any thing on it
+++ //so we have to kill message stores openned
+++ nsVoidArray m_MDBArray;
++ } ;
++
++ #endif // nsMapiAddressBook_h___
++--- misc/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp 2004-11-05 16:13:32.000000000 +0100
+++++ misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -46,6 +46,22 @@
++
++ #define PRINTF(args) PR_LOG(gWabAddressBookLog, PR_LOG_DEBUG, args)
++
+++enum
+++{
+++ ContentsColumnEntryId = 0,
+++ ContentsColumnObjectType,
+++ ContentsColumnsSize
+++} ;
+++
+++static const SizedSPropTagArray(ContentsColumnsSize, ContentsColumns) =
+++{
+++ ContentsColumnsSize,
+++ {
+++ PR_ENTRYID,
+++ PR_OBJECT_TYPE
+++ }
+++} ;
+++
++ HMODULE nsWabAddressBook::mLibrary = NULL ;
++ PRInt32 nsWabAddressBook::mLibUsage = 0 ;
++ LPWABOPEN nsWabAddressBook::mWABOpen = NULL ;
++@@ -94,7 +110,7 @@
++ MOZ_DECL_CTOR_COUNTER(nsWabAddressBook)
++
++ nsWabAddressBook::nsWabAddressBook(void)
++-: nsAbWinHelper()
+++: nsAbWinHelper(),mAddressBook(NULL)
++ {
++ BOOL result = Initialize() ;
++
++@@ -109,9 +125,254 @@
++ MOZ_COUNT_DTOR(nsWabAddressBook) ;
++ }
++
+++BOOL nsWabAddressBook::GetFolders(nsMapiEntryArray& aFolders)
+++{
+++ aFolders.CleanUp() ;
+++ nsMapiInterfaceWrapper<LPABCONT> rootFolder ;
+++ nsMapiInterfaceWrapper<LPMAPITABLE> folders ;
+++ ULONG objType = 0 ;
+++ ULONG rowCount = 0 ;
+++ SRestriction restriction ;
+++ SPropTagArray folderColumns ;
+++
+++ mLastError = OpenEntry(0, NULL, NULL, 0, &objType,
+++ rootFolder);
+++ if (HR_FAILED(mLastError)){
+++ PRINTF(("Cannot open root %08x.\n", mLastError));
+++ return FALSE;
+++ }
+++ mLastError = rootFolder->GetHierarchyTable(0, folders);
+++ if (HR_FAILED(mLastError)){
+++ PRINTF(("Cannot get hierarchy %08x.\n", mLastError));
+++ return FALSE;
+++ }
+++ // We only take into account modifiable containers,
+++ // otherwise, we end up with all the directory services...
+++ restriction.rt = RES_BITMASK ;
+++ restriction.res.resBitMask.ulPropTag = PR_CONTAINER_FLAGS ;
+++ restriction.res.resBitMask.relBMR = BMR_NEZ ;
+++ restriction.res.resBitMask.ulMask = AB_MODIFIABLE ;
+++ mLastError = folders->Restrict(&restriction, 0) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot restrict table %08x.\n", mLastError)) ;
+++ }
+++ folderColumns.cValues = 1 ;
+++ folderColumns.aulPropTag [0] = PR_ENTRYID ;
+++ mLastError = folders->SetColumns(&folderColumns, 0) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set columns %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ mLastError = folders->GetRowCount(0, &rowCount) ;
+++ if (HR_SUCCEEDED(mLastError)) {
+++ do {
+++ LPSRowSet rowSet = NULL ;
+++
+++ rowCount = 0 ;
+++ mLastError = folders->QueryRows(1, 0, &rowSet) ;
+++ if (HR_SUCCEEDED(mLastError)) {
+++ rowCount = rowSet->cRows ;
+++ if (rowCount > 0) {
+++ SPropValue& currentValue = rowSet->aRow->lpProps [0] ;
+++
+++ aFolders.AddItem(currentValue.Value.bin.cb,
+++ NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ;
+++ }
+++ MyFreeProws(rowSet) ;
+++ }
+++ else {
+++ PRINTF(("Cannot query rows %08x.\n", mLastError)) ;
+++ }
+++ } while (rowCount > 0) ;
+++ }
+++ return HR_SUCCEEDED(mLastError) ;
+++}
+++BOOL nsWabAddressBook::GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
+++ nsMapiEntryArray *aList, ULONG aMapiType)
+++{
+++ if (aList) { aList->CleanUp(); }
+++ nsMapiInterfaceWrapper<LPMAPICONTAINER> parent ;
+++ nsMapiInterfaceWrapper<LPMAPITABLE> contents ;
+++ ULONG objType = 0 ;
+++ ULONG rowCount = 0 ;
+++
+++ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId,
+++ &IID_IMAPIContainer, 0, &objType,
+++ parent) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open parent %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ // Here, flags for WAB and MAPI could be different, so this works
+++ // only as long as we don't want to use any flag in GetContentsTable
+++ mLastError = parent->GetContentsTable(0, contents) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot get contents %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ if (aRestriction) {
+++ mLastError = contents->Restrict(aRestriction, 0) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set restriction %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ }
+++ int entryId = ContentsColumnEntryId ;
+++ int objectType = ContentsColumnObjectType ;
+++
+++ if (aRestriction)
+++ {
+++ LPSPropTagArray allColumns = NULL ;
+++
+++ mLastError = contents->QueryColumns(TBL_ALL_COLUMNS, &allColumns) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot query columns %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++
+++ for (unsigned int j = 0 ; j < allColumns->cValues ; ++ j) {
+++ if (allColumns->aulPropTag [j] == PR_ENTRYID) {
+++ entryId = j ;
+++ }
+++ else if (allColumns->aulPropTag [j] == PR_OBJECT_TYPE) {
+++ objectType = j ;
+++ }
+++ }
+++ mLastError = contents->SetColumns(allColumns, 0) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set columns %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ FreeBuffer(allColumns) ;
+++ }
+++ else
+++ {
+++
+++ mLastError = contents->SetColumns((LPSPropTagArray) &ContentsColumns, 0) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot set columns %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ }
+++
+++ mLastError = contents->GetRowCount(0, &rowCount) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot get result count %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ do {
+++ LPSRowSet rowSet = NULL ;
+++
+++ rowCount = 0 ;
+++ mLastError = contents->QueryRows(1, 0, &rowSet) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot query rows %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ rowCount = rowSet->cRows ;
+++ if (rowCount > 0 &&
+++ (aMapiType == 0 ||
+++ rowSet->aRow->lpProps[objectType].Value.ul == aMapiType)) {
+++ if (aList) {
+++ SPropValue& currentValue = rowSet->aRow->lpProps[entryId] ;
+++
+++ aList->AddItem(currentValue.Value.bin.cb,
+++ NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ;
+++
+++ }
+++ }
+++ MyFreeProws(rowSet) ;
+++ } while (rowCount > 0) ;
+++ return TRUE ;
+++}
+++
+++BOOL nsWabAddressBook::GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags,
+++ ULONG aNbProperties, LPSPropValue& aValue,
+++ ULONG& aValueCount)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object ;
+++ IMsgStore * mdb=NULL;
+++ ULONG objType = 0 ;
+++ LPSPropTagArray properties = NULL ;
+++ ULONG i = 0 ;
+++
+++ mLastError = OpenEntry(aObject.mByteCount, aObject.mEntryId,
+++ &IID_IMAPIProp, 0, &objType,
+++ object) ;
+++
+++ if (HR_FAILED(mLastError)){
+++ PRINTF(("Cannot open entry %08x.\n", mLastError));
+++ return FALSE;
+++ }
+++ AllocateBuffer(CbNewSPropTagArray(aNbProperties),
+++ NS_REINTERPRET_CAST(void **, &properties));
+++ properties->cValues = aNbProperties;
+++ for (i = 0 ; i < aNbProperties ; ++ i) {
+++ properties->aulPropTag [i] = aPropertyTags [i];
+++ }
+++ mLastError = object->GetProps(properties, 0, &aValueCount, &aValue);
+++ FreeBuffer(properties);
+++ if (HR_FAILED(mLastError)){
+++ PRINTF(("Cannot get props %08x.\n", mLastError));
+++ }
+++ return HR_SUCCEEDED(mLastError) ;
+++}
+++
+++BOOL nsWabAddressBook::SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties,
+++ LPSPropValue& aValues)
+++{
+++ nsMapiInterfaceWrapper<LPMAPIPROP> object ;
+++ ULONG objType = 0 ;
+++ LPSPropProblemArray problems = NULL ;
+++
+++ mLastError = OpenEntry(aObject.mByteCount, aObject.mEntryId,
+++ &IID_IMAPIProp, MAPI_MODIFY, &objType,
+++ object) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot open entry %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ mLastError = object->SetProps(aNbProperties, aValues, &problems) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot update the object %08x.\n", mLastError)) ;
+++ return FALSE ;
+++ }
+++ if (problems) {
+++ for (ULONG i = 0 ; i < problems->cProblem ; ++ i) {
+++ PRINTF(("Problem %d: index %d code %08x.\n", i,
+++ problems->aProblem [i].ulIndex,
+++ problems->aProblem [i].scode));
+++ }
+++ }
+++ mLastError = object->SaveChanges(0) ;
+++ if (HR_FAILED(mLastError)) {
+++ PRINTF(("Cannot commit changes %08x.\n", mLastError)) ;
+++ }
+++ return HR_SUCCEEDED(mLastError) ;
+++}
+++
+++BOOL nsWabAddressBook::GetDefaultContainer(nsMapiEntry& aContainer)
+++{
+++ LPENTRYID entryId = NULL;
+++ ULONG byteCount = 0;
+++
+++ mLastError = mAddressBook->GetPAB(&byteCount, &entryId);
+++ if (HR_FAILED(mLastError)){
+++ PRINTF(("Cannot get PAB %08x.\n", mLastError));
+++ return FALSE;
+++ }
+++ aContainer.Assign(byteCount, entryId);
+++ FreeBuffer(entryId) ;
+++ return TRUE ;
+++}
+++
+++BOOL nsWabAddressBook::IsOK(void)
+++{
+++ return mAddressBook != NULL ;
+++}
+++
++ BOOL nsWabAddressBook::Initialize(void)
++ {
++- if (mAddressBook) { return TRUE ; }
++ nsAutoLock guard(mMutex) ;
++
++ if (!LoadWabLibrary()) {
++--- misc/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 2004-04-17 20:32:14.000000000 +0200
+++++ misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 2008-08-14 16:22:21.000000000 +0200
++@@ -47,6 +47,15 @@
++ nsWabAddressBook(void) ;
++ virtual ~nsWabAddressBook(void) ;
++
+++ // Get the top address books
+++ virtual BOOL GetFolders(nsMapiEntryArray& aFolders);
+++
+++ // Get a default address book container
+++ virtual BOOL GetDefaultContainer(nsMapiEntry& aContainer);
+++ // Is the helper correctly initialised?
+++ virtual BOOL IsOK(void);
+++ static void FreeWabLibrary(void) ;
+++
++ protected :
++ // Session and address book that will be shared by all instances
++ // (see nsMapiAddressBook.h for details)
++@@ -57,15 +66,46 @@
++ static HMODULE mLibrary ;
++ static LPWABOPEN mWABOpen ;
++
+++ LPADRBOOK mAddressBook ;
+++
++ // Load the WAB environment
++ BOOL Initialize(void) ;
+++
+++ virtual HRESULT OpenEntry(ULONG cbEntryID,
+++ LPENTRYID lpEntryID,
+++ LPCIID lpInterface,
+++ ULONG ulFlags,
+++ ULONG FAR * lpulObjType,
+++ LPUNKNOWN FAR * lppUnk
+++ )
+++ {
+++ return mAddressBook->OpenEntry(cbEntryID,
+++ lpEntryID,
+++ lpInterface,
+++ ulFlags,
+++ lpulObjType,
+++ lppUnk
+++ );
+++ }
+++
+++
+++ // Retrieve the contents of a container, with an optional restriction
+++ virtual BOOL GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
+++ nsMapiEntryArray *aList, ULONG aMapiType) ;
+++ // Retrieve the values of a set of properties on a MAPI object
+++ virtual BOOL GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags,
+++ ULONG aNbProperties,
+++ LPSPropValue& aValues, ULONG& aValueCount) ;
+++ // Set the values of a set of properties on a MAPI object
+++ virtual BOOL SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties,
+++ LPSPropValue& aValues) ;
+++
++ // Allocation of a buffer for transmission to interfaces
++ virtual void AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer) ;
++ // Destruction of a buffer provided by the interfaces
++ virtual void FreeBuffer(LPVOID aBuffer) ;
++ // Manage the library
++ static BOOL LoadWabLibrary(void) ;
++- static void FreeWabLibrary(void) ;
++
++ private :
++ } ;
++--- misc/mozilla/mailnews/base/src/nsMessengerWinIntegration.cpp 2007-05-03 03:39:41.000000000 +0200
+++++ misc/build/mozilla/mailnews/base/src/nsMessengerWinIntegration.cpp 2008-08-20 16:46:58.000000000 +0200
++@@ -819,8 +819,13 @@
++
++ if (mUseWideCharBiffIcon)
++ {
++- ::wcsncpy( sWideBiffIconData.szTip, aToolTipString, toolTipBufSize);
++- if (wcslen(aToolTipString) >= toolTipBufSize)
+++#ifdef __MINGW32__
+++ ::wcsncpy( sWideBiffIconData.szTip, NS_REINTERPRET_CAST(LPCWSTR, aToolTipString), toolTipBufSize);
+++ if (wcslen(NS_REINTERPRET_CAST(LPCWSTR, aToolTipString)) >= toolTipBufSize)
+++#else
+++ ::wcsncpy( sWideBiffIconData.szTip, aToolTipString, toolTipBufSize);
+++ if (wcslen(aToolTipString) >= toolTipBufSize)
+++#endif
++ sWideBiffIconData.szTip[toolTipBufSize - 1] = 0;
++ }
++ else
++@@ -862,7 +867,11 @@
++ // now we need to copy over any left over tool tip strings
++ if (sWideBiffIconData.szTip)
++ {
+++#ifdef __MINGW32__
+++ const PRUnichar * oldTooltipString = reinterpret_cast<PRUnichar*>(sWideBiffIconData.szTip);
+++#else
++ const PRUnichar * oldTooltipString = sWideBiffIconData.szTip;
+++#endif
++ SetToolTipStringOnIconData(oldTooltipString);
++ }
++ }
++@@ -1040,7 +1049,11 @@
++ registryUnreadMailCountKey,
++ sizeof(registryUnreadMailCountKey))))
++ {
+++#ifdef __MINGW32__
+++ if (wcscmp(registryUnreadMailCountKey, NS_REINTERPRET_CAST(LPCWSTR, currentUnreadMailCountKey.get()))==0) {
+++#else
++ if (wcscmp(registryUnreadMailCountKey, currentUnreadMailCountKey.get())==0) {
+++#endif
++ nsAutoString deleteKey;
++ deleteKey.Assign(NS_LITERAL_STRING(UNREADMAILNODEKEY).get());
++ deleteKey.Append(currentUnreadMailCountKey.get());
++@@ -1108,9 +1121,15 @@
++ }
++
++ // Write the info into the registry
+++#ifdef __MINGW32__
+++ HRESULT hr = mSHSetUnreadMailCount(NS_REINTERPRET_CAST(LPCWSTR, pBuffer.get()),
+++ mCurrentUnreadCount,
+++ NS_REINTERPRET_CAST(LPCWSTR, commandLinerForAppLaunch.get()));
+++#else
++ HRESULT hr = mSHSetUnreadMailCount(pBuffer.get(),
++ mCurrentUnreadCount,
++ commandLinerForAppLaunch.get());
+++#endif
++ }
++
++ // do this last
++--- misc/mozilla/modules/libpref/src/Makefile.in 2006-02-03 15:44:52.000000000 +0100
+++++ misc/build/mozilla/modules/libpref/src/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -91,7 +91,7 @@
++ PREF_JS_EXPORTS += $(srcdir)/init/non-shared.txt
++ endif
++
++-EXTRA_DSO_LDOPTS = \
+++EXTRA_DSO_LDOPTS += \
++ $(LIBS_DIR) \
++ $(MOZ_JS_LIBS) \
++ $(MOZ_COMPONENT_LIBS) \
++--- misc/mozilla/netwerk/protocol/http/src/nsHttpConnectionMgr.cpp 2005-07-20 20:31:42.000000000 +0200
+++++ misc/build/mozilla/netwerk/protocol/http/src/nsHttpConnectionMgr.cpp 2008-08-20 15:45:06.000000000 +0200
++@@ -277,7 +277,7 @@
++ nsresult
++ nsHttpConnectionMgr::UpdateParam(nsParamName name, PRUint16 value)
++ {
++- PRUint32 param = (PRUint32(name) << 16) | PRUint32(value);
+++ PRUint32 param = (NS_PTR_TO_INT32(name) << 16) | NS_PTR_TO_INT32(value);
++ return PostEvent(&nsHttpConnectionMgr::OnMsgUpdateParam, 0, (void *) param);
++ }
++
++--- misc/mozilla/nsprpub/build/cygwin-wrapper 2006-12-22 14:47:17.000000000 +0100
+++++ misc/build/mozilla/nsprpub/build/cygwin-wrapper 2008-08-14 16:22:21.000000000 +0200
++@@ -1,4 +1,4 @@
++-#!/bin/sh
+++#!/bin/bash
++ #
++ # Stupid wrapper to avoid win32 dospath/cygdrive issues
++ # Try not to spawn programs from within this file. If the stuff in here looks royally
++--- misc/mozilla/nsprpub/config/autoconf.mk.in 2006-12-22 14:47:17.000000000 +0100
+++++ misc/build/mozilla/nsprpub/config/autoconf.mk.in 2008-08-14 16:22:21.000000000 +0200
++@@ -22,6 +22,7 @@
++ RELEASE_OBJDIR_NAME = @RELEASE_OBJDIR_NAME@
++ OBJDIR_NAME = @OBJDIR_NAME@
++ OBJDIR = @OBJDIR@
+++LIB_PREFIX = @LIB_PREFIX@
++ OBJ_SUFFIX = @OBJ_SUFFIX@
++ LIB_SUFFIX = @LIB_SUFFIX@
++ DLL_SUFFIX = @DLL_SUFFIX@
++--- misc/mozilla/nsprpub/config/rules.mk 2006-12-22 14:47:17.000000000 +0100
+++++ misc/build/mozilla/nsprpub/config/rules.mk 2008-12-12 10:09:34.437500000 +0100
++@@ -340,6 +340,10 @@
++ else # AIX 4.1
++ ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
++ $(LINK_DLL) -MAP $(DLLBASE) $(DLL_LIBS) $(EXTRA_LIBS) $(OBJS) $(RES)
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;2; \
+++ rm -f $ manifest; \
+++ fi
++ else
++ ifeq ($(MOZ_OS2_TOOLS),VACPP)
++ $(LINK_DLL) $(DLLBASE) $(OBJS) $(OS_LIBS) $(EXTRA_LIBS) $(MAPFILE)
++--- misc/mozilla/nsprpub/configure 2008-01-29 20:27:43.000000000 +0100
+++++ misc/build/mozilla/nsprpub/configure 2008-08-14 16:22:21.000000000 +0200
++@@ -2737,6 +2737,7 @@
++ LIB_SUFFIX=a
++ DLL_SUFFIX=so
++ ASM_SUFFIX=s
+++LIB_PREFIX=lib
++ MKSHLIB='$(LD) $(DSO_LDOPTS) -o $@'
++ PR_MD_ASFILES=
++ PR_MD_CSRCS=
++@@ -3475,7 +3476,7 @@
++ EOF
++
++ CFLAGS="$CFLAGS $(DSO_CFLAGS) -ansi -Wall"
++- MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+++ MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo elf`
++ if test "$MOZ_OBJFORMAT" = "elf"; then
++ DLL_SUFFIX=so
++ else
++@@ -3941,7 +3942,7 @@
++ CC="$CC -mno-cygwin"
++ CXX="$CXX -mno-cygwin"
++ DLL_SUFFIX=dll
++- MKSHLIB='$(CC) -shared -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(IMPORT_LIBRARY) $(DLLBASE) -o $(subst $(OBJDIR)/,,$(SHARED_LIBRARY))'
+++ MKSHLIB='$(CC) -shared -Wl,--enable-runtime-pseudo-reloc -Wl,--export-all-symbols -Wl,--out-implib -Wl,$(IMPORT_LIBRARY) $(DLLBASE) -o $(subst $(OBJDIR)/,,$(SHARED_LIBRARY))'
++ RC=$WINDRES
++ # Use temp file for windres (bug 213281)
++ RCFLAGS='-O coff --use-temp-file'
++@@ -5766,6 +5767,7 @@
++ CC="\$(CYGWIN_WRAPPER) $CC"
++ CXX="\$(CYGWIN_WRAPPER) $CXX"
++ RC="\$(CYGWIN_WRAPPER) $RC"
+++ LD="\$(CYGWIN_WRAPPER) $LD"
++ ;;
++ esac
++
++@@ -6127,6 +6129,7 @@
++ s% LIB_SUFFIX@%$LIB_SUFFIX%g
++ s% DLL_SUFFIX@%$DLL_SUFFIX%g
++ s% ASM_SUFFIX@%$ASM_SUFFIX%g
+++s% LIB_PREFIX@%$LIB_PREFIX%g
++ s% MKSHLIB@%$MKSHLIB%g
++ s% DSO_CFLAGS@%$DSO_CFLAGS%g
++ s% DSO_LDOPTS@%$DSO_LDOPTS%g
++--- misc/mozilla/nsprpub/configure.in 2008-01-29 20:27:44.000000000 +0100
+++++ misc/build/mozilla/nsprpub/configure.in 2008-08-14 16:22:21.000000000 +0200
++@@ -1137,7 +1137,7 @@
++ AC_DEFINE(HAVE_BSD_FLOCK)
++ AC_DEFINE(HAVE_SOCKLEN_T)
++ CFLAGS="$CFLAGS $(DSO_CFLAGS) -ansi -Wall"
++- MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+++ MOZ_OBJFORMAT=`test -x /usr/bin/objformat && /usr/bin/objformat || echo elf`
++ if test "$MOZ_OBJFORMAT" = "elf"; then
++ DLL_SUFFIX=so
++ else
++--- misc/mozilla/nsprpub/lib/ds/Makefile.in 2006-12-22 14:47:17.000000000 +0100
+++++ misc/build/mozilla/nsprpub/lib/ds/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -79,18 +79,22 @@
++ OS_LIBS = -lc
++ endif
++
+++ifeq ($(OS_ARCH),Linux)
+++MKSHLIB += -Wl,-rpath,\$$ORIGIN:\$$ORIGIN/../ure-link/lib
+++endif
+++
++ ifeq ($(OS_ARCH),SunOS)
++ OS_LIBS = -lc
++ MAPFILE = $(OBJDIR)/pldsmap.sun
++ GARBAGE += $(MAPFILE)
++ ifdef NS_USE_GCC
++ ifdef GCC_USE_GNU_LD
++-MKSHLIB += -Wl,--version-script,$(MAPFILE)
+++MKSHLIB += -Wl,--version-script,$(MAPFILE) -Wl,-rpath,\$$ORIGIN:\$$ORIGIN/../ure-link/lib
++ else
++-MKSHLIB += -Wl,-M,$(MAPFILE)
+++MKSHLIB += -Wl,-M,$(MAPFILE) -Wl,-R,'$$ORIGIN'
++ endif
++ else
++-MKSHLIB += -M $(MAPFILE)
+++MKSHLIB += -M $(MAPFILE) -Wl,-R,'$$ORIGIN'
++ endif
++ # The -R '$ORIGIN' linker option instructs this library to search for its
++ # dependencies in the same directory where it resides.
++--- misc/mozilla/nsprpub/lib/libc/src/Makefile.in 2006-12-22 14:47:17.000000000 +0100
+++++ misc/build/mozilla/nsprpub/lib/libc/src/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -89,18 +89,22 @@
++ OS_LIBS = -lc
++ endif
++
+++ifeq ($(OS_ARCH),Linux)
+++MKSHLIB += -Wl,-rpath,\$$ORIGIN:\$$ORIGIN/../ure-link/lib
+++endif
+++
++ ifeq ($(OS_ARCH),SunOS)
++ OS_LIBS = -lc
++ MAPFILE = $(OBJDIR)/plcmap.sun
++ GARBAGE += $(MAPFILE)
++ ifdef NS_USE_GCC
++ ifdef GCC_USE_GNU_LD
++-MKSHLIB += -Wl,--version-script,$(MAPFILE)
+++MKSHLIB += -Wl,--version-script,$(MAPFILE) -Wl,-rpath,\$$ORIGIN:\$$ORIGIN/../ure-link/lib
++ else
++-MKSHLIB += -Wl,-M,$(MAPFILE)
+++MKSHLIB += -Wl,-M,$(MAPFILE) -Wl,-R,'$$ORIGIN'
++ endif
++ else
++-MKSHLIB += -M $(MAPFILE)
+++MKSHLIB += -M $(MAPFILE) -Wl,-R,'$$ORIGIN'
++ endif
++ # The -R '$ORIGIN' linker option instructs this library to search for its
++ # dependencies in the same directory where it resides.
++--- misc/mozilla/nsprpub/pr/include/prtypes.h 2006-12-22 14:47:19.000000000 +0100
+++++ misc/build/mozilla/nsprpub/pr/include/prtypes.h 2008-08-14 16:22:21.000000000 +0200
++@@ -472,7 +472,7 @@
++
++ #ifndef __PRUNICHAR__
++ #define __PRUNICHAR__
++-#if defined(WIN32) || defined(XP_MAC)
+++#if !defined(__MINGW32__) && (defined(WIN32) || defined(XP_MAC))
++ typedef wchar_t PRUnichar;
++ #else
++ typedef PRUint16 PRUnichar;
++--- misc/mozilla/nsprpub/pr/src/misc/prnetdb.c 2006-12-22 14:47:27.000000000 +0100
+++++ misc/build/mozilla/nsprpub/pr/src/misc/prnetdb.c 2008-08-14 16:22:21.000000000 +0200
++@@ -113,7 +113,8 @@
++ #define _PR_HAVE_5_ARG_GETPROTO_R
++ #endif
++
++-#if (defined(LINUX) && defined(__GLIBC__) && __GLIBC__ >= 2)
+++#if (defined(LINUX) && defined(__GLIBC__) && __GLIBC__ >= 2) || \
+++ (defined(__FreeBSD__) && __FreeBSD_version > 601103)
++ #define _PR_HAVE_GETPROTO_R
++ #define _PR_HAVE_5_ARG_GETPROTO_R
++ #endif
++--- misc/mozilla/security/coreconf/FreeBSD.mk 2006-12-22 14:48:06.000000000 +0100
+++++ misc/build/mozilla/security/coreconf/FreeBSD.mk 2008-08-14 16:22:21.000000000 +0200
++@@ -65,7 +65,7 @@
++
++ ARCH = freebsd
++
++-MOZ_OBJFORMAT := $(shell test -x /usr/bin/objformat && /usr/bin/objformat || echo aout)
+++MOZ_OBJFORMAT := $(shell test -x /usr/bin/objformat && /usr/bin/objformat || echo elf)
++
++ ifeq ($(MOZ_OBJFORMAT),elf)
++ DLL_SUFFIX = so
++--- misc/mozilla/security/coreconf/Linux.mk 2006-12-22 14:48:06.000000000 +0100
+++++ misc/build/mozilla/security/coreconf/Linux.mk 2008-08-18 10:16:15.000000000 +0200
++@@ -139,7 +139,7 @@
++
++ ifeq ($(OS_RELEASE),2.0)
++ OS_REL_CFLAGS += -DLINUX2_0
++- MKSHLIB = $(CC) -shared -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so)
+++ MKSHLIB = $(CC) $(DSO_LDOPTS) -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so)
++ ifdef MAPFILE
++ MKSHLIB += -Wl,--version-script,$(MAPFILE)
++ endif
++@@ -166,6 +166,7 @@
++
++ DSO_CFLAGS = -fPIC
++ DSO_LDOPTS = -shared $(ARCHFLAG)
+++DSO_LDOPTS += -Wl,-rpath,\$$ORIGIN:\$$ORIGIN/../ure-link/lib
++ DSO_LDFLAGS =
++ LDFLAGS += $(ARCHFLAG)
++
++--- misc/mozilla/security/coreconf/SunOS5.mk 2008-06-16 00:22:15.000000000 +0200
+++++ misc/build/mozilla/security/coreconf/SunOS5.mk 2008-08-14 16:22:21.000000000 +0200
++@@ -161,12 +161,14 @@
++
++ # ld options:
++ # -G: produce a shared object
+++# -R '$ORIGIN': search for dependencies in same directory
++ # -z defs: no unresolved symbols allowed
++ ifdef NS_USE_GCC
++ ifeq ($(USE_64), 1)
++ DSO_LDOPTS += -m64
++ endif
++ DSO_LDOPTS += -shared -h $(notdir $@)
+++ DSO_LDOPTS += -Wl,-rpath,\$$ORIGIN:\$$ORIGIN/../ure-link/lib
++ else
++ ifeq ($(USE_64), 1)
++ ifeq ($(OS_TEST),i86pc)
++@@ -176,6 +178,7 @@
++ endif
++ endif
++ DSO_LDOPTS += -G -h $(notdir $@)
+++ DSO_LDOPTS += -R '$$ORIGIN'
++ endif
++ DSO_LDOPTS += -z combreloc -z defs -z ignore
++
++--- misc/mozilla/security/coreconf/WIN32.mk 2008-06-16 00:22:15.000000000 +0200
+++++ misc/build/mozilla/security/coreconf/WIN32.mk 2008-08-18 16:04:59.000000000 +0200
++@@ -43,24 +43,24 @@
++ DEFAULT_COMPILER = cl
++
++ ifdef NS_USE_GCC
++- CC = gcc
++- CCC = g++
++- LINK = ld
++- AR = ar
+++ CC = $(CYGWIN_WRAPPER) gcc
+++ CCC = $(CYGWIN_WRAPPER) g++
+++ LINK = $(CYGWIN_WRAPPER) ld
+++ AR = $(CYGWIN_WRAPPER) ar
++ AR += cr $@
++- RANLIB = ranlib
+++ RANLIB = $(CYGWIN_WRAPPER) ranlib
++ BSDECHO = echo
++- RC = windres.exe -O coff --use-temp-file
++- LINK_DLL = $(CC) $(OS_DLLFLAGS) $(DLLFLAGS)
+++ RC = $(CYGWIN_WRAPPER) windres.exe -O coff --use-temp-file
+++ LINK_DLL = $(CYGWIN_WRAPPER) $(CC) $(OS_DLLFLAGS) $(DLLFLAGS)
++ else
++- CC = cl
++- CCC = cl
++- LINK = link
++- AR = lib
+++ CC = $(CYGWIN_WRAPPER) cl
+++ CCC = $(CYGWIN_WRAPPER) cl
+++ LINK = $(CYGWIN_WRAPPER) link
+++ AR = $(CYGWIN_WRAPPER) lib
++ AR += -NOLOGO -OUT:"$@"
++ RANLIB = echo
++ BSDECHO = echo
++- RC = rc.exe
+++ RC = $(CYGWIN_WRAPPER) rc.exe
++ MT = mt.exe
++ endif
++
++@@ -69,7 +69,7 @@
++ else
++ NSINSTALL_DIR = $(CORE_DEPTH)/coreconf/nsinstall
++ endif
++-NSINSTALL = nsinstall
+++NSINSTALL = $(CYGWIN_WRAPPER) nsinstall
++
++ MKDEPEND_DIR = $(CORE_DEPTH)/coreconf/mkdepend
++ MKDEPEND = $(MKDEPEND_DIR)/$(OBJDIR_NAME)/mkdepend.exe
++@@ -95,7 +95,7 @@
++ # dllimport cannot be used as as a constant address.
++ OS_CFLAGS += -mno-cygwin -mms-bitfields -mnop-fun-dllimport
++ _GEN_IMPORT_LIB=-Wl,--out-implib,$(IMPORT_LIBRARY)
++- DLLFLAGS += -mno-cygwin -o $@ -shared -Wl,--export-all-symbols $(if $(IMPORT_LIBRARY),$(_GEN_IMPORT_LIB))
+++ DLLFLAGS += -mno-cygwin -o $@ -shared -Wl,--enable-runtime-pseudo-reloc,--export-all-symbols $(if $(IMPORT_LIBRARY),$(_GEN_IMPORT_LIB))
++ ifdef BUILD_OPT
++ OPTIMIZER += -O2
++ DEFINES += -UDEBUG -U_DEBUG -DNDEBUG
++--- misc/mozilla/security/coreconf/WIN954.0.mk 2008-06-16 00:22:15.000000000 +0200
+++++ misc/build/mozilla/security/coreconf/WIN954.0.mk 2008-08-14 16:22:21.000000000 +0200
++@@ -72,3 +72,7 @@
++ endif
++ endif
++ DEFINES += -DWIN95
+++
+++ifdef NS_USE_GCC
+++NSPR31_LIB_PREFIX = lib
+++endif
++--- misc/mozilla/security/coreconf/command.mk 2008-06-16 00:22:15.000000000 +0200
+++++ misc/build/mozilla/security/coreconf/command.mk 2008-08-19 09:58:11.000000000 +0200
++@@ -45,7 +45,7 @@
++ CCF = $(CC) $(CFLAGS)
++ LINK_DLL = $(LINK) $(OS_DLLFLAGS) $(DLLFLAGS)
++ LINK_EXE = $(LINK) $(OS_LFLAGS) $(LFLAGS)
++-CFLAGS = $(OPTIMIZER) $(OS_CFLAGS) $(XP_DEFINE) $(DEFINES) $(INCLUDES) \
+++CFLAGS += $(OPTIMIZER) $(OS_CFLAGS) $(XP_DEFINE) $(DEFINES) $(INCLUDES) \
++ $(XCFLAGS)
++ PERL = perl
++ RANLIB = echo
++--- misc/mozilla/security/coreconf/rules.mk 2008-06-16 00:22:15.000000000 +0200
+++++ misc/build/mozilla/security/coreconf/rules.mk 2008-08-19 10:46:57.000000000 +0200
++@@ -284,7 +284,7 @@
++ $(PROGRAM): $(OBJS) $(EXTRA_LIBS)
++ @$(MAKE_OBJDIR)
++ ifeq (,$(filter-out _WIN%,$(NS_USE_GCC)_$(OS_TARGET)))
++- $(MKPROG) $(subst /,\\,$(OBJS)) -Fe$@ -link $(LDFLAGS) $(subst /,\\,$(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS))
+++ $(MKPROG) $(OBJS) -Fe$@ -link $(LDFLAGS) $(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS)
++ ifdef MT
++ if test -f $ manifest; then \
++ $(MT) -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;1; \
++@@ -305,11 +305,7 @@
++ $(LIBRARY): $(OBJS)
++ @$(MAKE_OBJDIR)
++ rm -f $@
++-ifeq (,$(filter-out _WIN%,$(NS_USE_GCC)_$(OS_TARGET)))
++- $(AR) $(subst /,\\,$(OBJS))
++-else
++ $(AR) $(OBJS)
++-endif
++ $(RANLIB) $@
++
++
++@@ -344,7 +340,7 @@
++ ifdef NS_USE_GCC
++ $(LINK_DLL) $(OBJS) $(SUB_SHLOBJS) $(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS) $(LD_LIBS) $(RES)
++ else
++- $(LINK_DLL) -MAP $(DLLBASE) $(subst /,\\,$(OBJS) $(SUB_SHLOBJS) $(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS) $(LD_LIBS) $(RES))
+++ $(LINK_DLL) -MAP $(DLLBASE) $(OBJS) $(SUB_SHLOBJS) $(EXTRA_LIBS) $(EXTRA_SHARED_LIBS) $(OS_LIBS) $(LD_LIBS) $(RES)
++ ifdef MT
++ if test -f $ manifest; then \
++ $(MT) -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;2; \
++@@ -429,15 +425,15 @@
++ endif
++ endif
++
++-core_abspath = $(if $(findstring :,$(1)),$(1),$(if $(filter /%,$(1)),$(1),$(PWD)/$(1)))
+++mozabspath = $(if $(findstring :,$(1)),$(1),$(if $(filter /%,$(1)),$(1),$(PWD)/$(1)))
++
++ $(OBJDIR)/$(PROG_PREFIX)%$(OBJ_SUFFIX): %.c
++ @$(MAKE_OBJDIR)
++ ifdef USE_NT_C_SYNTAX
++- $(CC) -Fo$@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CC) -Fo$@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ ifdef NEED_ABSOLUTE_PATH
++- $(CC) -o $@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CC) -o $@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ $(CC) -o $@ -c $(CFLAGS) $<
++ endif
++@@ -445,10 +441,10 @@
++
++ $(PROG_PREFIX)%$(OBJ_SUFFIX): %.c
++ ifdef USE_NT_C_SYNTAX
++- $(CC) -Fo$@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CC) -Fo$@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ ifdef NEED_ABSOLUTE_PATH
++- $(CC) -o $@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CC) -o $@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ $(CC) -o $@ -c $(CFLAGS) $<
++ endif
++@@ -477,10 +473,10 @@
++ $(OBJDIR)/$(PROG_PREFIX)%: %.cpp
++ @$(MAKE_OBJDIR)
++ ifdef USE_NT_C_SYNTAX
++- $(CCC) -Fo$@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CCC) -Fo$@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ ifdef NEED_ABSOLUTE_PATH
++- $(CCC) -o $@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CCC) -o $@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ $(CCC) -o $@ -c $(CFLAGS) $<
++ endif
++@@ -501,10 +497,10 @@
++ rm -f $(OBJDIR)/t_$*.cc
++ else
++ ifdef USE_NT_C_SYNTAX
++- $(CCC) -Fo$@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CCC) -Fo$@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ ifdef NEED_ABSOLUTE_PATH
++- $(CCC) -o $@ -c $(CFLAGS) $(call core_abspath,$<)
+++ $(CCC) -o $@ -c $(CFLAGS) $(call mozabspath,$<)
++ else
++ $(CCC) -o $@ -c $(CFLAGS) $<
++ endif
++--- misc/mozilla/security/manager/Makefile.in 2008-06-16 00:23:29.000000000 +0200
+++++ misc/build/mozilla/security/manager/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -172,6 +172,7 @@
++ endif
++ ifeq ($(OS_ARCH),WINNT)
++ DEFAULT_GMAKE_FLAGS += OS_TARGET=WIN95
+++DEFAULT_GMAKE_FLAGS += CYGWIN_WRAPPER= CYGWIN_WRAPPER@
++ ifdef MOZ_DEBUG
++ ifndef MOZ_NO_DEBUG_RTL
++ DEFAULT_GMAKE_FLAGS += USE_DEBUG_RTL=1
++--- misc/mozilla/security/nss/cmd/shlibsign/Makefile 2007-02-16 03:16:24.000000000 +0100
+++++ misc/build/mozilla/security/nss/cmd/shlibsign/Makefile 2009-02-12 15:42:13.033408000 +0100
++@@ -86,17 +86,46 @@
++
++ include ../platrules.mk
++
++-SRCDIR = $(call core_abspath,.)
++-
+++ifeq ($(OS_TARGET), Darwin)
+++ SRCDIR = .
+++else
+++ifeq ($(OS_TARGET), Linux)
+++ SRCDIR = .
+++else
+++ifeq ($(OS_TARGET), WIN95)
+++ SRCDIR = $(shell cygpath -d $(SRCDIR))
+++else
+++ SRCDIR = .
+++endif
+++endif
+++endif
++ %.chk: %.$(DLL_SUFFIX)
++ ifeq ($(OS_TARGET), OS2)
++ cd $(OBJDIR) ; cmd.exe /c $(SRCDIR)/sign.cmd $(DIST) \
++ $(call core_abspath,$(OBJDIR)) $(OS_TARGET) \
++ $(call core_abspath,$(NSPR_LIB_DIR)) $(call core_abspath,$<)
++ else
++- cd $(OBJDIR) ; sh $(SRCDIR)/sign.sh $(call core_abspath,$(DIST)) \
++- $(call core_abspath,$(OBJDIR)) $(OS_TARGET) \
++- $(call core_abspath,$(NSPR_LIB_DIR)) $(call core_abspath,$<)
+++ifeq ($(OS_TARGET), WIN95)
+++ sh $(CYGWIN_WRAPPER) ./sign.sh $(shell cygpath -d -a $(DIST)) \
+++ $(shell cygpath -d -a $(OBJDIR)) $(OS_TARGET) \
+++ $(shell cygpath -d -a $(NSPR_LIB_DIR)) $(shell cygpath -d -a $<)
+++else
+++ifeq ($(OS_TARGET), Darwin)
+++ cd $(SRCDIR) ; sh ./sign.sh $(DIST) \
+++ $(OBJDIR) $(OS_TARGET) \
+++ $(NSPR_LIB_DIR) $<
+++else
+++ifeq ($(OS_TARGET), Linux)
+++ cd $(SRCDIR) ; sh ./sign.sh $(DIST) \
+++ $(OBJDIR) $(OS_TARGET) \
+++ $(NSPR_LIB_DIR) $<
+++else
+++ cd $(SRCDIR) ; sh ./sign.sh $(DIST) \
+++ $(OBJDIR) $(OS_TARGET) \
+++ $(NSPR_LIB_DIR) $<
+++endif
+++endif
+++endif
++ endif
++
++ libs install :: $(CHECKLOC)
++--- misc/mozilla/security/nss/lib/ckfw/builtins/config.mk 2005-01-20 03:25:46.000000000 +0100
+++++ misc/build/mozilla/security/nss/lib/ckfw/builtins/config.mk 2008-08-14 16:22:21.000000000 +0200
++@@ -63,9 +63,4 @@
++ DSO_LDOPTS = -bundle
++ endif
++
++-ifeq ($(OS_TARGET),SunOS)
++-# The -R '$ORIGIN' linker option instructs this library to search for its
++-# dependencies in the same directory where it resides.
++-MKSHLIB += -R '$$ORIGIN'
++-endif
++
++--- misc/mozilla/security/nss/lib/freebl/Makefile 2008-06-16 00:22:09.000000000 +0200
+++++ misc/build/mozilla/security/nss/lib/freebl/Makefile 2008-08-18 14:31:08.000000000 +0200
++@@ -199,10 +199,6 @@
++ endif
++
++ ifeq ($(OS_TARGET),SunOS)
++-
++-# The -R '$ORIGIN' linker option instructs this library to search for its
++-# dependencies in the same directory where it resides.
++-MKSHLIB += -R '$$ORIGIN'
++ ifdef NS_USE_GCC
++ ifdef GCC_USE_GNU_LD
++ MKSHLIB += -Wl,-Bsymbolic,-z,now,-z,text
++@@ -210,7 +206,7 @@
++ MKSHLIB += -Wl,-B,symbolic,-z,now,-z,text
++ endif # GCC_USE_GNU_LD
++ else
++- MKSHLIB += -B symbolic -z now -z text
+++ MKSHLIB += -z now -z text
++ endif # NS_USE_GCC
++
++ # Sun's WorkShop defines v8, v8plus and v9 architectures.
++--- misc/mozilla/security/nss/lib/nss/config.mk 2006-12-22 14:47:56.000000000 +0100
+++++ misc/build/mozilla/security/nss/lib/nss/config.mk 2008-08-19 17:07:42.000000000 +0200
++@@ -113,12 +113,10 @@
++ # The -R '$ORIGIN' linker option instructs this library to search for its
++ # dependencies in the same directory where it resides.
++ ifeq ($(USE_64), 1)
++-MKSHLIB += -R '$$ORIGIN:/usr/lib/mps/secv1/64:/usr/lib/mps/64'
+++DSO_LDOPTS += -R '$$ORIGIN:/usr/lib/mps/secv1/64:/usr/lib/mps/64'
++ else
++-MKSHLIB += -R '$$ORIGIN:/usr/lib/mps/secv1:/usr/lib/mps'
+++DSO_LDOPTS += -R '$$ORIGIN:/usr/lib/mps/secv1:/usr/lib/mps'
++ endif
++-else
++-MKSHLIB += -R '$$ORIGIN'
++ endif
++ endif
++
++@@ -127,9 +125,9 @@
++ # pa-risc
++ ifeq ($(USE_64), 1)
++ MKSHLIB += +b '$$ORIGIN'
++-endif
++-endif
++-endif
+++endif # USE_64
+++endif # OS_TEST
+++endif # OS_ARCH
++
++ ifeq (,$(filter-out WINNT WIN95,$(OS_TARGET)))
++ ifndef NS_USE_GCC
++--- misc/mozilla/security/nss/lib/nss/nss.def 2008-06-16 00:22:10.000000000 +0200
+++++ misc/build/mozilla/security/nss/lib/nss/nss.def 2008-08-14 16:22:21.000000000 +0200
++@@ -61,6 +61,7 @@
++ CERT_CheckCertValidTimes;
++ CERT_CreateCertificateRequest;
++ CERT_ChangeCertTrust;
+++CERT_DecodeDERCertificate;
++ CERT_DecodeDERCrl;
++ CERT_DestroyCertificateRequest;
++ CERT_DestroyCertList;
++--- misc/mozilla/security/nss/lib/smime/config.mk 2006-12-22 14:48:00.000000000 +0100
+++++ misc/build/mozilla/security/nss/lib/smime/config.mk 2008-08-19 17:01:53.000000000 +0200
++@@ -92,8 +92,3 @@
++ ../pkcs7 \
++ $(NULL)
++
++-ifeq ($(OS_TARGET),SunOS)
++-# The -R '$ORIGIN' linker option instructs this library to search for its
++-# dependencies in the same directory where it resides.
++-MKSHLIB += -R '$$ORIGIN'
++-endif
++--- misc/mozilla/security/nss/lib/softoken/config.mk 2006-12-22 14:48:00.000000000 +0100
+++++ misc/build/mozilla/security/nss/lib/softoken/config.mk 2008-08-20 10:36:17.000000000 +0200
++@@ -87,13 +87,6 @@
++ $(NULL)
++ endif
++
++-ifeq ($(OS_TARGET),SunOS)
++-# The -R '$ORIGIN' linker option instructs this library to search for its
++-# dependencies in the same directory where it resides.
++-MKSHLIB += -R '$$ORIGIN'
++-OS_LIBS += -lbsm
++-endif
++-
++ ifeq ($(OS_TARGET),WINCE)
++ DEFINES += -DDBM_USING_NSPR
++ endif
++--- misc/mozilla/security/nss/lib/ssl/config.mk 2008-06-16 00:22:12.000000000 +0200
+++++ misc/build/mozilla/security/nss/lib/ssl/config.mk 2008-08-19 17:03:03.000000000 +0200
++@@ -116,13 +116,6 @@
++ EXTRA_SHARED_LIBS += -dylib_file @executable_path/libsoftokn3.dylib:$(DIST)/lib/libsoftokn3.dylib
++ endif
++
++-ifeq ($(OS_TARGET),SunOS)
++-# The -R '$ORIGIN' linker option instructs this library to search for its
++-# dependencies in the same directory where it resides.
++-MKSHLIB += -R '$$ORIGIN'
++-#EXTRA_SHARED_LIBS += -ldl -lrt -lc -z defs
++-endif
++-
++ endif
++
++ # indicates dependency on freebl static lib
++--- misc/mozilla/uriloader/exthandler/win/nsOSHelperAppService.cpp 2007-10-08 21:09:06.000000000 +0200
+++++ misc/build/mozilla/uriloader/exthandler/win/nsOSHelperAppService.cpp 2008-08-18 09:53:47.000000000 +0200
++@@ -163,11 +163,21 @@
++ if (aProtocolScheme && *aProtocolScheme)
++ {
++ HKEY hKey;
++- LONG err = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, aProtocolScheme, 0,
+++ LONG err;
+++#ifdef __MINGW32__
+++ err = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, NS_REINTERPRET_CAST(LPCWSTR, aProtocolScheme), 0,
++ KEY_QUERY_VALUE, &hKey);
+++#else
+++ err = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, aProtocolScheme, 0,
+++ KEY_QUERY_VALUE, &hKey);
+++#endif
++ if (err == ERROR_SUCCESS)
++ {
+++#ifdef __MINGW32__
+++ err = ::RegQueryValueEx(hKey, NS_REINTERPRET_CAST(LPCWSTR, "URL Protocol"), NULL, NULL, NULL, NULL);
+++#else
++ err = ::RegQueryValueEx(hKey, "URL Protocol", NULL, NULL, NULL, NULL);
+++#endif
++ *aHandlerExists = (err == ERROR_SUCCESS);
++ // close the key
++ ::RegCloseKey(hKey);
++--- misc/mozilla/webshell/tests/viewer/Makefile.in 2006-06-17 18:27:10.000000000 +0200
+++++ misc/build/mozilla/webshell/tests/viewer/Makefile.in 2008-08-14 16:22:21.000000000 +0200
++@@ -181,7 +181,7 @@
++ GTK_LIBS = unix/gtk/libviewer_gtk_s.a -lgtksuperwin $(XP_LIBS) $(MOZ_GTK_LDFLAGS)
++
++ XP_DIST_DEP_LIBS := $(filter-out -L$(DIST)/bin -L$(DIST)/lib, $(XP_DIST_LIBS))
++-XP_DIST_DEP_LIBS := $(wildcard $(addprefix $(DIST)/,$(patsubst -l%,bin/$(LIB_PREFIX)%$(DLL_SUFFIX),$(XP_DIST_DEP_LIBS:-l%_s=lib/lib%_s)))*)
+++XP_DIST_DEP_LIBS := $(wildcard $(addprefix $(DIST)/,$(patsubst -l%,bin/$(DLL_PREFIX)%$(DLL_SUFFIX),$(XP_DIST_DEP_LIBS:-l%_s=lib/lib%_s)))*)
++
++ EXTRA_DEPS = \
++ $(XP_DIST_DEP_LIBS) \
++--- misc/mozilla/widget/src/windows/nsDataObj.cpp 2006-06-21 06:33:32.000000000 +0200
+++++ misc/build/mozilla/widget/src/windows/nsDataObj.cpp 2008-08-18 15:49:13.000000000 +0200
++@@ -570,9 +570,15 @@
++ int currLen, textLen = (int) NS_MIN(aText.Length(), aFilenameLen);
++ char defaultChar = '_';
++ do {
+++#ifdef __MINGW32__
+++ currLen = WideCharToMultiByte(CP_ACP,
+++ NS_REINTERPRET_CAST(LPCWSTR, WC_COMPOSITECHECK|WC_DEFAULTCHAR),
+++ aText.get(), textLen--, aFilename, maxUsableFilenameLen, &defaultChar, NULL);
+++#else
++ currLen = WideCharToMultiByte(CP_ACP,
++ WC_COMPOSITECHECK|WC_DEFAULTCHAR,
++ aText.get(), textLen--, aFilename, maxUsableFilenameLen, &defaultChar, NULL);
+++#endif
++ }
++ while (currLen == 0 && textLen > 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER);
++ if (currLen > 0 && textLen > 0) {
++--- misc/mozilla/widget/src/windows/nsFilePicker.cpp 2006-02-03 15:41:10.000000000 +0100
+++++ misc/build/mozilla/widget/src/windows/nsFilePicker.cpp 2008-08-19 10:05:12.000000000 +0200
++@@ -135,7 +135,11 @@
++
++ PRBool result = PR_FALSE;
++ PRUnichar fileBuffer[FILE_BUFFER_SIZE+1];
+++#ifdef __MINGW32__
+++ wcsncpy(NS_REINTERPRET_CAST(LPOWSTR, fileBuffer), NS_REINTERPRET_CAST(LPOWSTR, mDefault.get()), FILE_BUFFER_SIZE);
+++#else
++ wcsncpy(fileBuffer, mDefault.get(), FILE_BUFFER_SIZE);
+++#endif
++ fileBuffer[FILE_BUFFER_SIZE] = '\0'; // null terminate in case copy truncated
++
++ NS_NAMED_LITERAL_STRING(htmExt, "html");
++@@ -155,14 +159,22 @@
++
++ if (mMode == modeGetFolder) {
++ PRUnichar dirBuffer[MAX_PATH+1];
+++#ifdef __MINGW32__
+++ wcsncpy(NS_REINTERPRET_CAST(LPWSTR, dirBuffer), NS_REINTERPRET_CAST(LPCWSTR, initialDir.get()), MAX_PATH);
+++#else
++ wcsncpy(dirBuffer, initialDir.get(), MAX_PATH);
+++#endif
++
++ BROWSEINFOW browserInfo;
++ browserInfo.hwndOwner = (HWND)
++ (mParentWidget.get() ? mParentWidget->GetNativeData(NS_NATIVE_WINDOW) : 0);
++ browserInfo.pidlRoot = nsnull;
++ browserInfo.pszDisplayName = (LPWSTR)dirBuffer;
+++#ifdef __MINGW32__
+++ browserInfo.lpszTitle = NS_REINTERPRET_CAST(LPCWSTR, mTitle.get());
+++#else
++ browserInfo.lpszTitle = mTitle.get();
+++#endif
++ browserInfo.ulFlags = BIF_USENEWUI | BIF_RETURNONLYFSDIRS;
++ if (initialDir.Length()) // convert folder path to native, the strdup copy will be released in BrowseCallbackProc
++ {
++@@ -202,7 +214,11 @@
++ nsString filterBuffer = mFilterList;
++
++ if (!initialDir.IsEmpty()) {
+++#ifdef __MINGW32__
+++ ofn.lpstrInitialDir = NS_REINTERPRET_CAST(LPCWSTR, initialDir.get());
+++#else
++ ofn.lpstrInitialDir = initialDir.get();
+++#endif
++ }
++
++ ofn.lpstrTitle = (LPCWSTR)mTitle.get();
++@@ -210,13 +226,21 @@
++ ofn.nFilterIndex = mSelectedType;
++ ofn.hwndOwner = (HWND)
++ (mParentWidget.get() ? mParentWidget->GetNativeData(NS_NATIVE_WINDOW) : 0);
+++#ifdef __MINGW32__
+++ ofn.lpstrFile = NS_REINTERPRET_CAST(LPWSTR, fileBuffer);
+++#else
++ ofn.lpstrFile = fileBuffer;
+++#endif
++ ofn.nMaxFile = FILE_BUFFER_SIZE;
++
++ ofn.Flags = OFN_NOCHANGEDIR | OFN_SHAREAWARE | OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
++
++ if (!mDefaultExtension.IsEmpty()) {
+++#ifdef __MINGW32__
+++ ofn.lpstrDefExt = NS_REINTERPRET_CAST(LPCWSTR, mDefaultExtension.get());
+++#else
++ ofn.lpstrDefExt = mDefaultExtension.get();
+++#endif
++ }
++ else {
++ // Get file extension from suggested filename
++@@ -236,7 +260,11 @@
++ //XXX Actually, behavior is sort of weird:
++ // often appends ".html" even if you have an extension
++ // It obeys your extension if you put quotes around name
+++#ifdef __MINGW32__
+++ ofn.lpstrDefExt = NS_REINTERPRET_CAST(LPCWSTR, htmExt.get());
+++#else
++ ofn.lpstrDefExt = htmExt.get();
+++#endif
++ }
++ }
++ }
++--- misc/mozilla/widget/src/windows/nsWindow.cpp 2007-11-19 21:40:12.000000000 +0100
+++++ misc/build/mozilla/widget/src/windows/nsWindow.cpp 2008-08-20 16:18:08.000000000 +0200
++@@ -7088,7 +7088,11 @@
++ return; // out of memory
++
++ unicharSize = MultiByteToWideChar(gCurrentKeyboardCP, MB_PRECOMPOSED,
++- aStrAnsi->get(), aStrAnsi->Length(), aStrUnicode->BeginWriting(), unicharSize + 1);
+++#ifdef __MINGW32__
+++ aStrAnsi->get(), aStrAnsi->Length(), S_REINTERPRET_CAST(LPWSTR, aStrUnicode->BeginWriting()), unicharSize + 1);
+++#else
+++ aStrAnsi->get(), aStrAnsi->Length(), aStrUnicode->BeginWriting(), unicharSize + 1);
+++#endif
++ aStrUnicode->SetLength(unicharSize);
++ }
++ }
++@@ -7265,7 +7269,11 @@
++ sIMEAttributeArray[i] = sIMEAttributeArray[offset];
++
++ offset += ::WideCharToMultiByte(gCurrentKeyboardCP, 0,
++- sIMECompUnicode->get() + i, 1, NULL, 0, NULL, NULL);
+++#ifdef __MINGW32__
+++ REINTERPRET_CAST(LPCWSTR, sIMECompUnicode->get() + i), 1, NULL, 0, NULL, NULL);
+++#else
+++ sIMECompUnicode->get() + i, 1, NULL, 0, NULL, NULL);
+++#endif
++ }
++
++ sIMEAttributeArrayLength = sIMECompUnicode->Length();
++@@ -7477,7 +7485,11 @@
++ *oResult = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
++ } else {
++ len = ::WideCharToMultiByte(gCurrentKeyboardCP, 0,
+++#ifdef __MINGW32__
+++ NS_REINTERPRET_CAST(LPCWSTR, sIMEReconvertUnicode),
+++#else
++ sIMEReconvertUnicode,
+++#endif
++ nsCRT::strlen(sIMEReconvertUnicode),
++ NULL, 0, NULL, NULL);
++ *oResult = sizeof(RECONVERTSTRING) + len;
++@@ -7496,7 +7508,11 @@
++ *oResult = sizeof(RECONVERTSTRING) + len * sizeof(WCHAR);
++ } else {
++ len = ::WideCharToMultiByte(gCurrentKeyboardCP, 0,
+++#ifdef __MINGW32__
+++ NS_REINTERPRET_CAST(LPCWSTR, sIMEReconvertUnicode),
+++#else
++ sIMEReconvertUnicode,
+++#endif
++ nsCRT::strlen(sIMEReconvertUnicode),
++ NULL, 0, NULL, NULL);
++ *oResult = sizeof(RECONVERTSTRING) + len;
++@@ -7523,7 +7539,11 @@
++ sIMEReconvertUnicode, len * sizeof(WCHAR));
++ } else {
++ ::WideCharToMultiByte(gCurrentKeyboardCP, 0,
+++#ifdef __MINGW32__
+++ NS_REINTERPRET_CAST(LPCWSTR, sIMEReconvertUnicode),
+++#else
++ sIMEReconvertUnicode,
+++#endif
++ nsCRT::strlen(sIMEReconvertUnicode),
++ (LPSTR) (aData + sizeof(RECONVERTSTRING)),
++ len,
++--- misc/mozilla/xpcom/base/nscore.h 2006-08-24 23:46:32.000000000 +0200
+++++ misc/build/mozilla/xpcom/base/nscore.h 2008-08-16 12:01:53.000000000 +0200
++@@ -337,7 +337,7 @@
++ * commercial build. When this is fixed there will be no need for the
++ * |NS_REINTERPRET_CAST| in nsLiteralString.h either.
++ */
++- #if defined(HAVE_CPP_2BYTE_WCHAR_T) && defined(NS_WIN32)
+++ #if defined(HAVE_CPP_2BYTE_WCHAR_T) && !defined(__MINGW32__) && (defined(NS_WIN32) || defined(XP_MAC))
++ typedef wchar_t PRUnichar;
++ #else
++ typedef PRUint16 PRUnichar;
++--- misc/mozilla/xpcom/io/nsLocalFileWin.cpp 2007-11-19 21:38:17.000000000 +0100
+++++ misc/build/mozilla/xpcom/io/nsLocalFileWin.cpp 2008-08-20 16:39:58.000000000 +0200
++@@ -836,8 +836,11 @@
++ PRUnichar *resolvedPath = mResolvedPath.BeginWriting();
++
++ // resolve this shortcut
+++#ifdef __MINGW32__
+++ nsresult rv = gResolver->Resolve(NS_REINTERPRET_CAST(LPCWSTR, mWorkingPath.get()), resolvedPath);
+++#else
++ nsresult rv = gResolver->Resolve(mWorkingPath.get(), resolvedPath);
++-
+++#endif
++ size_t len = NS_FAILED(rv) ? 0 : wcslen(resolvedPath);
++ mResolvedPath.SetLength(len);
++
++--- misc/mozilla/xpcom/io/nsNativeCharsetUtils.cpp 2006-06-22 21:13:01.000000000 +0200
+++++ misc/build/mozilla/xpcom/io/nsNativeCharsetUtils.cpp 2008-08-14 16:22:21.000000000 +0200
++@@ -935,7 +935,11 @@
++
++ PRUnichar *result = out_iter.get();
++
+++#ifdef __MINGW32__
+++ ::MultiByteToWideChar(CP_ACP, 0, buf, inputLen, NS_REINTERPRET_CAST(LPWSTR, result), resultLen);
+++#else
++ ::MultiByteToWideChar(CP_ACP, 0, buf, inputLen, result, resultLen);
+++#endif
++ }
++ return NS_OK;
++ }
++@@ -953,7 +957,11 @@
++ // determine length of result
++ PRUint32 resultLen = 0;
++
+++#ifdef __MINGW32__
+++ int n = ::WideCharToMultiByte(CP_ACP, 0, NS_REINTERPRET_CAST(LPCWSTR, buf), inputLen, NULL, 0, NULL, NULL);
+++#else
++ int n = ::WideCharToMultiByte(CP_ACP, 0, buf, inputLen, NULL, 0, NULL, NULL);
+++#endif
++ if (n > 0)
++ resultLen += n;
++
++@@ -970,7 +978,11 @@
++
++ char *result = out_iter.get();
++
+++#ifdef __MINGW32__
+++ ::WideCharToMultiByte(CP_ACP, 0, NS_REINTERPRET_CAST(LPCWSTR, buf), inputLen, result, resultLen,
+++#else
++ ::WideCharToMultiByte(CP_ACP, 0, buf, inputLen, result, resultLen,
+++#endif
++ &defaultChar, NULL);
++ }
++ return NS_OK;
++--- misc/mozilla/xpcom/reflect/xptinfo/public/xptinfo.h 2004-04-18 16:18:20.000000000 +0200
+++++ misc/build/mozilla/xpcom/reflect/xptinfo/public/xptinfo.h 2008-08-14 16:22:21.000000000 +0200
++@@ -132,7 +132,7 @@
++ }
++
++ PRBool IsArray() const
++- {return (PRBool) TagPart() == T_ARRAY;}
+++ {return (PRBool) (TagPart() == T_ARRAY);}
++
++ // 'Dependent' means that params of this type are dependent upon other
++ // params. e.g. an T_INTERFACE_IS is dependent upon some other param at
++@@ -152,7 +152,7 @@
++ uint8 TagPart() const
++ {return (uint8) (flags & XPT_TDP_TAGMASK);}
++
++- enum
+++ enum _xpttype
++ {
++ T_I8 = TD_INT8 ,
++ T_I16 = TD_INT16 ,
++--- misc/mozilla/xpfe/bootstrap/Makefile.in 2007-10-08 21:09:58.000000000 +0200
+++++ misc/build/mozilla/xpfe/bootstrap/Makefile.in 2008-08-18 14:10:04.000000000 +0200
++@@ -115,11 +115,14 @@
++
++ include $(topsrcdir)/config/config.mk
++
+++# reduce prerequisites by disabling mozilla binary
+++ifndef DISABLE_MOZ_EXECUTABLE
++ ifeq ($(USE_SHORT_LIBNAME),1)
++ PROGRAM = $(MOZ_APP_NAME)$(BIN_SUFFIX)
++ else
++ PROGRAM = $(MOZ_APP_NAME)-bin$(BIN_SUFFIX)
++ endif
+++endif
++
++ # Force applications to be built non-statically
++ # when building the mozcomps meta component
++@@ -491,6 +494,7 @@
++ APP_NAME = $(MOZ_APP_DISPLAYNAME)
++ endif
++
+++ifdef PROGRAM
++ libs:: $(PROGRAM)
++ mkdir -p $(DIST)/$(APP_NAME).app/Contents/MacOS
++ rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents $(DIST)/$(APP_NAME).app
++@@ -505,6 +509,7 @@
++ rsync -a --copy-unsafe-links $(DIST)/package/PrintPDE.plugin $(DIST)/$(APP_NAME).app/Contents/Plug-Ins
++ cp -RL $(DIST)/package/mozillaSuite.rsrc $(DIST)/$(APP_NAME).app/Contents/Resources/$(PROGRAM).rsrc
++ echo -n APPLMOZZ > $(DIST)/$(APP_NAME).app/Contents/PkgInfo
+++endif
++
++ clean clobber::
++ rm -rf $(DIST)/$(APP_NAME).app
++--- misc/mozilla/xpfe/bootstrap/nsNativeAppSupportWin.cpp 2007-02-22 14:05:28.000000000 +0100
+++++ misc/build/mozilla/xpfe/bootstrap/nsNativeAppSupportWin.cpp 2008-08-20 16:53:04.000000000 +0200
++@@ -142,7 +142,11 @@
++ int acplen = aStr.Length() * 2 + 1;
++ char * acp = new char[ acplen ];
++ if( acp ) {
++- int outlen = ::WideCharToMultiByte( CP_ACP, 0, aStr.get(), aStr.Length(),
+++#ifdef __MINGW32__
+++ int outlen = ::WideCharToMultiByte( CP_ACP, 0, NS_REINTERPRET_CAST(LPCWSTR, aStr.get()), aStr.Length(),
+++#else
+++ int outlen = ::WideCharToMultiByte( CP_ACP, 0, aStr.get(), aStr.Length(),
+++#endif
++ acp, acplen-1, NULL, NULL );
++ acp[ outlen ] = '\0'; // null terminate
++ }
++@@ -2507,7 +2511,11 @@
++ }
++ // Create menu and add item.
++ mTrayIconMenu = ::CreatePopupMenu();
+++#ifdef __MINGW32__
+++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_NAVIGATOR, NS_REINTERPRET_CAST(LPCWSTR, navigatorText.get()) );
+++#else
++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_NAVIGATOR, navigatorText.get() );
+++#endif
++ if ( ::GetLastError() == ERROR_CALL_NOT_IMPLEMENTED ) {
++ AppendMenuItem( mTrayIconMenu, TURBO_NAVIGATOR, navigatorText );
++ if ( isMail )
++@@ -2521,6 +2529,15 @@
++ }
++ else {
++ if (isMail)
+++#ifdef __MINGW32__
+++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_MAIL, NS_REINTERPRET_CAST(LPCWSTR, mailText.get()) );
+++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_EDITOR, NS_REINTERPRET_CAST(LPCWSTR, editorText.get()) );
+++ if (isMail)
+++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_ADDRESSBOOK, NS_REINTERPRET_CAST(LPCWSTR, addressbookText.get()) );
+++ ::AppendMenuW( mTrayIconMenu, MF_SEPARATOR, NULL, NULL );
+++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_DISABLE, NS_REINTERPRET_CAST(LPCWSTR, disableText.get()) );
+++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_EXIT, NS_REINTERPRET_CAST(LPCWSTR, exitText.get()) );
+++#else
++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_MAIL, mailText.get() );
++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_EDITOR, editorText.get() );
++ if (isMail)
++@@ -2528,6 +2545,7 @@
++ ::AppendMenuW( mTrayIconMenu, MF_SEPARATOR, NULL, NULL );
++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_DISABLE, disableText.get() );
++ ::AppendMenuW( mTrayIconMenu, MF_STRING, TURBO_EXIT, exitText.get() );
+++#endif
++ }
++ }
++
+--- moz/download/mozilla-source.txt (.../tags/DEV300_m41/moz) (revision 268999)
++++ moz/download/mozilla-source.txt (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -1,15 +1,9 @@
+ Please copy the source archive for the Mozilla sources into this directory.
+-At the moment "mozilla-source-1.7.5.tar.gz" is required, it can be found
++At the moment "seamonkey-1.1.12-source.tar.gz" is required, it can be found
+ here:
+- http://ftp.mozilla.org/pub/mozilla.org/mozilla/releases/mozilla1.7.5/source/
++ http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/1.1.13
+
+ Windows builders need also
+- "vc71-glib-1.2.10-bin.zip" and
+- "vc71-libIDL-0.6.8-bin.zip".
+-They can be found here:
+- ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/
+-
+-And also
+- "wintools.zip"
++ "vc8-moztools.zip"
+ which can be found here:
+- http://ftp.mozilla.org/pub/mozilla.org/mozilla/source/wintools.zip
+\ No newline at end of file
++ ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/historic/vc8/
+--- moz/patches/embed_manifest.patch (.../tags/DEV300_m41/moz) (revision 0)
++++ moz/patches/embed_manifest.patch (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -0,0 +1,142 @@
++--- mozilla.pure/configure 2008-06-16 00:25:31.000000000 +0200
+++++ mozilla/configure 2008-11-09 23:59:19.984375000 +0100
++@@ -1068,6 +1068,8 @@
++ GCONF_VERSION=1.2.1
++ LIBGNOME_VERSION=2.0
++
+++MSMANIFEST_TOOL=
+++
++ MISSING_X=
++ for ac_prog in gawk mawk nawk awk
++ do
++@@ -3025,6 +3027,22 @@
++ else
++ { echo "configure: error: This version of the MSVC compiler, $CC_VERSION , is unsupported." 1>&2; exit 1; }
++ fi
+++
+++ # bug #249782
+++ # ensure that mt.exe is Microsoft (R) Manifest Tool and not magnetic tape manipulation utility (or something else)
+++ if test "$_CC_SUITE" -ge "8"; then
+++ MSMT_TOOL=`mt 2>&1|grep 'Microsoft (R) Manifest Tool'`
+++ if test -n "MSMT_TOOL"; then
+++ MSMANIFEST_TOOL_VERSION=`echo ${MSMANIFEST_TOOL}|grep -Po "(^|\s)[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?(\s|$)"`
+++ if test -z "MSMANIFEST_TOOL_VERSION"; then
+++ echo "configure: warning: Unknown version of the Microsoft (R) Manifest Tool." 1>&2
+++ fi
+++ MSMANIFEST_TOOL=1
+++ unset MSMT_TOOL
+++ else
+++ { echo "Microsoft (R) Manifest Tool must be in your \$PATH." 1>&2; exit 1; }
+++ fi
+++ fi
++
++ # Check linker version
++ _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
++--- mozilla.pure/configure.in 2008-06-16 00:25:32.000000000 +0200
+++++ mozilla/configure.in 2008-11-09 23:59:20.000000000 +0100
++@@ -126,6 +126,8 @@
++ GCONF_VERSION=1.2.1
++ LIBGNOME_VERSION=2.0
++
+++MSMANIFEST_TOOL=
+++
++ dnl Set various checks
++ dnl ========================================================
++ MISSING_X=
++@@ -428,6 +430,22 @@
++ else
++ AC_MSG_ERROR([This version of the MSVC compiler, $CC_VERSION , is unsupported.])
++ fi
+++
+++ # bug #249782
+++ # ensure that mt.exe is Microsoft (R) Manifest Tool and not magnetic tape manipulation utility (or something else)
+++ if test "$_CC_SUITE" -ge "8"; then
+++ MSMT_TOOL=`mt 2>&1|grep 'Microsoft (R) Manifest Tool'`
+++ if test -n "MSMT_TOOL"; then
+++ MSMANIFEST_TOOL_VERSION=`echo ${MSMANIFEST_TOOL}|grep -Po "(^|\s)[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?(\s|$)"`
+++ if test -z "MSMANIFEST_TOOL_VERSION"; then
+++ AC_MSG_WARN([Unknown version of the Microsoft (R) Manifest Tool.])
+++ fi
+++ MSMANIFEST_TOOL=1
+++ unset MSMT_TOOL
+++ else
+++ AC_MSG_ERROR([Microsoft (R) Manifest Tool must be in your \$PATH.])
+++ fi
+++ fi
++
++ # Check linker version
++ _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
++@@ -7319,6 +7339,7 @@
++ AC_SUBST(USE_N32)
++ AC_SUBST(CC_VERSION)
++ AC_SUBST(CXX_VERSION)
+++AC_SUBST(MSMANIFEST_TOOL)
++
++ if test "$USING_HCC"; then
++ CC='${topsrcdir}/build/hcc'
++--- mozilla.pure/config/rules.mk 2008-01-29 20:30:22.000000000 +0100
+++++ mozilla/config/rules.mk 2008-11-09 23:59:19.968750000 +0100
++@@ -811,6 +812,12 @@
++
++ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
++ $(LD) -NOLOGO -OUT:$@ -PDB:$(PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(PROGOBJS) $(RESFILE) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;1; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
++ else
++ ifeq ($(CPP_PROG_LINK),1)
++ $(CCC) -o $@ $(CXXFLAGS) $(WRAP_MALLOC_CFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(BIN_FLAGS) $(WRAP_MALLOC_LIB) $(PROFILER_LIBS) $(EXE_DEF_FILE)
++@@ -843,6 +850,12 @@
++ else
++ ifeq (_WINNT,$(GNU_CC)_$(HOST_OS_ARCH))
++ $(HOST_LD) -NOLOGO -OUT:$@ -PDB:$(PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;1; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
++ else
++ $(HOST_CC) -o $@ $(HOST_CFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
++ endif
++@@ -866,6 +879,12 @@
++ else
++ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
++ $(LD) -nologo -out:$@ -pdb:$(PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;1; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
++ else
++ ifeq ($(CPP_PROG_LINK),1)
++ $(CCC) $(WRAP_MALLOC_CFLAGS) $(CXXFLAGS) -o $@ $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(WRAP_MALLOC_LIB) $(PROFILER_LIBS) $(BIN_FLAGS)
++@@ -1019,6 +1038,14 @@
++ endif # SHARED_LIBRARY_LIBS
++ endif # NO_LD_ARCHIVE_FLAGS
++ $(MKSHLIB) $(SHLIB_LDSTARTFILE) $(OBJS) $(LOBJS) $(SUB_SHLOBJS) $(RESFILE) $(LDFLAGS) $(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) $(DEF_FILE) $(SHLIB_LDENDFILE)
+++ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+++ifdef MSMANIFEST_TOOL
+++ @if test -f $ manifest; then \
+++ mt.exe -NOLOGO -MANIFEST $ manifest -OUTPUTRESOURCE:$ \;2; \
+++ rm -f $ manifest; \
+++ fi
+++endif # MSVC with manifest tool
+++endif # WINNT && !GCC
++ @rm -f foodummyfilefoo $(SUB_SHLOBJS) $(DELETE_AFTER_LINK)
++ else # os2 vacpp
++ $(MKSHLIB) -O:$@ -DLL -INC:_dllentry $(LDFLAGS) $(OBJS) $(LOBJS) $(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) $(DEF_FILE)
++--- mozilla.pure/config/autoconf.mk.in 2006-09-14 20:07:03.000000000 +0200
+++++ mozilla/config/autoconf.mk.in 2008-11-09 23:59:19.953125000 +0100
++@@ -543,6 +543,7 @@
++ MOZ_TOOLS_DIR = @MOZ_TOOLS_DIR@
++ MOZ_DEBUG_SYMBOLS = @MOZ_DEBUG_SYMBOLS@
++ MOZ_QUANTIFY = @MOZ_QUANTIFY@
+++MSMANIFEST_TOOL = @MSMANIFEST_TOOL@
++
++ #python options
++ PYTHON = @MOZ_PYTHON@
+
+Property changes on: patches/embed_manifest.patch
+___________________________________________________________________
+Added: svn:executable
+ + *
+
+--- moz/patches/consecutive_ldap_queries.patch (.../tags/DEV300_m41/moz) (revision 0)
++++ moz/patches/consecutive_ldap_queries.patch (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -0,0 +1,13 @@
++--- mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2009-02-02 09:39:32.054968600 +0100
+++++ mozilla.patched/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2009-02-02 09:35:35.633832119 +0100
++@@ -833,6 +833,10 @@
++ if (msgListener)
++ {
++ msgListener->mUrl = url;
+++ msgListener->mQueryListener = listener;
+++ msgListener->mResultLimit = resultLimit;
+++ msgListener->mTimeOut = timeOut;
+++ msgListener->mQueryArguments = arguments;
++ return msgListener->DoSearch();
++ }
++ }
+--- moz/patches/wchart_on_msvc8.patch (.../tags/DEV300_m41/moz) (revision 0)
++++ moz/patches/wchart_on_msvc8.patch (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -0,0 +1,20 @@
++--- mozilla.pure/configure.in 2008-06-16 00:25:32.000000000 +0200
+++++ mozilla/configure.in 2008-11-10 16:15:36.859375000 +0100
++@@ -425,6 +425,7 @@
++ _CC_SUITE=7
++ elif test "$_CC_MAJOR_VERSION" = "14"; then
++ _CC_SUITE=8
+++ CXXFLAGS="$CXXFLAGS -Zc:wchar_t-"
++ else
++ AC_MSG_ERROR([This version of the MSVC compiler, $CC_VERSION , is unsupported.])
++ fi
++--- mozilla.pure/configure 2008-06-16 00:25:31.000000000 +0200
+++++ mozilla/configure 2008-11-10 16:15:30.437500000 +0100
++@@ -3022,6 +3022,7 @@
++ _CC_SUITE=7
++ elif test "$_CC_MAJOR_VERSION" = "14"; then
++ _CC_SUITE=8
+++ CXXFLAGS="$CXXFLAGS -Zc:wchar_t-"
++ else
++ { echo "configure: error: This version of the MSVC compiler, $CC_VERSION , is unsupported." 1>&2; exit 1; }
++ fi
+--- moz/patches/cygwin_paths_in_ldap_sdk.patch (.../tags/DEV300_m41/moz) (revision 0)
++++ moz/patches/cygwin_paths_in_ldap_sdk.patch (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -0,0 +1,12 @@
++--- mozilla.org/directory/c-sdk/ldap/include/Makefile.in 2006-02-03 15:44:33.000000000 +0100
+++++ mozilla/directory/c-sdk/ldap/include/Makefile.in 2008-10-31 23:34:41.695625000 +0100
++@@ -85,6 +85,9 @@
++
++ ###########################################################################
++
+++INCLUDEDIR:=$(shell cygpath -u $(INCLUDEDIR))
+++GENHEADERS:=$(shell cygpath -u $(GENHEADERS))
+++
++ all export:: $(INCLUDEDIR) $(GENHEADERS)
++ $(NSINSTALL) -D $(PRIVATEINCDIR)
++ $(INSTALL) $(INSTALLFLAGS) -m 644 $(HEADERS) $(INCLUDEDIR)
+--- moz/patches/index.txt (.../tags/DEV300_m41/moz) (revision 0)
++++ moz/patches/index.txt (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -0,0 +1,65 @@
++====================================================================================
++File name
++---------
++ embed_manifest.patch
++
++Description
++-----------
++ When building Mozilla with MSVC2005, generated libraries and applications
++ require the manifest file (name.dll.manifest) to reside beside the file
++ itself, or to be embedded.
++
++ The patch does the latter: embedding the manifest file into the
++ library/application itself, using the Manifest Tool from the Platform SDK
++ resp. MSVC installation.
++
++ The patch is effectively the patch as was committed to the Mozilla trunk,
++ taken from here: https://bugzilla.mozilla.org/show_bug.cgi?id=249782#c81.
++
++====================================================================================
++File name
++---------
++ wchart_on_msvc8.patch
++
++Description
++-----------
++ For compiling with MSVC2005: See https://bugzilla.mozilla.org/show_bug.cgi?id=324842.
++
++====================================================================================
++File name
++---------
++ cygwin_paths_in_ldap_sdk.patch
++
++Description
++-----------
++ make 1.81, as currently part of cygwin, does not support Windows paths anymore.
++ So, targets, and target dependencies, in makefile may need to be converted to cygwin
++ notation. This patch does this for directory/c-sdk/ldap/include, other occurances are
++ not known, yet.
++
++====================================================================================
++File name
++---------
++ no_core_abspath_in_nss.patch
++
++Description
++-----------
++ On various platforms, building security/nss/cmd/shlibsign fails. In all cases, the
++ error messages indicate the core_abspath macro used in the Makefile is not resolved
++ properly.
++ This patch replaces the usage of core_abspath with platform-specific constructs.
++
++====================================================================================
++File name
++---------
++ consecutive_ldap_queries.patch
++
++Description
++-----------
++ Consecutive LDAP address book queries (using the same instance of nsAbLDAPDirectoryQuery,
++ but different parameters to the DoQuery method) do not work in OOo. The reason is that
++ the second call to DoQuery ignores most of its arguments, including the listener which
++ is to be notified about the query results, and re-uses the arguments from the first
++ call.
++ The patch changes the DoQuery behavior to respect the arguments of the second call.
++
+--- moz/patches/no_core_abspath_in_nss.patch (.../tags/DEV300_m41/moz) (revision 0)
++++ moz/patches/no_core_abspath_in_nss.patch (.../cws/moz2seamonkey01/moz) (revision 268999)
+@@ -0,0 +1,52 @@
++--- mozilla.pure/security/nss/cmd/shlibsign/Makefile 2007-02-16 03:16:24.000000000 +0100
+++++ mozilla/security/nss/cmd/shlibsign/Makefile 2008-11-05 14:04:54.798875000 +0100
++@@ -86,18 +86,47 @@
++
++ include ../platrules.mk
++
++-SRCDIR = $(call core_abspath,.)
++-
+++ifeq ($(OS_TARGET), Darwin)
+++ SRCDIR = .
+++else
+++ifeq ($(OS_TARGET), Linux)
+++ SRCDIR = .
+++else
+++ifeq ($(OS_TARGET), WIN95)
+++ SRCDIR = $(shell cygpath -d $(SRCDIR))
+++else
+++ SRCDIR = $(call core_abspath,.)
+++endif
+++endif
+++endif
++ %.chk: %.$(DLL_SUFFIX)
++ ifeq ($(OS_TARGET), OS2)
++ cd $(OBJDIR) ; cmd.exe /c $(SRCDIR)/sign.cmd $(DIST) \
++ $(call core_abspath,$(OBJDIR)) $(OS_TARGET) \
++ $(call core_abspath,$(NSPR_LIB_DIR)) $(call core_abspath,$<)
++ else
+++ifeq ($(OS_TARGET), WIN95)
+++ sh $(CYGWIN_WRAPPER) ./sign.sh $(shell cygpath -d -a $(DIST)) \
+++ $(shell cygpath -d -a $(OBJDIR)) $(OS_TARGET) \
+++ $(shell cygpath -d -a $(NSPR_LIB_DIR)) $(shell cygpath -d -a $<)
+++else
+++ifeq ($(OS_TARGET), Darwin)
+++ cd $(SRCDIR) ; sh ./sign.sh $(DIST) \
+++ $(OBJDIR) $(OS_TARGET) \
+++ $(NSPR_LIB_DIR) $<
+++else
+++ifeq ($(OS_TARGET), Linux)
+++ cd $(SRCDIR) ; sh ./sign.sh $(DIST) \
+++ $(OBJDIR) $(OS_TARGET) \
+++ $(NSPR_LIB_DIR) $<
+++else
++ cd $(OBJDIR) ; sh $(SRCDIR)/sign.sh $(call core_abspath,$(DIST)) \
++ $(call core_abspath,$(OBJDIR)) $(OS_TARGET) \
++ $(call core_abspath,$(NSPR_LIB_DIR)) $(call core_abspath,$<)
++ endif
+++endif
+++endif
+++endif
++
++ libs install :: $(CHECKLOC)
++
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]