[ooo-build-commit] Branch 'ooo/master' - moz/seamonkey-source-1.1.14.patch

Jan Holesovsky kendy at kemper.freedesktop.org
Wed Jul 22 18:19:02 PDT 2009


 moz/seamonkey-source-1.1.14.patch | 6355 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 6355 insertions(+)

New commits:
commit 92d354e0117bf9283249102c345cba8a1c19ba99
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date:   Wed Jul 22 15:07:42 2009 +0000

    #i10000# missing seamonkey patches

diff --git a/moz/seamonkey-source-1.1.14.patch b/moz/seamonkey-source-1.1.14.patch
new file mode 100644
index 0000000..85cf75b
--- /dev/null
+++ b/moz/seamonkey-source-1.1.14.patch
@@ -0,0 +1,6355 @@
+--- 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"`
+@@ -3422,6 +3441,8 @@
+ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ cross_compiling=$ac_cv_prog_cc_cross
+ fi
++else
++  ac_cv_prog_CXXCPP="$CXXCPP"
+ fi
+ CXXCPP="$ac_cv_prog_CXXCPP"
+ echo "$ac_t""$CXXCPP" 1>&6
+@@ -5726,6 +5747,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 +6058,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 +6097,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
+@@ -6455,12 +6477,12 @@
+ 
+ 
+         case "$host" in
+-    *-mingw*)
+-	CYGPATH_W=echo
++    *-cygwin*|*-mingw*)
++	CYGPATH_W="cygpath -u"
+ 	CYGPATH_S=cat
+-	MOZ_BUILD_ROOT=`cd $MOZ_BUILD_ROOT && pwd -W`
++	MOZ_BUILD_ROOT=`$CYGPATH_W $MOZ_BUILD_ROOT | $CYGPATH_S`
+ 	;;
+-    *-cygwin*|*-msvc*|*-mks*)
++    *-msvc*|*-mks*)
+ 	CYGPATH_W="cygpath -a -w"
+ 	CYGPATH_S="sed -e s|\\\\|/|g"
+ 	MOZ_BUILD_ROOT=`$CYGPATH_W $MOZ_BUILD_ROOT | $CYGPATH_S`
+@@ -6718,7 +6740,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 +8636,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 +12283,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 +19257,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 +20101,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
+@@ -1853,10 +1872,10 @@
+ 
+     dnl MinGW/MSYS doesn't provide or need cygpath
+     case "$host" in
+-    *-mingw*)
+-	CYGPATH_W=echo
++    *-cygwin*|*-mingw*)
++	CYGPATH_W="cygpath -u"
+ 	CYGPATH_S=cat
+-	MOZ_BUILD_ROOT=`cd $MOZ_BUILD_ROOT && pwd -W`
++	MOZ_BUILD_ROOT=`$CYGPATH_W $MOZ_BUILD_ROOT | $CYGPATH_S`
+ 	;;
+     *-cygwin*|*-msvc*|*-mks*)
+ 	CYGPATH_W="cygpath -a -w"
+@@ -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/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/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/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
+@@ -111,9 +111,9 @@
+ # other platforms do not.
+ #
+ ifeq (,$(filter-out WIN95 OS2,$(OS_TARGET)))
+-LIBRARY		= $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
++LIBRARY		= $(OBJDIR)/$(LIB_PREFIX)$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
+ SHARED_LIBRARY	= $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(DLL_SUFFIX)
+-IMPORT_LIBRARY	= $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
++IMPORT_LIBRARY	= $(OBJDIR)/$(LIB_PREFIX)$(LIBRARY_NAME)$(LIBRARY_VERSION).$(LIB_SUFFIX)
+ SHARED_LIB_PDB	= $(OBJDIR)/$(LIBRARY_NAME)$(LIBRARY_VERSION).pdb
+ else
+ LIBRARY		= $(OBJDIR)/lib$(LIBRARY_NAME)$(LIBRARY_VERSION)_s.$(LIB_SUFFIX)
+@@ -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'
+@@ -3958,6 +3959,7 @@
+         OBJ_SUFFIX=obj
+         LIB_SUFFIX=lib
+         DLL_SUFFIX=dll
++        LIB_PREFIX=
+ 
+         # Determine compiler version
+         CC_VERSION=`"${CC}" -v 2>&1 | grep Version | sed -e 's|.* Version ||' -e 's| .*||'`
+@@ -5766,6 +5768,7 @@
+     CC="\$(CYGWIN_WRAPPER) $CC"
+     CXX="\$(CYGWIN_WRAPPER) $CXX"
+     RC="\$(CYGWIN_WRAPPER) $RC"
++    LD="\$(CYGWIN_WRAPPER) $LD"
+     ;;
+ esac
+ 
+@@ -6127,6 +6130,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/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
+@@ -123,8 +123,11 @@
+ ifdef CYGDRIVE_MOUNT
+ ABS_DIST := $(shell cygpath -w $(ABS_DIST) | sed -e 's|\\|/|g')
+ endif
++ifneq (,$(filter cygwin%,$(host_os)))
++ABS_DIST := $(shell cygpath -u $(ABS_DIST))
++endif
+ ifneq (,$(filter mingw%,$(host_os)))
+-ABS_DIST := $(shell cd $(DIST) && pwd -W)
++ABS_DIST := $(shell cygpath -u $(ABS_DIST))
+ endif
+ endif
+ NSPR_INCLUDE_DIR = $(firstword $(filter -I%,$(NSPR_CFLAGS)))
+@@ -172,6 +175,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,42 @@
+ 
+ include ../platrules.mk
+ 
+-SRCDIR = $(call core_abspath,.)
+-
++ifeq ($(OS_TARGET), Darwin)
++	SRCDIR = .
++else
++ifeq ($(OS_TARGET), Linux)
++	SRCDIR = .
++else
++	SRCDIR = .
++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)
++	cd $(SRCDIR) ; sh $(CYGWIN_WRAPPER) ./sign.sh $(DIST) \
++        $(OBJDIR) $(OS_TARGET) \
++        $(NSPR_LIB_DIR) $<
++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/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/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


More information about the ooo-build-commit mailing list