diff options
author | Ivo Hinkelmann <ihi@openoffice.org> | 2009-07-22 15:07:42 +0000 |
---|---|---|
committer | Ivo Hinkelmann <ihi@openoffice.org> | 2009-07-22 15:07:42 +0000 |
commit | 22b7626699093fe82fe931510dd5209e8d67cce8 (patch) | |
tree | 71bc9de8a278b70c085a2d368d2841f13107899e /moz | |
parent | 63d71582afdc55fb43d467a64266051c3b7218de (diff) |
#i10000# missing seamonkey patches
Diffstat (limited to 'moz')
-rw-r--r-- | moz/seamonkey-source-1.1.14.patch | 6355 |
1 files changed, 6355 insertions, 0 deletions
diff --git a/moz/seamonkey-source-1.1.14.patch b/moz/seamonkey-source-1.1.14.patch new file mode 100644 index 000000000000..85cf75bc8930 --- /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 |