ooo-build r15488 - in trunk: . patches/dev300



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]