summaryrefslogtreecommitdiff
path: root/moz
diff options
context:
space:
mode:
Diffstat (limited to 'moz')
-rwxr-xr-xmoz/README4
-rw-r--r--moz/extractfiles.mk459
-rw-r--r--moz/makefile.mk425
-rw-r--r--moz/patches/arm_build_fix.patch189
-rw-r--r--moz/patches/brokenmakefile.patch13
-rw-r--r--moz/patches/consecutive_ldap_queries.patch13
-rw-r--r--moz/patches/cygwin_paths_in_ldap_sdk.patch12
-rw-r--r--moz/patches/dtoa.patch237
-rwxr-xr-xmoz/patches/embed_manifest.patch142
-rw-r--r--moz/patches/index.txt65
-rw-r--r--moz/patches/link_fontconfig.patch11
-rw-r--r--moz/patches/no_core_abspath_in_nss.patch52
-rw-r--r--moz/patches/respect_disable_pango.patch54
-rw-r--r--moz/patches/wchart_on_msvc8.patch20
-rw-r--r--moz/prj/build.lst4
-rw-r--r--moz/prj/d.lst240
-rw-r--r--moz/seamonkey-source-1.1.14.patch6346
-rw-r--r--moz/zipped/makefile.mk213
18 files changed, 8499 insertions, 0 deletions
diff --git a/moz/README b/moz/README
new file mode 100755
index 000000000000..6b1d0a2e169e
--- /dev/null
+++ b/moz/README
@@ -0,0 +1,4 @@
+Rebuild moz whenever changes have been made in the nss module. Those libs are
+merged into mozruntime.zip which is build in this project.
+
+Please read nss/readme.txt !!! \ No newline at end of file
diff --git a/moz/extractfiles.mk b/moz/extractfiles.mk
new file mode 100644
index 000000000000..dedfade257db
--- /dev/null
+++ b/moz/extractfiles.mk
@@ -0,0 +1,459 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+MOZTARGET=$(OS)$(COM)$(CPU)
+MOZ_DIST_DIR=$(MISC)$/build$/mozilla$/$(BUILD_DIR)$/dist
+MOZ_BIN_DIR=$(MOZ_DIST_DIR)$/bin
+RUNTIME_DIR=$(MISC)$/$(MOZTARGET)runtime
+LIB_DIR=$(LB)
+INCLUDE_DIR=$(INCCOM)
+
+
+
+#If we build the NSS module then we do not need the old nss libs from here
+.IF "$(ENABLE_NSS_MODULE)"=="YES"
+
+
+.IF "$(OS)" == "SOLARIS"
+.IF "$(CPU)" == "S" #32bit
+FREEBL_LIB=freebl_32fpu_3 freebl_32int64_3 freebl_32int_3
+.ELIF "$(CPU)" == "U" #64bit unxsolu4
+FREEBL_LIB=freebl_64int_3 freebl_64fpu_3
+.ELSE
+FREEBL_LIB=freebl3
+.ENDIF #"$(CPU)" == "S"
+
+.ELSE # "$(OS)" == "SOLARIS"
+FREEBL_LIB=freebl3
+.ENDIF # "$(OS)" == "SOLARIS"
+
+
+NSS_MODULE_RUNTIME_LIST:= \
+ $(FREEBL_LIB) \
+ nspr4 \
+ nss3 \
+ nssckbi \
+ nssdbm3 \
+ nssutil3 \
+ plc4 \
+ plds4 \
+ smime3 \
+ softokn3 \
+ sqlite/sqlite3 \
+ ssl3
+
+BIN_RUNTIMELIST= \
+ xpcom \
+ xpcom_core \
+ xpcom_compat
+.ELSE
+
+.IF "$(GUI)" == "WNT"
+ FREEBL_LIB=freebl3
+.ELSE # "$(GUI)" == "WNT"
+ .IF "$(OS)$(CPUNAME)" == "SOLARISSPARC"
+ FREEBL_LIB=freebl_32fpu_3
+ .ELSE # "$(OS)$(CPUNAME)" == "SOLARISSPARC"
+ FREEBL_LIB=freebl3
+ .ENDIF # "$(OS)$(CPUNAME)" == "SOLARISSPARC"
+.ENDIF # "$(GUI)" == "WNT"
+
+
+BIN_RUNTIMELIST= \
+ nspr4 \
+ plc4 \
+ plds4 \
+ xpcom \
+ xpcom_core \
+ xpcom_compat \
+ nss3 \
+ ssl3 \
+ softokn3 \
+ smime3 \
+ $(FREEBL_LIB)
+.ENDIF # "$(ENABLE_NSS_MODULE)"=="YES"
+
+.IF "$(GUI)"=="WNT"
+BIN_RUNTIMELIST+= \
+ js3250 \
+ mozz \
+ msgbsutl \
+ nsldap32v50 \
+ nsldappr32v50
+.ELSE #"$(GUI)"=="WNT"
+BIN_RUNTIMELIST+= \
+ mozjs \
+ mozz \
+ msgbaseutil \
+ ldap50 \
+ prldap50
+.ENDIF
+
+COMPONENT_RUNTIMELIST= \
+ addrbook \
+ mork \
+ mozldap \
+ necko \
+ profile \
+ xpcom_compat_c \
+ rdf \
+ uconv \
+ vcard \
+ i18n \
+ pipnss
+
+.IF "$(GUI)"=="WNT"
+COMPONENT_RUNTIMELIST+= \
+ xppref32 \
+ xpc3250
+.ELSE #"$(GUI)"=="WNT"
+COMPONENT_RUNTIMELIST+= \
+ pref \
+ xpconnect
+.ENDIF
+
+COMREGISTRY_FILELIST= \
+ necko_dns.xpt \
+ xpcom_base.xpt \
+ xpcom_obsolete.xpt \
+ xpcom_components.xpt \
+ xpcom_ds.xpt \
+ xpcom_io.xpt \
+ xpcom_xpti.xpt \
+ addrbook.xpt \
+ mozldap.xpt \
+ pref.xpt
+
+.IF "$(GUI)"=="WNT"
+COMREGISTRY_FILELIST+= xpcom_thread.xpt
+.ELSE #"$(GUI)"=="WNT"
+COMREGISTRY_FILELIST+= xpcom_threads.xpt
+.ENDIF
+
+DEFAULTS_RUNTIMELIST= \
+ defaults$/pref$/browser-prefs.js \
+ defaults$/pref$/mailnews.js \
+ defaults$/pref$/mdn.js \
+ defaults$/pref$/smime.js \
+ defaults$/autoconfig$/platform.js \
+ defaults$/autoconfig$/prefcalls.js \
+ greprefs$/all.js \
+ greprefs$/security-prefs.js
+
+.IF "$(ENABLE_NSS_MODULE)"=="YES"
+#These headers come from the separate NSS module if enabled
+NSS_INCLUDE_LIST= nspr nss
+
+.IF "$(GUI)"=="WNT"
+.IF "$(COM)"=="GCC"
+
+
+LIBLIST= \
+ libembed_base_s.a \
+ libmozreg_s.a \
+ libnslber32v50.a \
+ libnsldap32v50.a \
+ libxpcom_core.dll.a \
+ libxpcom.dll.a
+
+.ELSE #"$(COM)"=="GCC"
+
+LIBLIST= \
+ embed_base_s.lib \
+ mozreg_s.lib \
+ nslber32v50.lib \
+ nsldap32v50.lib \
+ xpcom_core.lib \
+ xpcom.lib
+
+.ENDIF #"$(COM)"=="GCC"
+
+.ELSE #"$(GUI)"=="WNT"
+
+LIBLIST= \
+ libembed_base_s.a \
+ libmozreg_s.a \
+ liblber50.a \
+ libxpcom_core$(DLLPOST) \
+ libxpcom$(DLLPOST) \
+ libmsgbaseutil$(DLLPOST) \
+ libldap50$(DLLPOST) \
+
+.ENDIF
+
+.ELSE # .IF"$(ENABLE_NSS_MODULE)"=="YES"
+
+.IF "$(GUI)"=="WNT"
+.IF "$(COM)"=="GCC"
+
+LIBLIST= \
+ libembed_base_s.a \
+ libmozreg_s.a \
+ libnslber32v50.a \
+ libnsldap32v50.a \
+ libnspr4.a \
+ libxpcom_core.dll.a \
+ libxpcom.dll.a \
+ libnss3.a \
+ libsmime3.a
+
+.ELSE
+
+LIBLIST= \
+ embed_base_s.lib \
+ mozreg_s.lib \
+ nslber32v50.lib \
+ nsldap32v50.lib \
+ nspr4.lib \
+ xpcom_core.lib \
+ xpcom.lib \
+ plc4.lib \
+ plds4.lib \
+ nss3.lib \
+ ssl3.lib \
+ smime3.lib
+
+.ENDIF
+
+.ELSE #"$(GUI)"=="WNT"
+
+LIBLIST= \
+ libembed_base_s.a \
+ libmozreg_s.a \
+ liblber50.a \
+ libnspr4$(DLLPOST) \
+ libxpcom_core$(DLLPOST) \
+ libxpcom$(DLLPOST) \
+ libmsgbaseutil$(DLLPOST) \
+ libldap50$(DLLPOST) \
+ libsoftokn3$(DLLPOST) \
+ libplc4$(DLLPOST) \
+ libplds4$(DLLPOST) \
+ libnss3$(DLLPOST) \
+ libssl3$(DLLPOST) \
+ libsmime3$(DLLPOST)
+
+.ENDIF
+.ENDIF # .IF "$(ENABLE_NSS_MODULE)"=="YES"
+
+INCLUDE_PATH=$(MOZ_DIST_DIR)$/include$/
+PUBLIC_PATH=$(MOZ_DIST_DIR)$/public$/
+
+
+.IF "$(GUI)"=="WNT"
+REG_SUBFIX= .exe
+.ELSE #"$(GUI)"=="WNT"
+REG_SUBFIX=
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+extract_mozab_files: $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE) \
+ make_temp_dir \
+ $(MISC)$/build$/so_moz_runtime_files \
+ $(MISC)$/build$/so_moz_include_files \
+ $(MISC)$/build$/so_moz_lib_files
+
+make_temp_dir:
+ @@-$(MKDIR) $(RUNTIME_DIR)
+ @@-$(MKDIR) $(RUNTIME_DIR)$/components
+ @@-$(MKDIR) $(RUNTIME_DIR)$/defaults
+ @@-$(MKDIR) $(RUNTIME_DIR)$/defaults$/pref
+ @@-$(MKDIR) $(LIB_DIR)
+ @@-$(MKDIR) $(INCLUDE_DIR)
+.IF "$(OS)"=="SOLARIS"
+ @@-$(MKDIR) $(RUNTIME_DIR)$/res
+.ENDIF
+
+$(OUT)$/bin$/mozruntime.zip: $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+ noop
+
+$(MISC)$/build$/so_moz_runtime_files: $(OUT)$/bin$/mozruntime.zip
+# copy files in BIN_RUNTIMELIST
+ $(foreach,file,$(BIN_RUNTIMELIST) $(COPY) $(MOZ_BIN_DIR)$/$(DLLPRE)$(file)$(DLLPOST) \
+ $(RUNTIME_DIR)$/$(DLLPRE)$(file)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+.IF "$(GUI)" == "UNX"
+ $(foreach,file,$(BIN_RUNTIMELIST) $(COPY) $(MOZ_BIN_DIR)$/$(DLLPRE)$(file)$(DLLPOST) \
+ $(LIB_DIR)$/$(DLLPRE)$(file)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+.IF "$(ENABLE_NSS_MODULE)" == "YES"
+# We add the libraries from the separate nss module
+ $(foreach,file,$(NSS_MODULE_RUNTIME_LIST) $(COPY) $(SOLARLIBDIR)$/$(file:d:d)/$(DLLPRE)$(file:f)$(DLLPOST) \
+ $(RUNTIME_DIR)$/$(DLLPRE)$(file:f)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+.ENDIF
+.ELSE # .IF "$(GUI)" == "UNX"
+.IF "$(ENABLE_NSS_MODULE)" == "YES"
+# We add the libraries from the separate nss module
+ $(foreach,file,$(NSS_MODULE_RUNTIME_LIST) $(COPY) $(SOLARBINDIR)$/$(DLLPRE)$(file)$(DLLPOST) \
+ $(RUNTIME_DIR)$/$(DLLPRE)$(file)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+.ENDIF
+.ENDIF # .IF "$(GUI)" == "UNX"
+
+
+# copy files in RES_FILELIST
+.IF "$(OS)"=="SOLARIS"
+ @$(COPY) $(MOZ_BIN_DIR)$/res$/charsetalias.properties $(RUNTIME_DIR)$/res$/charsetalias.properties
+.ELSE
+ @echo No Res Files to copy.
+.ENDIF
+
+# copy files in COMPONENT_RUNTIMELIST
+ $(foreach,file,$(COMPONENT_RUNTIMELIST) $(COPY) $(MOZ_BIN_DIR)$/components$/$(DLLPRE)$(file)$(DLLPOST) \
+ $(RUNTIME_DIR)$/components$/$(DLLPRE)$(file)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+
+# copy files in COMREGISTRY_FILELIST
+ $(foreach,file,$(COMREGISTRY_FILELIST) $(COPY) $(MOZ_BIN_DIR)$/components$/$(file) \
+ $(RUNTIME_DIR)$/components$/$(file) &&) \
+ echo >& $(NULLDEV)
+
+# copy files in DEFAULTS_RUNTIMELIST
+ @@-$(MKDIR) $(RUNTIME_DIR)$/defaults$/pref
+ @@-$(MKDIR) $(RUNTIME_DIR)$/defaults$/autoconfig
+ @@-$(MKDIR) $(RUNTIME_DIR)$/greprefs
+ $(foreach,file,$(DEFAULTS_RUNTIMELIST) $(COPY) $(MOZ_BIN_DIR)$/$(file) $(RUNTIME_DIR)$/$(file) &&) \
+ echo >& $(NULLDEV)
+
+.IF "$(GUI)"=="UNX"
+.IF "$(OS)"!="MACOSX"
+ cd $(RUNTIME_DIR) && strip *$(DLLPOST)
+ cd $(RUNTIME_DIR)$/components && strip *$(DLLPOST)
+.ENDIF
+.ENDIF
+.IF "$(OS)"=="MACOSX"
+ $(PERL) $(SOLARENV)$/bin$/macosx-change-install-names.pl extshl OOO \
+ $(RUNTIME_DIR)$/*$(DLLPOST)
+# A crude hack to adapt all the install names in the components subdir:
+ $(foreach,file,$(shell ls $(RUNTIME_DIR)$/components$/*$(DLLPOST)) \
+ install_name_tool \
+ -change @executable_path/libldap50.dylib \
+ @loader_path/../libldap50.dylib \
+ -change @executable_path/libmozjs.dylib @loader_path/../libmozjs.dylib \
+ -change @executable_path/libmozz.dylib @loader_path/../libmozz.dylib \
+ -change @executable_path/libmsgbaseutil.dylib \
+ @loader_path/../libmsgbaseutil.dylib \
+ -change @executable_path/libnspr4.dylib @loader_path/../libnspr4.dylib \
+ -change @executable_path/libnss3.dylib @loader_path/../libnss3.dylib \
+ -change @executable_path/libplc4.dylib @loader_path/../libplc4.dylib \
+ -change @executable_path/libplds4.dylib @loader_path/../libplds4.dylib \
+ -change @executable_path/libprldap50.dylib \
+ @loader_path/../libprldap50.dylib \
+ -change @executable_path/libsmime3.dylib \
+ @loader_path/../libsmime3.dylib \
+ -change @executable_path/libsoftokn3.dylib \
+ @loader_path/../libsoftokn3.dylib \
+ -change @executable_path/libssl3.dylib @loader_path/../libssl3.dylib \
+ -change @executable_path/libxpcom.dylib @loader_path/../libxpcom.dylib \
+ -change @executable_path/libxpcom_compat.dylib \
+ @loader_path/../libxpcom_compat.dylib \
+ $(file) &&) true
+.ENDIF
+
+# zip runtime files to mozruntime.zip
+ cd $(RUNTIME_DIR) && zip -r ..$/..$/bin$/mozruntime.zip *
+
+ $(TOUCH) $@
+
+$(INCCOM)$/nsBuildID.h: $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+ @-echo "You can delete $(INCCOM) to force it copy all include files again."
+
+
+$(MISC)$/build$/so_moz_include_files: $(INCCOM)$/nsBuildID.h
+.IF "$(OS)"!="SOLARIS"
+ $(GNUCOPY) -pRL $(INCLUDE_PATH)* $(INCLUDE_DIR)
+ $(GNUCOPY) -pRL $(PUBLIC_PATH)* $(INCLUDE_DIR)
+.ELSE # "$(OS)"!="SOLARIS"
+ $(COPY) -pr $(INCLUDE_PATH)* $(INCLUDE_DIR)
+ $(COPY) -pr $(PUBLIC_PATH)* $(INCLUDE_DIR)
+.ENDIF # "$(OS)"!="SOLARIS"
+
+.IF "$(GUI)"=="UNX"
+ chmod -R 775 $(INCCOM)
+.ENDIF
+ $(TOUCH) $@
+.IF "$(ENABLE_NSS_MODULE)"=="YES"
+ +$(foreach,dir,$(NSS_INCLUDE_LIST) $(RENAME:s/+//) $(INCLUDE_DIR)$/$(dir) $(INCLUDE_DIR)$/$(dir)_remove_me &&) echo >& $(NULLDEV)
+ $(foreach,dir,$(NSS_INCLUDE_LIST) rm -rf $(INCLUDE_DIR)$/$(dir)_remove_me &&) echo >& $(NULLDEV)
+ -$(MKDIR) $(OUT)$/inc.nss
+ cd $(OUT)$/inc.nss && $(foreach,dir,$(NSS_INCLUDE_LIST) $(GNUCOPY) -pRL $(SOLARINCDIR)$/mozilla/$(dir) . &&) echo >& $(NULLDEV)
+.ENDIF
+
+# On UNX the rules for so_moz_runtime_files copy files into the same directory
+# used here (LIB_DIR), and on MACOSX all those files together need to be
+# processed here, hence the dependency on so_moz_runtime_files:
+$(MISC)$/build$/so_moz_lib_files: $(foreach,file,$(LIBLIST) $(LIB_DIR)$/$(file)) $(MISC)$/build$/so_moz_runtime_files
+ echo $(foreach,file,$(LIBLIST) $(MOZ_DIST_DIR)$/lib$/$(file))
+ $(foreach,file,$(LIBLIST) $(COPY) $(MOZ_DIST_DIR)$/lib$/$(file) \
+ $(LIB_DIR)$/$(file) &&) \
+ echo >& $(NULLDEV)
+.IF "$(OS)"=="MACOSX"
+ $(PERL) $(SOLARENV)$/bin$/macosx-change-install-names.pl extshl OOO \
+ $(LIB_DIR)$/*$(DLLPOST)
+.ENDIF
+.IF "$(GUI)"=="UNX"
+ chmod -R 775 $(LB)
+.ENDIF
+ $(TOUCH) $@
+
+$(BIN_RUNTIMELIST): $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+ @$(COPY) $(MOZ_BIN_DIR)$/$(DLLPRE)$@$(DLLPOST) $(RUNTIME_DIR)$/$(DLLPRE)$@$(DLLPOST)
+
+$(COMPONENT_RUNTIMELIST): $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+ @$(COPY) $(MOZ_BIN_DIR)$/components$/$(DLLPRE)$@$(DLLPOST) $(RUNTIME_DIR)$/components$/$(DLLPRE)$@$(DLLPOST)
+
+$(COMREGISTRY_FILELIST): $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+ @$(COPY) $(MOZ_BIN_DIR)$/components$/$@ $(RUNTIME_DIR)$/components$/$@
+
+$(DEFAULTS_RUNTIMELIST): $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+ @$(COPY) $(MOZ_BIN_DIR)$/$@ $(RUNTIME_DIR)$/$@
+
+RES_FILELIST: $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+.IF "$(OS)"=="SOLARIS"
+ @$(COPY) $(MOZ_BIN_DIR)$/res$/charsetalias.properties $(RUNTIME_DIR)$/res$/charsetalias.properties
+.ELSE
+ @echo No Res Files to copy.
+.ENDIF
+
+$(LIB_DIR)$/%: $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE)
+ noop
+
+$(MISC)$/CREATETARBALL: extract_mozab_files
+ @@-$(MKDIR) $(OUT)$/zipped
+ $(COPY) $(BIN)$/mozruntime.zip $(OUT)$/zipped$/$(MOZTARGET)runtime.zip
+.IF "$(GUI)"=="UNX"
+.IF "$(OS)"!="MACOSX"
+ cd $(LB) && strip *$(DLLPOST)
+.ENDIF
+.ENDIF
+ cd $(LB) && zip -r ..$/zipped$/$(MOZTARGET)lib.zip *
+ cd $(INCCOM) && zip -r ..$/zipped$/$(MOZTARGET)inc.zip *
+.IF "$(ENABLE_NSS_MODULE)"=="YES"
+ cd $(OUT)$/inc.nss && zip -r ..$/zipped$/$(MOZTARGET)inc.zip *
+.ENDIF
diff --git a/moz/makefile.mk b/moz/makefile.mk
new file mode 100644
index 000000000000..feb2c50343ee
--- /dev/null
+++ b/moz/makefile.mk
@@ -0,0 +1,425 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=.
+
+PRJNAME=ooo_mozab
+TARGET=ooo_mozab
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+# ----- pkg-config start -------
+.INCLUDE .IGNORE : pkgroot.mk
+.IF "$(PKGCONFIG_ROOT)"!=""
+PKG_CONFIG:=$(PKGCONFIG_ROOT)$/bin$/pkg-config
+PKG_CONFIG_PATH:=$(PKGCONFIG_ROOT)$/lib$/pkgconfig
+.IF "$(LD_LIBRARY_PATH)"=="" # assume empty implies unset
+LD_LIBRARY_PATH!:=$(PKGCONFIG_ROOT)$/lib
+.ELSE
+LD_LIBRARY_PATH!:=$(LD_LIBRARY_PATH)$(PATH_SEPERATOR)$(PKGCONFIG_ROOT)$/lib
+.ENDIF
+.EXPORT : PKG_CONFIG_PATH PKG_CONFIG LD_LIBRARY_PATH
+.ENDIF # "$(PKGCONFIG_ROOT)"!=""
+
+# reduce prerequisites by disabling mozilla binary
+DISABLE_MOZ_EXECUTABLE=TRUE
+.EXPORT : DISABLE_MOZ_EXECUTABLE
+
+.IF "$(SYSBASE)"!="" && "$(OS)" == "LINUX"
+## hmm... rather gcc specific switches...
+CFLAGS:=-isystem $(SYSBASE)/usr/include -B$(SYSBASE)/usr/lib
+LDFLAGS:= -Wl,--unresolved-symbols=ignore-in-shared-libs -L$(SYSBASE)/lib -L$(SYSBASE)/usr/lib -L$(SYSBASE)/usr/X11R6/lib
+SYSBASE_X11:=--x-includes=$(SYSBASE)/usr/include/X11 --x-libraries=$(SYSBASE)/usr/X11R6/lib
+MOZ_ENABLE_COREXFONTS=1
+MOZILLA_CONFIGURE_FLAGS +=--disable-xft
+.EXPORT : CFLAGS LDFLAGS MOZ_ENABLE_COREXFONTS
+.ENDIF # "$(SYSBASE)"!="" && "$(OS)" == "LINUX"
+
+.IF "$(SYSBASE)"!="" && "$(OS)" == "MACOSX"
+PKGCONFIG_ROOT!:=$(ENV_ROOT)$/macports-1.7.0
+PKG_CONFIG:=$(PKGCONFIG_ROOT)$/bin$/pkg-config
+PKG_CONFIG_PATH:=$(PKGCONFIG_ROOT)$/lib$/pkgconfig
+.EXPORT : PKG_CONFIG_PATH PKG_CONFIG
+# hmm... rather gcc specific switches...
+CFLAGS:=-isystem $(SYSBASE)/usr/include -B$(SYSBASE)/usr/lib -B$(SYSBASE)/usr/lib/system -L$(ENV_ROOT)/macports-1.7.0/lib -lmathCommon
+LDFLAGS:=-L$(SYSBASE)/lib -L$(SYSBASE)/usr/lib -L$(SYSBASE)/usr/lib/system
+XLDOPTS:= -B$(SYSBASE)/usr/lib -B$(SYSBASE)/usr/lib/system -lmathCommon
+.EXPORT : CFLAGS LDFLAGS XLDOPTS
+.ENDIF # "$(SYSBASE)"!="" && "$(OS)" == "MACOSX"
+
+# ----- pkg-config end -------
+
+MOZILLA_VERSION=1.1.14
+TARFILE_NAME=seamonkey-$(MOZILLA_VERSION).source
+TARFILE_MD5=a169ab152209200a7bad29a275cb0333
+
+TARFILE_ROOTDIR=mozilla
+PATCH_FILES = \
+ seamonkey-source-$(MOZILLA_VERSION).patch \
+ patches/dtoa.patch \
+ patches/respect_disable_pango.patch \
+ patches/arm_build_fix.patch \
+ patches/link_fontconfig.patch \
+ patches/brokenmakefile.patch
+
+# This file is needed for the W32 build when BUILD_MOZAB is set
+# (currently only vc8/vs2005 is supported when BUILD_MOZAB is set)
+.IF "$(COM)"=="GCC"
+LIBIDL_VC71_ZIPFILE_NAME*=vc71-libIDL-0.6.8-bin.zip
+LIBGLIB_VC71_ZIPFILE_NAME*=vc71-glib-1.2.10-bin.zip
+MOZTOOLS_ZIPFILE_NAME*=wintools.zip
+.ELSE
+MOZTOOLS_ZIPFILE_NAME*=vc8-moztools.zip
+.ENDIF
+
+ADDITIONAL_FILES=mailnews$/addrbook$/src$/nsAbMD5sum.cpp
+
+CONFIGURE_DIR=
+.IF "$(GUIBASE)"!="aqua"
+MOZILLA_CONFIGURE_FLAGS += $(SYSBASE_X11)
+.ENDIF
+
+MOZILLA_CONFIGURE_FLAGS += --disable-tests \
+ --enable-application=suite \
+ --enable-ldap \
+ --enable-crypto \
+ --enable-optimize \
+ --enable-strip \
+ --disable-profilelocking \
+ --disable-activex \
+ --disable-activex-scripting \
+ --disable-gnomevfs \
+ --disable-debug \
+ --disable-xprint \
+ --disable-postscript \
+ --without-system-zlib \
+ --disable-installer \
+ --disable-accessibility \
+ --disable-xpfe-components \
+ --disable-mathml \
+ --disable-oji \
+ --disable-profilesharing \
+ --disable-boehm \
+ --disable-jsloader \
+ --disable-canvas \
+ --disable-freetype2 \
+ --disable-gnomeui \
+ --disable-image-encoders \
+ --disable-plugins \
+ --disable-printing \
+ --disable-pango \
+ --enable-extensions="pref"
+
+#.IF "$(GUI)"!="WNT"
+#MOZILLA_CONFIGURE_FLAGS += --enable-system-cairo
+#.ENDIF
+
+#disable profilelocking to share profile with mozilla
+#disable activex and activex-scripting to remove the dependence of Microsoft_SDK\src\mfc\atlbase.h
+#disable gnomevfs to remove the needed of gnome develop files
+#disable others to save build times
+
+.IF "$(GUI)"=="UNX"
+.IF "$(GUIBASE)"=="aqua"
+MACDEVSDK*=/Developer/SDKs/MacOSX10.4u.sdk
+MOZILLA_CONFIGURE_FLAGS+= \
+ --with-macos-sdk=$(MACDEVSDK) \
+ --disable-glibtest \
+ --enable-macos-target=10.4 \
+ --disable-libxul
+DEFAULT_MOZILLA_TOOLKIT=mac
+.ELSE
+#We do not need mozilla ui, but libIDL version are decided by default toolkit.
+#default-toolkit=xlib need libIDL < 0.68
+#default-toolkit=gtk2 need libIDL > 0.8 (know as libIDL2)
+DEFAULT_MOZILLA_TOOLKIT*=gtk2
+.ENDIF # "$(GUIBASE)"=="aqua"
+MOZILLA_CONFIGURE_FLAGS+= --enable-default-toolkit=$(DEFAULT_MOZILLA_TOOLKIT)
+.ENDIF
+
+# create a objdir build = build files in a seperate directory, not in the sourcetree directly
+CONFIGURE_DIR=$(CPU)_objdir
+BUILD_DIR=$(CONFIGURE_DIR)
+MOZ_CROSSCOMPILE=CROSS_COMPILE=1 CC="$(CC) -arch $(MOZ_ARCH)" CXX="$(CXX) -arch $(MOZ_ARCH)" AR=ar
+
+CONFIGURE_ACTION=$(null,$(MOZ_ARCH) $(NULL) $(MOZ_CROSSCOMPILE)) ../configure $(MOZILLA_CONFIGURE_FLAGS)
+
+BUILD_ACTION:=$(GNUMAKE) -j$(EXTMAXPROCESS)
+
+.IF "$(GUI)"=="UNX"
+.IF "$(COMNAME)"=="sunpro5"
+CXXFLAGS:=-features=tmplife
+.IF "$(CPU)"=="U"
+CXXFLAGS+=-m64
+.ENDIF
+.EXPORT : CXXFLAGS
+.ENDIF # "$(COMNAME)"=="sunpro5"
+.IF "$(COM)$(OS)$(CPUNAME)" == "GCCLINUXPOWERPC64"
+CXXFLAGS:=-mminimal-toc
+.EXPORT : CXXFLAGS
+.ENDIF
+.ENDIF
+
+.IF "$(OS)"=="SOLARIS" && "$(CPUNAME)"=="SPARC" && "$(CPU)"=="U"
+PKG_CONFIG_PATH=/usr/lib/64/pkgconfig
+.EXPORT: PKG_CONFIG_PATH
+MAKE=/usr/sfw/bin/gmake
+.EXPORT: MAKE
+CFLAGS=-I/usr/sfw/include
+.EXPORT: CFLAGS
+.ENDIF
+.IF "$(COM)"=="C52" && "$(CPUNAME)"=="SPARC" && "$(CPU)"=="U"
+CFLAGS=-m64
+ASFLAGS=-m64
+.EXPORT: CFLAGS ASFLAGS
+.ENDIF
+
+MOZDIR=$(MISC)$/build$/seamonkey
+MOZTARGET=$(OS)$(COM)$(CPU)
+
+.IF "$(GUI)"=="WNT"
+# "Our" build environment uses "NO" for the environment variable that
+# indicate if system libraries should be used, the mozilla build uses
+# "" in this case. This conflicts (at least for W32) with mozilla (1.7b)
+# because it disables the library checks for msvc so that
+# --without-system-* is not evaluated. To build the included libraries
+# the affected variables have to be empty and not NO.
+.IF "$(SYSTEM_ZLIB)"=="NO"
+SYSTEM_ZLIB:=
+.EXPORT : SYSTEM_ZLIB
+.ENDIF
+.IF "$(SYSTEM_JPEG)"=="NO"
+SYSTEM_JPEG:=
+.EXPORT : SYSTEM_JPEG
+.ENDIF
+
+# For W32-tcsh CC and CXX must not contain the wrapper, and W32-4nt ( in
+# some cases ) doesn't work with DOS path notation when building mozilla.
+.IF "$(COM)"=="GCC"
+CC:=$(CC:s/guw.exe //:s/ -mno-cygwin//)
+CXX:=$(CXX:s/guw.exe //:s/ -mno-cygwin//)
+CPP:=$(CC) -E
+LD:=ld
+LIBS:=-lsupc++
+.EXPORT : CPP LIBS
+.ELSE
+CC:=cl.exe
+CXX:=cl.exe
+.ENDIF
+
+# Variables to install/use our own wintools
+.IF "$(COM)"=="GCC"
+MOZTOOLSUNPACK:=$(MISC)$/build$/moztoolsunpack
+MOZTOOLSINST:=$(MISC)$/build$/moztoolsinst
+.ELSE
+MOZTOOLS_EXTRACT:=$(MISC)$/build$/moztools
+.ENDIF
+.IF "$(COM)"=="GCC"
+MOZ_TOOLS_DOS:=$(shell @cygpath -ad "$(MISC)")\build\moztoolsinst
+PATH!:=$(PATH):$(shell @cygpath $(MOZ_TOOLS_DOS))/bin:$(shell @cygpath $(MOZ_TOOLS_DOS))/vc71/bin
+SET_MOZ_TOOLS_INSTALL_BAT:=export "MOZ_TOOLS=$(MOZ_TOOLS_DOS)"
+.ELSE
+MOZ_TOOLS_DOS:=$(shell @cygpath -ad "$(MISC)")\build\moztools\vc8-moztools
+PATH!:=$(shell @cygpath $(MOZ_TOOLS_DOS))/bin:$(PATH)
+.ENDIF
+
+MOZ_TOOLS:=$(subst,\,/ $(MOZ_TOOLS_DOS))
+.IF "$(COM)"=="GCC"
+GLIB_PREFIX:=$(MOZ_TOOLS)/vc71
+LIBIDL_PREFIX:=$(MOZ_TOOLS)/vc71
+.EXPORT : GLIB_PREFIX LIBIDL_PREFIX
+.ENDIF
+
+.EXPORT : PATH MOZ_TOOLS
+.ENDIF # "$(GUI)"=="WNT"
+
+# --- Targets ------------------------------------------------------
+
+.IF "$(BUILD_MOZAB)"==""
+all:
+ @echo "Never Build Mozilla."
+.ENDIF
+
+.INCLUDE : set_ext.mk
+.INCLUDE : target.mk
+.INCLUDE : tg_ext.mk
+
+.IF "$(GUI)"=="WNT"
+NEEDWINTOOLSFLAGFILE:=$(MISC)$/build$/moztools.complete
+.ENDIF # "$(GUI)"=="WNT"
+
+ALLTAR: $(NEEDWINTOOLSFLAGFILE) \
+ $(MISC)$/remove_build.flag \
+ extract_mozab_files
+
+$(PACKAGE_DIR)$/$(UNTAR_FLAG_FILE) : $(MISC)$/remove_build.flag
+
+# Since you never know what will be in a patch (for example, it may already
+# patch at configure level), we remove the entire package directory if a patch
+# is newer.
+$(MISC)$/remove_build.flag : $(PATCH_FILES)
+ $(REMOVE_PACKAGE_COMMAND)
+ $(TOUCH) $(MISC)$/remove_build.flag
+
+# Unpack/setup Windows build tools
+.IF "$(GUI)"=="WNT"
+$(PACKAGE_DIR)$/$(UNTAR_FLAG_FILE) : $(MISC)$/build$/moztools.complete
+
+.IF "$(COM)"=="GCC"
+$(MISC)$/build$/moztools.unpack : $(PRJ)$/download$/$(MOZTOOLS_ZIPFILE_NAME)
+ -$(RENAME) $(MOZTOOLSUNPACK) $(MOZTOOLSUNPACK)_removeme
+ -$(RENAME) $(MOZTOOLSINST) $(MOZTOOLSINST)_removeme
+ -rm -rf $(MOZTOOLSUNPACK)_removeme $(MOZTOOLSINST)_removeme
+ @-$(MKDIRHIER) $(MOZTOOLSUNPACK)
+ unzip $(PRJ)$/download$/$(MOZTOOLS_ZIPFILE_NAME) -d $(MOZTOOLSUNPACK)
+ $(TOUCH) $(MISC)$/build$/moztools.unpack
+
+$(MISC)$/build$/moztools.install : $(MISC)$/build$/moztools.unpack
+ cd $(MOZTOOLSUNPACK)$/buildtools$/windows && $(SET_MOZ_TOOLS_INSTALL_BAT) && cmd /c install.bat
+ $(TOUCH) $(MISC)$/build$/moztools.install
+
+$(MISC)$/build$/moztools.complete : \
+ $(MISC)$/build$/moztools.install \
+ $(PRJ)$/download$/$(LIBIDL_VC71_ZIPFILE_NAME) \
+ $(PRJ)$/download$/$(LIBGLIB_VC71_ZIPFILE_NAME)
+ unzip $(PRJ)$/download$/$(LIBIDL_VC71_ZIPFILE_NAME) -d $(MOZTOOLSINST)
+ unzip $(PRJ)$/download$/$(LIBGLIB_VC71_ZIPFILE_NAME) -d $(MOZTOOLSINST)
+# chmod is also needed for W32-4nt build (when cygwin unzip is used)
+ -chmod -R +x $(MOZTOOLSINST)$/vc71$/bin
+ $(TOUCH) $(MISC)$/build$/moztools.complete
+.ELSE
+$(MISC)$/build$/moztools.unpack : $(PRJ)$/download$/$(MOZTOOLS_ZIPFILE_NAME)
+ -$(RENAME) $(MOZTOOLS_EXTRACT) $(MOZTOOLS_EXTRACT)_removeme
+ -rm -rf $(MOZTOOLS_EXTRACT)_removeme
+ @-$(MKDIRHIER) $(MOZTOOLS_EXTRACT)
+ unzip $(PRJ)$/download$/$(MOZTOOLS_ZIPFILE_NAME) -d $(MOZTOOLS_EXTRACT)
+# chmod is also needed for W32-4nt build (when cygwin unzip is used)
+ -chmod -R +x $(MOZTOOLS_EXTRACT)$/vc8-moztools$/bin
+ $(TOUCH) $(MISC)$/build$/moztools.unpack
+
+$(MISC)$/build$/moztools.complete : $(MISC)$/build$/moztools.unpack
+ $(TOUCH) $(MISC)$/build$/moztools.complete
+.ENDIF
+.ENDIF # "$(GUI)"=="WNT"
+
+zip: \
+ $(MISC)$/CREATETARBALL
+
+.IF "$(GUIBASE)"=="aqua"
+MOZ_ARCH=$(eq,$(CPU),I i386 ppc)
+MOZILLA_CONFIGURE_FLAGS+=$(eq,$(CPU),I --target=i386-apple-darwin8 --target=powerpc-apple-darwin8)
+
+force_clean :
+ @$(IFEXIST) $(PACKAGE_DIR)$/$(PREDELIVER_FLAG_FILE) $(THEN) echo 'ERROR: get rid of your outputdir first (or refactor the makefiles to allow incremental creation of prebuilt zips). Remember to copy already created zips to a safe place '; exit 1 $(FI)
+
+zip_intel .SEQUENTIAL: force_clean $(MISC)$/CREATETARBALL
+
+zip_ppc .SEQUENTIAL: force_clean $(MISC)$/CREATETARBALL
+
+# target-conditionals, when building target -> Macro is set
+zip_intel ?= MOZ_ARCH=i386
+zip_intel ?= MOZILLA_CONFIGURE_FLAGS+=--target=i386-apple-darwin8
+zip_intel ?= CPU=I
+
+zip_ppc ?= MOZ_ARCH=ppc
+zip_ppc ?= MOZILLA_CONFIGURE_FLAGS+=--target=powerpc-apple-darwin8
+zip_ppc ?= CPU=P
+
+zip_universal: $(OUT)$/zipped$/$(OS)$(COM)UBinc.zip $(OUT)$/zipped$/$(OS)$(COM)UBlib.zip $(OUT)$/zipped$/$(OS)$(COM)UBruntime.zip
+ @echo "All zips created successfully - copy from $(OUT)$/zipped to \$$SRC_ROOT/moz/zipped and use --disable-build-mozilla to use them"
+
+$(OUT)$/zipped$/$(OS)$(COM)UBinc.zip : zipped$/$(OS)$(COM)Pinc.zip zipped$/$(OS)$(COM)Iinc.zip
+ @echo "setting up for $@"
+ @rm -rf $(MISC)$/UB_inc
+ @$(MKDIRHIER) $(MISC)$/UB_inc$/intel
+ @$(MKDIR) $(MISC)$/UB_inc$/ppc
+ @$(MKDIR) $(MISC)$/UB_inc$/uni
+ @unzip -q zipped$/$(OS)$(COM)Pinc.zip -d $(MISC)$/UB_inc$/ppc
+ @unzip -q zipped$/$(OS)$(COM)Iinc.zip -d $(MISC)$/UB_inc$/intel
+# use one of the two as basis for the universal one - (saves manually creating directories/copying identical files)
+ @unzip -q zipped$/$(OS)$(COM)Pinc.zip -d $(MISC)$/UB_inc$/uni
+# add safety-warning to host-autogenerated headers (aren't used anywhere in OOo currently, but doesn't hurt to be safe
+# bail out on everything that differs and is not a *.h file
+ @echo "flagging endian-specific headers with #error.."
+ @diff --brief -r $(MISC)$/UB_inc$/ppc $(MISC)$/UB_inc$/intel | awk \
+ '/^Only in/ {{print; print "ERROR - file sets differ!"; exit 1}} \
+ /^Files .*\.h differ$$/ {{target="$(MISC)$/UB_inc$/uni$/" substr($$2,length("$(MISC)$/UB_inc$/ppc")+2); \
+ system("echo \"#error use native moz-zips, this header is endian-specific!\" | cat - " $$2 " > " target); next}} \
+ {{print; print "ERROR - unexpected files encountered!"; exit 2}}'
+ @cd $(MISC)$/UB_inc$/uni ; zip -q -r ..$/$(@:f) *
+ @$(MKDIRHIER) $(@:d)
+ @$(MV) $(MISC)$/UB_inc$/$(@:f) $@
+ @echo "successfully created $@"
+
+$(OUT)$/zipped$/$(OS)$(COM)UBlib.zip : zipped$/$(OS)$(COM)Plib.zip zipped$/$(OS)$(COM)Ilib.zip
+ @echo "setting up for $@"
+ @rm -rf $(MISC)$/UB_lib
+ @$(MKDIRHIER) $(MISC)$/UB_lib$/intel
+ @$(MKDIR) $(MISC)$/UB_lib$/ppc
+ @$(MKDIR) $(MISC)$/UB_lib$/uni
+ @unzip -q zipped$/$(OS)$(COM)Plib.zip -d $(MISC)$/UB_lib$/ppc
+ @unzip -q zipped$/$(OS)$(COM)Ilib.zip -d $(MISC)$/UB_lib$/intel
+# use lipo on .a and .dylib files - bail out on anything else
+ @echo "creating universal binaries from libs..."
+ @diff --brief -s -r $(MISC)$/UB_lib$/ppc $(MISC)$/UB_lib$/intel | awk \
+ '/^Only in/ {{print "ERROR - file sets differ!"; print; exit 1}} \
+ /^Files .*\.(a|dylib) differ$$/ {{target="$(MISC)$/UB_lib$/uni$/" substr($$2,length("$(MISC)$/UB_lib$/ppc")+2); \
+ if(0!=system("lipo -create -arch ppc "$$2" -arch i386 "$$4" -output " target)) exit 11; next}} \
+ {{print; print "ERROR - unexpected files encountered!"; exit 2}}'
+ @cd $(MISC)$/UB_lib$/uni ; zip -q -r ..$/$(@:f) *
+ @$(MKDIRHIER) $(@:d)
+ @$(MV) $(MISC)$/UB_lib$/$(@:f) $@
+ @echo "successfully created $@"
+
+$(OUT)$/zipped$/$(OS)$(COM)UBruntime.zip : zipped$/$(OS)$(COM)Pruntime.zip zipped$/$(OS)$(COM)Iruntime.zip
+ @echo "setting up for $@"
+ @rm -rf $(MISC)$/UB_runtime
+ @$(MKDIRHIER) $(MISC)$/UB_runtime$/intel
+ @$(MKDIR) $(MISC)$/UB_runtime$/ppc
+ @$(MKDIR) $(MISC)$/UB_runtime$/uni
+ @unzip -q zipped$/$(OS)$(COM)Pruntime.zip -d $(MISC)$/UB_runtime$/ppc
+ @unzip -q zipped$/$(OS)$(COM)Iruntime.zip -d $(MISC)$/UB_runtime$/intel
+# use one of the two as basis for the universal one - (saves manually creating directories/copying identical files)
+ @unzip -q zipped$/$(OS)$(COM)Pruntime.zip -d $(MISC)$/UB_runtime$/uni
+# @line -comments in autogenerated files: contains path of source-file, ignore different objdirs
+ @echo "creating universal binaries from libs..."
+ @diff --brief -I "^//@line [0-9][0-9]*" -r $(MISC)$/UB_runtime$/ppc $(MISC)$/UB_runtime$/intel | awk \
+ '/^Only in/ {{print; print "ERROR - file sets differ!"; exit 1}} \
+ /^Files .*\.dylib differ$$/ {{target="$(MISC)$/UB_runtime$/uni$/" substr($$2,length("$(MISC)$/UB_runtime$/ppc")+2); \
+ if(0!=system("lipo -create -arch ppc "$$2" -arch i386 "$$4" -output " target)) exit 11; next}} \
+ {{print; print "ERROR - unexpected files encountered!"; exit 2}}'
+ @cd $(MISC)$/UB_lib$/uni ; zip -q -r ..$/$(@:f) *
+ @$(MKDIRHIER) $(@:d)
+ @$(MV) $(MISC)$/UB_lib$/$(@:f) $@
+ @echo "successfully created $@"
+
+.ENDIF # $(GUIBASE)=="aqua"
+
+.INCLUDE : extractfiles.mk
diff --git a/moz/patches/arm_build_fix.patch b/moz/patches/arm_build_fix.patch
new file mode 100644
index 000000000000..79368e5fe6db
--- /dev/null
+++ b/moz/patches/arm_build_fix.patch
@@ -0,0 +1,189 @@
+--- misc/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_arm.cpp 2010-01-29 08:39:01.000000000 +0000
++++ misc/build/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_arm.cpp 2010-01-29 08:41:01.000000000 +0000
+@@ -44,8 +44,21 @@
+ #error "This code is for Linux ARM only. Please check if it works for you, too.\nDepends strongly on gcc behaviour."
+ #endif
+
++#if (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
++/* This tells gcc3.4+ not to optimize away symbols.
++ * * @see http://gcc.gnu.org/gcc-3.4/changes.html
++ * */
++#define DONT_DROP_OR_WARN __attribute__((used))
++#else
++/* This tells older gccs not to warn about unused vairables.
++ * * @see http://docs.freebsd.org/info/gcc/gcc.info.Variable_Attributes.html
++ * */
++#define DONT_DROP_OR_WARN __attribute__((unused))
++#endif
++
+ /* Specify explicitly a symbol for this function, don't try to guess the c++ mangled symbol. */
+-static nsresult PrepareAndDispatch(nsXPTCStubBase* self, uint32 methodIndex, PRUint32* args) asm("_PrepareAndDispatch");
++static nsresult PrepareAndDispatch(nsXPTCStubBase* self, uint32 methodIndex, PRUint32* args) asm("_PrepareAndDispatch")
++DONT_DROP_OR_WARN;
+
+ static nsresult
+ PrepareAndDispatch(nsXPTCStubBase* self, uint32 methodIndex, PRUint32* args)
+--- misc/mozilla/security/nss/cmd/shlibsign/Makefile 2010-02-05 13:13:56.000000000 +0000
++++ misc/build/mozilla/security/nss/cmd/shlibsign/Makefile 2010-02-05 13:14:16.000000000 +0000
+@@ -124,5 +124,5 @@
+ endif
+ endif
+
+-libs install :: $(CHECKLOC)
++libs install ::
+
+--- misc/mozilla/security/manager/Makefile.in 2010-02-05 13:27:25.000000000 +0000
++++ misc/build/mozilla/security/manager/Makefile.in 2010-02-05 13:28:00.000000000 +0000
+@@ -53,7 +53,6 @@
+ SMIME3_LIB \
+ SSL3_LIB \
+ SOFTOKEN3_LIB \
+- SOFTOKEN3_CHK \
+ LOADABLE_ROOT_MODULE \
+ HAVE_FREEBL_LIBS \
+ HAVE_FREEBL_LIBS_32 \
+@@ -68,7 +67,6 @@
+ SMIME3_LIB = $(DLL_PREFIX)smime3$(DLL_SUFFIX)
+ SSL3_LIB = $(DLL_PREFIX)ssl3$(DLL_SUFFIX)
+ SOFTOKEN3_LIB = $(DLL_PREFIX)softokn3$(DLL_SUFFIX)
+-SOFTOKEN3_CHK = $(DLL_PREFIX)softokn3.chk
+
+ # Default
+ HAVE_FREEBL_LIBS = 1
+@@ -99,23 +97,17 @@
+
+ ifdef HAVE_FREEBL_LIBS
+ FREEBL_LIB = $(DLL_PREFIX)freebl3$(DLL_SUFFIX)
+-FREEBL_CHK = $(DLL_PREFIX)freebl3.chk
+ endif
+ ifdef HAVE_FREEBL_LIBS_32
+ FREEBL_32INT_LIB = libfreebl_32int_3$(DLL_SUFFIX)
+-FREEBL_32INT_CHK = libfreebl_32int_3.chk
+ FREEBL_32FPU_LIB = libfreebl_32fpu_3$(DLL_SUFFIX)
+-FREEBL_32FPU_CHK = libfreebl_32fpu_3.chk
+ endif
+ ifdef HAVE_FREEBL_LIBS_32INT64
+ FREEBL_32INT64_LIB = libfreebl_32int64_3$(DLL_SUFFIX)
+-FREEBL_32INT64_CHK = libfreebl_32int64_3.chk
+ endif
+ ifdef HAVE_FREEBL_LIBS_64
+ FREEBL_64INT_LIB = libfreebl_64int_3$(DLL_SUFFIX)
+-FREEBL_64INT_CHK = libfreebl_64int_3.chk
+ FREEBL_64FPU_LIB = libfreebl_64fpu_3$(DLL_SUFFIX)
+-FREEBL_64FPU_CHK = libfreebl_64fpu_3.chk
+ endif
+
+ ABS_DIST := $(shell cd $(DIST) && pwd)
+@@ -210,7 +202,6 @@
+ OS_ARCH="$(OS_ARCH)" \
+ CPU_ARCH="$(TARGET_CPU)" \
+ $(NULL)
+-SKIP_CHK=1
+ endif
+ SUBMAKEFILES = boot/Makefile ssl/Makefile pki/Makefile locales/Makefile
+
+@@ -223,10 +214,6 @@
+ ifndef MOZ_NATIVE_NSS
+ $(MAKE) -C $(topsrcdir)/security/coreconf $(DEFAULT_GMAKE_FLAGS) clean
+ $(MAKE) -C $(topsrcdir)/security/nss/lib $(DEFAULT_GMAKE_FLAGS) clean
+-ifndef SKIP_CHK
+- $(MAKE) -C $(topsrcdir)/security/nss/cmd/lib $(DEFAULT_GMAKE_FLAGS) clean
+- $(MAKE) -C $(topsrcdir)/security/nss/cmd/shlibsign $(DEFAULT_GMAKE_FLAGS) clean
+-endif
+ touch $@
+ endif
+
+@@ -262,43 +249,22 @@
+ # In NSS 3.11.8-3.11.9, lib/ssl/derive.c includes cmd/lib/secutil.h.
+ $(MAKE) -C $(topsrcdir)/security/nss/cmd/lib $(DEFAULT_GMAKE_FLAGS) export
+ $(MAKE) -C $(topsrcdir)/security/nss/lib $(DEFAULT_GMAKE_FLAGS) DIRS="util base dev pki pki1 certdb certhigh pk11wrap cryptohi nss ssl pkcs12 pkcs7 smime crmf jar ckfw ckfw/builtins"
+-ifndef SKIP_CHK
+- $(MAKE) -C $(topsrcdir)/security/nss/cmd/lib $(DEFAULT_GMAKE_FLAGS)
+- $(MAKE) -C $(topsrcdir)/security/nss/cmd/shlibsign $(DEFAULT_GMAKE_FLAGS)
+-endif
+ $(INSTALL) -m 755 $(DIST)/lib/$(LOADABLE_ROOT_MODULE) $(DIST)/bin
+-ifndef SKIP_CHK
+- $(INSTALL) -m 644 $(DIST)/lib/$(SOFTOKEN3_CHK) $(DIST)/bin
+-endif
+ $(INSTALL) -m 755 $(DIST)/lib/$(SOFTOKEN3_LIB) $(DIST)/bin
+ $(INSTALL) -m 755 $(DIST)/lib/$(NSS3_LIB) $(DIST)/bin
+ $(INSTALL) -m 755 $(DIST)/lib/$(SSL3_LIB) $(DIST)/bin
+ $(INSTALL) -m 755 $(DIST)/lib/$(SMIME3_LIB) $(DIST)/bin
+ ifdef HAVE_FREEBL_LIBS
+-ifndef SKIP_CHK
+- $(INSTALL) -m 644 $(DIST)/lib/$(FREEBL_CHK) $(DIST)/bin
+-endif
+ $(INSTALL) -m 755 $(DIST)/lib/$(FREEBL_LIB) $(DIST)/bin
+ endif
+ ifdef HAVE_FREEBL_LIBS_32
+-ifndef SKIP_CHK
+- $(INSTALL) -m 644 $(DIST)/lib/$(FREEBL_32INT_CHK) $(DIST)/bin
+- $(INSTALL) -m 644 $(DIST)/lib/$(FREEBL_32FPU_CHK) $(DIST)/bin
+-endif
+ $(INSTALL) -m 755 $(DIST)/lib/$(FREEBL_32INT_LIB) $(DIST)/bin
+ $(INSTALL) -m 755 $(DIST)/lib/$(FREEBL_32FPU_LIB) $(DIST)/bin
+ endif
+ ifdef HAVE_FREEBL_LIBS_32INT64
+-ifndef SKIP_CHK
+- $(INSTALL) -m 644 $(DIST)/lib/$(FREEBL_32INT64_CHK) $(DIST)/bin
+-endif
+ $(INSTALL) -m 755 $(DIST)/lib/$(FREEBL_32INT64_LIB) $(DIST)/bin
+ endif
+ ifdef HAVE_FREEBL_LIBS_64
+-ifndef SKIP_CHK
+- $(INSTALL) -m 644 $(DIST)/lib/$(FREEBL_64INT_CHK) $(DIST)/bin
+- $(INSTALL) -m 644 $(DIST)/lib/$(FREEBL_64FPU_CHK) $(DIST)/bin
+-endif
+ $(INSTALL) -m 755 $(DIST)/lib/$(FREEBL_64INT_LIB) $(DIST)/bin
+ $(INSTALL) -m 755 $(DIST)/lib/$(FREEBL_64FPU_LIB) $(DIST)/bin
+ endif
+@@ -313,38 +279,21 @@
+ install::
+ ifndef MOZ_NATIVE_NSS
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(LOADABLE_ROOT_MODULE) $(DESTDIR)$(mozappdir)
+-ifndef SKIP_CHK
+- $(SYSINSTALL) -m 644 $(DIST)/lib/$(SOFTOKEN3_CHK) $(DESTDIR)$(mozappdir)
+-endif
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(SOFTOKEN3_LIB) $(DESTDIR)$(mozappdir)
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(NSS3_LIB) $(DESTDIR)$(mozappdir)
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(SSL3_LIB) $(DESTDIR)$(mozappdir)
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(SMIME3_LIB) $(DESTDIR)$(mozappdir)
+ ifdef HAVE_FREEBL_LIBS
+-ifndef SKIP_CHK
+- $(SYSINSTALL) -m 644 $(DIST)/lib/$(FREEBL_CHK) $(DESTDIR)$(mozappdir)
+-endif
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(FREEBL_LIB) $(DESTDIR)$(mozappdir)
+ endif
+ ifdef HAVE_FREEBL_LIBS_32
+-ifndef SKIP_CHK
+- $(SYSINSTALL) -m 644 $(DIST)/lib/$(FREEBL_32INT_CHK) $(DESTDIR)$(mozappdir)
+- $(SYSINSTALL) -m 644 $(DIST)/lib/$(FREEBL_32FPU_CHK) $(DESTDIR)$(mozappdir)
+-endif
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(FREEBL_32INT_LIB) $(DESTDIR)$(mozappdir)
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(FREEBL_32FPU_LIB) $(DESTDIR)$(mozappdir)
+ endif
+ ifdef HAVE_FREEBL_LIBS_32INT64
+-ifndef SKIP_CHK
+- $(SYSINSTALL) -m 644 $(DIST)/lib/$(FREEBL_32INT64_CHK) $(DESTDIR)$(mozappdir)
+-endif
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(FREEBL_32INT64_LIB) $(DESTDIR)$(mozappdir)
+ endif
+ ifdef HAVE_FREEBL_LIBS_64
+-ifndef SKIP_CHK
+- $(SYSINSTALL) -m 644 $(DIST)/lib/$(FREEBL_64INT_CHK) $(DESTDIR)$(mozappdir)
+- $(SYSINSTALL) -m 644 $(DIST)/lib/$(FREEBL_64FPU_CHK) $(DESTDIR)$(mozappdir)
+-endif
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(FREEBL_64INT_LIB) $(DESTDIR)$(mozappdir)
+ $(SYSINSTALL) -m 755 $(DIST)/lib/$(FREEBL_64FPU_LIB) $(DESTDIR)$(mozappdir)
+ endif
+@@ -366,10 +315,6 @@
+ ifndef MOZ_NATIVE_NSS
+ $(MAKE) -C $(topsrcdir)/security/coreconf $(DEFAULT_GMAKE_FLAGS) clean
+ $(MAKE) -C $(topsrcdir)/security/nss/lib $(DEFAULT_GMAKE_FLAGS) clean
+-ifndef SKIP_CHK
+- $(MAKE) -C $(topsrcdir)/security/nss/cmd/lib $(DEFAULT_GMAKE_FLAGS) clean
+- $(MAKE) -C $(topsrcdir)/security/nss/cmd/shlibsign $(DEFAULT_GMAKE_FLAGS) clean
+-endif
+ endif
+
+ echo-requires-recursive::
diff --git a/moz/patches/brokenmakefile.patch b/moz/patches/brokenmakefile.patch
new file mode 100644
index 000000000000..20d88014b932
--- /dev/null
+++ b/moz/patches/brokenmakefile.patch
@@ -0,0 +1,13 @@
+--- misc/mozilla/mailnews/extensions/smime/build/Makefile.in 2010-09-04 16:00:38.000000000 +0100
++++ misc/build/mozilla/mailnews/extensions/smime/build/Makefile.in 2010-09-04 16:02:24.000000000 +0100
+@@ -79,10 +79,6 @@
+ $(DIST)/lib/$(LIB_PREFIX)msgsmime_s.$(LIB_SUFFIX) \
+ $(NULL)
+
+-ifndef MOZ_STATIC_MAIL_BUILD
+-SHARED_LIBRARY_LIBS + = $(DIST)/lib/$(LIB_PREFIX)msgbsutl_s.$(LIB_SUFFIX)
+-endif
+-
+ EXTRA_DSO_LDOPTS = \
+ $(LIBS_DIR) \
+ $(EXTRA_DSO_LIBS) \
diff --git a/moz/patches/consecutive_ldap_queries.patch b/moz/patches/consecutive_ldap_queries.patch
new file mode 100644
index 000000000000..d82d594bce09
--- /dev/null
+++ b/moz/patches/consecutive_ldap_queries.patch
@@ -0,0 +1,13 @@
+--- mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2009-02-02 09:39:32.054968600 +0100
++++ mozilla.patched/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2009-02-02 09:35:35.633832119 +0100
+@@ -833,6 +833,10 @@
+ if (msgListener)
+ {
+ msgListener->mUrl = url;
++ msgListener->mQueryListener = listener;
++ msgListener->mResultLimit = resultLimit;
++ msgListener->mTimeOut = timeOut;
++ msgListener->mQueryArguments = arguments;
+ return msgListener->DoSearch();
+ }
+ }
diff --git a/moz/patches/cygwin_paths_in_ldap_sdk.patch b/moz/patches/cygwin_paths_in_ldap_sdk.patch
new file mode 100644
index 000000000000..e0983aecbe74
--- /dev/null
+++ b/moz/patches/cygwin_paths_in_ldap_sdk.patch
@@ -0,0 +1,12 @@
+--- mozilla.org/directory/c-sdk/ldap/include/Makefile.in 2006-02-03 15:44:33.000000000 +0100
++++ mozilla/directory/c-sdk/ldap/include/Makefile.in 2008-10-31 23:34:41.695625000 +0100
+@@ -85,6 +85,9 @@
+
+ ###########################################################################
+
++INCLUDEDIR:=$(shell cygpath -u $(INCLUDEDIR))
++GENHEADERS:=$(shell cygpath -u $(GENHEADERS))
++
+ all export:: $(INCLUDEDIR) $(GENHEADERS)
+ $(NSINSTALL) -D $(PRIVATEINCDIR)
+ $(INSTALL) $(INSTALLFLAGS) -m 644 $(HEADERS) $(INCLUDEDIR)
diff --git a/moz/patches/dtoa.patch b/moz/patches/dtoa.patch
new file mode 100644
index 000000000000..fce3be38b10b
--- /dev/null
+++ b/moz/patches/dtoa.patch
@@ -0,0 +1,237 @@
+--- misc/mozilla/nsprpub/pr/src/misc/prdtoa.c 20 Mar 2009 03:41:21 -0000 4.7
++++ misc/build/mozilla/nsprpub/pr/src/misc/prdtoa.c 15 Sep 2009 00:10:20 -0000
+@@ -169,17 +169,22 @@ void _PR_CleanupDtoa(void)
+ * Llong, #define #ULLong to be the corresponding unsigned type.
+ * #define KR_headers for old-style C function headers.
+ * #define Bad_float_h if your system lacks a float.h or if it does not
+ * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
+ * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
+ * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
+ * if memory is available and otherwise does something you deem
+ * appropriate. If MALLOC is undefined, malloc will be invoked
+- * directly -- and assumed always to succeed.
++ * directly -- and assumed always to succeed. Similarly, if you
++ * want something other than the system's free() to be called to
++ * recycle memory acquired from MALLOC, #define FREE to be the
++ * name of the alternate routine. (FREE or free is only called in
++ * pathological cases, e.g., in a dtoa call after a dtoa return in
++ * mode 3 with thousands of digits requested.)
+ * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
+ * memory allocations from a private pool of memory when possible.
+ * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes,
+ * unless #defined to be a different length. This default length
+ * suffices to get rid of MALLOC calls except for unusual cases,
+ * such as decimal-to-binary conversion of a very long string of
+ * digits. The longest string dtoa can return is about 751 bytes
+ * long. For conversions by strtod of strings of 800 digits and
+@@ -553,17 +558,17 @@ extern double rnd_prod(double, double),
+ #endif
+ #endif /* NO_LONG_LONG */
+
+ #ifndef MULTIPLE_THREADS
+ #define ACQUIRE_DTOA_LOCK(n) /*nothing*/
+ #define FREE_DTOA_LOCK(n) /*nothing*/
+ #endif
+
+-#define Kmax 15
++#define Kmax 7
+
+ struct
+ Bigint {
+ struct Bigint *next;
+ int k, maxwds, sign, wds;
+ ULong x[1];
+ };
+
+@@ -581,27 +586,28 @@ Balloc
+ {
+ int x;
+ Bigint *rv;
+ #ifndef Omit_Private_Memory
+ unsigned int len;
+ #endif
+
+ ACQUIRE_DTOA_LOCK(0);
+- if (rv = freelist[k]) {
++ /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
++ /* but this case seems very unlikely. */
++ if (k <= Kmax && (rv = freelist[k]))
+ freelist[k] = rv->next;
+- }
+ else {
+ x = 1 << k;
+ #ifdef Omit_Private_Memory
+ rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
+ #else
+ len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
+ /sizeof(double);
+- if (pmem_next - private_mem + len <= PRIVATE_mem) {
++ if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
+ rv = (Bigint*)pmem_next;
+ pmem_next += len;
+ }
+ else
+ rv = (Bigint*)MALLOC(len*sizeof(double));
+ #endif
+ rv->k = k;
+ rv->maxwds = x;
+@@ -615,20 +621,28 @@ Balloc
+ Bfree
+ #ifdef KR_headers
+ (v) Bigint *v;
+ #else
+ (Bigint *v)
+ #endif
+ {
+ if (v) {
+- ACQUIRE_DTOA_LOCK(0);
+- v->next = freelist[v->k];
+- freelist[v->k] = v;
+- FREE_DTOA_LOCK(0);
++ if (v->k > Kmax)
++#ifdef FREE
++ FREE((void*)v);
++#else
++ free((void*)v);
++#endif
++ else {
++ ACQUIRE_DTOA_LOCK(0);
++ v->next = freelist[v->k];
++ freelist[v->k] = v;
++ FREE_DTOA_LOCK(0);
++ }
+ }
+ }
+
+ #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
+ y->wds*sizeof(Long) + 2*sizeof(int))
+
+ static Bigint *
+ multadd
+--- misc/mozilla/js/src/jsdtoa.c 2 Sep 2007 22:20:41 -0000 3.41
++++ misc/build/mozilla/js/src/jsdtoa.c 18 Sep 2009 16:15:13 -0000
+@@ -145,17 +145,22 @@
+ * and if "unsigned Llong" does not work as an unsigned version of
+ * Llong, #define #ULLong to be the corresponding unsigned type.
+ * #define Bad_float_h if your system lacks a float.h or if it does not
+ * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
+ * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
+ * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
+ * if memory is available and otherwise does something you deem
+ * appropriate. If MALLOC is undefined, malloc will be invoked
+- * directly -- and assumed always to succeed.
++ * directly -- and assumed always to succeed. Similarly, if you
++ * want something other than the system's free() to be called to
++ * recycle memory acquired from MALLOC, #define FREE to be the
++ * name of the alternate routine. (FREE or free is only called in
++ * pathological cases, e.g., in a dtoa call after a dtoa return in
++ * mode 3 with thousands of digits requested.)
+ * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
+ * memory allocations from a private pool of memory when possible.
+ * When used, the private pool is PRIVATE_MEM bytes long: 2000 bytes,
+ * unless #defined to be a different length. This default length
+ * suffices to get rid of MALLOC calls except for unusual cases,
+ * such as decimal-to-binary conversion of a very long string of
+ * digits.
+ * #define INFNAN_CHECK on IEEE systems to cause strtod to check for
+@@ -320,17 +325,17 @@ static PRLock *freelist_lock;
+ JS_END_MACRO
+ #define RELEASE_DTOA_LOCK() PR_Unlock(freelist_lock)
+ #else
+ #undef MULTIPLE_THREADS
+ #define ACQUIRE_DTOA_LOCK() /*nothing*/
+ #define RELEASE_DTOA_LOCK() /*nothing*/
+ #endif
+
+-#define Kmax 15
++#define Kmax 7
+
+ struct Bigint {
+ struct Bigint *next; /* Free list link */
+ int32 k; /* lg2(maxwds) */
+ int32 maxwds; /* Number of words allocated for x */
+ int32 sign; /* Zero if positive, 1 if negative. Ignored by most Bigint routines! */
+ int32 wds; /* Actual number of words. If value is nonzero, the most significant word must be nonzero. */
+ ULong x[1]; /* wds words of number in little endian order */
+@@ -400,26 +405,26 @@ static Bigint *Balloc(int32 k)
+
+ #ifdef ENABLE_OOM_TESTING
+ if (++allocationNum == desiredFailure) {
+ printf("Forced Failing Allocation number %d\n", allocationNum);
+ return NULL;
+ }
+ #endif
+
+- if ((rv = freelist[k]) != NULL)
++ if (k <= Kmax && (rv = freelist[k]) != NULL)
+ freelist[k] = rv->next;
+ if (rv == NULL) {
+ x = 1 << k;
+ #ifdef Omit_Private_Memory
+ rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
+ #else
+ len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
+ /sizeof(double);
+- if (pmem_next - private_mem + len <= PRIVATE_mem) {
++ if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
+ rv = (Bigint*)pmem_next;
+ pmem_next += len;
+ }
+ else
+ rv = (Bigint*)MALLOC(len*sizeof(double));
+ #endif
+ if (!rv)
+ return NULL;
+@@ -428,18 +433,26 @@ static Bigint *Balloc(int32 k)
+ }
+ rv->sign = rv->wds = 0;
+ return rv;
+ }
+
+ static void Bfree(Bigint *v)
+ {
+ if (v) {
+- v->next = freelist[v->k];
+- freelist[v->k] = v;
++ if (v->k > Kmax)
++#ifdef FREE
++ FREE((void*)v);
++#else
++ free((void*)v);
++#endif
++ else {
++ v->next = freelist[v->k];
++ freelist[v->k] = v;
++ }
+ }
+ }
+
+ #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
+ y->wds*sizeof(Long) + 2*sizeof(int32))
+
+ /* Return b*m + a. Deallocate the old b. Both a and m must be between 0 and
+ * 65535 inclusive. NOTE: old b is deallocated on memory failure.
+--- misc/mozilla/js/src/jsdtoa.c 22 Sep 2009 06:16:27 -0000 3.42
++++ misc/build/mozilla/js/src/jsdtoa.c 15 Oct 2009 10:34:38 -0000
+@@ -405,19 +405,19 @@ static Bigint *Balloc(int32 k)
+
+ #ifdef ENABLE_OOM_TESTING
+ if (++allocationNum == desiredFailure) {
+ printf("Forced Failing Allocation number %d\n", allocationNum);
+ return NULL;
+ }
+ #endif
+
+- if (k <= Kmax && (rv = freelist[k]) != NULL)
++ if (k <= Kmax && (rv = freelist[k]))
+ freelist[k] = rv->next;
+- if (rv == NULL) {
++ else {
+ x = 1 << k;
+ #ifdef Omit_Private_Memory
+ rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
+ #else
+ len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
+ /sizeof(double);
+ if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
+ rv = (Bigint*)pmem_next;
diff --git a/moz/patches/embed_manifest.patch b/moz/patches/embed_manifest.patch
new file mode 100755
index 000000000000..3b0e80b3ab81
--- /dev/null
+++ b/moz/patches/embed_manifest.patch
@@ -0,0 +1,142 @@
+--- mozilla.pure/configure 2008-06-16 00:25:31.000000000 +0200
++++ mozilla/configure 2008-11-09 23:59:19.984375000 +0100
+@@ -1068,6 +1068,8 @@
+ GCONF_VERSION=1.2.1
+ LIBGNOME_VERSION=2.0
+
++MSMANIFEST_TOOL=
++
+ MISSING_X=
+ for ac_prog in gawk mawk nawk awk
+ do
+@@ -3025,6 +3027,22 @@
+ else
+ { echo "configure: error: This version of the MSVC compiler, $CC_VERSION , is unsupported." 1>&2; exit 1; }
+ fi
++
++ # bug #249782
++ # ensure that mt.exe is Microsoft (R) Manifest Tool and not magnetic tape manipulation utility (or something else)
++ if test "$_CC_SUITE" -ge "8"; then
++ MSMT_TOOL=`mt 2>&1|grep 'Microsoft (R) Manifest Tool'`
++ if test -n "MSMT_TOOL"; then
++ MSMANIFEST_TOOL_VERSION=`echo ${MSMANIFEST_TOOL}|grep -Po "(^|\s)[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?(\s|$)"`
++ if test -z "MSMANIFEST_TOOL_VERSION"; then
++ echo "configure: warning: Unknown version of the Microsoft (R) Manifest Tool." 1>&2
++ fi
++ MSMANIFEST_TOOL=1
++ unset MSMT_TOOL
++ else
++ { echo "Microsoft (R) Manifest Tool must be in your \$PATH." 1>&2; exit 1; }
++ fi
++ fi
+
+ # Check linker version
+ _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
+--- mozilla.pure/configure.in 2008-06-16 00:25:32.000000000 +0200
++++ mozilla/configure.in 2008-11-09 23:59:20.000000000 +0100
+@@ -126,6 +126,8 @@
+ GCONF_VERSION=1.2.1
+ LIBGNOME_VERSION=2.0
+
++MSMANIFEST_TOOL=
++
+ dnl Set various checks
+ dnl ========================================================
+ MISSING_X=
+@@ -428,6 +430,22 @@
+ else
+ AC_MSG_ERROR([This version of the MSVC compiler, $CC_VERSION , is unsupported.])
+ fi
++
++ # bug #249782
++ # ensure that mt.exe is Microsoft (R) Manifest Tool and not magnetic tape manipulation utility (or something else)
++ if test "$_CC_SUITE" -ge "8"; then
++ MSMT_TOOL=`mt 2>&1|grep 'Microsoft (R) Manifest Tool'`
++ if test -n "MSMT_TOOL"; then
++ MSMANIFEST_TOOL_VERSION=`echo ${MSMANIFEST_TOOL}|grep -Po "(^|\s)[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?(\s|$)"`
++ if test -z "MSMANIFEST_TOOL_VERSION"; then
++ AC_MSG_WARN([Unknown version of the Microsoft (R) Manifest Tool.])
++ fi
++ MSMANIFEST_TOOL=1
++ unset MSMT_TOOL
++ else
++ AC_MSG_ERROR([Microsoft (R) Manifest Tool must be in your \$PATH.])
++ fi
++ fi
+
+ # Check linker version
+ _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"`
+@@ -7319,6 +7339,7 @@
+ AC_SUBST(USE_N32)
+ AC_SUBST(CC_VERSION)
+ AC_SUBST(CXX_VERSION)
++AC_SUBST(MSMANIFEST_TOOL)
+
+ if test "$USING_HCC"; then
+ CC='${topsrcdir}/build/hcc'
+--- mozilla.pure/config/rules.mk 2008-01-29 20:30:22.000000000 +0100
++++ mozilla/config/rules.mk 2008-11-09 23:59:19.968750000 +0100
+@@ -811,6 +812,12 @@
+
+ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+ $(LD) -NOLOGO -OUT:$@ -PDB:$(PDBFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(PROGOBJS) $(RESFILE) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
++ifdef MSMANIFEST_TOOL
++ @if test -f $@.manifest; then \
++ mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
++ rm -f $@.manifest; \
++ fi
++endif # MSVC with manifest tool
+ else
+ ifeq ($(CPP_PROG_LINK),1)
+ $(CCC) -o $@ $(CXXFLAGS) $(WRAP_MALLOC_CFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(BIN_FLAGS) $(WRAP_MALLOC_LIB) $(PROFILER_LIBS) $(EXE_DEF_FILE)
+@@ -843,6 +850,12 @@
+ else
+ ifeq (_WINNT,$(GNU_CC)_$(HOST_OS_ARCH))
+ $(HOST_LD) -NOLOGO -OUT:$@ -PDB:$(PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
++ifdef MSMANIFEST_TOOL
++ @if test -f $@.manifest; then \
++ mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
++ rm -f $@.manifest; \
++ fi
++endif # MSVC with manifest tool
+ else
+ $(HOST_CC) -o $@ $(HOST_CFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+ endif
+@@ -866,6 +879,12 @@
+ else
+ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+ $(LD) -nologo -out:$@ -pdb:$(PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
++ifdef MSMANIFEST_TOOL
++ @if test -f $@.manifest; then \
++ mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
++ rm -f $@.manifest; \
++ fi
++endif # MSVC with manifest tool
+ else
+ ifeq ($(CPP_PROG_LINK),1)
+ $(CCC) $(WRAP_MALLOC_CFLAGS) $(CXXFLAGS) -o $@ $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(WRAP_MALLOC_LIB) $(PROFILER_LIBS) $(BIN_FLAGS)
+@@ -1019,6 +1038,14 @@
+ endif # SHARED_LIBRARY_LIBS
+ endif # NO_LD_ARCHIVE_FLAGS
+ $(MKSHLIB) $(SHLIB_LDSTARTFILE) $(OBJS) $(LOBJS) $(SUB_SHLOBJS) $(RESFILE) $(LDFLAGS) $(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) $(DEF_FILE) $(SHLIB_LDENDFILE)
++ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
++ifdef MSMANIFEST_TOOL
++ @if test -f $@.manifest; then \
++ mt.exe -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;2; \
++ rm -f $@.manifest; \
++ fi
++endif # MSVC with manifest tool
++endif # WINNT && !GCC
+ @rm -f foodummyfilefoo $(SUB_SHLOBJS) $(DELETE_AFTER_LINK)
+ else # os2 vacpp
+ $(MKSHLIB) -O:$@ -DLL -INC:_dllentry $(LDFLAGS) $(OBJS) $(LOBJS) $(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) $(DEF_FILE)
+--- mozilla.pure/config/autoconf.mk.in 2006-09-14 20:07:03.000000000 +0200
++++ mozilla/config/autoconf.mk.in 2008-11-09 23:59:19.953125000 +0100
+@@ -543,6 +543,7 @@
+ MOZ_TOOLS_DIR = @MOZ_TOOLS_DIR@
+ MOZ_DEBUG_SYMBOLS = @MOZ_DEBUG_SYMBOLS@
+ MOZ_QUANTIFY = @MOZ_QUANTIFY@
++MSMANIFEST_TOOL = @MSMANIFEST_TOOL@
+
+ #python options
+ PYTHON = @MOZ_PYTHON@
diff --git a/moz/patches/index.txt b/moz/patches/index.txt
new file mode 100644
index 000000000000..fd27f442a05c
--- /dev/null
+++ b/moz/patches/index.txt
@@ -0,0 +1,65 @@
+====================================================================================
+File name
+---------
+ embed_manifest.patch
+
+Description
+-----------
+ When building Mozilla with MSVC2005, generated libraries and applications
+ require the manifest file (name.dll.manifest) to reside beside the file
+ itself, or to be embedded.
+
+ The patch does the latter: embedding the manifest file into the
+ library/application itself, using the Manifest Tool from the Platform SDK
+ resp. MSVC installation.
+
+ The patch is effectively the patch as was committed to the Mozilla trunk,
+ taken from here: https://bugzilla.mozilla.org/show_bug.cgi?id=249782#c81.
+
+====================================================================================
+File name
+---------
+ wchart_on_msvc8.patch
+
+Description
+-----------
+ For compiling with MSVC2005: See https://bugzilla.mozilla.org/show_bug.cgi?id=324842.
+
+====================================================================================
+File name
+---------
+ cygwin_paths_in_ldap_sdk.patch
+
+Description
+-----------
+ make 1.81, as currently part of cygwin, does not support Windows paths anymore.
+ So, targets, and target dependencies, in makefile may need to be converted to cygwin
+ notation. This patch does this for directory/c-sdk/ldap/include, other occurances are
+ not known, yet.
+
+====================================================================================
+File name
+---------
+ no_core_abspath_in_nss.patch
+
+Description
+-----------
+ On various platforms, building security/nss/cmd/shlibsign fails. In all cases, the
+ error messages indicate the core_abspath macro used in the Makefile is not resolved
+ properly.
+ This patch replaces the usage of core_abspath with platform-specific constructs.
+
+====================================================================================
+File name
+---------
+ consecutive_ldap_queries.patch
+
+Description
+-----------
+ Consecutive LDAP address book queries (using the same instance of nsAbLDAPDirectoryQuery,
+ but different parameters to the DoQuery method) do not work in OOo. The reason is that
+ the second call to DoQuery ignores most of its arguments, including the listener which
+ is to be notified about the query results, and re-uses the arguments from the first
+ call.
+ The patch changes the DoQuery behavior to respect the arguments of the second call.
+
diff --git a/moz/patches/link_fontconfig.patch b/moz/patches/link_fontconfig.patch
new file mode 100644
index 000000000000..66e82fa63e52
--- /dev/null
+++ b/moz/patches/link_fontconfig.patch
@@ -0,0 +1,11 @@
+--- misc/mozilla/gfx/src/gtk/Makefile.in 2010-03-16 14:44:44.000000000 +0000
++++ misc/build/mozilla/gfx/src/gtk/Makefile.in 2010-03-16 14:45:08.000000000 +0000
+@@ -183,7 +183,7 @@
+ endif
+
+ ifdef MOZ_ENABLE_XFT
+-EXTRA_DSO_LDOPTS += $(FT2_LIBS)
++EXTRA_DSO_LDOPTS += $(FT2_LIBS) -lfontconfig
+
+ libs:: fontEncoding.properties pangoFontEncoding.properties
+ $(INSTALL) $^ $(DIST)/bin/res/fonts
diff --git a/moz/patches/no_core_abspath_in_nss.patch b/moz/patches/no_core_abspath_in_nss.patch
new file mode 100644
index 000000000000..026cc7e3eb92
--- /dev/null
+++ b/moz/patches/no_core_abspath_in_nss.patch
@@ -0,0 +1,52 @@
+--- mozilla.pure/security/nss/cmd/shlibsign/Makefile 2007-02-16 03:16:24.000000000 +0100
++++ mozilla/security/nss/cmd/shlibsign/Makefile 2008-11-05 14:04:54.798875000 +0100
+@@ -86,18 +86,47 @@
+
+ include ../platrules.mk
+
+-SRCDIR = $(call core_abspath,.)
+-
++ifeq ($(OS_TARGET), Darwin)
++ SRCDIR = .
++else
++ifeq ($(OS_TARGET), Linux)
++ SRCDIR = .
++else
++ifeq ($(OS_TARGET), WIN95)
++ SRCDIR = $(shell cygpath -d $(SRCDIR))
++else
++ SRCDIR = $(call core_abspath,.)
++endif
++endif
++endif
+ %.chk: %.$(DLL_SUFFIX)
+ ifeq ($(OS_TARGET), OS2)
+ cd $(OBJDIR) ; cmd.exe /c $(SRCDIR)/sign.cmd $(DIST) \
+ $(call core_abspath,$(OBJDIR)) $(OS_TARGET) \
+ $(call core_abspath,$(NSPR_LIB_DIR)) $(call core_abspath,$<)
+ else
++ifeq ($(OS_TARGET), WIN95)
++ sh $(CYGWIN_WRAPPER) ./sign.sh $(shell cygpath -d -a $(DIST)) \
++ $(shell cygpath -d -a $(OBJDIR)) $(OS_TARGET) \
++ $(shell cygpath -d -a $(NSPR_LIB_DIR)) $(shell cygpath -d -a $<)
++else
++ifeq ($(OS_TARGET), Darwin)
++ cd $(SRCDIR) ; sh ./sign.sh $(DIST) \
++ $(OBJDIR) $(OS_TARGET) \
++ $(NSPR_LIB_DIR) $<
++else
++ifeq ($(OS_TARGET), Linux)
++ cd $(SRCDIR) ; sh ./sign.sh $(DIST) \
++ $(OBJDIR) $(OS_TARGET) \
++ $(NSPR_LIB_DIR) $<
++else
+ cd $(OBJDIR) ; sh $(SRCDIR)/sign.sh $(call core_abspath,$(DIST)) \
+ $(call core_abspath,$(OBJDIR)) $(OS_TARGET) \
+ $(call core_abspath,$(NSPR_LIB_DIR)) $(call core_abspath,$<)
+ endif
++endif
++endif
++endif
+
+ libs install :: $(CHECKLOC)
+
diff --git a/moz/patches/respect_disable_pango.patch b/moz/patches/respect_disable_pango.patch
new file mode 100644
index 000000000000..07a83e9dd40a
--- /dev/null
+++ b/moz/patches/respect_disable_pango.patch
@@ -0,0 +1,54 @@
+--- misc/mozilla/gfx/src/gtk/nsDeviceContextGTK.cpp 2006-02-28 15:55:35.000000000 +0100
++++ misc/build/mozilla/gfx/src/gtk/nsDeviceContextGTK.cpp 2009-11-13 15:12:24.000000000 +0100
+@@ -66,10 +66,12 @@
+ #endif /* MOZ_WIDGET_GTK */
+
+ #ifdef MOZ_WIDGET_GTK2
++#ifdef MOZ_ENABLE_PANGO
+ #include <pango/pango.h>
+ #include <pango/pangox.h>
+ #include <pango/pango-fontmap.h>
+ #endif
++#endif
+
+ #ifdef MOZ_ENABLE_XFT
+ #include "nsFontMetricsUtils.h"
+@@ -963,9 +965,11 @@
+ #ifdef MOZ_WIDGET_GTK2
+
+ #ifdef MOZ_ENABLE_COREXFONTS
++#ifdef MOZ_ENABLE_PANGO
+ static void xlfd_from_pango_font_description(GtkWidget *aWidget,
+ const PangoFontDescription *aFontDesc,
+ nsString& aFontName);
++#endif
+ #endif /* MOZ_ENABLE_COREXFONTS */
+
+ nsresult
+@@ -997,10 +1001,12 @@
+ #endif /* MOZ_ENABLE_XFT */
+
+ #ifdef MOZ_ENABLE_COREXFONTS
++#ifdef MOZ_ENABLE_PANGO
+ // if name already set by Xft, do nothing
+ if (!aFont->name.Length()) {
+ xlfd_from_pango_font_description(aWidget, desc, aFont->name);
+ }
++#endif /* MOZ_ENABLE_PANGO */
+ #endif /* MOZ_ENABLE_COREXFONTS */
+ aFont->weight = pango_font_description_get_weight(desc);
+
+@@ -1104,6 +1110,7 @@
+ #endif /* MOZ_ENABLE_XFT */
+
+ #if defined(MOZ_WIDGET_GTK2) && defined(MOZ_ENABLE_COREXFONTS)
++#ifdef MOZ_ENABLE_PANGO
+ // xlfd_from_pango_font_description copied from vte, which was
+ // written by nalin@redhat.com, and added some codes.
+ static void
+@@ -1226,4 +1233,5 @@
+ g_free(spec);
+ g_object_unref(font);
+ }
++#endif
+ #endif /* MOZ_WIDGET_GTK2 && MOZ_ENABLE_COREXFONTS */
diff --git a/moz/patches/wchart_on_msvc8.patch b/moz/patches/wchart_on_msvc8.patch
new file mode 100644
index 000000000000..a8f31cd4c3e3
--- /dev/null
+++ b/moz/patches/wchart_on_msvc8.patch
@@ -0,0 +1,20 @@
+--- mozilla.pure/configure.in 2008-06-16 00:25:32.000000000 +0200
++++ mozilla/configure.in 2008-11-10 16:15:36.859375000 +0100
+@@ -425,6 +425,7 @@
+ _CC_SUITE=7
+ elif test "$_CC_MAJOR_VERSION" = "14"; then
+ _CC_SUITE=8
++ CXXFLAGS="$CXXFLAGS -Zc:wchar_t-"
+ else
+ AC_MSG_ERROR([This version of the MSVC compiler, $CC_VERSION , is unsupported.])
+ fi
+--- mozilla.pure/configure 2008-06-16 00:25:31.000000000 +0200
++++ mozilla/configure 2008-11-10 16:15:30.437500000 +0100
+@@ -3022,6 +3022,7 @@
+ _CC_SUITE=7
+ elif test "$_CC_MAJOR_VERSION" = "14"; then
+ _CC_SUITE=8
++ CXXFLAGS="$CXXFLAGS -Zc:wchar_t-"
+ else
+ { echo "configure: error: This version of the MSVC compiler, $CC_VERSION , is unsupported." 1>&2; exit 1; }
+ fi
diff --git a/moz/prj/build.lst b/moz/prj/build.lst
new file mode 100644
index 000000000000..717c309da96e
--- /dev/null
+++ b/moz/prj/build.lst
@@ -0,0 +1,4 @@
+moz moz : solenv SO:so_prereq NSS:nss NULL
+moz moz usr1 - all moz_mkout NULL
+moz moz nmake - all moz_mozilla NULL
+moz moz\zipped nmake - all moz_zipped moz_mozilla NULL
diff --git a/moz/prj/d.lst b/moz/prj/d.lst
new file mode 100644
index 000000000000..dda8503f5f9d
--- /dev/null
+++ b/moz/prj/d.lst
@@ -0,0 +1,240 @@
+mkdir: %_DEST%\inc%_EXT%\mozilla
+mkdir: %COMMON_DEST%\inc%_EXT%\mozilla
+mkdir: %_DEST%\inc%_EXT%\mozilla\absync
+mkdir: %_DEST%\inc%_EXT%\mozilla\accessibility
+mkdir: %_DEST%\inc%_EXT%\mozilla\AcctIdl
+mkdir: %_DEST%\inc%_EXT%\mozilla\addrbook
+mkdir: %_DEST%\inc%_EXT%\mozilla\appcomps
+mkdir: %_DEST%\inc%_EXT%\mozilla\appshell
+mkdir: %_DEST%\inc%_EXT%\mozilla\appstartup
+mkdir: %_DEST%\inc%_EXT%\mozilla\bookmarks
+mkdir: %_DEST%\inc%_EXT%\mozilla\caps
+mkdir: %_DEST%\inc%_EXT%\mozilla\chardet
+mkdir: %_DEST%\inc%_EXT%\mozilla\chrome
+mkdir: %_DEST%\inc%_EXT%\mozilla\content
+mkdir: %_DEST%\inc%_EXT%\mozilla\content_xsl
+mkdir: %_DEST%\inc%_EXT%\mozilla\content_xul
+mkdir: %_DEST%\inc%_EXT%\mozilla\cookie
+mkdir: %_DEST%\inc%_EXT%\mozilla\docshell
+mkdir: %_DEST%\inc%_EXT%\mozilla\dom
+mkdir: %_DEST%\inc%_EXT%\mozilla\editor
+mkdir: %_DEST%\inc%_EXT%\mozilla\embed_base
+mkdir: %_DEST%\inc%_EXT%\mozilla\expat
+mkdir: %_DEST%\inc%_EXT%\mozilla\exthandler
+mkdir: %_DEST%\inc%_EXT%\mozilla\find
+mkdir: %_DEST%\inc%_EXT%\mozilla\gfx
+mkdir: %_DEST%\inc%_EXT%\mozilla\gfx2
+mkdir: %_DEST%\inc%_EXT%\mozilla\gfxwin
+mkdir: %_DEST%\inc%_EXT%\mozilla\gkplugin
+mkdir: %_DEST%\inc%_EXT%\mozilla\helperAppDlg
+mkdir: %_DEST%\inc%_EXT%\mozilla\history
+mkdir: %_DEST%\inc%_EXT%\mozilla\htmlparser
+mkdir: %_DEST%\inc%_EXT%\mozilla\imgicon
+mkdir: %_DEST%\inc%_EXT%\mozilla\imglib2
+mkdir: %_DEST%\inc%_EXT%\mozilla\import
+mkdir: %_DEST%\inc%_EXT%\mozilla\intl
+mkdir: %_DEST%\inc%_EXT%\mozilla\intlcmpt
+mkdir: %_DEST%\inc%_EXT%\mozilla\jar
+mkdir: %_DEST%\inc%_EXT%\mozilla\java
+mkdir: %_DEST%\inc%_EXT%\mozilla\jpeg
+mkdir: %_DEST%\inc%_EXT%\mozilla\js
+mkdir: %_DEST%\inc%_EXT%\mozilla\jsconsole
+mkdir: %_DEST%\inc%_EXT%\mozilla\jsurl
+mkdir: %_DEST%\inc%_EXT%\mozilla\layout
+mkdir: %_DEST%\inc%_EXT%\mozilla\layout_xul
+mkdir: %_DEST%\inc%_EXT%\mozilla\ldap
+mkdir: %_DEST%\inc%_EXT%\mozilla\ldap\ldap
+mkdir: %_DEST%\inc%_EXT%\mozilla\ldap-nspr
+mkdir: %_DEST%\inc%_EXT%\mozilla\locale
+mkdir: %_DEST%\inc%_EXT%\mozilla\lwbrk
+mkdir: %_DEST%\inc%_EXT%\mozilla\mailnews
+mkdir: %_DEST%\inc%_EXT%\mozilla\mime
+mkdir: %_DEST%\inc%_EXT%\mozilla\mimeemitter
+mkdir: %_DEST%\inc%_EXT%\mozilla\mimetype
+mkdir: %_DEST%\inc%_EXT%\mozilla\mng
+mkdir: %_DEST%\inc%_EXT%\mozilla\mork
+mkdir: %_DEST%\inc%_EXT%\mozilla\mozbrwsr
+mkdir: %_DEST%\inc%_EXT%\mozilla\mozldap
+mkdir: %_DEST%\inc%_EXT%\mozilla\mozreg
+mkdir: %_DEST%\inc%_EXT%\mozilla\mpfilelocprovider
+mkdir: %_DEST%\inc%_EXT%\mozilla\msgbase
+mkdir: %_DEST%\inc%_EXT%\mozilla\msgbaseutil
+mkdir: %_DEST%\inc%_EXT%\mozilla\msgcompo
+mkdir: %_DEST%\inc%_EXT%\mozilla\msgdb
+mkdir: %_DEST%\inc%_EXT%\mozilla\msgimap
+mkdir: %_DEST%\inc%_EXT%\mozilla\msglocal
+mkdir: %_DEST%\inc%_EXT%\mozilla\msgnews
+mkdir: %_DEST%\inc%_EXT%\mozilla\msgsearch
+mkdir: %_DEST%\inc%_EXT%\mozilla\necko
+mkdir: %_DEST%\inc%_EXT%\mozilla\necko2
+mkdir: %_DEST%\inc%_EXT%\mozilla\nkcache
+mkdir: %_DEST%\inc%_EXT%\mozilla\nspr
+mkdir: %_DEST%\inc%_EXT%\mozilla\nspr\obsolete
+mkdir: %_DEST%\inc%_EXT%\mozilla\nspr\private
+mkdir: %_DEST%\inc%_EXT%\mozilla\nsprefm
+mkdir: %_DEST%\inc%_EXT%\mozilla\nss
+mkdir: %_DEST%\inc%_EXT%\mozilla\oji
+mkdir: %_DEST%\inc%_EXT%\mozilla\obsolete
+mkdir: %_DEST%\inc%_EXT%\mozilla\plugin
+mkdir: %_DEST%\inc%_EXT%\mozilla\png
+mkdir: %_DEST%\inc%_EXT%\mozilla\pref
+mkdir: %_DEST%\inc%_EXT%\mozilla\prefmigr
+mkdir: %_DEST%\inc%_EXT%\mozilla\profile
+mkdir: %_DEST%\inc%_EXT%\mozilla\rdf
+mkdir: %_DEST%\inc%_EXT%\mozilla\rdfutil
+mkdir: %_DEST%\inc%_EXT%\mozilla\regviewer
+mkdir: %_DEST%\inc%_EXT%\mozilla\related
+mkdir: %_DEST%\inc%_EXT%\mozilla\search
+mkdir: %_DEST%\inc%_EXT%\mozilla\setuprsc
+mkdir: %_DEST%\inc%_EXT%\mozilla\shistory
+mkdir: %_DEST%\inc%_EXT%\mozilla\sidebar
+mkdir: %_DEST%\inc%_EXT%\mozilla\signonviewer
+mkdir: %_DEST%\inc%_EXT%\mozilla\string
+mkdir: %_DEST%\inc%_EXT%\mozilla\timer
+mkdir: %_DEST%\inc%_EXT%\mozilla\transformiix
+mkdir: %_DEST%\inc%_EXT%\mozilla\txmgr
+mkdir: %_DEST%\inc%_EXT%\mozilla\txtsvc
+mkdir: %_DEST%\inc%_EXT%\mozilla\uconv
+mkdir: %_DEST%\inc%_EXT%\mozilla\unicharutil
+mkdir: %_DEST%\inc%_EXT%\mozilla\uninstall
+mkdir: %_DEST%\inc%_EXT%\mozilla\uriloader
+mkdir: %_DEST%\inc%_EXT%\mozilla\urlbarhistory
+mkdir: %_DEST%\inc%_EXT%\mozilla\util
+mkdir: %_DEST%\inc%_EXT%\mozilla\view
+mkdir: %_DEST%\inc%_EXT%\mozilla\wallet
+mkdir: %_DEST%\inc%_EXT%\mozilla\walleteditor
+mkdir: %_DEST%\inc%_EXT%\mozilla\walletpreview
+mkdir: %_DEST%\inc%_EXT%\mozilla\webBrowser_core
+mkdir: %_DEST%\inc%_EXT%\mozilla\webshell
+mkdir: %_DEST%\inc%_EXT%\mozilla\widget
+mkdir: %_DEST%\inc%_EXT%\mozilla\windowwatcher
+mkdir: %_DEST%\inc%_EXT%\mozilla\xml-rpc
+mkdir: %_DEST%\inc%_EXT%\mozilla\xmlextras
+mkdir: %_DEST%\inc%_EXT%\mozilla\xpcom
+mkdir: %_DEST%\inc%_EXT%\mozilla\xpconnect
+mkdir: %_DEST%\inc%_EXT%\mozilla\xpicleanup
+mkdir: %_DEST%\inc%_EXT%\mozilla\xpinstall
+mkdir: %_DEST%\inc%_EXT%\mozilla\xpnet
+mkdir: %_DEST%\inc%_EXT%\mozilla\zlib
+mkdir: %_DEST%\inc%_EXT%\mozilla\xpcom_obsolete
+
+..\%__SRC%\inc\*.h %_DEST%\inc%_EXT%\mozilla
+..\%__SRC%\inc\absync\* %_DEST%\inc%_EXT%\mozilla\absync
+..\%__SRC%\inc\accessibility\* %_DEST%\inc%_EXT%\mozilla\accessibility
+..\%__SRC%\inc\AcctIdl\* %_DEST%\inc%_EXT%\mozilla\AcctIdl
+..\%__SRC%\inc\addrbook\* %_DEST%\inc%_EXT%\mozilla\addrbook
+..\%__SRC%\inc\appcomps\* %_DEST%\inc%_EXT%\mozilla\appcomps
+..\%__SRC%\inc\appshell\* %_DEST%\inc%_EXT%\mozilla\appshell
+..\%__SRC%\inc\appstartup\* %_DEST%\inc%_EXT%\mozilla\appstartup
+..\%__SRC%\inc\bookmarks\* %_DEST%\inc%_EXT%\mozilla\bookmarks
+..\%__SRC%\inc\caps\* %_DEST%\inc%_EXT%\mozilla\caps
+..\%__SRC%\inc\chardet\* %_DEST%\inc%_EXT%\mozilla\chardet
+..\%__SRC%\inc\chrome\* %_DEST%\inc%_EXT%\mozilla\chrome
+..\%__SRC%\inc\content\* %_DEST%\inc%_EXT%\mozilla\content
+..\%__SRC%\inc\content_xsl\* %_DEST%\inc%_EXT%\mozilla\content_xsl
+..\%__SRC%\inc\content_xul\* %_DEST%\inc%_EXT%\mozilla\content_xul
+..\%__SRC%\inc\cookie\* %_DEST%\inc%_EXT%\mozilla\cookie
+..\%__SRC%\inc\docshell\* %_DEST%\inc%_EXT%\mozilla\docshell
+..\%__SRC%\inc\dom\* %_DEST%\inc%_EXT%\mozilla\dom
+..\%__SRC%\inc\editor\* %_DEST%\inc%_EXT%\mozilla\editor
+..\%__SRC%\inc\embed_base\* %_DEST%\inc%_EXT%\mozilla\embed_base
+..\%__SRC%\inc\expat\* %_DEST%\inc%_EXT%\mozilla\expat
+..\%__SRC%\inc\exthandler\* %_DEST%\inc%_EXT%\mozilla\exthandler
+..\%__SRC%\inc\find\* %_DEST%\inc%_EXT%\mozilla\find
+..\%__SRC%\inc\gfx\* %_DEST%\inc%_EXT%\mozilla\gfx
+..\%__SRC%\inc\gfx2\* %_DEST%\inc%_EXT%\mozilla\gfx2
+..\%__SRC%\inc\gfxwin\* %_DEST%\inc%_EXT%\mozilla\gfxwin
+..\%__SRC%\inc\gkplugin\* %_DEST%\inc%_EXT%\mozilla\gkplugin
+..\%__SRC%\inc\helperAppDlg\* %_DEST%\inc%_EXT%\mozilla\helperAppDlg
+..\%__SRC%\inc\history\* %_DEST%\inc%_EXT%\mozilla\history
+..\%__SRC%\inc\htmlparser\* %_DEST%\inc%_EXT%\mozilla\htmlparser
+..\%__SRC%\inc\imgicon\* %_DEST%\inc%_EXT%\mozilla\imgicon
+..\%__SRC%\inc\imglib2\* %_DEST%\inc%_EXT%\mozilla\imglib2
+..\%__SRC%\inc\import\* %_DEST%\inc%_EXT%\mozilla\import
+..\%__SRC%\inc\intl\* %_DEST%\inc%_EXT%\mozilla\intl
+..\%__SRC%\inc\intlcmpt\* %_DEST%\inc%_EXT%\mozilla\intlcmpt
+..\%__SRC%\inc\jar\* %_DEST%\inc%_EXT%\mozilla\jar
+..\%__SRC%\inc\java\* %_DEST%\inc%_EXT%\mozilla\java
+..\%__SRC%\inc\jpeg\* %_DEST%\inc%_EXT%\mozilla\jpeg
+..\%__SRC%\inc\js\* %_DEST%\inc%_EXT%\mozilla\js
+..\%__SRC%\inc\jsconsole\* %_DEST%\inc%_EXT%\mozilla\jsconsole
+..\%__SRC%\inc\jsurl\* %_DEST%\inc%_EXT%\mozilla\jsurl
+..\%__SRC%\inc\layout\* %_DEST%\inc%_EXT%\mozilla\layout
+..\%__SRC%\inc\layout_xul\* %_DEST%\inc%_EXT%\mozilla\layout_xul
+..\%__SRC%\inc\ldap\* %_DEST%\inc%_EXT%\mozilla\ldap
+..\%__SRC%\inc\ldap\ldap\* %_DEST%\inc%_EXT%\mozilla\ldap\ldap
+..\%__SRC%\inc\ldap-nspr\* %_DEST%\inc%_EXT%\mozilla\ldap-nspr
+..\%__SRC%\inc\locale\* %_DEST%\inc%_EXT%\mozilla\locale
+..\%__SRC%\inc\lwbrk\* %_DEST%\inc%_EXT%\mozilla\lwbrk
+..\%__SRC%\inc\mailnews\* %_DEST%\inc%_EXT%\mozilla\mailnews
+..\%__SRC%\inc\mime\* %_DEST%\inc%_EXT%\mozilla\mime
+..\%__SRC%\inc\mimeemitter\* %_DEST%\inc%_EXT%\mozilla\mimeemitter
+..\%__SRC%\inc\mimetype\* %_DEST%\inc%_EXT%\mozilla\mimetype
+..\%__SRC%\inc\mng\* %_DEST%\inc%_EXT%\mozilla\mng
+..\%__SRC%\inc\mork\* %_DEST%\inc%_EXT%\mozilla\mork
+..\%__SRC%\inc\mozbrwsr\* %_DEST%\inc%_EXT%\mozilla\mozbrwsr
+..\%__SRC%\inc\mozldap\* %_DEST%\inc%_EXT%\mozilla\mozldap
+..\%__SRC%\inc\mozreg\* %_DEST%\inc%_EXT%\mozilla\mozreg
+..\%__SRC%\inc\mpfilelocprovider\* %_DEST%\inc%_EXT%\mozilla\mpfilelocprovider
+..\%__SRC%\inc\msgbase\* %_DEST%\inc%_EXT%\mozilla\msgbase
+..\%__SRC%\inc\msgbaseutil\* %_DEST%\inc%_EXT%\mozilla\msgbaseutil
+..\%__SRC%\inc\msgcompo\* %_DEST%\inc%_EXT%\mozilla\msgcompo
+..\%__SRC%\inc\msgdb\* %_DEST%\inc%_EXT%\mozilla\msgdb
+..\%__SRC%\inc\msgimap\* %_DEST%\inc%_EXT%\mozilla\msgimap
+..\%__SRC%\inc\msglocal\* %_DEST%\inc%_EXT%\mozilla\msglocal
+..\%__SRC%\inc\msgnews\* %_DEST%\inc%_EXT%\mozilla\msgnews
+..\%__SRC%\inc\msgsearch\* %_DEST%\inc%_EXT%\mozilla\msgsearch
+..\%__SRC%\inc\necko\* %_DEST%\inc%_EXT%\mozilla\necko
+..\%__SRC%\inc\necko2\* %_DEST%\inc%_EXT%\mozilla\necko2
+..\%__SRC%\inc\nkcache\* %_DEST%\inc%_EXT%\mozilla\nkcache
+..\%__SRC%\inc\nspr\* %_DEST%\inc%_EXT%\mozilla\nspr
+..\%__SRC%\inc\nspr\obsolete\* %_DEST%\inc%_EXT%\mozilla\nspr\obsolete
+..\%__SRC%\inc\nspr\private\* %_DEST%\inc%_EXT%\mozilla\nspr\private
+..\%__SRC%\inc\nsprefm\* %_DEST%\inc%_EXT%\mozilla\nsprefm
+..\%__SRC%\inc\nss\* %_DEST%\inc%_EXT%\mozilla\nss
+..\%__SRC%\inc\oji\* %_DEST%\inc%_EXT%\mozilla\oji
+..\%__SRC%\inc\obsolete\* %_DEST%\inc%_EXT%\mozilla\obsolete
+..\%__SRC%\inc\plugin\* %_DEST%\inc%_EXT%\mozilla\plugin
+..\%__SRC%\inc\png\* %_DEST%\inc%_EXT%\mozilla\png
+..\%__SRC%\inc\pref\* %_DEST%\inc%_EXT%\mozilla\pref
+..\%__SRC%\inc\prefmigr\* %_DEST%\inc%_EXT%\mozilla\prefmigr
+..\%__SRC%\inc\profile\* %_DEST%\inc%_EXT%\mozilla\profile
+..\%__SRC%\inc\rdf\* %_DEST%\inc%_EXT%\mozilla\rdf
+..\%__SRC%\inc\rdfutil\* %_DEST%\inc%_EXT%\mozilla\rdfutil
+..\%__SRC%\inc\regviewer\* %_DEST%\inc%_EXT%\mozilla\regviewer
+..\%__SRC%\inc\related\* %_DEST%\inc%_EXT%\mozilla\related
+..\%__SRC%\inc\search\* %_DEST%\inc%_EXT%\mozilla\search
+..\%__SRC%\inc\setuprsc\* %_DEST%\inc%_EXT%\mozilla\setuprsc
+..\%__SRC%\inc\shistory\* %_DEST%\inc%_EXT%\mozilla\shistory
+..\%__SRC%\inc\sidebar\* %_DEST%\inc%_EXT%\mozilla\sidebar
+..\%__SRC%\inc\signonviewer\* %_DEST%\inc%_EXT%\mozilla\signonviewer
+..\%__SRC%\inc\string\* %_DEST%\inc%_EXT%\mozilla\string
+..\%__SRC%\inc\timer\* %_DEST%\inc%_EXT%\mozilla\timer
+..\%__SRC%\inc\transformiix\* %_DEST%\inc%_EXT%\mozilla\transformiix
+..\%__SRC%\inc\txmgr\* %_DEST%\inc%_EXT%\mozilla\txmgr
+..\%__SRC%\inc\txtsvc\* %_DEST%\inc%_EXT%\mozilla\txtsvc
+..\%__SRC%\inc\uconv\* %_DEST%\inc%_EXT%\mozilla\uconv
+..\%__SRC%\inc\unicharutil\* %_DEST%\inc%_EXT%\mozilla\unicharutil
+..\%__SRC%\inc\uninstall\* %_DEST%\inc%_EXT%\mozilla\uninstall
+..\%__SRC%\inc\uriloader\* %_DEST%\inc%_EXT%\mozilla\uriloader
+..\%__SRC%\inc\urlbarhistory\* %_DEST%\inc%_EXT%\mozilla\urlbarhistory
+..\%__SRC%\inc\util\* %_DEST%\inc%_EXT%\mozilla\util
+..\%__SRC%\inc\view\* %_DEST%\inc%_EXT%\mozilla\view
+..\%__SRC%\inc\wallet\* %_DEST%\inc%_EXT%\mozilla\wallet
+..\%__SRC%\inc\walleteditor\* %_DEST%\inc%_EXT%\mozilla\walleteditor
+..\%__SRC%\inc\walletpreview\* %_DEST%\inc%_EXT%\mozilla\walletpreview
+..\%__SRC%\inc\webBrowser_core\* %_DEST%\inc%_EXT%\mozilla\webBrowser_core
+..\%__SRC%\inc\webshell\* %_DEST%\inc%_EXT%\mozilla\webshell
+..\%__SRC%\inc\widget\* %_DEST%\inc%_EXT%\mozilla\widget
+..\%__SRC%\inc\windowwatcher\* %_DEST%\inc%_EXT%\mozilla\windowwatcher
+..\%__SRC%\inc\xml-rpc\* %_DEST%\inc%_EXT%\mozilla\xml-rpc
+..\%__SRC%\inc\xmlextras\* %_DEST%\inc%_EXT%\mozilla\xmlextras
+..\%__SRC%\inc\xpcom\* %_DEST%\inc%_EXT%\mozilla\xpcom
+..\%__SRC%\inc\xpconnect\* %_DEST%\inc%_EXT%\mozilla\xpconnect
+..\%__SRC%\inc\xpicleanup\* %_DEST%\inc%_EXT%\mozilla\xpicleanup
+..\%__SRC%\inc\xpinstall\* %_DEST%\inc%_EXT%\mozilla\xpinstall
+..\%__SRC%\inc\xpnet\* %_DEST%\inc%_EXT%\mozilla\xpnet
+..\%__SRC%\inc\zlib\* %_DEST%\inc%_EXT%\mozilla\zlib
+..\%__SRC%\inc\xpcom_obsolete\* %_DEST%\inc%_EXT%\mozilla\xpcom_obsolete
+..\%__SRC%\lib\* %_DEST%\lib%_EXT%
+..\%__SRC%\bin\*.zip %_DEST%\bin%_EXT%
diff --git a/moz/seamonkey-source-1.1.14.patch b/moz/seamonkey-source-1.1.14.patch
new file mode 100644
index 000000000000..3aabbe1a5f44
--- /dev/null
+++ b/moz/seamonkey-source-1.1.14.patch
@@ -0,0 +1,6346 @@
+--- 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
+@@ -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
diff --git a/moz/zipped/makefile.mk b/moz/zipped/makefile.mk
new file mode 100644
index 000000000000..0ea80c02dc3e
--- /dev/null
+++ b/moz/zipped/makefile.mk
@@ -0,0 +1,213 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=moz
+TARGET=moz_unzip
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+
+.IF "$(PREBUILD_MOZAB)" == "" || "$(SYSTEM_MOZILLA)" == "YES" || "$(WITH_MOZILLA)" == "NO"
+
+dummy:
+ @echo "No need to unpack the prebuilt mozab packages"
+
+.ELSE # unpack mozab zips
+.INCLUDE : target.mk
+
+.IF "$(BUILD_MOZAB)"=="TRUE"
+ALLTAR:
+ @echo "Does not need build mozab zipped!"
+.ELSE
+ALLTAR: \
+ $(MISC)$/unpacked_$(TARGET)_inc \
+ $(MISC)$/unpacked_$(TARGET)_lib \
+ $(BIN)$/mozruntime.zip \
+ $(MISC)$/replace_old_nss_libs
+.ENDIF
+.IF "$(GUI)" == "UNX"
+
+$(MISC)$/unpacked_%_lib : $(OS)$(COM)$(CPU)lib.zip '$(OS)$(COM)$(CPU)runtime.zip'
+ unzip -o -d $(LB) $(OS)$(COM)$(CPU)lib.zip && unzip -o -d $(LB) $(OS)$(COM)$(CPU)runtime.zip && $(TOUCH) $@
+ chmod -R 775 $(LB)
+
+$(MISC)$/unpacked_%_inc : $(OS)$(COM)$(CPU)inc.zip
+ unzip -o -d $(INCCOM) $(OS)$(COM)$(CPU)inc.zip && $(TOUCH) $@
+ chmod -R 775 $(INCCOM)
+
+.ELSE
+
+$(MISC)$/unpacked_$(TARGET)_lib : $(OS)$(COM)$(CPU)lib.zip
+ unzip -o -d $(LB) $(OS)$(COM)$(CPU)lib.zip && \
+ $(TOUCH) $@
+
+$(MISC)$/unpacked_$(TARGET)_inc : $(OS)$(COM)$(CPU)inc.zip
+ unzip -o -d $(INCCOM) $(OS)$(COM)$(CPU)inc.zip && $(TOUCH) $@
+
+.ENDIF
+
+$(BIN)$/mozruntime%zip : $(OS)$(COM)$(CPU)runtime.zip
+ $(COPY) $(OS)$(COM)$(CPU)runtime.zip $(BIN)$/mozruntime.zip
+
+# add alternative rules for universal binary moz-zips
+.IF "$(GUIBASE)" == "aqua"
+$(MISC)$/unpacked_%_lib : $(OS)$(COM)UBlib.zip '$(OS)$(COM)UBruntime.zip'
+ unzip -o -d $(LB) $(OS)$(COM)UBlib.zip && unzip -o -d $(LB) $(OS)$(COM)UBruntime.zip && $(TOUCH) $@
+ chmod -R 775 $(LB)
+
+$(MISC)$/unpacked_%_inc : $(OS)$(COM)UBinc.zip
+ unzip -o -d $(INCCOM) $(OS)$(COM)UBinc.zip && $(TOUCH) $@
+ chmod -R 775 $(INCCOM)
+
+$(BIN)$/mozruntime%zip : $(OS)$(COM)UBruntime.zip
+ $(COPY) $(OS)$(COM)UBruntime.zip $(BIN)$/mozruntime.zip
+
+.ENDIF # "$(GUIBASE)"=="aqua"
+
+LIBLIST =
+BIN_RUNTIMELIST =
+NSS_INCLUDE_LIST =
+NSS_MODULE_RUNTIME_LIST =
+.IF "$(ENABLE_NSS_MODULE)"=="YES"
+# The prebuilt moz files include all the old NSS stuff from moz and not the new
+# NSS libs, headers, etc, from the separate nss module. If we use the nss module
+# then we must take care not to deliver the old NSS stuff from the "prebuilts"
+.IF "$(GUI)" == "WNT"
+ FREEBL_LIB_OLD=freebl3
+.ELSE # "$(GUI)" == "WNT"
+ .IF "$(OS)$(CPUNAME)" == "SOLARISSPARC"
+ FREEBL_LIB_OLD=freebl_32fpu_3
+ .ELSE # "$(OS)$(CPUNAME)" == "SOLARISSPARC"
+ FREEBL_LIB_OLD=freebl3
+ .ENDIF # "$(OS)$(CPUNAME)" == "SOLARISSPARC"
+.ENDIF # "$(GUI)" == "WNT"
+
+BIN_RUNTIMELIST= \
+ $(FREEBL_LIB_OLD) \
+ nspr4 \
+ plc4 \
+ plds4 \
+ nss3 \
+ ssl3 \
+ softokn3 \
+ smime3
+
+.IF "$(GUI)"=="WNT"
+.IF "$(COM)"=="GCC"
+LIBLIST= \
+ libnspr4.a \
+ libnss3.a \
+ libsmime3.a \
+ libplc4.a \
+ libplds4.a \
+ libssl3.a
+
+.ELSE
+LIBLIST= \
+ nspr4.lib \
+ plc4.lib \
+ plds4.lib \
+ nss3.lib \
+ ssl3.lib\
+ smime3.lib
+.ENDIF
+.ELSE #"$(GUI)"=="WNT"
+LIBLIST= \
+ lib$(FREEBL_LIB_OLD)$(DLLPOST) \
+ libnspr4$(DLLPOST) \
+ libsoftokn3$(DLLPOST) \
+ libplc4$(DLLPOST) \
+ libplds4$(DLLPOST) \
+ libnss3$(DLLPOST) \
+ libssl3$(DLLPOST) \
+ libsmime3$(DLLPOST)
+
+.ENDIF # .IF "$(GUI)"=="WNT"
+
+
+NSS_INCLUDE_LIST= nspr nss
+
+
+.IF "$(OS)" == "SOLARIS"
+.IF "$(CPU)" == "S" #32bit
+FREEBL=freebl_32fpu_3 freebl_32int64_3 freebl_32int_3
+.ELIF "$(CPU)" == "U" #64bit unxsolu4
+FREEBL=freebl_64int_3 freebl_64fpu_3
+.ELSE
+FREEBL=freebl3
+.ENDIF #"$(CPU)" == "S"
+
+.ELSE # "$(OS)" == "SOLARIS"
+FREEBL=freebl3
+.ENDIF # "$(OS)" == "SOLARIS"
+
+
+#On Linux/Unix sqlite is delivered to $(SOLARLIBDIR)/sqlite/libsqlite3.so
+#See readme.txt in module nss
+NSS_MODULE_RUNTIME_LIST:= \
+ $(FREEBL) \
+ nspr4 \
+ nss3 \
+ nssckbi \
+ nssdbm3 \
+ nssutil3 \
+ plc4 \
+ plds4 \
+ smime3 \
+ softokn3 \
+ sqlite/sqlite3 \
+ ssl3
+
+
+.ENDIF #.IF "$(ENABLE_NSS_MODULE)"=="YES"
+# Remove the nss libs build in moz and those build in the nss module
+$(MISC)$/replace_old_nss_libs : $(MISC)$/unpacked_$(TARGET)_lib \
+$(MISC)$/unpacked_$(TARGET)_inc $(BIN)$/mozruntime.zip
+ +$(foreach,dir,$(NSS_INCLUDE_LIST) $(RENAME:s/+//) $(INCCOM)$/$(dir) \
+ $(INCCOM)$/$(dir)_remove_me &&) echo >& $(NULLDEV)
+ $(foreach,dir,$(NSS_INCLUDE_LIST) rm -r -f $(INCCOM)$/$(dir)_remove_me &&) \
+ echo >& $(NULLDEV)
+ $(foreach,lib,$(LIBLIST) rm -f $(LB)$/$(lib) &&) \
+ echo >& $(NULLDEV)
+ $(foreach,lib,$(BIN_RUNTIMELIST) zip -d $(BIN)$/mozruntime.zip $(DLLPRE)$(lib:f)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+.IF "$(GUI)"=="WNT"
+ +$(foreach,lib,$(NSS_MODULE_RUNTIME_LIST) zip -g -j $(BIN)$/mozruntime.zip $(SOLARBINDIR)$/$(DLLPRE)$(lib:f)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+.ELSE
+ +$(foreach,lib,$(NSS_MODULE_RUNTIME_LIST) zip -g -j $(BIN)$/mozruntime.zip $(SOLARLIBDIR)$/$(lib:d)$(DLLPRE)$(lib:f)$(DLLPOST) &&) \
+ echo >& $(NULLDEV)
+.ENDIF
+ $(TOUCH) $@
+
+.ENDIF # unpack mozab zips
+