diff options
author | Oliver Bolte <obo@openoffice.org> | 2005-07-20 08:49:32 +0000 |
---|---|---|
committer | Oliver Bolte <obo@openoffice.org> | 2005-07-20 08:49:32 +0000 |
commit | a82d3b50fa9c2537befc474fdbf97e1b12c9ddbe (patch) | |
tree | d53c34bc13f11a098324cde706f8af5e6a2b554b /moz | |
parent | 4752b81ae586a9f904cb39ddecff018c3a441bdc (diff) |
INTEGRATION: CWS mhu09 (1.3.2); FILE MERGED
2005/07/14 13:12:12 hjs 1.3.2.2: #i51415# set RUNPATH and some minor tweaks
2005/07/12 13:24:53 mhu 1.3.2.1: #i51415# (a) Do not let the Sun Studio compiler record it's default RUNPATH (/opt/SUNWspro/...) into shared libraries. Use the compilers -norunpath option instead. (b) Always specify a RUNPATH in shared libraries (Linux and Solaris: '6753ORIGIN' always, and '6753ORIGIN/..' for components).
Diffstat (limited to 'moz')
-rw-r--r-- | moz/mozilla-source-1.7.5.patch | 12436 |
1 files changed, 7063 insertions, 5373 deletions
diff --git a/moz/mozilla-source-1.7.5.patch b/moz/mozilla-source-1.7.5.patch index f61e12be7342..2c7edcafd184 100644 --- a/moz/mozilla-source-1.7.5.patch +++ b/moz/mozilla-source-1.7.5.patch @@ -1,5 +1,5 @@ -*** misc/mozilla/build/autoconf/mozconfig-find Fri Jul 16 20:13:24 2004 ---- misc/build/mozilla/build/autoconf/mozconfig-find Sat Jun 4 14:56:18 2005 +*** misc/mozilla/build/autoconf/mozconfig-find 2004-07-16 20:13:24.000000000 +0200 +--- misc/build/mozilla/build/autoconf/mozconfig-find 2005-07-13 17:26:54.000000000 +0200 *************** *** 51,60 **** $topsrcdir/.mozconfig \ @@ -20,5379 +20,7069 @@ do if test -f $_config; then echo $_config; -diff -ru misc/mozilla/gfx/idl/nsIFreeType2.idl misc/build/mozilla/gfx/idl/nsIFreeType2.idl ---- misc/mozilla/gfx/idl/nsIFreeType2.idl 2004-04-15 21:09:33.000000000 -0400 -+++ misc/build/mozilla/gfx/idl/nsIFreeType2.idl 2005-01-09 13:23:32.968750000 -0500 -@@ -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); -diff -ru misc/mozilla/gfx/src/freetype/nsFreeType.cpp misc/build/mozilla/gfx/src/freetype/nsFreeType.cpp ---- misc/mozilla/gfx/src/freetype/nsFreeType.cpp 2004-02-07 10:22:30.000000000 -0500 -+++ misc/build/mozilla/gfx/src/freetype/nsFreeType.cpp 2005-01-09 13:23:33.015625000 -0500 -@@ -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}, -@@ -282,7 +282,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 -@@ -291,11 +291,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; - } - -@@ -320,7 +320,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); -@@ -389,7 +389,7 @@ - } - - NS_IMETHODIMP --nsFreeType2::GetImageCache(FTC_Image_Cache *aCache) -+nsFreeType2::GetImageCache(FTC_ImageCache *aCache) - { - *aCache = mImageCache; - return NS_OK; -diff -ru misc/mozilla/gfx/src/freetype/nsFreeType.h misc/build/mozilla/gfx/src/freetype/nsFreeType.h ---- misc/mozilla/gfx/src/freetype/nsFreeType.h 2004-04-16 17:31:42.000000000 -0400 -+++ misc/build/mozilla/gfx/src/freetype/nsFreeType.h 2005-01-09 13:23:33.015625000 -0500 -@@ -104,13 +104,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) -@@ -165,7 +165,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; -@@ -213,7 +213,7 @@ - PRLibrary *mSharedLib; - FT_Library mFreeTypeLibrary; - FTC_Manager mFTCacheManager; -- FTC_Image_Cache mImageCache; -+ FTC_ImageCache mImageCache; - - static nsHashtable *sFontFamilies; - static nsHashtable *sRange1CharSetNames; -diff -ru misc/mozilla/gfx/src/ps/nsFontMetricsPS.cpp misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.cpp ---- misc/mozilla/gfx/src/ps/nsFontMetricsPS.cpp 2004-02-04 20:57:05.000000000 -0500 -+++ misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.cpp 2005-01-09 13:23:33.031250000 -0500 -@@ -1141,10 +1141,10 @@ +*** misc/mozilla/config/config.mk 2004-10-12 06:13:31.000000000 +0200 +--- misc/build/mozilla/config/config.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 771,776 **** +--- 771,793 ---- + endif + + # ++ # Shared library RUNPATH linker option(s) ++ # ++ ifeq ($(OS_ARCH),Linux) ++ EXTRA_DSO_LDOPTS += -Wl,-rpath,\$$ORIGIN ++ ifdef IS_COMPONENT ++ EXTRA_DSO_LDOPTS += -Wl,-rpath,\$$ORIGIN/.. ++ 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/Makefile.in 2004-11-01 19:30:40.000000000 +0100 +--- misc/build/mozilla/config/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 135,141 **** + + ifdef MOZ_ENABLE_GTK2 + GLIB_CFLAGS = $(MOZ_GTK2_CFLAGS) +! GLIB_LIBS = $(MOZ_GTK2_LIBS) + endif + + build_number: FORCE +--- 135,141 ---- + + ifdef MOZ_ENABLE_GTK2 + GLIB_CFLAGS = $(MOZ_GTK2_CFLAGS) +! GLIB_LIBS = $(filter -lglib% -L%,$(MOZ_GTK2_LIBS)) + endif + + build_number: FORCE +*** misc/mozilla/configure 2004-10-12 06:13:29.000000000 +0200 +--- misc/build/mozilla/configure 2005-07-14 12:53:22.400073064 +0200 +*************** +*** 5895,5901 **** + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_FLAGS) -G -Wl,-z -Wl,muldefs -o $@' + MKSHLIB_FORCE_ALL='-Qoption ld -z,allextract' + MKSHLIB_UNFORCE_ALL='' +! DSO_LDOPTS='-G -Qoption ld -z,muldefs -h $@' + AR_LIST="$AR t" + AR_EXTRACT="$AR x" + AR_DELETE="$AR d" +--- 5895,5901 ---- + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_FLAGS) -G -Wl,-z -Wl,muldefs -o $@' + MKSHLIB_FORCE_ALL='-Qoption ld -z,allextract' + MKSHLIB_UNFORCE_ALL='' +! DSO_LDOPTS='-G -norunpath -Qoption ld -z,muldefs -h $@' + AR_LIST="$AR t" + AR_EXTRACT="$AR x" + AR_DELETE="$AR d" +*** misc/mozilla/configure.in 2004-10-12 06:13:29.000000000 +0200 +--- misc/build/mozilla/configure.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 1536,1542 **** + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_FLAGS) -G -Wl,-z -Wl,muldefs -o $@' + MKSHLIB_FORCE_ALL='-Qoption ld -z,allextract' + MKSHLIB_UNFORCE_ALL='' +! DSO_LDOPTS='-G -Qoption ld -z,muldefs -h $@' + AR_LIST="$AR t" + AR_EXTRACT="$AR x" + AR_DELETE="$AR d" +--- 1536,1542 ---- + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_FLAGS) -G -Wl,-z -Wl,muldefs -o $@' + MKSHLIB_FORCE_ALL='-Qoption ld -z,allextract' + MKSHLIB_UNFORCE_ALL='' +! DSO_LDOPTS='-G -norunpath -Qoption ld -z,muldefs -h $@' + AR_LIST="$AR t" + AR_EXTRACT="$AR x" + AR_DELETE="$AR d" +*** misc/mozilla/directory/c-sdk/config/Makefile 2004-02-11 05:01:16.000000000 +0100 +--- misc/build/mozilla/directory/c-sdk/config/Makefile 2005-07-13 17:27:32.000000000 +0200 +*************** +*** 48,58 **** + + include $(topsrcdir)/config/config.mk + +! CSRCS = nsinstall.c now.c + + PLSRCS = nfspwd.pl + +! ifneq (,$(filter WINNT OS2,$(OS_ARCH))) + PROG_SUFFIX = .exe + else + PROG_SUFFIX = +--- 48,62 ---- + + include $(topsrcdir)/config/config.mk + +! ifndef MOZILLA_CLIENT +! CSRCS = nsinstall.c +! endif +! +! CSRCS += now.c + + PLSRCS = nfspwd.pl + +! ifneq (,$(CROSS_COMPILE)$(filter WINNT OS2,$(OS_ARCH))) + PROG_SUFFIX = .exe + else + PROG_SUFFIX = +*************** +*** 92,100 **** + XLDOPTS += $(LDFLAGS) + endif + +! ifdef XP_OS2_EMX + XCFLAGS = $(OS_EXE_CFLAGS) +! XLDOPTS = -Zlinker /PM:VIO + endif + + ifeq ($(MOZ_OS2_TOOLS),VACPP) +--- 96,104 ---- + XLDOPTS += $(LDFLAGS) + endif + +! ifeq ($(MOZ_OS2_TOOLS),EMX) + XCFLAGS = $(OS_EXE_CFLAGS) +! XLDOPTS = -Zomf -Zlinker /PM:VIO + endif + + ifeq ($(MOZ_OS2_TOOLS),VACPP) +*************** +*** 114,121 **** +--- 118,127 ---- + + OUTOPTION = -o # end of the line + ifeq (,$(filter-out WINNT OS2,$(OS_ARCH))) ++ ifndef NS_USE_GCC + OUTOPTION = /Fe + endif ++ endif + + # Redefine MAKE_OBJDIR for just this directory + define MAKE_OBJDIR +*** misc/mozilla/directory/c-sdk/configure 2004-09-14 23:14:38.000000000 +0200 +--- misc/build/mozilla/directory/c-sdk/configure 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 3832,3837 **** +--- 3832,3838 ---- + MKSHLIB='$(CC) $(DSO_LDOPTS) -o $@' + DSO_CFLAGS=-fPIC + DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)' ++ DSO_LDOPTS="$DSO_LDOPTS -Wl,-rpath,'$\$ORIGIN'" + OS_LIBS="$OS_LIBS -lc" + _OPTIMIZE_FLAGS=-O2 + _DEBUG_FLAGS="-g -fno-inline" # most people on linux use gcc/gdb, and that +*************** +*** 4685,4690 **** +--- 4686,4692 ---- + 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 +*** misc/mozilla/directory/c-sdk/configure.in 2004-09-14 23:14:38.000000000 +0200 +--- misc/build/mozilla/directory/c-sdk/configure.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 1144,1149 **** +--- 1144,1150 ---- + MKSHLIB='$(CC) $(DSO_LDOPTS) -o $@' + DSO_CFLAGS=-fPIC + DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)' ++ DSO_LDOPTS="$DSO_LDOPTS -Wl,-rpath,'$\$ORIGIN'" + OS_LIBS="$OS_LIBS -lc" + _OPTIMIZE_FLAGS=-O2 + _DEBUG_FLAGS="-g -fno-inline" # most people on linux use gcc/gdb, and that +*************** +*** 1686,1691 **** +--- 1687,1693 ---- + 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 +*** misc/mozilla/directory/c-sdk/ldap/libraries/libssldap/Makefile 2004-02-11 05:01:15.000000000 +0100 +--- misc/build/mozilla/directory/c-sdk/ldap/libraries/libssldap/Makefile 2005-07-13 17:27:33.000000000 +0200 +*************** +*** 92,97 **** +--- 92,106 ---- + endif + + ifeq ($(OS_ARCH), WINNT) ++ ifdef NS_USE_GCC ++ EXTRA_DLL_LIBS = -L$(dist_libdir) -l$(LDAP_LIBNAME) -l$(PRLDAP_LIBNAME) \ ++ -l$(NSS_LIBNAME) ++ ifeq ($(NSS_DYNAMIC_SOFTOKN),1) ++ EXTRA_DLL_LIBS += -l$(SOFTOKN_LIBNAME) ++ endif ++ EXTRA_DLL_LIBS += -l$(SSL_LIBNAME) \ ++ -l$(PLC_BASENAME) -l$(PLDS_BASENAME) -l$(NSPR_BASENAME) ++ else + EXTRA_LIBS =wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib \ + comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \ + rpcrt4.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib +*************** +*** 106,111 **** +--- 115,121 ---- + endif + EXTRA_LIBS += $(dist_libdir)/$(SSL_LIBNAME).lib + endif ++ endif + + ifeq ($(OS_ARCH),OS2) + EXTRA_LIBS = $(OS_LIBS) +*** misc/mozilla/embedding/browser/gtk/src/Makefile.in 2004-04-08 21:18:25.000000000 +0200 +--- misc/build/mozilla/embedding/browser/gtk/src/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 111,117 **** + gtkmozembed_internal.h + + ifdef MOZ_ENABLE_GTK +! EXTRA_DSO_LDOPTS = \ + $(MOZ_COMPONENT_LIBS) \ + $(XPCOM_GLUE_LIBS) \ + -lgtksuperwin \ +--- 111,117 ---- + gtkmozembed_internal.h + + ifdef MOZ_ENABLE_GTK +! EXTRA_DSO_LDOPTS += \ + $(MOZ_COMPONENT_LIBS) \ + $(XPCOM_GLUE_LIBS) \ + -lgtksuperwin \ +*************** +*** 119,125 **** + endif + + ifdef MOZ_ENABLE_GTK2 +! EXTRA_DSO_LDOPTS = \ + $(MOZ_COMPONENT_LIBS) \ + $(NULL) + endif +--- 119,125 ---- + endif + + ifdef MOZ_ENABLE_GTK2 +! EXTRA_DSO_LDOPTS += \ + $(MOZ_COMPONENT_LIBS) \ + $(NULL) + endif +*** misc/mozilla/embedding/browser/gtk/tests/Makefile.in 2003-10-07 04:43:00.000000000 +0200 +--- misc/build/mozilla/embedding/browser/gtk/tests/Makefile.in 2005-07-14 12:58:38.361111472 +0200 +*************** +*** 46,55 **** + TestGtkEmbedNotebook.cpp \ + TestGtkEmbedSocket.cpp \ + TestGtkEmbedChild.cpp +- endif + + SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=) + + # ENABLE_GNOME=1 + + ifdef ENABLE_GNOME +--- 46,56 ---- + TestGtkEmbedNotebook.cpp \ + TestGtkEmbedSocket.cpp \ + TestGtkEmbedChild.cpp + + SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=) + ++ endif ++ + # ENABLE_GNOME=1 + + ifdef ENABLE_GNOME +*** misc/mozilla/extensions/pref/autoconfig/src/Makefile.in 2004-01-07 14:36:25.000000000 +0100 +--- misc/build/mozilla/extensions/pref/autoconfig/src/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 68,74 **** + endif + + +! EXTRA_DSO_LDOPTS = \ + $(LIBS_DIR) \ + $(MOZ_JS_LIBS) \ + $(MOZ_COMPONENT_LIBS) \ +--- 68,74 ---- + endif + + +! EXTRA_DSO_LDOPTS += \ + $(LIBS_DIR) \ + $(MOZ_JS_LIBS) \ + $(MOZ_COMPONENT_LIBS) \ +*** misc/mozilla/gfx/idl/nsIFreeType2.idl 2004-04-16 03:09:33.000000000 +0200 +--- misc/build/mozilla/gfx/idl/nsIFreeType2.idl 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 76,85 **** + native FT_Sfnt_Tag(FT_Sfnt_Tag); + native FT_Size(FT_Size); + +! [ptr] native FTC_Image_Desc_p(FTC_Image_Desc); + native FTC_Face_Requester(FTC_Face_Requester); + native FTC_Font(FTC_Font); +! native FTC_Image_Cache(FTC_Image_Cache); + native FTC_Manager(FTC_Manager); + + // #ifdef MOZ_SVG +--- 76,86 ---- + native FT_Sfnt_Tag(FT_Sfnt_Tag); + native FT_Size(FT_Size); + +! [ptr] native FTC_ImageType_p(FTC_ImageType); + native FTC_Face_Requester(FTC_Face_Requester); + native FTC_Font(FTC_Font); +! native FTC_FaceID(FTC_FaceID); +! native FTC_ImageCache(FTC_ImageCache); + native FTC_Manager(FTC_Manager); + + // #ifdef MOZ_SVG +*************** +*** 99,105 **** + + readonly attribute FT_Library library; + readonly attribute FTC_Manager FTCacheManager; +! readonly attribute FTC_Image_Cache ImageCache; + + void doneFace(in FT_Face face); + void doneFreeType(in FT_Library lib); +--- 100,106 ---- + + readonly attribute FT_Library library; + readonly attribute FTC_Manager FTCacheManager; +! readonly attribute FTC_ImageCache ImageCache; + + void doneFace(in FT_Face face); + void doneFreeType(in FT_Library lib); +*************** +*** 115,130 **** + 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, + 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 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); + /* #ifdef MOZ_SVG */ + void glyphTransform(in FT_Glyph glyph, in FT_Matrix_p matrix, + in FT_Vector_p delta); +--- 116,131 ---- + 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_ImageCache cache, in FTC_ImageType_p desc, + in FT_UInt gindex, out FT_Glyph glyph); +! 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_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 2004-02-07 16:22:30.000000000 +0100 +--- misc/build/mozilla/gfx/src/freetype/nsFreeType.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 111,117 **** + {"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_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}, +--- 111,117 ---- + {"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_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}, +*************** +*** 282,288 **** + } - 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); -@@ -1190,7 +1190,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"); -@@ -1228,8 +1228,8 @@ + NS_IMETHODIMP +! nsFreeType2::ImageCacheLookup(FTC_Image_Cache cache, FTC_Image_Desc *desc, + FT_UInt glyphID, FT_Glyph *glyph) + { + // call the FreeType2 function via the function pointer +--- 282,288 ---- + } - 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; -@@ -1622,16 +1622,16 @@ - mEntry->GetFamilyName(fontName); - mEntry->GetStyleName(styleName); + NS_IMETHODIMP +! nsFreeType2::ImageCacheLookup(FTC_ImageCache cache, FTC_ImageType *desc, + FT_UInt glyphID, FT_Glyph *glyph) + { + // call the FreeType2 function via the function pointer +*************** +*** 291,301 **** + } -- 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; - -diff -ru misc/mozilla/gfx/src/ps/nsFontMetricsPS.h misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.h ---- misc/mozilla/gfx/src/ps/nsFontMetricsPS.h 2003-04-22 12:25:09.000000000 -0400 -+++ misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.h 2005-01-09 13:23:33.046875000 -0500 -@@ -320,7 +320,7 @@ - nsCOMPtr<nsITrueTypeFontCatalogEntry> mFaceID; - nsCOMPtr<nsIFreeType2> mFt2; - PRUint16 mPixelSize; -- FTC_Image_Desc mImageDesc; -+ FTC_ImageType mImageDesc; - - - static PRBool AddUserPref(nsIAtom *aLang, const nsFont& aFont, -@@ -363,7 +363,7 @@ - protected: - nsCOMPtr<nsITrueTypeFontCatalogEntry> mEntry; - nsCOMPtr<nsIFreeType2> mFt2; -- FTC_Image_Desc mImageDesc; -+ FTC_ImageType mImageDesc; - }; - #endif - -diff -ru misc/mozilla/gfx/src/x11shared/nsFontFreeType.cpp misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.cpp ---- misc/mozilla/gfx/src/x11shared/nsFontFreeType.cpp 2003-12-25 03:24:52.000000000 -0500 -+++ misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.cpp 2005-01-09 13:23:33.062500000 -0500 -@@ -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; -diff -ru misc/mozilla/gfx/src/x11shared/nsFontFreeType.h misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.h ---- misc/mozilla/gfx/src/x11shared/nsFontFreeType.h 2003-04-22 12:25:13.000000000 -0400 -+++ misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.h 2005-01-09 13:23:33.078125000 -0500 -@@ -110,7 +110,7 @@ - XImage *GetXImage(PRUint32 width, PRUint32 height); - nsITrueTypeFontCatalogEntry *mFaceID; - PRUint16 mPixelSize; -- FTC_Image_Desc mImageDesc; -+ FTC_ImageType mImageDesc; - nsCOMPtr<nsIFreeType2> mFt2; - }; - -diff -ru misc/mozilla/jpeg/jmorecfg.h misc/build/mozilla/jpeg/jmorecfg.h ---- misc/mozilla/jpeg/jmorecfg.h 2004-03-25 20:17:16.000000000 -0500 -+++ misc/build/mozilla/jpeg/jmorecfg.h 2005-01-09 13:23:33.093750000 -0500 -@@ -108,8 +108,8 @@ - /* Defines for MMX/SSE2 support. */ - - #if defined(XP_WIN32) && defined(_M_IX86) && !defined(__GNUC__) --#define HAVE_MMX_INTEL_MNEMONICS --#define HAVE_SSE2_INTEL_MNEMONICS -+//#define HAVE_MMX_INTEL_MNEMONICS -+//#define HAVE_SSE2_INTEL_MNEMONICS - #endif - - /* Compressed datastreams are represented as arrays of JOCTET. -diff -ru misc/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp misc/build/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp ---- misc/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp 2004-03-18 20:36:16.000000000 -0500 -+++ misc/build/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp 2005-01-09 13:23:33.109375000 -0500 -@@ -440,19 +440,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"); - } - -diff -ru misc/mozilla/mailnews/addrbook/src/Makefile.in misc/build/mozilla/mailnews/addrbook/src/Makefile.in ---- misc/mozilla/mailnews/addrbook/src/Makefile.in 2003-10-06 13:48:56.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/Makefile.in 2005-01-09 13:23:33.125000000 -0500 -@@ -86,6 +86,7 @@ - nsVCard.cpp \ - nsVCardObj.cpp \ - nsMsgVCardService.cpp \ -+ nsAbMD5sum.cpp \ - $(NULL) - - EXPORTS = \ -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp 2002-10-11 04:17:13.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp 2005-01-09 13:23:33.125000000 -0500 -@@ -39,6 +39,7 @@ - #include "nsAbBoolExprToLDAPFilter.h" - #include "nsAbLDAPProperties.h" - #include "nsXPIDLString.h" -+#include "nsAbUtils.h" - - const int nsAbBoolExprToLDAPFilter::TRANSLATE_CARD_PROPERTY = 1 << 0 ; - const int nsAbBoolExprToLDAPFilter::ALLOW_NON_CONVERTABLE_CARD_PROPERTY = 1 << 1 ; -@@ -186,13 +187,16 @@ - rv = condition->GetName (getter_Copies (name)); - NS_ENSURE_SUCCESS(rv, rv); - -- const char* ldapProperty = name.get (); -+ CharPtrArrayGuard attrs; - if (flags & TRANSLATE_CARD_PROPERTY) - { -- const MozillaLdapPropertyRelation* p = -- MozillaLdapPropertyRelator::findLdapPropertyFromMozilla (name.get ()); -- if (p) -- ldapProperty = p->ldapProperty; -+ if(const MozillaLdapPropertyRelation* property = -+ MozillaLdapPropertyRelator::findLdapPropertyFromMozilla (name.get ())) -+ { -+ // allow even single ldap attribute mapppings to go through this to simplify the filter creation later. -+ rv = MozillaLdapPropertyRelator::getAllLDAPAttrsFromMozilla (property->ldapProperty, attrs.GetSizeAddr(), attrs.GetArrayAddr() ); -+ NS_ENSURE_SUCCESS(rv, rv); -+ } - else if (!(flags & ALLOW_NON_CONVERTABLE_CARD_PROPERTY)) - return NS_OK; - } -@@ -202,6 +206,37 @@ - NS_ENSURE_SUCCESS(rv, rv); - NS_ConvertUCS2toUTF8 vUTF8 (value); - -+ // check if using multiple ldap attributes -+ if(attrs.GetSize() == 1 ) -+ GenerateSingleFilter(conditionType,filter,vUTF8,attrs.GetArray()[0]); -+ else -+ { -+ // add the opening brace if using multiple ldap attributes -+ switch (conditionType) -+ { -+ // 'NOT' conditionals use the 'AND' operator -+ case nsIAbBooleanConditionTypes::DoesNotExist: -+ case nsIAbBooleanConditionTypes::DoesNotContain: -+ case nsIAbBooleanConditionTypes::IsNot: -+ filter += NS_LITERAL_CSTRING("(&"); -+ break; -+ default: -+ filter += NS_LITERAL_CSTRING("(|"); -+ break; -+ } -+ GenerateMultipleFilter(conditionType,filter,vUTF8,&attrs); -+ // add the closing brace if using multiple ldap attributes -+ filter += NS_LITERAL_CSTRING(")"); -+ } -+ -+ return rv; -+} -+void nsAbBoolExprToLDAPFilter:: GenerateSingleFilter( -+ nsAbBooleanConditionType conditionType, -+ nsCString& filter, -+ NS_ConvertUCS2toUTF8 &vUTF8, -+ const char *ldapProperty) -+{ - switch (conditionType) - { - case nsIAbBooleanConditionTypes::DoesNotExist: -@@ -282,7 +317,47 @@ - default: - break; - } -- -- return rv; - } -+void nsAbBoolExprToLDAPFilter:: GenerateMultipleFilter( -+ nsAbBooleanConditionType conditionType, -+ nsCString& filter, -+ NS_ConvertUCS2toUTF8 &vUTF8, -+ CharPtrArrayGuard *pAttrs) -+{ -+ PRUint16 i = 0; -+ PRUint16 inner = 0; -+ -+ /* -+ * This function is based on the fact that we are trying to generate support -+ * for multiple occurring ldap attributes. Consider the following query: -+ * (PagerNumber,=,123456) where PagerNumber = pager|pagerphone translates to: -+ * (|(&(pager=*)(pager=123456))(&(!(pager=*))(pagerphone=123456))) -+ * This can be shortened to: -+ * (|(pager=123456)(&(!(pager=*))(pagerphone=123456))) -+ * -+ * i.e. use the first occurring attribute if it exists otherwise if first -+ * does not exist use the second etc. The assumption is that the first -+ * always takes precedence. -+ * This translates to: -+ * GenerateSingleFilter(Is); -+ * GenerateSingleFilter(DoesNotExists); -+ * GenerateSingleFilter(Is); -+ */ - -+ for (i = 0; i < pAttrs->GetSize(); i++) -+ { -+ if(i == 0) -+ GenerateSingleFilter(conditionType,filter,vUTF8,pAttrs->GetArray()[i]); -+ else -+ { -+ filter += NS_LITERAL_CSTRING("(&"); -+ nsAbBooleanConditionType doesNotExistsType = nsIAbBooleanConditionTypes::DoesNotExist; -+ for(inner = 0; inner < i; ++inner) -+ { -+ GenerateSingleFilter(doesNotExistsType,filter,vUTF8,pAttrs->GetArray()[inner]); -+ } -+ GenerateSingleFilter(conditionType,filter,vUTF8,pAttrs->GetArray()[i]); -+ filter += NS_LITERAL_CSTRING(")"); -+ } -+ } -+} -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h ---- misc/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 2001-09-28 16:06:21.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 2005-01-09 13:23:33.171875000 -0500 -@@ -42,6 +42,7 @@ - #include "nsIAbBooleanExpression.h" - #include "nsCOMPtr.h" - #include "nsString.h" -+#include "nsAbUtils.h" - - class nsAbBoolExprToLDAPFilter - { -@@ -67,6 +68,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 -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp 2004-02-13 21:09:27.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp 2005-01-09 13:23:33.187500000 -0500 -@@ -118,11 +118,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->CopyCharPref(prefName.get(), getter_Copies(URI)); -+ nsCAutoString uriPrefName; -+ uriPrefName = prefName + NS_LITERAL_CSTRING(".uri"); -+ rv = prefs->CopyCharPref(uriPrefName.get(), getter_Copies(URI)); - if (NS_FAILED(rv)) - { - /* -@@ -146,6 +148,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 - { -@@ -156,24 +179,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)); - -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2004-02-13 21:09:27.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2005-01-09 13:23:33.187500000 -0500 -@@ -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, -@@ -105,6 +105,8 @@ - PRBool mInitialized; - PRBool mCanceled; - -+ nsAutoString m_sPassword; -+ - nsCOMPtr<nsILDAPOperation> mSearchOperation; - - PRLock* mLock; -@@ -255,7 +257,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; -@@ -398,10 +400,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; - } - -@@ -685,7 +690,7 @@ - rv = getLdapReturnAttributes (arguments, returnAttributes); - NS_ENSURE_SUCCESS(rv, rv); - -- -+ - // Get the filter - nsCOMPtr<nsISupports> supportsExpression; - rv = arguments->GetExpression (getter_AddRefs (supportsExpression)); -@@ -811,6 +816,11 @@ - timeOut); - if (_messageListener == NULL) - return NS_ERROR_OUT_OF_MEMORY; -+ -+ nsAutoString wPassword; -+ wPassword.AssignWithConversion(mPassword.get()); -+ _messageListener->SetPassword(wPassword); -+ - messageListener = _messageListener; - nsVoidKey key (NS_REINTERPRET_CAST(void *,contextID)); - -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h ---- misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 2004-02-13 21:09:27.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 2005-01-09 13:23:33.203125000 -0500 -@@ -74,6 +74,7 @@ - nsresult RemoveListener (PRInt32 contextID); - 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) - -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp 2003-03-22 10:43:29.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp 2005-01-09 13:23:33.218750000 -0500 -@@ -39,6 +39,7 @@ - #include "nsAbLDAPProperties.h" - - #include "nsAbUtils.h" -+#include "nsCRT.h" - - #include "nsCOMPtr.h" - #include "nsString.h" -@@ -59,6 +60,21 @@ - If there are multiple entries for a mozilla - property the first takes precedence. - -+ But where we need to do a query against -+ a multiple occurring ldap attribute we -+ need to OR all the possible ldap entries e.g. -+ -+ (CellularNumber=123456) translates to -+ (|(mobile=123456)(&(!(mobile=*))(cellphone=123456))(&(!(mobile=*))(!(cellphone=*))(carphone=123456))) -+ -+ i.e. use the first occurring attribute otherwise if -+ first does not exist use the second etc. -+ -+ [Multiple occurring ldap attributes do not -+ include aliases. We have also ignored the case -+ for including 'displayname' as the first occurring -+ attribute 'cn' is a required attribute.] -+ - This ensures that - - 1) Generality is maintained when mapping from -@@ -101,52 +117,32 @@ - {MozillaProperty_String, "FaxNumber", "fax"}, - // organizationalPerson - {MozillaProperty_String, "FaxNumber", "facsimiletelephonenumber"}, -- // inetOrgPerson -- {MozillaProperty_String, "PagerNumber", "pager"}, -- // ? -- {MozillaProperty_String, "PagerNumber", "pagerphone"}, -- // inetOrgPerson -- {MozillaProperty_String, "CellularNumber", "mobile"}, -- // ? -- {MozillaProperty_String, "CellularNumber", "cellphone"}, -- // ? -- {MozillaProperty_String, "CellularNumber", "carphone"}, -+ // inetOrgPerson,? -+ {MozillaProperty_String, "PagerNumber", "pager,pagerphone"}, -+ // inetOrgPerson,?,? -+ {MozillaProperty_String, "CellularNumber", "mobile,cellphone,carphone"}, - - // No Home* properties defined yet - -- // organizationalPerson -- {MozillaProperty_String, "WorkAddress", "postofficebox"}, -- // ? -- {MozillaProperty_String, "WorkAddress", "streetaddress"}, -+ // organizationalPerson,? -+ {MozillaProperty_String, "WorkAddress", "postofficebox,streetaddress"}, - // ? - {MozillaProperty_String, "WorkCity", "l"}, - // ? - {MozillaProperty_String, "WorkCity", "locality"}, - // ? -- {MozillaProperty_String, "WorkState", "st"}, -- // ? -- {MozillaProperty_String, "WorkState", "region"}, -- // organizationalPerson -- {MozillaProperty_String, "WorkZipCode", "postalcode"}, -- // ? -- {MozillaProperty_String, "WorkZipCode", "zip"}, -+ {MozillaProperty_String, "WorkState", "st,region"}, -+ // organizationalPerson,? -+ {MozillaProperty_String, "WorkZipCode", "postalcode,zip"}, - // ? - {MozillaProperty_String, "WorkCountry", "countryname"}, - - // organizationalPerson - {MozillaProperty_String, "JobTitle", "title"}, - // ? -- {MozillaProperty_String, "Department", "ou"}, -- // ? -- {MozillaProperty_String, "Department", "orgunit"}, -- // ? -- {MozillaProperty_String, "Department", "department"}, -- // ? -- {MozillaProperty_String, "Department", "departmentnumber"}, -- // inetOrgPerson -- {MozillaProperty_String, "Company", "o"}, -- // ? -- {MozillaProperty_String, "Company", "company"}, -+ {MozillaProperty_String, "Department", "ou,orgunit,department,departmentnumber"}, -+ // inetOrgPerson,? -+ {MozillaProperty_String, "Company", "o,company"}, - // ? - {MozillaProperty_String, "WorkCountry", "countryname"}, - // ? -@@ -168,10 +164,8 @@ - // ? - {MozillaProperty_String, "Custom4", "custom4"}, - -- // ? -- {MozillaProperty_String, "Notes", "notes"}, -- // person -- {MozillaProperty_String, "Notes", "description"}, -+ // ?,person -+ {MozillaProperty_String, "Notes", "notes,description"}, - - // mozilla specfic - {MozillaProperty_Int, "PreferMailFormat", "xmozillausehtmlmail"}, -@@ -209,10 +203,22 @@ - if (IsInitialized) { return ; } - - for (int i = tableSize - 1 ; i >= 0 ; -- i) { -- nsCStringKey keyMozilla (table [i].mozillaProperty, -1, nsCStringKey::NEVER_OWN); -- nsCStringKey keyLdap (table [i].ldapProperty, -1, nsCStringKey::NEVER_OWN); - -+ char *attrToken = nsnull; -+ char *LDAPProperty = nsCRT::strdup(table[i].ldapProperty); -+ char *tmpLDAPProperty; -+ -+ attrToken = nsCRT::strtok(LDAPProperty, ",", &tmpLDAPProperty); -+ while (attrToken != nsnull) -+ { -+ while ( ' ' == *attrToken) -+ attrToken++; -+ nsCStringKey keyLdap (attrToken, -1, nsCStringKey::NEVER_OWN); - mLdapToMozilla.Put(&keyLdap, NS_REINTERPRET_CAST(void *, NS_CONST_CAST(MozillaLdapPropertyRelation*, &table[i]))) ; -+ attrToken = nsCRT::strtok(tmpLDAPProperty, ",", &tmpLDAPProperty); -+ } -+ -+ nsCStringKey keyMozilla (table [i].mozillaProperty, -1, nsCStringKey::NEVER_OWN); - mMozillaToLdap.Put(&keyMozilla, NS_REINTERPRET_CAST(void *, NS_CONST_CAST(MozillaLdapPropertyRelation*, &table[i]))) ; - } - IsInitialized = PR_TRUE; -@@ -234,10 +240,13 @@ - const MozillaLdapPropertyRelation* MozillaLdapPropertyRelator::findMozillaPropertyFromLdap (const char* ldapProperty) - { - Initialize(); -+ char *attrToken; -+ char *tmpLDAPProperty; -+ attrToken = nsCRT::strtok(NS_CONST_CAST(char *,ldapProperty), ",", &tmpLDAPProperty); - // ensure that we always do a case insensitive comparison - // against the incoming ldap attributes. -- nsCAutoString lowercasedProp(ldapProperty); -- ToLowerCase(nsDependentCString(ldapProperty), lowercasedProp); -+ nsCAutoString lowercasedProp (attrToken) ; -+ ToLowerCase(nsDependentCString(attrToken),lowercasedProp); - nsCStringKey key(lowercasedProp); - - return NS_REINTERPRET_CAST(const MozillaLdapPropertyRelation *, mLdapToMozilla.Get(&key)) ; -@@ -289,3 +298,64 @@ - - return rv; - } -+ -+// Parse the input string which may contain a single ldap attribute or multiple attributes in the form -+// "string" or "string1,string2,string3" respectively and assign to the array. -+nsresult MozillaLdapPropertyRelator::getAllLDAPAttrsFromMozilla (const char* aLDAPProperty, PRUint32 *aAttrCount, char * **aAttributes) -+{ -+ NS_ENSURE_ARG_POINTER(aAttrCount); -+ NS_ENSURE_ARG_POINTER(aAttributes); -+ -+ nsresult rv = NS_OK; -+ -+ *aAttributes = 0; -+ // we must have at least one attribute -+ *aAttrCount = 1; -+ -+ // if no multiple ldap attributes then allocate our single entry and exit -+ if (!strchr(aLDAPProperty,',')) -+ { -+ if (!(*aAttributes = NS_STATIC_CAST(char **, nsMemory::Alloc(sizeof(char *))))) -+ return NS_ERROR_OUT_OF_MEMORY; -+ if (!((*aAttributes)[0] = nsCRT::strdup(aLDAPProperty))) -+ return NS_ERROR_OUT_OF_MEMORY; -+ -+ return rv; -+ } -+ -+ char *attrToken = nsnull; -+ char *LDAPProperty = nsnull; -+ char *tmpLDAPProperty; -+ -+ if((LDAPProperty = nsCRT::strdup(aLDAPProperty)) == nsnull) -+ return NS_ERROR_OUT_OF_MEMORY; -+ -+ // set our tokenizer to the start -+ attrToken = nsCRT::strtok(LDAPProperty, ",", &tmpLDAPProperty); -+ -+ // Count up the attribute names -+ while ((attrToken = nsCRT::strtok(tmpLDAPProperty, ",", &tmpLDAPProperty)) != nsnull) -+ *aAttrCount += 1; -+ -+ nsCRT::free (LDAPProperty); -+ if(!(*aAttributes = NS_STATIC_CAST(char **, nsMemory::Alloc(*aAttrCount * sizeof(char *))))) -+ return NS_ERROR_OUT_OF_MEMORY; -+ -+ if((LDAPProperty = nsCRT::strdup(aLDAPProperty)) == nsnull) -+ return NS_ERROR_OUT_OF_MEMORY; -+ -+ PRInt32 j = 0; -+ attrToken = nsCRT::strtok(LDAPProperty, ",", &tmpLDAPProperty); -+ while (nsnull != attrToken) { -+ if(((*aAttributes)[j++] = nsCRT::strdup(attrToken)) == nsnull) -+ { -+ nsCRT::free(LDAPProperty); -+ return NS_ERROR_OUT_OF_MEMORY; -+ } -+ -+ attrToken = nsCRT::strtok(tmpLDAPProperty, ",", &tmpLDAPProperty); -+ } -+ -+ nsCRT::free(LDAPProperty); -+ return rv; -+} -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h ---- misc/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h 2002-04-09 05:27:24.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h 2005-01-09 13:23:33.234375000 -0500 -@@ -85,6 +85,7 @@ - static nsresult createCardPropertyFromLDAPMessage (nsILDAPMessage* message, - nsIAbCard* card, - PRBool* hasSetCardProperty); -+ static nsresult getAllLDAPAttrsFromMozilla (const char* aLDAPProperty, PRUint32 *aAttrCount, char * **aAttributes); - }; - - #endif -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2005-01-09 17:07:22.906250000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2005-01-09 13:23:33.250000000 -0500 -@@ -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); -+} -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp 2002-11-12 14:19:56.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp 2005-01-09 13:23:33.265625000 -0500 -@@ -266,8 +266,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; -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 2004-03-09 09:42:24.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 2005-01-09 13:23:33.281250000 -0500 -@@ -537,7 +537,7 @@ - } - } - } -- mDatabase->Commit(nsAddrDBCommitType::kLargeCommit); -+ rv = mDatabase->Commit(nsAddrDBCommitType::kLargeCommit); - } - return rv; - } -@@ -684,6 +684,7 @@ - return NS_ERROR_NOT_IMPLEMENTED; - - nsresult rv = NS_OK; -+ - if (!mDatabase) - rv = GetAbDatabase(); - -@@ -713,10 +714,11 @@ - mDatabase->CreateNewListCardAndAddToDB(this, m_dbRowID, newCard, PR_TRUE); - 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) -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 2004-03-09 10:18:40.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 2005-01-09 13:23:33.296875000 -0500 -@@ -97,6 +97,7 @@ - { - index_DisplayName = 0, - index_EmailAddress, -+ index_SecondEmailAddress, - index_FirstName, - index_LastName, - index_NickName, -@@ -124,32 +125,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) ; -@@ -176,6 +179,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()) ; -@@ -210,12 +214,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()) ; -@@ -297,6 +301,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])) ; -@@ -316,9 +321,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 ; -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp 2003-02-25 16:36:33.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp 2005-01-09 13:23:33.312500000 -0500 -@@ -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) ; - -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp 2004-02-05 13:33:06.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp 2005-01-09 13:23:33.328125000 -0500 -@@ -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}, -@@ -1032,7 +1094,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) ; -@@ -1056,14 +1121,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 ; - -@@ -1071,15 +1136,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, -@@ -1104,13 +1172,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")) ; -@@ -1119,22 +1217,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 ; - } - -@@ -1158,8 +1248,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)) ; -@@ -1280,7 +1370,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 ; - -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h ---- misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 2004-02-05 13:33:06.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 2005-01-09 13:23:33.343750000 -0500 -@@ -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 -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 2004-04-14 16:16:12.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 2005-01-09 13:23:33.359375000 -0500 -@@ -41,6 +41,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 "nsAbUtils.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(WORD *, 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(WORD *, 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://" ; -diff -ru misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.h misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.h ---- misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 2004-04-14 16:16:12.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 2005-01-09 17:04:59.843750000 -0500 -@@ -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 ; - } ; -diff -ru misc/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp ---- misc/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 2003-12-24 12:18:08.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 2005-01-09 13:23:33.390625000 -0500 -@@ -97,6 +97,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() -@@ -166,6 +169,7 @@ - m_LastRecordKey(0), - m_dbDirectory(nsnull) - { -+ memset(m_dbMd5Sum,0,33); - } - - nsAddrDatabase::~nsAddrDatabase() -@@ -720,7 +724,11 @@ - NS_RELEASE(oldFile); // always release our file ref, store has own - } - } -- -+ -+ ret = getMD5sum(nativeFileName,m_dbMd5Sum); -+ if (ret == 1) -+ ret = NS_ERROR_FAILURE; -+ - nsCRT::free(nativeFileName); - - if (NS_SUCCEEDED(ret) && thumb) -@@ -817,6 +825,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) - { - mdb_percent outActualWaste = 0; -@@ -867,6 +886,10 @@ - // ### do something with error, but clear it now because mork errors out on commits. - if (GetEnv()) - GetEnv()->ClearErrors(); -+ if (NS_SUCCEEDED(err) && getMD5sum(nativeFileName,m_dbMd5Sum)) -+ err = NS_ERROR_FAILURE; -+ nsCRT::free(nativeFileName); -+ - return err; - } - -diff -ru misc/mozilla/mailnews/addrbook/src/nsAddrDatabase.h misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.h ---- misc/mozilla/mailnews/addrbook/src/nsAddrDatabase.h 2004-01-28 12:22:13.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.h 2005-01-09 13:23:33.406250000 -0500 -@@ -396,6 +396,7 @@ - nsIMdbTable *m_mdbPabTable; - nsIMdbTable *m_mdbDeletedCardsTable; - nsFileSpec m_dbName; -+ char m_dbMd5Sum[33]; - PRBool m_mdbTokensInitialized; - nsVoidArray /*<nsIAddrDBListener>*/ *m_ChangeListeners; - -diff -ru misc/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp ---- misc/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp 2001-10-30 02:59:16.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp 2005-01-09 13:23:33.421875000 -0500 -@@ -41,6 +41,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"); -@@ -48,6 +64,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 ; -@@ -60,7 +130,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) - { -@@ -92,7 +162,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)) { -@@ -106,22 +176,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) ; -@@ -135,6 +202,7 @@ - } - } - FreeLibrary(mLibrary) ; -+ mRootSession = NULL; - mLibrary = NULL ; - } - } -@@ -146,7 +214,6 @@ - : nsAbWinHelper() - { - BOOL result = Initialize() ; -- - NS_ASSERTION(result == TRUE, "Couldn't initialize Mapi Helper") ; - MOZ_COUNT_CTOR(nsMapiAddressBook) ; - } -@@ -154,22 +221,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; + NS_IMETHODIMP +! nsFreeType2::ManagerLookupSize(FTC_Manager manager, FTC_Font font, +! FT_Face *face, FT_Size *size) + { + // call the FreeType2 function via the function pointer +! FT_Error error = nsFTC_Manager_Lookup_Size(manager, font, face, size); + return error ? NS_ERROR_FAILURE : NS_OK; + } + +--- 291,301 ---- + } + + NS_IMETHODIMP +! nsFreeType2::ManagerLookupFace(FTC_Manager manager, FTC_FaceID font, +! FT_Face *face) + { + // call the FreeType2 function via the function pointer +! FT_Error error = nsFTC_Manager_LookupFace(manager, font, face); + return error ? NS_ERROR_FAILURE : NS_OK; + } + +*************** +*** 320,326 **** + } + + NS_IMETHODIMP +! nsFreeType2::ImageCacheNew(FTC_Manager manager, FTC_Image_Cache *cache) + { + // call the FreeType2 function via the function pointer + FT_Error error = nsFTC_Image_Cache_New(manager, cache); +--- 320,326 ---- + } + + NS_IMETHODIMP +! 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); +*************** +*** 389,395 **** + } + + NS_IMETHODIMP +! nsFreeType2::GetImageCache(FTC_Image_Cache *aCache) + { + *aCache = mImageCache; + return NS_OK; +--- 389,395 ---- + } + + NS_IMETHODIMP +! nsFreeType2::GetImageCache(FTC_ImageCache *aCache) + { + *aCache = mImageCache; + return NS_OK; +*** misc/mozilla/gfx/src/freetype/nsFreeType.h 2004-04-16 23:31:42.000000000 +0200 +--- misc/build/mozilla/gfx/src/freetype/nsFreeType.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 104,116 **** + 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*); + 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*); + // #ifdef MOZ_SVG + typedef FT_Error (*FT_Glyph_Transform_t)(FT_Glyph, FT_Matrix*, FT_Vector*); + typedef FT_Error (*FT_Get_Kerning_t) +--- 104,116 ---- + 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_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_ImageCache*); + // #ifdef MOZ_SVG + typedef FT_Error (*FT_Glyph_Transform_t)(FT_Glyph, FT_Matrix*, FT_Vector*); + typedef FT_Error (*FT_Get_Kerning_t) +*************** +*** 165,171 **** + 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_Done_t nsFTC_Manager_Done; + FTC_Manager_New_t nsFTC_Manager_New; + FTC_Image_Cache_New_t nsFTC_Image_Cache_New; +--- 165,171 ---- + 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_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; +*************** +*** 213,219 **** + PRLibrary *mSharedLib; + FT_Library mFreeTypeLibrary; + FTC_Manager mFTCacheManager; +! FTC_Image_Cache mImageCache; + + static nsHashtable *sFontFamilies; + static nsHashtable *sRange1CharSetNames; +--- 213,219 ---- + PRLibrary *mSharedLib; + FT_Library mFreeTypeLibrary; + FTC_Manager mFTCacheManager; +! FTC_ImageCache mImageCache; + + static nsHashtable *sFontFamilies; + static nsHashtable *sRange1CharSetNames; +*** misc/mozilla/gfx/src/gtk/Makefile.in 2003-11-10 13:24:51.000000000 +0100 +--- misc/build/mozilla/gfx/src/gtk/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 176,181 **** +--- 176,185 ---- + 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 2004-02-05 02:57:05.000000000 +0100 +--- misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 1141,1150 **** + + 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; + + nsresult rv; + mFt2 = do_GetService(NS_FREETYPE2_CONTRACTID, &rv); +--- 1141,1150 ---- + + mPixelSize = NSToIntRound(app2dev * mFont->size); + +! mImageDesc->face_id = (FTC_FaceID)&mEntry; +! mImageDesc->width = mPixelSize; +! mImageDesc->height = mPixelSize; +! mImageDesc->flags = 0; + + nsresult rv; + mFt2 = do_GetService(NS_FREETYPE2_CONTRACTID, &rv); +*************** +*** 1190,1196 **** + if (!face) + return 0; + +! FTC_Image_Cache iCache; + nsresult rv = mFt2->GetImageCache(&iCache); + if (NS_FAILED(rv)) { + NS_ERROR("Failed to get Image Cache"); +--- 1190,1196 ---- + if (!face) + return 0; + +! FTC_ImageCache iCache; + nsresult rv = mFt2->GetImageCache(&iCache); + if (NS_FAILED(rv)) { + NS_ERROR("Failed to get Image Cache"); +*************** +*** 1228,1235 **** + + FTC_Manager cManager; + mFt2->GetFTCacheManager(&cManager); +! nsresult rv = mFt2->ManagerLookupSize(cManager, &mImageDesc.font, +! &face, nsnull); + NS_ASSERTION(rv==0, "failed to get face/size"); + if (rv) + return nsnull; +--- 1228,1235 ---- + + FTC_Manager cManager; + mFt2->GetFTCacheManager(&cManager); +! nsresult rv = mFt2->ManagerLookupFace(cManager, mImageDesc->face_id, +! &face); + NS_ASSERTION(rv==0, "failed to get face/size"); + if (rv) + return nsnull; +*************** +*** 1622,1637 **** + mEntry->GetFamilyName(fontName); + mEntry->GetStyleName(styleName); + +! mImageDesc.font.face_id = (void*)mEntry; + // TT glyph has no relation to size +! mImageDesc.font.pix_width = 16; +! mImageDesc.font.pix_height = 16; +! mImageDesc.image_type = 0; + FT_Face face = nsnull; + FTC_Manager cManager; + mFt2->GetFTCacheManager(&cManager); +! nsresult rv = mFt2->ManagerLookupSize(cManager, &mImageDesc.font, +! &face, nsnull); + if (NS_FAILED(rv)) + return; + +--- 1622,1637 ---- + mEntry->GetFamilyName(fontName); + mEntry->GetStyleName(styleName); + +! mImageDesc->face_id = (FTC_FaceID)&mEntry; + // TT glyph has no relation to size +! mImageDesc->width = 16; +! mImageDesc->height = 16; +! mImageDesc->flags = 0; + FT_Face face = nsnull; + FTC_Manager cManager; + mFt2->GetFTCacheManager(&cManager); +! nsresult rv = mFt2->ManagerLookupFace(cManager, mImageDesc->face_id, +! &face); + if (NS_FAILED(rv)) + return; + +*** misc/mozilla/gfx/src/ps/nsFontMetricsPS.h 2003-04-22 18:25:09.000000000 +0200 +--- misc/build/mozilla/gfx/src/ps/nsFontMetricsPS.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 320,326 **** + nsCOMPtr<nsITrueTypeFontCatalogEntry> mFaceID; + nsCOMPtr<nsIFreeType2> mFt2; + PRUint16 mPixelSize; +! FTC_Image_Desc mImageDesc; + + + static PRBool AddUserPref(nsIAtom *aLang, const nsFont& aFont, +--- 320,326 ---- + nsCOMPtr<nsITrueTypeFontCatalogEntry> mFaceID; + nsCOMPtr<nsIFreeType2> mFt2; + PRUint16 mPixelSize; +! FTC_ImageType mImageDesc; + + + static PRBool AddUserPref(nsIAtom *aLang, const nsFont& aFont, +*************** +*** 363,369 **** + protected: + nsCOMPtr<nsITrueTypeFontCatalogEntry> mEntry; + nsCOMPtr<nsIFreeType2> mFt2; +! FTC_Image_Desc mImageDesc; + }; + #endif + +--- 363,369 ---- + protected: + nsCOMPtr<nsITrueTypeFontCatalogEntry> mEntry; + nsCOMPtr<nsIFreeType2> mFt2; +! FTC_ImageType mImageDesc; + }; + #endif + +*** misc/mozilla/gfx/src/x11shared/nsFontFreeType.cpp 2003-12-25 09:24:52.000000000 +0100 +--- misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 177,183 **** + FTC_Manager mgr; + nsresult rv; + mFt2->GetFTCacheManager(&mgr); +! rv = mFt2->ManagerLookupSize(mgr, &mImageDesc.font, &face, nsnull); + NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get face/size"); + if (NS_FAILED(rv)) + return nsnull; +--- 177,183 ---- + FTC_Manager mgr; + nsresult rv; + mFt2->GetFTCacheManager(&mgr); +! 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,212 **** + 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; + + 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, +--- 191,205 ---- + PRBool embedded_bimap = PR_FALSE; + mFaceID = aFaceID; + mPixelSize = aPixelSize; +! mImageDesc->face_id = (FTC_FaceID)&mFaceID; +! mImageDesc->width = aPixelSize; +! mImageDesc->height = aPixelSize; +! mImageDesc->flags = 0; + + if (aPixelSize < nsFreeType2::gAntiAliasMinimum) { + anti_alias = PR_FALSE; + } + + PRUint32 num_embedded_bitmaps, i; + PRInt32* embedded_bitmapheights; + mFaceID->GetEmbeddedBitmapHeights(&num_embedded_bitmaps, +*************** +*** 218,224 **** + 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; + } + } +--- 211,216 ---- +*************** +*** 312,318 **** + if (!face) + return NS_ERROR_FAILURE; + +! FTC_Image_Cache icache; + mFt2->GetImageCache(&icache); + if (!icache) + return NS_ERROR_FAILURE; +--- 304,310 ---- + if (!face) + return NS_ERROR_FAILURE; + +! FTC_ImageCache icache; + mFt2->GetImageCache(&icache); + if (!icache) + return NS_ERROR_FAILURE; +*************** +*** 401,407 **** + if (!face) + return 0; + +! FTC_Image_Cache icache; + mFt2->GetImageCache(&icache); + if (!icache) + return 0; +--- 393,399 ---- + if (!face) + return 0; + +! FTC_ImageCache icache; + mFt2->GetImageCache(&icache); + if (!icache) + return 0; +*************** +*** 723,729 **** + if (y%4==0) (*blendPixelFunc)(sub_image, y, ascent-1, black, 255/2); + #endif + +! FTC_Image_Cache icache; + mFt2->GetImageCache(&icache); + if (!icache) + return 0; +--- 715,721 ---- + if (y%4==0) (*blendPixelFunc)(sub_image, y, ascent-1, black, 255/2); + #endif + +! FTC_ImageCache icache; + mFt2->GetImageCache(&icache); + if (!icache) + return 0; +*** misc/mozilla/gfx/src/x11shared/nsFontFreeType.h 2003-04-22 18:25:13.000000000 +0200 +--- misc/build/mozilla/gfx/src/x11shared/nsFontFreeType.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 110,116 **** + XImage *GetXImage(PRUint32 width, PRUint32 height); + nsITrueTypeFontCatalogEntry *mFaceID; + PRUint16 mPixelSize; +! FTC_Image_Desc mImageDesc; + nsCOMPtr<nsIFreeType2> mFt2; + }; + +--- 110,116 ---- + XImage *GetXImage(PRUint32 width, PRUint32 height); + nsITrueTypeFontCatalogEntry *mFaceID; + PRUint16 mPixelSize; +! FTC_ImageType mImageDesc; + nsCOMPtr<nsIFreeType2> mFt2; + }; + +*** misc/mozilla/jpeg/jmorecfg.h 2004-03-26 02:17:16.000000000 +0100 +--- misc/build/mozilla/jpeg/jmorecfg.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 108,115 **** + /* Defines for MMX/SSE2 support. */ + + #if defined(XP_WIN32) && defined(_M_IX86) && !defined(__GNUC__) +! #define HAVE_MMX_INTEL_MNEMONICS +! #define HAVE_SSE2_INTEL_MNEMONICS + #endif + + /* Compressed datastreams are represented as arrays of JOCTET. +--- 108,115 ---- + /* Defines for MMX/SSE2 support. */ + + #if defined(XP_WIN32) && defined(_M_IX86) && !defined(__GNUC__) +! //#define HAVE_MMX_INTEL_MNEMONICS +! //#define HAVE_SSE2_INTEL_MNEMONICS + #endif + + /* Compressed datastreams are represented as arrays of JOCTET. +*** misc/mozilla/js/src/xpconnect/src/Makefile.in 2004-01-07 14:36:33.000000000 +0100 +--- misc/build/mozilla/js/src/xpconnect/src/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 148,151 **** + .NOTPARALLEL:: + endif + endif +- +--- 148,150 ---- +*** misc/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp 2004-03-19 02:36:16.000000000 +0100 +--- misc/build/mozilla/layout/svg/renderer/src/libart/nsSVGLibartGlyphMetricsFT.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 440,458 **** + return; + } + +! FTC_Image_Desc imageDesc; +! imageDesc.font.face_id=(void*)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; + + // get the face + nsresult rv; + FTC_Manager mgr; + nsSVGLibartFreetype::ft2->GetFTCacheManager(&mgr); +! rv = nsSVGLibartFreetype::ft2->ManagerLookupSize(mgr, &imageDesc.font, &mFace, nsnull); + NS_ASSERTION(mFace, "failed to get face/size"); + } + +--- 440,458 ---- + return; + } + +! 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->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->ManagerLookupFace(mgr, imageDesc->face_id, &mFace); + NS_ASSERTION(mFace, "failed to get face/size"); + } + +*** misc/mozilla/mailnews/addrbook/src/Makefile.in 2003-10-06 19:48:56.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 86,91 **** +--- 86,92 ---- + nsVCard.cpp \ + nsVCardObj.cpp \ + nsMsgVCardService.cpp \ ++ nsAbMD5sum.cpp \ + $(NULL) + + EXPORTS = \ +*** misc/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp 2002-10-11 10:17:13.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 39,44 **** +--- 39,45 ---- + #include "nsAbBoolExprToLDAPFilter.h" + #include "nsAbLDAPProperties.h" + #include "nsXPIDLString.h" ++ #include "nsAbUtils.h" + + const int nsAbBoolExprToLDAPFilter::TRANSLATE_CARD_PROPERTY = 1 << 0 ; + const int nsAbBoolExprToLDAPFilter::ALLOW_NON_CONVERTABLE_CARD_PROPERTY = 1 << 1 ; +*************** +*** 186,198 **** + rv = condition->GetName (getter_Copies (name)); + NS_ENSURE_SUCCESS(rv, rv); + +! const char* ldapProperty = name.get (); + if (flags & TRANSLATE_CARD_PROPERTY) + { +! const MozillaLdapPropertyRelation* p = +! MozillaLdapPropertyRelator::findLdapPropertyFromMozilla (name.get ()); +! if (p) +! ldapProperty = p->ldapProperty; + else if (!(flags & ALLOW_NON_CONVERTABLE_CARD_PROPERTY)) + return NS_OK; + } +--- 187,202 ---- + rv = condition->GetName (getter_Copies (name)); + NS_ENSURE_SUCCESS(rv, rv); + +! CharPtrArrayGuard attrs; + if (flags & TRANSLATE_CARD_PROPERTY) + { +! if(const MozillaLdapPropertyRelation* property = +! MozillaLdapPropertyRelator::findLdapPropertyFromMozilla (name.get ())) +! { +! // allow even single ldap attribute mapppings to go through this to simplify the filter creation later. +! rv = MozillaLdapPropertyRelator::getAllLDAPAttrsFromMozilla (property->ldapProperty, attrs.GetSizeAddr(), attrs.GetArrayAddr() ); +! NS_ENSURE_SUCCESS(rv, rv); +! } + else if (!(flags & ALLOW_NON_CONVERTABLE_CARD_PROPERTY)) + return NS_OK; + } +*************** +*** 202,207 **** +--- 206,242 ---- + NS_ENSURE_SUCCESS(rv, rv); + NS_ConvertUCS2toUTF8 vUTF8 (value); + ++ // check if using multiple ldap attributes ++ if(attrs.GetSize() == 1 ) ++ GenerateSingleFilter(conditionType,filter,vUTF8,attrs.GetArray()[0]); ++ else ++ { ++ // add the opening brace if using multiple ldap attributes ++ switch (conditionType) ++ { ++ // 'NOT' conditionals use the 'AND' operator ++ case nsIAbBooleanConditionTypes::DoesNotExist: ++ case nsIAbBooleanConditionTypes::DoesNotContain: ++ case nsIAbBooleanConditionTypes::IsNot: ++ filter += NS_LITERAL_CSTRING("(&"); ++ break; ++ default: ++ filter += NS_LITERAL_CSTRING("(|"); ++ break; ++ } ++ GenerateMultipleFilter(conditionType,filter,vUTF8,&attrs); ++ // add the closing brace if using multiple ldap attributes ++ filter += NS_LITERAL_CSTRING(")"); ++ } ++ ++ return rv; ++ } ++ void nsAbBoolExprToLDAPFilter:: GenerateSingleFilter( ++ nsAbBooleanConditionType conditionType, ++ nsCString& filter, ++ NS_ConvertUCS2toUTF8 &vUTF8, ++ const char *ldapProperty) ++ { + switch (conditionType) + { + case nsIAbBooleanConditionTypes::DoesNotExist: +*************** +*** 282,288 **** + default: + break; + } +- +- return rv; + } + +--- 317,363 ---- + default: + break; + } + } ++ void nsAbBoolExprToLDAPFilter:: GenerateMultipleFilter( ++ nsAbBooleanConditionType conditionType, ++ nsCString& filter, ++ NS_ConvertUCS2toUTF8 &vUTF8, ++ CharPtrArrayGuard *pAttrs) ++ { ++ PRUint16 i = 0; ++ PRUint16 inner = 0; ++ ++ /* ++ * This function is based on the fact that we are trying to generate support ++ * for multiple occurring ldap attributes. Consider the following query: ++ * (PagerNumber,=,123456) where PagerNumber = pager|pagerphone translates to: ++ * (|(&(pager=*)(pager=123456))(&(!(pager=*))(pagerphone=123456))) ++ * This can be shortened to: ++ * (|(pager=123456)(&(!(pager=*))(pagerphone=123456))) ++ * ++ * i.e. use the first occurring attribute if it exists otherwise if first ++ * does not exist use the second etc. The assumption is that the first ++ * always takes precedence. ++ * This translates to: ++ * GenerateSingleFilter(Is); ++ * GenerateSingleFilter(DoesNotExists); ++ * GenerateSingleFilter(Is); ++ */ + ++ for (i = 0; i < pAttrs->GetSize(); i++) ++ { ++ if(i == 0) ++ GenerateSingleFilter(conditionType,filter,vUTF8,pAttrs->GetArray()[i]); ++ else ++ { ++ filter += NS_LITERAL_CSTRING("(&"); ++ nsAbBooleanConditionType doesNotExistsType = nsIAbBooleanConditionTypes::DoesNotExist; ++ for(inner = 0; inner < i; ++inner) ++ { ++ GenerateSingleFilter(doesNotExistsType,filter,vUTF8,pAttrs->GetArray()[inner]); ++ } ++ GenerateSingleFilter(conditionType,filter,vUTF8,pAttrs->GetArray()[i]); ++ filter += NS_LITERAL_CSTRING(")"); ++ } ++ } ++ } +*** misc/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 2001-09-28 22:06:21.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 42,47 **** +--- 42,48 ---- + #include "nsIAbBooleanExpression.h" + #include "nsCOMPtr.h" + #include "nsString.h" ++ #include "nsAbUtils.h" + + class nsAbBoolExprToLDAPFilter + { +*************** +*** 67,72 **** +--- 68,83 ---- + 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 2004-02-14 03:09:27.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 118,128 **** + + // use mURINoQuery to get a prefName + nsCAutoString prefName; +! prefName = nsDependentCString(mURINoQuery.get() + kLDAPDirectoryRootLen) + NS_LITERAL_CSTRING(".uri"); + + // turn moz-abldapdirectory://ldap_2.servers.nscpphonebook into -> "ldap_2.servers.nscpphonebook.uri" + nsXPIDLCString URI; +! rv = prefs->CopyCharPref(prefName.get(), getter_Copies(URI)); + if (NS_FAILED(rv)) + { + /* +--- 118,130 ---- + + // use mURINoQuery to get a prefName + nsCAutoString prefName; +! prefName = nsDependentCString(mURINoQuery.get() + kLDAPDirectoryRootLen) ; + + // turn moz-abldapdirectory://ldap_2.servers.nscpphonebook into -> "ldap_2.servers.nscpphonebook.uri" + nsXPIDLCString URI; +! nsCAutoString uriPrefName; +! uriPrefName = prefName + NS_LITERAL_CSTRING(".uri"); +! rv = prefs->CopyCharPref(uriPrefName.get(), getter_Copies(URI)); + if (NS_FAILED(rv)) + { + /* +*************** +*** 146,151 **** +--- 148,174 ---- + 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 + { +*************** +*** 156,179 **** + // get the login information, if there is any + // + rv = prefs->GetCharPref( +! PromiseFlatCString( +! Substring(mURINoQuery, kLDAPDirectoryRootLen, +! mURINoQuery.Length() - kLDAPDirectoryRootLen) + + NS_LITERAL_CSTRING(".auth.dn")).get(), + getter_Copies(mLogin)); + if (NS_FAILED(rv)) { + mLogin.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) + + NS_LITERAL_CSTRING(".protocolVersion")).get(), + getter_Copies(protocolVersion)); + +--- 179,207 ---- + // get the login information, if there is any + // + rv = prefs->GetCharPref( +! 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(prefName + + NS_LITERAL_CSTRING(".protocolVersion")).get(), + getter_Copies(protocolVersion)); + +*** misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2004-02-14 03:09:27.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 74,80 **** + PRInt32 resultLimit = -1, + PRInt32 timeOut = 0); + virtual ~nsAbQueryLDAPMessageListener (); +! + protected: + nsresult OnLDAPMessageBind (nsILDAPMessage *aMessage); + nsresult OnLDAPMessageSearchEntry (nsILDAPMessage *aMessage, +--- 74,80 ---- + 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, +*************** +*** 105,110 **** +--- 105,112 ---- + PRBool mInitialized; + PRBool mCanceled; + ++ nsAutoString m_sPassword; ++ + nsCOMPtr<nsILDAPOperation> mSearchOperation; + + PRLock* mLock; +*************** +*** 255,261 **** + + // If mLogin is set, we're expected to use it to get a password. + // +! if (!mDirectoryQuery->mLogin.IsEmpty()) { + // XXX hack until nsUTF8AutoString exists + #define nsUTF8AutoString nsCAutoString + nsUTF8AutoString spec; +--- 257,263 ---- + + // If mLogin is set, we're expected to use it to get a password. + // +! if (!mDirectoryQuery->mLogin.IsEmpty() && !m_sPassword.Length()) { + // XXX hack until nsUTF8AutoString exists + #define nsUTF8AutoString nsCAutoString + nsUTF8AutoString spec; +*************** +*** 398,407 **** + rv = ldapOperation->Init(mConnection, proxyListener, nsnull); + NS_ENSURE_SUCCESS(rv, rv); + +! // Bind +! rv = ldapOperation->SimpleBind(NS_ConvertUCS2toUTF8(passwd)); + NS_ENSURE_SUCCESS(rv, rv); +- + return rv; + } + +--- 400,412 ---- + rv = ldapOperation->Init(mConnection, proxyListener, nsnull); + NS_ENSURE_SUCCESS(rv, rv); + +! +! // 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; + } + +*************** +*** 685,691 **** + rv = getLdapReturnAttributes (arguments, returnAttributes); + NS_ENSURE_SUCCESS(rv, rv); + +! + // Get the filter + nsCOMPtr<nsISupports> supportsExpression; + rv = arguments->GetExpression (getter_AddRefs (supportsExpression)); +--- 690,696 ---- + rv = getLdapReturnAttributes (arguments, returnAttributes); + NS_ENSURE_SUCCESS(rv, rv); + +! + // Get the filter + nsCOMPtr<nsISupports> supportsExpression; + rv = arguments->GetExpression (getter_AddRefs (supportsExpression)); +*************** +*** 811,816 **** +--- 816,826 ---- + timeOut); + if (_messageListener == NULL) + return NS_ERROR_OUT_OF_MEMORY; ++ ++ nsAutoString wPassword; ++ wPassword.AssignWithConversion(mPassword.get()); ++ _messageListener->SetPassword(wPassword); ++ + messageListener = _messageListener; + nsVoidKey key (NS_REINTERPRET_CAST(void *,contextID)); + +*** misc/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 2004-02-14 03:09:27.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 74,79 **** +--- 74,80 ---- + nsresult RemoveListener (PRInt32 contextID); + 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/nsAbLDAPProperties.cpp 2003-03-22 16:43:29.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 39,44 **** +--- 39,45 ---- + #include "nsAbLDAPProperties.h" + + #include "nsAbUtils.h" ++ #include "nsCRT.h" + + #include "nsCOMPtr.h" + #include "nsString.h" +*************** +*** 59,64 **** +--- 60,80 ---- + If there are multiple entries for a mozilla + property the first takes precedence. + ++ But where we need to do a query against ++ a multiple occurring ldap attribute we ++ need to OR all the possible ldap entries e.g. ++ ++ (CellularNumber=123456) translates to ++ (|(mobile=123456)(&(!(mobile=*))(cellphone=123456))(&(!(mobile=*))(!(cellphone=*))(carphone=123456))) ++ ++ i.e. use the first occurring attribute otherwise if ++ first does not exist use the second etc. ++ ++ [Multiple occurring ldap attributes do not ++ include aliases. We have also ignored the case ++ for including 'displayname' as the first occurring ++ attribute 'cn' is a required attribute.] ++ + This ensures that + + 1) Generality is maintained when mapping from +*************** +*** 101,152 **** + {MozillaProperty_String, "FaxNumber", "fax"}, + // organizationalPerson + {MozillaProperty_String, "FaxNumber", "facsimiletelephonenumber"}, +! // inetOrgPerson +! {MozillaProperty_String, "PagerNumber", "pager"}, +! // ? +! {MozillaProperty_String, "PagerNumber", "pagerphone"}, +! // inetOrgPerson +! {MozillaProperty_String, "CellularNumber", "mobile"}, +! // ? +! {MozillaProperty_String, "CellularNumber", "cellphone"}, +! // ? +! {MozillaProperty_String, "CellularNumber", "carphone"}, + + // No Home* properties defined yet + +! // organizationalPerson +! {MozillaProperty_String, "WorkAddress", "postofficebox"}, +! // ? +! {MozillaProperty_String, "WorkAddress", "streetaddress"}, + // ? + {MozillaProperty_String, "WorkCity", "l"}, + // ? + {MozillaProperty_String, "WorkCity", "locality"}, + // ? +! {MozillaProperty_String, "WorkState", "st"}, +! // ? +! {MozillaProperty_String, "WorkState", "region"}, +! // organizationalPerson +! {MozillaProperty_String, "WorkZipCode", "postalcode"}, +! // ? +! {MozillaProperty_String, "WorkZipCode", "zip"}, + // ? + {MozillaProperty_String, "WorkCountry", "countryname"}, + + // organizationalPerson + {MozillaProperty_String, "JobTitle", "title"}, + // ? +! {MozillaProperty_String, "Department", "ou"}, +! // ? +! {MozillaProperty_String, "Department", "orgunit"}, +! // ? +! {MozillaProperty_String, "Department", "department"}, +! // ? +! {MozillaProperty_String, "Department", "departmentnumber"}, +! // inetOrgPerson +! {MozillaProperty_String, "Company", "o"}, +! // ? +! {MozillaProperty_String, "Company", "company"}, + // ? + {MozillaProperty_String, "WorkCountry", "countryname"}, + // ? +--- 117,148 ---- + {MozillaProperty_String, "FaxNumber", "fax"}, + // organizationalPerson + {MozillaProperty_String, "FaxNumber", "facsimiletelephonenumber"}, +! // inetOrgPerson,? +! {MozillaProperty_String, "PagerNumber", "pager,pagerphone"}, +! // inetOrgPerson,?,? +! {MozillaProperty_String, "CellularNumber", "mobile,cellphone,carphone"}, + + // No Home* properties defined yet + +! // organizationalPerson,? +! {MozillaProperty_String, "WorkAddress", "postofficebox,streetaddress"}, + // ? + {MozillaProperty_String, "WorkCity", "l"}, + // ? + {MozillaProperty_String, "WorkCity", "locality"}, + // ? +! {MozillaProperty_String, "WorkState", "st,region"}, +! // organizationalPerson,? +! {MozillaProperty_String, "WorkZipCode", "postalcode,zip"}, + // ? + {MozillaProperty_String, "WorkCountry", "countryname"}, + + // organizationalPerson + {MozillaProperty_String, "JobTitle", "title"}, + // ? +! {MozillaProperty_String, "Department", "ou,orgunit,department,departmentnumber"}, +! // inetOrgPerson,? +! {MozillaProperty_String, "Company", "o,company"}, + // ? + {MozillaProperty_String, "WorkCountry", "countryname"}, + // ? +*************** +*** 168,177 **** + // ? + {MozillaProperty_String, "Custom4", "custom4"}, + +! // ? +! {MozillaProperty_String, "Notes", "notes"}, +! // person +! {MozillaProperty_String, "Notes", "description"}, + + // mozilla specfic + {MozillaProperty_Int, "PreferMailFormat", "xmozillausehtmlmail"}, +--- 164,171 ---- + // ? + {MozillaProperty_String, "Custom4", "custom4"}, + +! // ?,person +! {MozillaProperty_String, "Notes", "notes,description"}, + + // mozilla specfic + {MozillaProperty_Int, "PreferMailFormat", "xmozillausehtmlmail"}, +*************** +*** 209,218 **** + if (IsInitialized) { return ; } + + for (int i = tableSize - 1 ; i >= 0 ; -- i) { +- nsCStringKey keyMozilla (table [i].mozillaProperty, -1, nsCStringKey::NEVER_OWN); +- nsCStringKey keyLdap (table [i].ldapProperty, -1, nsCStringKey::NEVER_OWN); + + mLdapToMozilla.Put(&keyLdap, NS_REINTERPRET_CAST(void *, NS_CONST_CAST(MozillaLdapPropertyRelation*, &table[i]))) ; + mMozillaToLdap.Put(&keyMozilla, NS_REINTERPRET_CAST(void *, NS_CONST_CAST(MozillaLdapPropertyRelation*, &table[i]))) ; + } + IsInitialized = PR_TRUE; +--- 203,224 ---- + if (IsInitialized) { return ; } + + for (int i = tableSize - 1 ; i >= 0 ; -- i) { + ++ char *attrToken = nsnull; ++ char *LDAPProperty = nsCRT::strdup(table[i].ldapProperty); ++ char *tmpLDAPProperty; ++ ++ attrToken = nsCRT::strtok(LDAPProperty, ",", &tmpLDAPProperty); ++ while (attrToken != nsnull) ++ { ++ while ( ' ' == *attrToken) ++ attrToken++; ++ nsCStringKey keyLdap (attrToken, -1, nsCStringKey::NEVER_OWN); + mLdapToMozilla.Put(&keyLdap, NS_REINTERPRET_CAST(void *, NS_CONST_CAST(MozillaLdapPropertyRelation*, &table[i]))) ; ++ attrToken = nsCRT::strtok(tmpLDAPProperty, ",", &tmpLDAPProperty); ++ } ++ ++ nsCStringKey keyMozilla (table [i].mozillaProperty, -1, nsCStringKey::NEVER_OWN); + mMozillaToLdap.Put(&keyMozilla, NS_REINTERPRET_CAST(void *, NS_CONST_CAST(MozillaLdapPropertyRelation*, &table[i]))) ; + } + IsInitialized = PR_TRUE; +*************** +*** 234,243 **** + const MozillaLdapPropertyRelation* MozillaLdapPropertyRelator::findMozillaPropertyFromLdap (const char* ldapProperty) + { + Initialize(); + // ensure that we always do a case insensitive comparison + // against the incoming ldap attributes. +! nsCAutoString lowercasedProp(ldapProperty); +! ToLowerCase(nsDependentCString(ldapProperty), lowercasedProp); + nsCStringKey key(lowercasedProp); + + return NS_REINTERPRET_CAST(const MozillaLdapPropertyRelation *, mLdapToMozilla.Get(&key)) ; +--- 240,252 ---- + const MozillaLdapPropertyRelation* MozillaLdapPropertyRelator::findMozillaPropertyFromLdap (const char* ldapProperty) + { + Initialize(); ++ char *attrToken; ++ char *tmpLDAPProperty; ++ attrToken = nsCRT::strtok(NS_CONST_CAST(char *,ldapProperty), ",", &tmpLDAPProperty); + // ensure that we always do a case insensitive comparison + // against the incoming ldap attributes. +! nsCAutoString lowercasedProp (attrToken) ; +! ToLowerCase(nsDependentCString(attrToken),lowercasedProp); + nsCStringKey key(lowercasedProp); + + return NS_REINTERPRET_CAST(const MozillaLdapPropertyRelation *, mLdapToMozilla.Get(&key)) ; +*************** +*** 289,291 **** +--- 298,361 ---- + + return rv; + } ++ ++ // Parse the input string which may contain a single ldap attribute or multiple attributes in the form ++ // "string" or "string1,string2,string3" respectively and assign to the array. ++ nsresult MozillaLdapPropertyRelator::getAllLDAPAttrsFromMozilla (const char* aLDAPProperty, PRUint32 *aAttrCount, char * **aAttributes) ++ { ++ NS_ENSURE_ARG_POINTER(aAttrCount); ++ NS_ENSURE_ARG_POINTER(aAttributes); ++ ++ nsresult rv = NS_OK; ++ ++ *aAttributes = 0; ++ // we must have at least one attribute ++ *aAttrCount = 1; ++ ++ // if no multiple ldap attributes then allocate our single entry and exit ++ if (!strchr(aLDAPProperty,',')) ++ { ++ if (!(*aAttributes = NS_STATIC_CAST(char **, nsMemory::Alloc(sizeof(char *))))) ++ return NS_ERROR_OUT_OF_MEMORY; ++ if (!((*aAttributes)[0] = nsCRT::strdup(aLDAPProperty))) ++ return NS_ERROR_OUT_OF_MEMORY; ++ ++ return rv; ++ } ++ ++ char *attrToken = nsnull; ++ char *LDAPProperty = nsnull; ++ char *tmpLDAPProperty; ++ ++ if((LDAPProperty = nsCRT::strdup(aLDAPProperty)) == nsnull) ++ return NS_ERROR_OUT_OF_MEMORY; ++ ++ // set our tokenizer to the start ++ attrToken = nsCRT::strtok(LDAPProperty, ",", &tmpLDAPProperty); ++ ++ // Count up the attribute names ++ while ((attrToken = nsCRT::strtok(tmpLDAPProperty, ",", &tmpLDAPProperty)) != nsnull) ++ *aAttrCount += 1; ++ ++ nsCRT::free (LDAPProperty); ++ if(!(*aAttributes = NS_STATIC_CAST(char **, nsMemory::Alloc(*aAttrCount * sizeof(char *))))) ++ return NS_ERROR_OUT_OF_MEMORY; ++ ++ if((LDAPProperty = nsCRT::strdup(aLDAPProperty)) == nsnull) ++ return NS_ERROR_OUT_OF_MEMORY; ++ ++ PRInt32 j = 0; ++ attrToken = nsCRT::strtok(LDAPProperty, ",", &tmpLDAPProperty); ++ while (nsnull != attrToken) { ++ if(((*aAttributes)[j++] = nsCRT::strdup(attrToken)) == nsnull) ++ { ++ nsCRT::free(LDAPProperty); ++ return NS_ERROR_OUT_OF_MEMORY; ++ } ++ ++ attrToken = nsCRT::strtok(tmpLDAPProperty, ",", &tmpLDAPProperty); ++ } ++ ++ nsCRT::free(LDAPProperty); ++ return rv; ++ } +*** misc/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h 2002-04-09 11:27:24.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 85,90 **** +--- 85,91 ---- + static nsresult createCardPropertyFromLDAPMessage (nsILDAPMessage* message, + nsIAbCard* card, + PRBool* hasSetCardProperty); ++ static nsresult getAllLDAPAttrsFromMozilla (const char* aLDAPProperty, PRUint32 *aAttrCount, char * **aAttributes); + }; + + #endif +*** misc/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2005-07-13 17:11:03.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 1 **** +! dummy +--- 1,633 ---- +! /* +! * 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 2002-11-12 20:19:56.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 266,273 **** + if (mCardDatabase) + { + mCardDatabase->EditCard(this, PR_TRUE); +! mCardDatabase->Commit(nsAddrDBCommitType::kLargeCommit); +! return NS_OK; + } + else + return NS_ERROR_FAILURE; +--- 266,272 ---- + if (mCardDatabase) + { + mCardDatabase->EditCard(this, PR_TRUE); +! return mCardDatabase->Commit(nsAddrDBCommitType::kLargeCommit); + } + else + return NS_ERROR_FAILURE; +*** misc/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 2004-03-09 15:42:24.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 537,543 **** + } + } + } +! mDatabase->Commit(nsAddrDBCommitType::kLargeCommit); + } + return rv; + } +--- 537,543 ---- + } + } + } +! rv = mDatabase->Commit(nsAddrDBCommitType::kLargeCommit); + } + return rv; + } +*************** +*** 684,689 **** +--- 684,690 ---- + return NS_ERROR_NOT_IMPLEMENTED; + + nsresult rv = NS_OK; ++ + if (!mDatabase) + rv = GetAbDatabase(); + +*************** +*** 713,722 **** + mDatabase->CreateNewListCardAndAddToDB(this, m_dbRowID, newCard, PR_TRUE); + else + mDatabase->CreateNewCardAndAddToDB(newCard, PR_TRUE); +! mDatabase->Commit(nsAddrDBCommitType::kLargeCommit); + + NS_IF_ADDREF(*addedCard = newCard); +! return NS_OK; + } + + NS_IMETHODIMP nsAbMDBDirectory::DropCard(nsIAbCard* aCard, PRBool needToCopyCard) +--- 714,724 ---- + mDatabase->CreateNewListCardAndAddToDB(this, m_dbRowID, newCard, PR_TRUE); + else + mDatabase->CreateNewCardAndAddToDB(newCard, PR_TRUE); +! rv = mDatabase->Commit(nsAddrDBCommitType::kLargeCommit); + ++ NS_ENSURE_SUCCESS(rv, rv); + NS_IF_ADDREF(*addedCard = newCard); +! return rv; + } + + NS_IMETHODIMP nsAbMDBDirectory::DropCard(nsIAbCard* aCard, PRBool needToCopyCard) +*** misc/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 2004-03-09 16:18:40.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 97,102 **** +--- 97,103 ---- + { + index_DisplayName = 0, + index_EmailAddress, ++ index_SecondEmailAddress, + index_FirstName, + index_LastName, + index_NickName, +*************** +*** 124,155 **** + + 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 + } ; + + nsresult nsAbOutlookCard::Init(const char *aUri) + { + nsresult retCode = nsRDFResource::Init(aUri) ; +--- 125,158 ---- + + static const ULONG OutlookCardMAPIProps [] = + { +! 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) ; +*************** +*** 176,181 **** +--- 179,185 ---- + 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()) ; +*************** +*** 210,221 **** + nsAutoString unichar ; + nsAutoString unicharBis ; + +! if (mapiAddBook->GetPropertyUString(*mMapiData, PR_HOME_ADDRESS_STREET_W, unichar)) { + splitString(unichar, unicharBis) ; + SetHomeAddress(unichar.get()) ; + SetHomeAddress2(unicharBis.get()) ; + } +! if (mapiAddBook->GetPropertyUString(*mMapiData, PR_BUSINESS_ADDRESS_STREET_W, unichar)) { + splitString(unichar, unicharBis) ; + SetWorkAddress(unichar.get()) ; + SetWorkAddress2(unicharBis.get()) ; +--- 214,225 ---- + nsAutoString unichar ; + nsAutoString unicharBis ; + +! 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_A, unichar)) { + splitString(unichar, unicharBis) ; + SetWorkAddress(unichar.get()) ; + SetWorkAddress2(unicharBis.get()) ; +*************** +*** 297,302 **** +--- 301,307 ---- + 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])) ; +*************** +*** 316,324 **** + 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")) ; + } + delete [] properties ; + nsXPIDLString unichar ; +--- 321,336 ---- + GetWebPage1(getter_Copies(properties [index_WorkWebPage])) ; + GetWebPage2(getter_Copies(properties [index_HomeWebPage])) ; + GetNotes(getter_Copies(properties [index_Comments])) ; +! +! 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/nsAbOutlookDirectory.cpp 2004-02-05 19:33:06.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 126,132 **** + PRINTF(("Cannot get type.\n")) ; + return NS_ERROR_FAILURE ; + } +! if (!mapiAddBook->GetPropertyUString(*mMapiData, PR_DISPLAY_NAME_W, unichars)) { + PRINTF(("Cannot get name.\n")) ; + return NS_ERROR_FAILURE ; + } +--- 126,132 ---- + PRINTF(("Cannot get type.\n")) ; + return NS_ERROR_FAILURE ; + } +! if (!mapiAddBook->GetPropertyUString(*mMapiData, PR_DISPLAY_NAME_A, unichars)) { + PRINTF(("Cannot get name.\n")) ; + return NS_ERROR_FAILURE ; + } +*************** +*** 163,207 **** + return retCode; + } + + NS_IMETHODIMP nsAbOutlookDirectory::GetChildCards(nsIEnumerator **aCards) + { + if (!aCards) { return NS_ERROR_NULL_POINTER ; } + *aCards = nsnull ; + nsCOMPtr<nsISupportsArray> cardList ; + nsresult retCode ; + +- mCardList.Reset() ; + if (mIsQueryURI) { + retCode = StartSearch() ; +- NS_NewISupportsArray(getter_AddRefs(cardList)) ; + } + else { +! retCode = GetChildCards(getter_AddRefs(cardList), nsnull) ; + } + 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 ; + +- 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) ; + +! if (!oldElement) { + // 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)) ; + + 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 +--- 163,247 ---- + 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 ; + + if (mIsQueryURI) { + retCode = StartSearch() ; + } + else { +! 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 ; +! nsCAutoString uriName; +! nsCOMPtr <nsIAbCard> childCard; +! PRBool searchForOldCards = 0; //(mCardList.Count() != 0) ; +! +! nbCards = uriList.Count(); +! NS_NewISupportsArray(getter_AddRefs(m_AddressList)); + + for (PRUint32 i = 0 ; i < nbCards ; ++ i) { +! PRBool isNewCard = PR_FALSE ; + +! 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 +! 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,241 **** + NotifyItemAddition(card) ; + } + } +- else { +- NS_ASSERTION(oldElement == element, "Different card stored") ; + } + } + } + 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 = mCardList.Exists(&key) ; + return NS_OK ; +--- 264,296 ---- + NotifyItemAddition(card) ; + } + } + } + } ++ 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 ; } +! *aHasCard = PR_FALSE ; +! nsCString uri ; +! +! ExtractUriFromCard(aCard, uri) ; +! nsCStringKey key(uri) ; + + *aHasCard = mCardList.Exists(&key) ; + return NS_OK ; +*************** +*** 317,323 **** + PRINTF(("Cannot delete card %s.\n", entryString.get())) ; + } + else { +! nsVoidKey key (NS_STATIC_CAST(void *, element)) ; + + mCardList.Remove(&key) ; + if (m_IsMailList) { m_AddressList->RemoveElement(element) ; } +--- 372,381 ---- + PRINTF(("Cannot delete card %s.\n", entryString.get())) ; + } + else { +! nsCString uri ; +! +! ExtractUriFromCard(card, uri) ; +! nsCStringKey key(uri) ; + + mCardList.Remove(&key) ; + if (m_IsMailList) { m_AddressList->RemoveElement(element) ; } +*************** +*** 386,392 **** + } + retCode = CreateCard(aData, addedCard) ; + NS_ENSURE_SUCCESS(retCode, retCode) ; +! nsVoidKey newKey (NS_STATIC_CAST(void *, *addedCard)) ; + + mCardList.Put(&newKey, *addedCard) ; + if (m_IsMailList) { m_AddressList->AppendElement(*addedCard) ; } +--- 444,453 ---- + } + retCode = CreateCard(aData, addedCard) ; + NS_ENSURE_SUCCESS(retCode, retCode) ; +! nsCString uri ; +! +! ExtractUriFromCard(*addedCard, uri) ; +! nsCStringKey newKey(uri) ; + + mCardList.Put(&newKey, *addedCard) ; + if (m_IsMailList) { m_AddressList->AppendElement(*addedCard) ; } +*************** +*** 457,463 **** + 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())) { + return NS_ERROR_FAILURE ; + } + retCode = CommitAddressList() ; +--- 518,524 ---- + if (!mapiAddBook->IsOK()) { return NS_ERROR_FAILURE ; } + retCode = GetDirName(getter_Copies(name)) ; + NS_ENSURE_SUCCESS(retCode, retCode) ; +! if (!mapiAddBook->SetPropertyUString(*mMapiData, PR_DISPLAY_NAME_A, name.get())) { + return NS_ERROR_FAILURE ; + } + retCode = CommitAddressList() ; +*************** +*** 518,523 **** +--- 579,585 ---- + {"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}, +*************** +*** 1032,1038 **** + + nsresult nsAbOutlookDirectory::OnSearchFoundCard(nsIAbCard *aCard) + { +! nsVoidKey newKey (NS_STATIC_CAST(void *, aCard)) ; + nsresult retCode = NS_OK ; + + mCardList.Put(&newKey, aCard) ; +--- 1094,1103 ---- + + nsresult nsAbOutlookDirectory::OnSearchFoundCard(nsIAbCard *aCard) + { +! nsCString uri ; +! +! ExtractUriFromCard(aCard, uri) ; +! nsCStringKey newKey(uri) ; + nsresult retCode = NS_OK ; + + mCardList.Put(&newKey, aCard) ; +*************** +*** 1056,1069 **** + retCode = BuildRestriction(aArguments, arguments) ; + NS_ENSURE_SUCCESS(retCode, retCode) ; + nsCOMPtr<nsISupportsArray> resultsArray ; + PRUint32 nbResults = 0 ; + +! retCode = GetChildCards(getter_AddRefs(resultsArray), + arguments.rt == RES_COMMENT ? nsnull : &arguments) ; + DestroyRestriction(arguments) ; + NS_ENSURE_SUCCESS(retCode, retCode) ; +! retCode = resultsArray->Count(&nbResults) ; +! NS_ENSURE_SUCCESS(retCode, retCode) ; + nsCOMPtr<nsIAbDirectoryQueryResult> result ; + nsAbDirectoryQueryResult *newResult = nsnull ; + +--- 1121,1134 ---- + retCode = BuildRestriction(aArguments, arguments) ; + NS_ENSURE_SUCCESS(retCode, retCode) ; + nsCOMPtr<nsISupportsArray> resultsArray ; ++ nsCStringArray uriArray ; + PRUint32 nbResults = 0 ; + +! retCode = GetChildCards(uriArray, + arguments.rt == RES_COMMENT ? nsnull : &arguments) ; + DestroyRestriction(arguments) ; + NS_ENSURE_SUCCESS(retCode, retCode) ; +! nbResults = uriArray.Count() ; + nsCOMPtr<nsIAbDirectoryQueryResult> result ; + nsAbDirectoryQueryResult *newResult = nsnull ; + +*************** +*** 1071,1085 **** + nbResults = NS_STATIC_CAST(PRUint32, aResultLimit) ; + } + PRUint32 i = 0 ; +- nsCOMPtr<nsISupports> element ; + nsCOMPtr<nsISupportsArray> propertyValues ; + + 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)) ; + + NS_ENSURE_SUCCESS(retCode, retCode) ; + FillPropertyValues(card, aArguments, getter_AddRefs(propertyValues)) ; + newResult = new nsAbDirectoryQueryResult(0, aArguments, + nsIAbDirectoryQueryResult::queryResultMatch, +--- 1136,1153 ---- + nbResults = NS_STATIC_CAST(PRUint32, aResultLimit) ; + } + PRUint32 i = 0 ; + nsCOMPtr<nsISupportsArray> propertyValues ; + ++ nsCAutoString uriName; ++ nsCOMPtr <nsIAbCard> card; ++ + for (i = 0 ; i < nbResults ; ++ i) { +! 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, +*************** +*** 1104,1116 **** + if (!aCards) { return NS_ERROR_NULL_POINTER ; } + *aCards = nsnull ; + nsresult retCode = NS_OK ; +! nsCOMPtr<nsISupportsArray> cards ; + 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")) ; +--- 1172,1214 ---- + if (!aCards) { return NS_ERROR_NULL_POINTER ; } + *aCards = nsnull ; + nsresult retCode = NS_OK ; +! +! 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 ; } + NS_ENSURE_SUCCESS(retCode, retCode) ; + if (!mapiAddBook->GetCards(*mMapiData, restriction, cardEntries)) { + PRINTF(("Cannot get cards.\n")) ; +*************** +*** 1119,1140 **** + nsCAutoString entryId ; + nsCAutoString uriName ; + nsCOMPtr<nsIRDFResource> resource ; +! nsCOMPtr <nsIAbCard> childCard; +! +! for (ULONG card = 0 ; card < cardEntries.mNbEntries ; ++ card) { +! cardEntries.mEntries [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) ; + } +- *aCards = cards ; +- NS_ADDREF(*aCards) ; + return retCode ; + } + +--- 1217,1230 ---- + nsCAutoString entryId ; + nsCAutoString uriName ; + nsCOMPtr<nsIRDFResource> resource ; +! aURI.Clear(); +! +! for (ULONG card = 0 ; card < cardEntries.GetSize() ; ++ card) { +! cardEntries [card].ToString(entryId) ; + buildAbWinUri(kOutlookCardScheme, mAbWinType, uriName) ; + uriName.Append(entryId) ; +! aURI.AppendCString(uriName); + } + return retCode ; + } + +*************** +*** 1158,1165 **** + nsCAutoString uriName ; + nsCOMPtr <nsIRDFResource> resource ; + +! for (ULONG node = 0 ; node < nodeEntries.mNbEntries ; ++ node) { +! nodeEntries.mEntries [node].ToString(entryId) ; + buildAbWinUri(kOutlookDirectoryScheme, mAbWinType, uriName) ; + uriName.Append(entryId) ; + retCode = gRDFService->GetResource(uriName, getter_AddRefs(resource)) ; +--- 1248,1255 ---- + nsCAutoString uriName ; + nsCOMPtr <nsIRDFResource> resource ; + +! 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)) ; +*************** +*** 1280,1286 **** + // 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) { + nsMapiEntry parentEntry ; + nsMapiEntry temporaryEntry ; + +--- 1370,1376 ---- + // 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 && mAbWinType == nsAbWinType_OutlookExp) { + nsMapiEntry parentEntry ; + nsMapiEntry temporaryEntry ; + +*** misc/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 2004-02-05 19:33:06.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 46,51 **** +--- 46,52 ---- + #include "nsHashtable.h" + + #include "nsISupportsArray.h" ++ #include "nsVoidArray.h" + + struct nsMapiEntry ; + +*************** +*** 92,97 **** +--- 93,100 ---- + 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,108 **** +--- 106,114 ---- + 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/nsAbOutlookDirFactory.cpp 2003-02-25 22:36:33.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 124,131 **** + nsCAutoString uri ; + nsCOMPtr<nsIRDFResource> resource ; + +! for (ULONG i = 0 ; i < folders.mNbEntries ; ++ i) { +! folders.mEntries [i].ToString(entryId) ; + buildAbWinUri(kOutlookDirectoryScheme, abType, uri) ; + uri.Append(entryId) ; + +--- 124,131 ---- + nsCAutoString uri ; + nsCOMPtr<nsIRDFResource> resource ; + +! for (ULONG i = 0 ; i < folders.GetSize() ; ++ i) { +! folders[i].ToString(entryId) ; + buildAbWinUri(kOutlookDirectoryScheme, abType, uri) ; + uri.Append(entryId) ; + +*** misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 2004-04-14 22:16:12.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 41,46 **** +--- 41,49 ---- + #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 "nsAbUtils.h" +*************** +*** 59,77 **** + + #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) + { +--- 62,67 ---- +*************** +*** 249,272 **** + MOZ_DECL_CTOR_COUNTER(nsMapiEntryArray) + + nsMapiEntryArray::nsMapiEntryArray(void) +- : mEntries(NULL), mNbEntries(0) + { + MOZ_COUNT_CTOR(nsMapiEntryArray) ; + } + + nsMapiEntryArray::~nsMapiEntryArray(void) + { +! if (mEntries) { delete [] mEntries ; } + MOZ_COUNT_DTOR(nsMapiEntryArray) ; + } +! + void nsMapiEntryArray::CleanUp(void) + { +! if (mEntries != NULL) { +! delete [] mEntries ; +! mEntries = NULL ; +! mNbEntries = 0 ; + } + } + + MOZ_DECL_CTOR_COUNTER(nsAbWinHelper) +--- 239,266 ---- + MOZ_DECL_CTOR_COUNTER(nsMapiEntryArray) + + nsMapiEntryArray::nsMapiEntryArray(void) + { + MOZ_COUNT_CTOR(nsMapiEntryArray) ; + } + + nsMapiEntryArray::~nsMapiEntryArray(void) + { +! CleanUp(); + MOZ_COUNT_DTOR(nsMapiEntryArray) ; + } +! void nsMapiEntryArray::AddItem(nsMapiEntry * aEntries) +! { +! m_array.AppendElement(aEntries); +! } + void nsMapiEntryArray::CleanUp(void) + { +! 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,379 **** + // same protection (MAPI is supposed to be thread-safe). + PRLock *nsAbWinHelper::mMutex = PR_NewLock() ; + + nsAbWinHelper::nsAbWinHelper(void) +! : mAddressBook(NULL), mLastError(S_OK) + { + MOZ_COUNT_CTOR(nsAbWinHelper) ; + } + + nsAbWinHelper::~nsAbWinHelper(void) + { + MOZ_COUNT_DTOR(nsAbWinHelper) ; +! } +! +! BOOL nsAbWinHelper::GetFolders(nsMapiEntryArray& aFolders) + { +! 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 ; + } +- 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) ; + } + + BOOL nsAbWinHelper::GetNodes(const nsMapiEntry& aParent, nsMapiEntryArray& aNodes) + { + aNodes.CleanUp() ; +! return GetContents(aParent, NULL, &aNodes.mEntries, aNodes.mNbEntries, MAPI_DISTLIST) ; + } + + BOOL nsAbWinHelper::GetCardsCount(const nsMapiEntry& aParent, ULONG& aNbCards) + { +! aNbCards = 0 ; +! return GetContents(aParent, NULL, NULL, aNbCards, 0) ; + } + + BOOL nsAbWinHelper::GetPropertyString(const nsMapiEntry& aObject, +--- 274,328 ---- + // 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) +! :mLastError(S_OK) + { + MOZ_COUNT_CTOR(nsAbWinHelper) ; ++ m_clients++; + } + + nsAbWinHelper::~nsAbWinHelper(void) + { + MOZ_COUNT_DTOR(nsAbWinHelper) ; +! m_clients--; +! if (!m_clients) + { +! delete [] m_pUniBuff; +! m_pUniBuff = NULL; +! m_uniBuffLen = 0; +! delete [] m_pCStrBuff; +! m_pCStrBuff = NULL; +! m_cstrBuffLen = 0; + } + } +! + + BOOL nsAbWinHelper::GetCards(const nsMapiEntry& aParent, LPSRestriction aRestriction, + nsMapiEntryArray& aCards) + { + aCards.CleanUp() ; +! return GetContents(aParent, aRestriction, &aCards, 0) ; + } + + BOOL nsAbWinHelper::GetNodes(const nsMapiEntry& aParent, nsMapiEntryArray& aNodes) + { + aNodes.CleanUp() ; +! return GetContents(aParent, NULL, &aNodes, MAPI_DISTLIST) ; + } + + BOOL nsAbWinHelper::GetCardsCount(const nsMapiEntry& aParent, ULONG& aNbCards) + { +! nsMapiEntryArray aCards; +! BOOL ret=GetContents(aParent, NULL, &aCards, 0) ; +! aNbCards=aCards.GetSize(); +! return ret; + } + + BOOL nsAbWinHelper::GetPropertyString(const nsMapiEntry& aObject, +*************** +*** 390,396 **** + aName = values->Value.lpszA ; + } + else if (PROP_TYPE(values->ulPropTag) == PT_UNICODE) { +! aName.AssignWithConversion(values->Value.lpszW) ; + } + } + FreeBuffer(values) ; +--- 339,345 ---- + aName = values->Value.lpszA ; + } + else if (PROP_TYPE(values->ulPropTag) == PT_UNICODE) { +! UnicodeToCStr(values->Value.lpszW,aName) ; + } + } + FreeBuffer(values) ; +*************** +*** 410,416 **** + aName = values->Value.lpszW ; + } + else if (PROP_TYPE(values->ulPropTag) == PT_STRING8) { +! aName.AssignWithConversion(values->Value.lpszA) ; + } + } + FreeBuffer(values) ; +--- 359,365 ---- + aName = values->Value.lpszW ; + } + else if (PROP_TYPE(values->ulPropTag) == PT_STRING8) { +! CStrToUnicode(values->Value.lpszA,aName) ; + } + } + FreeBuffer(values) ; +*************** +*** 431,446 **** + 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_STRING8) { + nsAutoString temp ; + +! temp.AssignWithConversion (values [i].Value.lpszA) ; + aNames.AppendString(temp) ; + } + else if (PROP_TYPE(values [i].ulPropTag) == PT_UNICODE) { + aNames.AppendString(nsAutoString (values [i].Value.lpszW)) ; + } + else { + aNames.AppendString(nsAutoString((const PRUnichar *) "")) ; + } +--- 380,401 ---- + ULONG i = 0 ; + + for (i = 0 ; i < valueCount ; ++ 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 ; + +! 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,472 **** + 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 ; +--- 421,426 ---- +*************** +*** 518,524 **** + nsMapiInterfaceWrapper<LPMAPIPROP> subObject ; + ULONG objType = 0 ; + +! mLastError = mAddressBook->OpenEntry(aContainer.mByteCount, aContainer.mEntryId, + &IID_IMAPIContainer, 0, &objType, + container) ; + if (HR_FAILED(mLastError)) { +--- 472,478 ---- + nsMapiInterfaceWrapper<LPMAPIPROP> subObject ; + ULONG objType = 0 ; + +! mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId, + &IID_IMAPIContainer, 0, &objType, + container) ; + if (HR_FAILED(mLastError)) { +*************** +*** 537,543 **** + SBinary entry ; + SBinaryArray entryArray ; + +! mLastError = mAddressBook->OpenEntry(aContainer.mByteCount, aContainer.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +--- 491,497 ---- + SBinary entry ; + SBinaryArray entryArray ; + +! mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +*************** +*** 567,580 **** + value.Value.lpszW = NS_CONST_CAST(WORD *, aValue) ; + } + else if (PROP_TYPE(aPropertyTag) == PT_STRING8) { +! alternativeValue.AssignWithConversion(aValue) ; + 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) ; + } + + BOOL nsAbWinHelper::SetPropertiesUString(const nsMapiEntry& aObject, const ULONG *aPropertiesTag, +--- 521,535 ---- + value.Value.lpszW = NS_CONST_CAST(WORD *, aValue) ; + } + else if (PROP_TYPE(aPropertyTag) == PT_STRING8) { +! UnicodeToCStr(aValue,alternativeValue) ; + value.Value.lpszA = NS_CONST_CAST(char *, alternativeValue.get()) ; + } + else { + PRINTF(("Property %08x is not a string.\n", aPropertyTag)) ; + return TRUE ; + } +! LPSPropValue values=&value; +! return SetMAPIProperties(aObject, 1, values) ; + } + + BOOL nsAbWinHelper::SetPropertiesUString(const nsMapiEntry& aObject, const ULONG *aPropertiesTag, +*************** +*** 595,601 **** + values [currentValue ++].Value.lpszW = NS_CONST_CAST(WORD *, aValues [i].get()) ; + } + else if (PROP_TYPE(aPropertiesTag [i]) == PT_STRING8) { +! alternativeValue.AssignWithConversion(aValues [i].get()) ; + char *av = nsCRT::strdup(alternativeValue.get()) ; + if (!av) { + retCode = FALSE ; +--- 550,556 ---- + values [currentValue ++].Value.lpszW = NS_CONST_CAST(WORD *, aValues [i].get()) ; + } + else if (PROP_TYPE(aPropertiesTag [i]) == PT_STRING8) { +! UnicodeToCStr(aValues [i].get(),alternativeValue) ; + char *av = nsCRT::strdup(alternativeValue.get()) ; + if (!av) { + retCode = FALSE ; +*************** +*** 633,639 **** + readableTime.wSecond = 0 ; + readableTime.wMilliseconds = 0 ; + if (SystemTimeToFileTime(&readableTime, &value.Value.ft)) { +! return SetMAPIProperties(aObject, 1, &value) ; + } + return TRUE ; + } +--- 588,595 ---- + readableTime.wSecond = 0 ; + readableTime.wMilliseconds = 0 ; + if (SystemTimeToFileTime(&readableTime, &value.Value.ft)) { +! LPSPropValue values=&value; +! return SetMAPIProperties(aObject, 1, values) ; + } + return TRUE ; + } +*************** +*** 645,651 **** + nsMapiInterfaceWrapper<LPABCONT> container ; + ULONG objType = 0 ; + +! mLastError = mAddressBook->OpenEntry(aParent.mByteCount, aParent.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +--- 601,607 ---- + nsMapiInterfaceWrapper<LPABCONT> container ; + ULONG objType = 0 ; + +! mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +*************** +*** 708,714 **** + nsMapiInterfaceWrapper<LPABCONT> container ; + ULONG objType = 0 ; + +! mLastError = mAddressBook->OpenEntry(aParent.mByteCount, aParent.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +--- 664,670 ---- + nsMapiInterfaceWrapper<LPABCONT> container ; + ULONG objType = 0 ; + +! mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +*************** +*** 773,779 **** + nsMapiInterfaceWrapper<LPABCONT> container ; + ULONG objType = 0 ; + +! mLastError = mAddressBook->OpenEntry(aContainer.mByteCount, aContainer.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +--- 729,735 ---- + nsMapiInterfaceWrapper<LPABCONT> container ; + ULONG objType = 0 ; + +! mLastError = OpenEntry(aContainer.mByteCount, aContainer.mEntryId, + &IID_IABContainer, MAPI_MODIFY, &objType, + container) ; + if (HR_FAILED(mLastError)) { +*************** +*** 810,1003 **** + 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) + { +! if (aList != NULL) { *aList = NULL ; } +! aNbElements = 0 ; +! nsMapiInterfaceWrapper<LPMAPICONTAINER> parent ; +! nsMapiInterfaceWrapper<LPMAPITABLE> contents ; +! ULONG objType = 0 ; +! ULONG rowCount = 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 ; + } +! 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)) ; + } +! ++ aNbElements ; + } +- MyFreeProws(rowSet) ; +- } while (rowCount > 0) ; +- return TRUE ; + } +! +! BOOL nsAbWinHelper::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 = mAddressBook->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 nsAbWinHelper::SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties, +! const LPSPropValue& aValues) +! { +! nsMapiInterfaceWrapper<LPMAPIPROP> object ; +! ULONG objType = 0 ; +! LPSPropProblemArray problems = 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) ; + } + +! void nsAbWinHelper::MyFreeProws(LPSRowSet aRowset) +! { +! if (aRowset == NULL) { return ; } +! ULONG i = 0 ; + +! for (i = 0 ; i < aRowset->cRows ; ++ i) { +! FreeBuffer(aRowset->aRow [i].lpProps) ; +! } +! FreeBuffer(aRowset) ; + } + + nsAbWinHelperGuard::nsAbWinHelperGuard(PRUint32 aType) + : mHelper(NULL) + { + switch(aType) { +! case nsAbWinType_Outlook: mHelper = new nsMapiAddressBook ; break ; +! case nsAbWinType_OutlookExp: mHelper = new nsWabAddressBook ; break ; + default: break ; + } + } + + nsAbWinHelperGuard::~nsAbWinHelperGuard(void) + { +- delete mHelper ; + } + + const char *kOutlookDirectoryScheme = "moz-aboutlookdirectory://" ; +--- 766,842 ---- + return TRUE ; + } + + + + +! void nsAbWinHelper::MyFreeProws(LPSRowSet aRowset) + { +! if (aRowset == NULL) { return ; } +! ULONG i = 0 ; + +! for (i = 0 ; i < aRowset->cRows ; ++ i) { +! FreeBuffer(aRowset->aRow [i].lpProps) ; + } +! 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; + } +! if (wLen) +! { +! MultiByteToWideChar( CP_ACP, 0, pStr, -1, m_pUniBuff, m_uniBuffLen); +! result = m_pUniBuff; + } + } +! void nsAbWinHelper::UnicodeToCStr( const PRUnichar *pUStr,nsCString& result) + { +! 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; + } +! if (cLen) { +! WideCharToMultiByte( CP_ACP, 0, pUStr, -1, m_pCStrBuff, m_cstrBuffLen,NULL,NULL); +! result = m_pCStrBuff; + } + } + +! static nsAbWinHelper *getOutlookAddressBook(void) { +! static nsMapiAddressBook *addressBook = NULL ; + +! if (addressBook == NULL) { addressBook = new nsMapiAddressBook ; } +! return addressBook ; + } + +! static nsAbWinHelper *getOutlookExpAddressBook(void) { +! static nsWabAddressBook *addressBook = NULL ; + +! if (addressBook == NULL) { addressBook = new nsWabAddressBook ; } +! return addressBook ; + } + + nsAbWinHelperGuard::nsAbWinHelperGuard(PRUint32 aType) + : mHelper(NULL) + { + switch(aType) { +! case nsAbWinType_Outlook: mHelper = getOutlookAddressBook() ; break ; +! case nsAbWinType_OutlookExp: mHelper = getOutlookExpAddressBook() ; break ; + default: break ; + } + } + + nsAbWinHelperGuard::~nsAbWinHelperGuard(void) + { + } + + const char *kOutlookDirectoryScheme = "moz-aboutlookdirectory://" ; +*** misc/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 2004-04-14 22:16:12.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 45,50 **** +--- 45,68 ---- + #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,75 **** + + struct nsMapiEntryArray + { +- nsMapiEntry *mEntries ; +- ULONG mNbEntries ; + + nsMapiEntryArray(void) ; + ~nsMapiEntryArray(void) ; + +! const nsMapiEntry& operator [] (int aIndex) const { return mEntries [aIndex] ; } + void CleanUp(void) ; + } ; + + class nsAbWinHelper +--- 80,107 ---- + + struct nsMapiEntryArray + { + + nsMapiEntryArray(void) ; + ~nsMapiEntryArray(void) ; + +! 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,85 **** + virtual ~nsAbWinHelper(void) ; + + // Get the top address books +! BOOL GetFolders(nsMapiEntryArray& aFolders) ; + // Get a list of entries for cards/mailing lists in a folder/mailing list + BOOL GetCards(const nsMapiEntry& aParent, LPSRestriction aRestriction, + nsMapiEntryArray& aCards) ; +--- 111,117 ---- + virtual ~nsAbWinHelper(void) ; + + // Get the top address books +! 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,114 **** + 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, + 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, + const PRUnichar *aValue) ; + // Same as previous, but with a bunch of properties in one call + BOOL SetPropertiesUString(const nsMapiEntry& aObject, const ULONG *aPropertiesTag, +--- 129,142 ---- + BOOL GetPropertiesUString(const nsMapiEntry& aObject, const ULONG *aPropertiesTag, + ULONG aNbProperties, nsStringArray& aValues) ; + // Get the value of a MAPI property of type SYSTIME +! virtual BOOL GetPropertyDate(const nsMapiEntry& aObject, ULONG aPropertyTag, + WORD& aYear, WORD& aMonth, WORD& aDay) ; + // 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) ; + // Set the value of a MAPI property of type string in unicode +! 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,148 **** + 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) ; + // Create a distribution list in the address book +! 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) ; + // Get a default address book container +! BOOL GetDefaultContainer(nsMapiEntry& aContainer) ; + // Is the helper correctly initialised? +! BOOL IsOK(void) const { return mAddressBook != NULL ; } + + protected: + HRESULT mLastError ; +- LPADRBOOK mAddressBook ; + static PRUint32 mEntryCounter ; + static PRLock *mMutex ; + + // Retrieve the contents of a container, with an optional restriction +! BOOL GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction, +! nsMapiEntry **aList, ULONG &aNbElements, ULONG aMapiType) ; + // Retrieve the values of a set of properties on a MAPI object +! 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 +! BOOL SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties, +! const LPSPropValue& aValues) ; + // Clean-up a rowset returned by QueryRows + void MyFreeProws(LPSRowSet aSet) ; + // Allocation of a buffer for transmission to interfaces +--- 145,188 ---- + BOOL SetPropertyDate(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) ; + // Get a default address book container +! virtual BOOL GetDefaultContainer(nsMapiEntry& aContainer) =0; + // Is the helper correctly initialised? +! 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 ; + 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 +! 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 +! virtual BOOL GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags, + ULONG aNbProperties, +! LPSPropValue& aValues, ULONG& aValueCount) =0; + // Set the values of a set of properties on a MAPI object +! 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,156 **** +--- 190,205 ---- + // 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,173 **** +--- 217,223 ---- + + nsAbWinHelper *operator ->(void) { return mHelper ; } + ++ static void FreeWinAbLibrarys(); + private: + nsAbWinHelper *mHelper ; + } ; +*** misc/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 2003-12-24 18:18:08.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 97,102 **** +--- 97,105 ---- + + 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() +*************** +*** 166,171 **** +--- 169,175 ---- + m_LastRecordKey(0), + m_dbDirectory(nsnull) + { ++ memset(m_dbMd5Sum,0,33); + } + + nsAddrDatabase::~nsAddrDatabase() +*************** +*** 720,726 **** + NS_RELEASE(oldFile); // always release our file ref, store has own + } + } +! + nsCRT::free(nativeFileName); + + if (NS_SUCCEEDED(ret) && thumb) +--- 724,734 ---- + NS_RELEASE(oldFile); // always release our file ref, store has own + } + } +! +! ret = getMD5sum(nativeFileName,m_dbMd5Sum); +! if (ret == 1) +! ret = NS_ERROR_FAILURE; +! + nsCRT::free(nativeFileName); + + if (NS_SUCCEEDED(ret) && thumb) +*************** +*** 817,822 **** +--- 825,841 ---- + 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) + { + mdb_percent outActualWaste = 0; +*************** +*** 867,872 **** +--- 886,895 ---- + // ### do something with error, but clear it now because mork errors out on commits. + if (GetEnv()) + GetEnv()->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 2004-01-28 18:22:13.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 396,401 **** +--- 396,402 ---- + 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 2001-10-30 08:59:16.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 41,46 **** +--- 41,62 ---- + + #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"); +*************** +*** 48,53 **** +--- 64,123 ---- + + #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 ; +*************** +*** 60,66 **** + BOOL nsMapiAddressBook::mInitialized = FALSE ; + BOOL nsMapiAddressBook::mLogonDone = FALSE ; + LPMAPISESSION nsMapiAddressBook::mRootSession = NULL ; +! LPADRBOOK nsMapiAddressBook::mRootBook = NULL ; + + BOOL nsMapiAddressBook::LoadMapiLibrary(void) + { +--- 130,136 ---- + BOOL nsMapiAddressBook::mInitialized = FALSE ; + BOOL nsMapiAddressBook::mLogonDone = FALSE ; + LPMAPISESSION nsMapiAddressBook::mRootSession = NULL ; +! #define MAPI_NO_COINIT 8 + + BOOL nsMapiAddressBook::LoadMapiLibrary(void) + { +*************** +*** 92,98 **** + mMAPILogonEx = NS_REINTERPRET_CAST(LPMAPILOGONEX, + GetProcAddress(mLibrary, "MAPILogonEx")) ; + if (!mMAPILogonEx) { return FALSE ; } +! MAPIINIT_0 mapiInit = { MAPI_INIT_VERSION, MAPI_MULTITHREAD_NOTIFICATIONS } ; + HRESULT retCode = mMAPIInitialize(&mapiInit) ; + + if (HR_FAILED(retCode)) { +--- 162,168 ---- + mMAPILogonEx = NS_REINTERPRET_CAST(LPMAPILOGONEX, + GetProcAddress(mLibrary, "MAPILogonEx")) ; + if (!mMAPILogonEx) { return FALSE ; } +! MAPIINIT_0 mapiInit = { MAPI_INIT_VERSION, MAPI_MULTITHREAD_NOTIFICATIONS | MAPI_NO_COINIT } ; + HRESULT retCode = mMAPIInitialize(&mapiInit) ; + + if (HR_FAILED(retCode)) { +*************** +*** 106,127 **** + MAPI_NEW_SESSION, + &mRootSession) ; + if (HR_FAILED(retCode)) { +! 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 (mRootBook) { mRootBook->Release() ; } + if (mRootSession) { + if (mLogonDone) { + mRootSession->Logoff(NULL, 0, 0) ; +--- 176,194 ---- + MAPI_NEW_SESSION, + &mRootSession) ; + if (HR_FAILED(retCode)) { +! PRINTF(("Cannot logon to MAPI %08x.\n", retCode)) ; +! return FALSE ; + } + mLogonDone = TRUE ; +! + return HR_SUCCEEDED(retCode) ; + } + + void nsMapiAddressBook::FreeMapiLibrary(void) + { + if (mLibrary) { +! if (--mLibUsage < 0) { + { + if (mRootSession) { + if (mLogonDone) { + mRootSession->Logoff(NULL, 0, 0) ; +*************** +*** 135,140 **** +--- 202,208 ---- + } + } + FreeLibrary(mLibrary) ; ++ mRootSession = NULL; + mLibrary = NULL ; + } + } +*************** +*** 146,152 **** + : nsAbWinHelper() + { + BOOL result = Initialize() ; +- + NS_ASSERTION(result == TRUE, "Couldn't initialize Mapi Helper") ; + MOZ_COUNT_CTOR(nsMapiAddressBook) ; + } +--- 214,219 ---- +*************** +*** 154,175 **** + nsMapiAddressBook::~nsMapiAddressBook(void) + { + nsAutoLock guard(mMutex) ; +! + FreeMapiLibrary() ; + MOZ_COUNT_DTOR(nsMapiAddressBook) ; + } + + BOOL nsMapiAddressBook::Initialize(void) + { +! if (mAddressBook) { return TRUE ; } + nsAutoLock guard(mMutex) ; + + if (!LoadMapiLibrary()) { + PRINTF(("Cannot load library.\n")) ; + return FALSE ; + } +! mAddressBook = mRootBook ; +! return TRUE ; + } + + void nsMapiAddressBook::AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer) +--- 221,1102 ---- + 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 ; + -+ 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 ; ++ 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) + { +! + nsAutoLock guard(mMutex) ; + + if (!LoadMapiLibrary()) { + PRINTF(("Cannot load library.\n")) ; + return FALSE ; + } +! return TRUE; + } + + void nsMapiAddressBook::AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer) +*************** +*** 182,188 **** +--- 1109,1911 ---- + 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 ; -+ -+ 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) -@@ -182,7 +1109,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; -+} -diff -ru misc/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h ---- misc/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h 2001-09-28 16:06:25.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h 2005-01-09 13:23:33.437500000 -0500 -@@ -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___ -diff -ru misc/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp ---- misc/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp 2001-10-30 02:59:16.000000000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp 2005-01-09 13:23:33.453125000 -0500 -@@ -47,6 +47,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 ; -@@ -95,7 +111,7 @@ - MOZ_DECL_CTOR_COUNTER(nsWabAddressBook) - - nsWabAddressBook::nsWabAddressBook(void) --: nsAbWinHelper() -+: nsAbWinHelper(),mAddressBook(NULL) - { - BOOL result = Initialize() ; - -@@ -110,9 +126,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()) { -diff -ru misc/mozilla/mailnews/addrbook/src/nsWabAddressBook.h misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.h ---- misc/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 2001-09-28 16:06:25.000000000 -0400 -+++ misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 2005-01-09 13:23:33.468750000 -0500 -@@ -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 : - } ; -diff -ru misc/mozilla/profile/src/nsProfile.cpp misc/build/mozilla/profile/src/nsProfile.cpp ---- misc/mozilla/profile/src/nsProfile.cpp 2004-04-24 13:15:40.000000000 -0400 -+++ misc/build/mozilla/profile/src/nsProfile.cpp 2005-01-09 13:23:33.515625000 -0500 -@@ -37,7 +37,9 @@ - - #include "nscore.h" - #include "nsProfile.h" -+#ifdef MOZ_PROFILELOCKING - #include "nsProfileLock.h" -+#endif - #include "nsIPrefService.h" - #include "nsIPrefBranch.h" - -@@ -499,12 +501,14 @@ - profileURLStr = PROFILE_MANAGER_URL; - if (exists) - { -+#ifdef MOZ_PROFILELOCKING - // If the profile is locked, we need the UI - nsCOMPtr<nsILocalFile> localFile(do_QueryInterface(curProfileDir)); - nsProfileLock tempLock; - rv = tempLock.Lock(localFile); - if (NS_FAILED(rv)) - profileURLStr = PROFILE_MANAGER_URL; -+#endif - } - } - else -@@ -1173,7 +1177,7 @@ - } - else - isSwitch = PR_FALSE; -- -+#ifdef MOZ_PROFILELOCKING - nsProfileLock localLock; - nsCOMPtr<nsILocalFile> localProfileDir(do_QueryInterface(profileDir, &rv)); - if (NS_FAILED(rv)) return rv; -@@ -1183,7 +1187,7 @@ - NS_ERROR("Could not get profile directory lock."); - return rv; - } -- -+#endif - nsCOMPtr<nsIObserverService> observerService = - do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_TRUE(observerService, NS_ERROR_FAILURE); -@@ -1237,8 +1241,10 @@ - UpdateCurrentProfileModTime(PR_FALSE); - } - -+#ifdef MOZ_PROFILELOCKING - // Do the profile switch - localLock.Unlock(); // gDirServiceProvider will get and hold its own lock -+#endif - gDirServiceProvider->SetProfileDir(profileDir); - mCurrentProfileName.Assign(aCurrentProfile); - gProfileDataAccess->SetCurrentProfile(aCurrentProfile); -diff -ru misc/mozilla/security/nss/lib/nss/config.mk misc/build/mozilla/security/nss/lib/nss/config.mk ---- misc/mozilla/security/nss/lib/nss/config.mk 2004-10-15 19:52:33.000000000 -0400 -+++ misc/build/mozilla/security/nss/lib/nss/config.mk 2005-01-09 13:23:33.531250000 -0500 -@@ -112,7 +112,7 @@ - MKSHLIB += -R '$$ORIGIN:/usr/lib/mps/secv1:/usr/lib/mps' - endif - else --MKSHLIB += -R '$$ORIGIN' -+#MKSHLIB += -R '$$ORIGIN' - endif - endif - ---- misc/build/mozilla/security/nss/lib/nss/nss.def 2004-07-13 10:38:04.000000000 +0800 -+++ misc/build/mozilla/security/nss/lib/nss/nss.def 2004-05-20 01:32:27.000000000 +0800 -@@ -60,6 +60,7 @@ - CERT_CheckCertValidTimes; - CERT_CreateCertificateRequest; - CERT_ChangeCertTrust; -+CERT_DecodeDERCertificate; - CERT_DecodeDERCrl; - CERT_DestroyCertificateRequest; - CERT_DestroyCertList; -diff -ru misc/mozilla/security/nss/lib/softoken/config.mk misc/build/mozilla/security/nss/lib/softoken/config.mk ---- misc/mozilla/security/nss/lib/softoken/config.mk 2004-10-15 19:52:35.000000000 -0400 -+++ misc/build/mozilla/security/nss/lib/softoken/config.mk 2005-01-09 13:23:33.546875000 -0500 -@@ -86,7 +86,7 @@ - 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' -+#MKSHLIB += -R '$$ORIGIN' - endif - - ifeq ($(OS_TARGET),WINCE) ---- misc/build/mozilla/security/nss/lib/ckfw/builtins/config.mk Sat Oct 16 07:52:32 2004 -+++ misc/build/mozilla/security/nss/lib/ckfw/builtins/config.mk Thu Jan 20 21:48:52 2005 -@@ -62,6 +62,6 @@ - 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' -+#MKSHLIB += -R '$$ORIGIN' - endif - ---- misc/build/mozilla/security/nss/lib/freebl/Makefile Sat Oct 16 07:52:33 2004 -+++ misc/build/mozilla/security/nss/lib/freebl/Makefile Thu Jan 20 21:49:40 2005 -@@ -182,8 +182,7 @@ - - # The -R '$ORIGIN' linker option instructs this library to search for its - # dependencies in the same directory where it resides. --MKSHLIB += -R '$$ORIGIN' -- -+#MKSHLIB += -R '$$ORIGIN' - ifeq ($(CPU_ARCH),sparc) - ifndef NS_USE_GCC - ifdef USE_HYBRID -@@ -199,7 +198,7 @@ - MKSHLIB += -Wl,-B,symbolic,-z,defs,-z,now,-z,text,-M,mapfile.Solaris - endif # GCC_USE_GNU_LD - else --MKSHLIB += -B symbolic -z defs -z now -z text -M mapfile.Solaris -+MKSHLIB += -z defs -z now -z text -M mapfile.Solaris - endif # NS_USE_GCC - ifdef USE_PURE_32 - # this builds for Sparc v8 pure 32-bit architecture -diff -u -r misc/build/mozilla/security/nss/lib/smime/config.mk misc/build/mozilla/security/nss/lib/smime/config.mk ---- misc/build/mozilla/security/nss/lib/smime/config.mk Sat Oct 16 07:52:34 2004 -+++ misc/build/mozilla/security/nss/lib/smime/config.mk Thu Jan 20 21:42:18 2005 -@@ -89,6 +89,6 @@ - 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' -+#MKSHLIB += -R '$$ORIGIN' - endif - -diff -u -r misc/build/mozilla/security/nss/lib/ssl/config.mk misc/build/mozilla/security/nss/lib/ssl/config.mk ---- misc/build/mozilla/security/nss/lib/ssl/config.mk Sat Oct 16 07:52:35 2004 -+++ misc/build/mozilla/security/nss/lib/ssl/config.mk Thu Jan 20 21:42:44 2005 -@@ -81,7 +81,7 @@ - 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' -+#MKSHLIB += -R '$$ORIGIN' - endif - - endif ---- misc/build/mozilla/gfx/src/gtk/Makefile.in Sun Jan 30 11:10:45 2005 -+++ misc/build/mozilla/gfx/src/gtk/Makefile.in Sun Jan 30 11:10:46 2005 -@@ -176,6 +176,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 ++ ++ 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 2001-09-28 22:06:25.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 40,51 **** +--- 40,81 ---- + + #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,85 **** + static BOOL mInitialized ; + static BOOL mLogonDone ; + static LPMAPISESSION mRootSession ; +! static LPADRBOOK mRootBook ; + + // Load the MAPI environment + BOOL Initialize(void) ; + // 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) ; + + private : + } ; + + #endif // nsMapiAddressBook_h___ +--- 97,173 ---- + static BOOL mInitialized ; + static BOOL mLogonDone ; + static LPMAPISESSION mRootSession ; +! + + // 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) ; +! +! 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 2001-10-30 08:59:16.000000000 +0100 +--- misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 47,52 **** +--- 47,68 ---- + + #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 ; +*************** +*** 95,101 **** + MOZ_DECL_CTOR_COUNTER(nsWabAddressBook) + + nsWabAddressBook::nsWabAddressBook(void) +! : nsAbWinHelper() + { + BOOL result = Initialize() ; + +--- 111,117 ---- + MOZ_DECL_CTOR_COUNTER(nsWabAddressBook) + + nsWabAddressBook::nsWabAddressBook(void) +! : nsAbWinHelper(),mAddressBook(NULL) + { + BOOL result = Initialize() ; + +*************** +*** 110,118 **** + MOZ_COUNT_DTOR(nsWabAddressBook) ; + } + + BOOL nsWabAddressBook::Initialize(void) + { +- if (mAddressBook) { return TRUE ; } + nsAutoLock guard(mMutex) ; + + if (!LoadWabLibrary()) { +--- 126,379 ---- + 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) + { + nsAutoLock guard(mMutex) ; + + if (!LoadWabLibrary()) { +*** misc/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 2001-09-28 22:06:25.000000000 +0200 +--- misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 47,52 **** +--- 47,61 ---- + 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,71 **** + static HMODULE mLibrary ; + static LPWABOPEN mWABOpen ; + + // Load the WAB environment + BOOL Initialize(void) ; + // 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 : + } ; +--- 66,111 ---- + 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) ; + + private : + } ; +*** misc/mozilla/modules/libpref/src/Makefile.in 2004-01-16 20:22:37.000000000 +0100 +--- misc/build/mozilla/modules/libpref/src/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 78,84 **** + PREF_JS_EXPORTS += $(srcdir)/init/non-shared.txt + endif + +! EXTRA_DSO_LDOPTS = \ + $(LIBS_DIR) \ + $(MOZ_JS_LIBS) \ + $(MOZ_COMPONENT_LIBS) \ +--- 78,84 ---- + PREF_JS_EXPORTS += $(srcdir)/init/non-shared.txt + endif + +! EXTRA_DSO_LDOPTS += \ + $(LIBS_DIR) \ + $(MOZ_JS_LIBS) \ + $(MOZ_COMPONENT_LIBS) \ +*************** +*** 89,91 **** +--- 89,92 ---- + GARBAGE += $(addprefix $(DIST)/bin/defaults/pref/, \ + all.js mailnews.js editor.js \ + aix.js beos.js unix.js winpref.js os2prefs.js openvms.js photon.js) ++ +*** misc/mozilla/nsprpub/lib/ds/Makefile.in 2003-04-09 23:49:32.000000000 +0200 +--- misc/build/mozilla/nsprpub/lib/ds/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 80,97 **** + OS_LIBS = -lc + 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) + else +! MKSHLIB += -Wl,-M,$(MAPFILE) + endif + else +! MKSHLIB += -M $(MAPFILE) + endif + endif + +--- 80,101 ---- + OS_LIBS = -lc + endif + ++ ifeq ($(OS_ARCH),Linux) ++ MKSHLIB += -Wl,-rpath,\$$ORIGIN ++ 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) -Wl,-rpath,\$$ORIGIN + else +! MKSHLIB += -Wl,-M,$(MAPFILE) -Wl,-R,'$$ORIGIN' + endif + else +! MKSHLIB += -M $(MAPFILE) -Wl,-R,'$$ORIGIN' + endif + endif + +*** misc/mozilla/nsprpub/lib/libc/src/Makefile.in 2003-04-09 23:49:35.000000000 +0200 +--- misc/build/mozilla/nsprpub/lib/libc/src/Makefile.in 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 90,107 **** + OS_LIBS = -lc + 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) + else +! MKSHLIB += -Wl,-M,$(MAPFILE) + endif + else +! MKSHLIB += -M $(MAPFILE) + endif + endif + +--- 90,111 ---- + OS_LIBS = -lc + endif + ++ ifeq ($(OS_ARCH),Linux) ++ MKSHLIB += -Wl,-rpath,\$$ORIGIN ++ 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) -Wl,-rpath,\$$ORIGIN + else +! MKSHLIB += -Wl,-M,$(MAPFILE) -Wl,-R,'$$ORIGIN' + endif + else +! MKSHLIB += -M $(MAPFILE) -Wl,-R,'$$ORIGIN' + endif + endif + +*** misc/mozilla/profile/src/nsProfile.cpp 2004-04-24 19:15:40.000000000 +0200 +--- misc/build/mozilla/profile/src/nsProfile.cpp 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 37,43 **** +--- 37,45 ---- + + #include "nscore.h" + #include "nsProfile.h" ++ #ifdef MOZ_PROFILELOCKING + #include "nsProfileLock.h" ++ #endif + #include "nsIPrefService.h" + #include "nsIPrefBranch.h" + +*************** +*** 499,510 **** +--- 501,514 ---- + profileURLStr = PROFILE_MANAGER_URL; + if (exists) + { ++ #ifdef MOZ_PROFILELOCKING + // If the profile is locked, we need the UI + nsCOMPtr<nsILocalFile> localFile(do_QueryInterface(curProfileDir)); + nsProfileLock tempLock; + rv = tempLock.Lock(localFile); + if (NS_FAILED(rv)) + profileURLStr = PROFILE_MANAGER_URL; ++ #endif + } + } + else +*************** +*** 1173,1179 **** + } + else + isSwitch = PR_FALSE; +! + nsProfileLock localLock; + nsCOMPtr<nsILocalFile> localProfileDir(do_QueryInterface(profileDir, &rv)); + if (NS_FAILED(rv)) return rv; +--- 1177,1183 ---- + } + else + isSwitch = PR_FALSE; +! #ifdef MOZ_PROFILELOCKING + nsProfileLock localLock; + nsCOMPtr<nsILocalFile> localProfileDir(do_QueryInterface(profileDir, &rv)); + if (NS_FAILED(rv)) return rv; +*************** +*** 1183,1189 **** + NS_ERROR("Could not get profile directory lock."); + return rv; + } +! + nsCOMPtr<nsIObserverService> observerService = + do_GetService("@mozilla.org/observer-service;1", &rv); + NS_ENSURE_TRUE(observerService, NS_ERROR_FAILURE); +--- 1187,1193 ---- + NS_ERROR("Could not get profile directory lock."); + return rv; + } +! #endif + nsCOMPtr<nsIObserverService> observerService = + do_GetService("@mozilla.org/observer-service;1", &rv); + NS_ENSURE_TRUE(observerService, NS_ERROR_FAILURE); +*************** +*** 1237,1244 **** +--- 1241,1250 ---- + UpdateCurrentProfileModTime(PR_FALSE); + } + ++ #ifdef MOZ_PROFILELOCKING + // Do the profile switch + localLock.Unlock(); // gDirServiceProvider will get and hold its own lock ++ #endif + gDirServiceProvider->SetProfileDir(profileDir); + mCurrentProfileName.Assign(aCurrentProfile); + gProfileDataAccess->SetCurrentProfile(aCurrentProfile); +*** misc/mozilla/security/coreconf/command.mk 2002-02-15 23:53:12.000000000 +0100 +--- misc/build/mozilla/security/coreconf/command.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 42,48 **** + LINK_DLL = $(LINK) $(OS_DLLFLAGS) $(DLLFLAGS) + LINK_EXE = $(LINK) $(OS_LFLAGS) $(LFLAGS) + NFSPWD = $(NSINSTALL_DIR)/nfspwd +! CFLAGS = $(OPTIMIZER) $(OS_CFLAGS) $(XP_DEFINE) $(DEFINES) $(INCLUDES) \ + $(XCFLAGS) + RANLIB = echo + TAR = /bin/tar +--- 42,48 ---- + LINK_DLL = $(LINK) $(OS_DLLFLAGS) $(DLLFLAGS) + LINK_EXE = $(LINK) $(OS_LFLAGS) $(LFLAGS) + NFSPWD = $(NSINSTALL_DIR)/nfspwd +! CFLAGS += $(OPTIMIZER) $(OS_CFLAGS) $(XP_DEFINE) $(DEFINES) $(INCLUDES) \ + $(XCFLAGS) + RANLIB = echo + TAR = /bin/tar +*** misc/mozilla/security/coreconf/Linux2.1.mk 2001-11-07 21:58:09.000000000 +0100 +--- misc/build/mozilla/security/coreconf/Linux2.1.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 36,42 **** + include $(CORE_DEPTH)/coreconf/Linux.mk + ifeq ($(OS_RELEASE),2.1) + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) -shared -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +--- 36,42 ---- + include $(CORE_DEPTH)/coreconf/Linux.mk + ifeq ($(OS_RELEASE),2.1) + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) $(DSO_LDOPTS) -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +*** misc/mozilla/security/coreconf/Linux2.2.mk 2001-11-07 21:56:18.000000000 +0100 +--- misc/build/mozilla/security/coreconf/Linux2.2.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 36,42 **** + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) -shared -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +--- 36,42 ---- + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) $(DSO_LDOPTS) -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +*** misc/mozilla/security/coreconf/Linux2.4.mk 2001-11-07 21:56:18.000000000 +0100 +--- misc/build/mozilla/security/coreconf/Linux2.4.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 36,42 **** + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) -shared -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +--- 36,42 ---- + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) $(DSO_LDOPTS) -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +*** misc/mozilla/security/coreconf/Linux2.5.mk 2002-01-27 01:45:37.000000000 +0100 +--- misc/build/mozilla/security/coreconf/Linux2.5.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 36,42 **** + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) -shared -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +--- 36,42 ---- + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) $(DSO_LDOPTS) -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +*** misc/mozilla/security/coreconf/Linux2.6.mk 2003-07-19 23:21:50.000000000 +0200 +--- misc/build/mozilla/security/coreconf/Linux2.6.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 36,42 **** + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) -shared -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +--- 36,42 ---- + include $(CORE_DEPTH)/coreconf/Linux.mk + + OS_REL_CFLAGS += -DLINUX2_1 +! MKSHLIB = $(CC) $(DSO_LDOPTS) -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +*** misc/mozilla/security/coreconf/Linux.mk 2004-02-11 03:33:51.000000000 +0100 +--- misc/build/mozilla/security/coreconf/Linux.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 123,129 **** + + ifeq ($(OS_RELEASE),2.0) + OS_REL_CFLAGS += -DLINUX2_0 +! MKSHLIB = $(CC) -shared -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +--- 123,129 ---- + + ifeq ($(OS_RELEASE),2.0) + OS_REL_CFLAGS += -DLINUX2_0 +! MKSHLIB = $(CC) $(DSO_LDOPTS) -Wl,-soname -Wl,$(@:$(OBJDIR)/%.so=%.so) + ifdef BUILD_OPT + OPTIMIZER = -O2 + endif +*************** +*** 149,154 **** +--- 149,155 ---- + + DSO_CFLAGS = -fPIC + DSO_LDOPTS = -shared ++ DSO_LDOPTS += -Wl,-rpath,\$$ORIGIN + DSO_LDFLAGS = + + # INCLUDES += -I/usr/include -Y/usr/include/linux +*** misc/mozilla/security/coreconf/SunOS5.mk 2004-10-16 01:52:29.000000000 +0200 +--- misc/build/mozilla/security/coreconf/SunOS5.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 164,175 **** +--- 164,177 ---- + + # 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 + else + ifeq ($(USE_64), 1) + ifeq ($(OS_TEST),i86pc) +*************** +*** 179,184 **** +--- 181,187 ---- + endif + endif + DSO_LDOPTS += -G -h $(notdir $@) ++ DSO_LDOPTS += -R '\$$ORIGIN' + endif + + # -KPIC generates position independent code for use in shared libraries. +*** misc/mozilla/security/nss/lib/ckfw/builtins/config.mk 2004-10-16 01:52:32.000000000 +0200 +--- misc/build/mozilla/security/nss/lib/ckfw/builtins/config.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 59,67 **** + 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 + +--- 59,62 ---- +*** misc/mozilla/security/nss/lib/freebl/Makefile 2004-10-16 01:52:33.000000000 +0200 +--- misc/build/mozilla/security/nss/lib/freebl/Makefile 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 179,189 **** + + # Note: -xarch=v8 or v9 is now done in coreconf + 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' +- + ifeq ($(CPU_ARCH),sparc) + ifndef NS_USE_GCC + ifdef USE_HYBRID +--- 179,184 ---- +*************** +*** 199,205 **** + MKSHLIB += -Wl,-B,symbolic,-z,defs,-z,now,-z,text,-M,mapfile.Solaris + endif # GCC_USE_GNU_LD + else +! MKSHLIB += -B symbolic -z defs -z now -z text -M mapfile.Solaris + endif # NS_USE_GCC + ifdef USE_PURE_32 + # this builds for Sparc v8 pure 32-bit architecture +--- 194,200 ---- + MKSHLIB += -Wl,-B,symbolic,-z,defs,-z,now,-z,text,-M,mapfile.Solaris + endif # GCC_USE_GNU_LD + else +! MKSHLIB += -z defs -z now -z text -M mapfile.Solaris + endif # NS_USE_GCC + ifdef USE_PURE_32 + # this builds for Sparc v8 pure 32-bit architecture +*** misc/mozilla/security/nss/lib/nss/config.mk 2004-10-16 01:52:33.000000000 +0200 +--- misc/build/mozilla/security/nss/lib/nss/config.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 107,120 **** + # 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/sparcv9:/usr/lib/mps/sparcv9' + else +! MKSHLIB += -R '$$ORIGIN:/usr/lib/mps/secv1:/usr/lib/mps' +! endif +! else +! MKSHLIB += -R '$$ORIGIN' +! endif +! endif + + + ifeq (,$(filter-out WINNT WIN95,$(OS_TARGET))) +--- 107,118 ---- + # The -R '$ORIGIN' linker option instructs this library to search for its + # dependencies in the same directory where it resides. + ifeq ($(USE_64), 1) +! DSO_LDOPTS += -R /usr/lib/mps/secv1/sparcv9:/usr/lib/mps/sparcv9 + else +! DSO_LDOPTS += -R /usr/lib/mps/secv1:/usr/lib/mps +! endif # USE_64 +! endif # BUILD_SUN_PKG +! endif # SunOS + + + ifeq (,$(filter-out WINNT WIN95,$(OS_TARGET))) +*** misc/mozilla/security/nss/lib/nss/nss.def 2004-10-16 01:52:33.000000000 +0200 +--- misc/build/mozilla/security/nss/lib/nss/nss.def 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 60,65 **** +--- 60,66 ---- + CERT_CheckCertValidTimes; + CERT_CreateCertificateRequest; + CERT_ChangeCertTrust; ++ CERT_DecodeDERCertificate; + CERT_DecodeDERCrl; + CERT_DestroyCertificateRequest; + CERT_DestroyCertList; +*** misc/mozilla/security/nss/lib/smime/config.mk 2004-10-16 01:52:34.000000000 +0200 +--- misc/build/mozilla/security/nss/lib/smime/config.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 85,94 **** + ../pkcs12 \ + ../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 +- +--- 85,87 ---- +*** misc/mozilla/security/nss/lib/softoken/config.mk 2004-10-16 01:52:35.000000000 +0200 +--- misc/build/mozilla/security/nss/lib/softoken/config.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 83,94 **** + $(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' +- endif +- + ifeq ($(OS_TARGET),WINCE) + DEFINES += -DDBM_USING_NSPR + endif +--- 83,88 ---- +*** misc/mozilla/security/nss/lib/ssl/config.mk 2004-10-16 01:52:35.000000000 +0200 +--- misc/build/mozilla/security/nss/lib/ssl/config.mk 2005-07-13 17:26:54.000000000 +0200 +*************** +*** 78,87 **** + 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' +- endif +- + endif +--- 78,81 ---- +*** misc/mozilla/xpfe/bootstrap/Makefile.in 2004-06-24 20:58:48.000000000 +0200 +--- misc/build/mozilla/xpfe/bootstrap/Makefile.in 2005-07-14 12:34:56.000000000 +0200 +*************** +*** 84,94 **** +--- 84,97 ---- + + include $(topsrcdir)/config/config.mk + ++ # reduce prerequisites by disabling mozilla binary ++ ifndef DISABLE_MOZ_EXECUTABLE + ifeq ($(USE_SHORT_LIBNAME),1) + PROGRAM = mozilla$(BIN_SUFFIX) + else + PROGRAM = mozilla-bin$(BIN_SUFFIX) + endif ++ endif + + # Force applications to be built non-statically + # when building the mozcomps meta component |