diff options
Diffstat (limited to 'moz/mozilla-source-1.7b.patch')
-rw-r--r-- | moz/mozilla-source-1.7b.patch | 5107 |
1 files changed, 0 insertions, 5107 deletions
diff --git a/moz/mozilla-source-1.7b.patch b/moz/mozilla-source-1.7b.patch deleted file mode 100644 index 8c6ee36ec1c2..000000000000 --- a/moz/mozilla-source-1.7b.patch +++ /dev/null @@ -1,5107 +0,0 @@ -Index: directory/xpcom/base/src/nsLDAPMessage.cpp -=================================================================== -RCS file: /cvsroot/mozilla/directory/xpcom/base/src/nsLDAPMessage.cpp,v -retrieving revision 1.28 -diff -u -r1.28 nsLDAPMessage.cpp ---- misc/build/mozilla/directory/xpcom/base/src/nsLDAPMessage.cpp 29 Jan 2004 22:04:23 -0000 1.28 -+++ misc/build/mozilla/directory/xpcom/base/src/nsLDAPMessage.cpp 17 May 2004 03:23:37 -0000 -@@ -513,7 +513,11 @@ - // - PRUint32 i; - for ( i = 0 ; i < numVals ; i++ ) { -- (*aValues)[i] = UTF8ToNewUnicode(nsDependentCString(values[i])); -+ if (IsUTF8(nsDependentCString(values[i]))) -+ (*aValues)[i] = UTF8ToNewUnicode(nsDependentCString(values[i])); -+ else -+ (*aValues)[i] = ToNewUnicode(nsDependentCString(values[i])); -+ - if ( ! (*aValues)[i] ) { - NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(i, aValues); - ldap_value_free(values); -Index: mailnews/addrbook/src/Makefile.in -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/Makefile.in,v -retrieving revision 1.47 -diff -u -r1.47 Makefile.in ---- misc/build/mozilla/mailnews/addrbook/src/Makefile.in 6 Oct 2003 17:48:56 -0000 1.47 -+++ misc/build/mozilla/mailnews/addrbook/src/Makefile.in 17 May 2004 03:23:53 -0000 -@@ -86,6 +86,7 @@ - nsVCard.cpp \ - nsVCardObj.cpp \ - nsMsgVCardService.cpp \ -+ nsAbMD5sum.cpp \ - $(NULL) - - EXPORTS = \ -Index: mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp,v -retrieving revision 1.4 -diff -u -r1.4 nsAbBoolExprToLDAPFilter.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp 11 Oct 2002 08:17:13 -0000 1.4 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.cpp 17 May 2004 03:23:53 -0000 -@@ -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(")"); -+ } -+ } -+} -Index: mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h,v -retrieving revision 1.2 -diff -u -r1.2 nsAbBoolExprToLDAPFilter.h ---- misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 28 Sep 2001 20:06:21 -0000 1.2 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbBoolExprToLDAPFilter.h 17 May 2004 03:23:53 -0000 -@@ -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 -Index: mailnews/addrbook/src/nsAbLDAPDirectory.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp,v -retrieving revision 1.17 -diff -u -r1.17 nsAbLDAPDirectory.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp 14 Feb 2004 02:09:27 -0000 1.17 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp 17 May 2004 03:23:53 -0000 -@@ -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)); - -Index: mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp,v -retrieving revision 1.22 -diff -u -r1.22 nsAbLDAPDirectoryQuery.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 14 Feb 2004 02:09:27 -0000 1.22 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp 17 May 2004 03:23:53 -0000 -@@ -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)); - -Index: mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h,v -retrieving revision 1.6 -diff -u -r1.6 nsAbLDAPDirectoryQuery.h ---- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 14 Feb 2004 02:09:27 -0000 1.6 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h 17 May 2004 03:23:53 -0000 -@@ -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) - -Index: mailnews/addrbook/src/nsAbLDAPProperties.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp,v -retrieving revision 1.11 -diff -u -r1.11 nsAbLDAPProperties.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp 22 Mar 2003 15:43:29 -0000 1.11 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.cpp 17 May 2004 03:23:53 -0000 -@@ -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)) ; -@@ -287,5 +296,66 @@ - } - } - -+ 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; - } -Index: mailnews/addrbook/src/nsAbLDAPProperties.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h,v -retrieving revision 1.7 -diff -u -r1.7 nsAbLDAPProperties.h ---- misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h 9 Apr 2002 09:27:24 -0000 1.7 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbLDAPProperties.h 17 May 2004 03:23:53 -0000 -@@ -85,6 +85,7 @@ - static nsresult createCardPropertyFromLDAPMessage (nsILDAPMessage* message, - nsIAbCard* card, - PRBool* hasSetCardProperty); -+ static nsresult getAllLDAPAttrsFromMozilla (const char* aLDAPProperty, PRUint32 *aAttrCount, char * **aAttributes); - }; - - #endif -Index: mailnews/addrbook/src/nsAbMDBCardProperty.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp,v -retrieving revision 1.15 -diff -u -r1.15 nsAbMDBCardProperty.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp 12 Nov 2002 19:19:56 -0000 1.15 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbMDBCardProperty.cpp 17 May 2004 03:23:53 -0000 -@@ -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; -Index: mailnews/addrbook/src/nsAbMDBDirectory.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp,v -retrieving revision 1.36 -diff -u -r1.36 nsAbMDBDirectory.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 9 Mar 2004 14:42:24 -0000 1.36 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbMDBDirectory.cpp 17 May 2004 03:23:53 -0000 -@@ -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) -Index: mailnews/addrbook/src/nsAbOutlookCard.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp,v -retrieving revision 1.14 -diff -u -r1.14 nsAbOutlookCard.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 9 Mar 2004 15:18:40 -0000 1.14 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookCard.cpp 17 May 2004 03:23:53 -0000 -@@ -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 ; -Index: mailnews/addrbook/src/nsAbOutlookDirFactory.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp,v -retrieving revision 1.9 -diff -u -r1.9 nsAbOutlookDirFactory.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp 25 Feb 2003 21:36:33 -0000 1.9 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirFactory.cpp 17 May 2004 03:23:53 -0000 -@@ -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) ; - -Index: mailnews/addrbook/src/nsAbOutlookDirectory.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp,v -retrieving revision 1.18 -diff -u -r1.18 nsAbOutlookDirectory.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp 5 Feb 2004 18:33:06 -0000 1.18 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.cpp 17 May 2004 03:23:53 -0000 -@@ -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 ; - -Index: mailnews/addrbook/src/nsAbOutlookDirectory.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h,v -retrieving revision 1.6 -diff -u -r1.6 nsAbOutlookDirectory.h ---- misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 5 Feb 2004 18:33:06 -0000 1.6 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbOutlookDirectory.h 17 May 2004 03:23:53 -0000 -@@ -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 -Index: mailnews/addrbook/src/nsAbWinHelper.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp,v -retrieving revision 1.13 -diff -u -r1.13 nsAbWinHelper.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 24 Dec 2003 19:55:05 -0000 1.13 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.cpp 17 May 2004 03:23:53 -0000 -@@ -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://" ; -Index: mailnews/addrbook/src/nsAbWinHelper.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAbWinHelper.h,v -retrieving revision 1.2 -diff -u -r1.2 nsAbWinHelper.h ---- misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 28 Sep 2001 20:06:23 -0000 1.2 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbWinHelper.h 17 May 2004 03:23:53 -0000 -@@ -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 ULONG 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 ; - } ; -Index: mailnews/addrbook/src/nsAddrDatabase.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp,v -retrieving revision 1.118 -diff -u -r1.118 nsAddrDatabase.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 24 Dec 2003 17:18:08 -0000 1.118 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp 17 May 2004 03:23:55 -0000 -@@ -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; - } - -Index: mailnews/addrbook/src/nsAddrDatabase.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsAddrDatabase.h,v -retrieving revision 1.46 -diff -u -r1.46 nsAddrDatabase.h ---- misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.h 28 Jan 2004 17:22:13 -0000 1.46 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAddrDatabase.h 17 May 2004 03:23:55 -0000 -@@ -396,6 +396,7 @@ - nsIMdbTable *m_mdbPabTable; - nsIMdbTable *m_mdbDeletedCardsTable; - nsFileSpec m_dbName; -+ char m_dbMd5Sum[33]; - PRBool m_mdbTokensInitialized; - nsVoidArray /*<nsIAddrDBListener>*/ *m_ChangeListeners; - -Index: mailnews/addrbook/src/nsMapiAddressBook.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp,v -retrieving revision 1.7 -diff -u -r1.7 nsMapiAddressBook.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp 30 Oct 2001 07:59:16 -0000 1.7 -+++ misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.cpp 17 May 2004 03:23:55 -0000 -@@ -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; -+ -+ nsMapiEntryArray listDel; -+ ULONG delindex=0; -+ -+ ULONG listsize; -+ ULONG resCount = 0; -+ ULONG resIndex = 0; -+ -+ listsize = aList->GetSize(); -+ conditionType = aRestriction->rt; -+ switch (conditionType) -+ { -+ case RES_EXIST : -+ case RES_BITMASK : -+ case RES_CONTENT : -+ case RES_PROPERTY : -+ case RES_SIZE : -+ case RES_COMPAREPROPS : -+ case RES_COMMENT : -+ case RES_SUBRESTRICTION : -+ { -+ while(listindex < aList->GetSize()) -+ { -+ if (!FilterOnOneRow(aList->ElementAt(listindex),aRestriction)) -+ aList->Remove(listindex); -+ else -+ listindex++; -+ } -+ } -+ break; -+ case RES_NOT : -+ aRestriction->res.resNot.ulReserved = 1; -+ case RES_AND : -+ case RES_OR : -+ { -+ if (conditionType == RES_OR) -+ { -+ for(listindex=0;listindex<aList->GetSize();listindex++) -+ { -+ listDel.AddItem(aList->ElementAt(listindex)); -+ } -+ } -+ -+ resCount = aRestriction->res.resAnd.cRes; -+ //notice that SAndRestriction ,SNotRestriction ,SOrRestriction -+ //use the same struct -+ for (resIndex = 0;resIndex < resCount;resIndex++) -+ { -+ //can't call listOut.CleanUp() here -+ //because it will destroy all Element too -+ while(listOut.GetSize()) -+ { -+ listOut.Remove(0); -+ } -+ -+ for(listindex=0;listindex<aList->GetSize();listindex++) -+ { -+ listOut.AddItem(aList->ElementAt(listindex)); -+ } -+ -+ Filter(&aRestriction->res.resAnd.lpRes[resIndex],&listOut); -+ if (conditionType == RES_NOT) -+ { -+ for(listindex=0;listindex<listOut.GetSize();listindex++) -+ { -+ aList->Remove(listOut.ElementAt(listindex)); -+ } -+ } -+ else if (conditionType == RES_AND ) -+ { -+ for(listindex=0;listindex<listOut.GetSize();listindex++) -+ { -+ if (!aList->IndexOf(listOut.ElementAt(listindex))) -+ { -+ aList->Remove(listOut.ElementAt(listindex)); -+ } -+ } -+ } -+ else if (conditionType == RES_OR ) -+ { -+ for(listindex=0;listindex<listOut.GetSize();listindex++) -+ { -+ listDel.Remove(listOut.ElementAt(listindex)); -+ } -+ if (listDel.GetSize() == 0) -+ { -+ break; -+ } -+ } -+ } -+ if (conditionType == RES_OR) -+ { -+ for(listindex=0;listindex<listDel.GetSize();listindex++) -+ { -+ aList->Remove(listDel.ElementAt(listindex)); -+ } -+ } -+ } -+ -+ } -+ while(listDel.GetSize()) -+ { -+ listDel.Remove(0); -+ } -+ while(listOut.GetSize()) -+ { -+ listOut.Remove(0); -+ } -+ -+ -+ return TRUE; -+} -+ -+BOOL nsMapiAddressBook::FilterOnOneRow(nsMapiEntry *aEntry,LPSRestriction aRestriction) -+{ -+ LPMAPIPROP object ; -+ ULONG objType = 0 ; -+ LPSPropValue realValue = NULL ; -+ LPSPropValue resValue = NULL ; -+ ULONG valueCount = 0 ; -+ -+ mLastError = OpenEntry(aEntry->mByteCount, aEntry->mEntryId, -+ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType, -+ (IUnknown **)&object) ; -+ -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot open entry %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ -+ ULONG conditionType = 0 ; -+ conditionType = aRestriction->rt; -+ -+ switch (conditionType) -+ { -+ case RES_EXIST : -+ if (!GetMAPIProperties(*aEntry,&aRestriction->res.resExist.ulPropTag,1,realValue,valueCount)) -+ return FALSE; -+ resValue = NULL; -+ break ; -+ case RES_CONTENT : -+ if (!GetMAPIProperties(*aEntry,&aRestriction->res.resContent.ulPropTag,1,realValue,valueCount)) -+ return FALSE; -+ resValue = aRestriction->res.resContent.lpProp; -+ break ; -+ case RES_PROPERTY : -+ if (!GetMAPIProperties(*aEntry,&aRestriction->res.resProperty.ulPropTag,1,realValue,valueCount)) -+ return FALSE; -+ resValue = aRestriction->res.resProperty.lpProp; -+ break ; -+ case RES_BITMASK : -+ return FALSE; //not support -+ break ; -+ case RES_SIZE : -+ return FALSE;//not been used now -+ break ; -+ case RES_COMPAREPROPS : -+ return FALSE;//not been used now -+ break ; -+ case RES_NOT : -+ return FALSE;//not need care here -+ break; -+ case RES_AND : -+ return FALSE;//not need care here -+ break; -+ case RES_OR : -+ return FALSE;//not need care here -+ break; -+ case RES_COMMENT : -+ return TRUE;//comment -+ break; -+ case RES_SUBRESTRICTION : -+ return FALSE;//not been used now -+ break ; -+} -+ return AtomyFilter(aRestriction,realValue,resValue); -+ -+} -+ -+BOOL nsMapiAddressBook::AtomyFilter(LPSRestriction aRestriction,LPSPropValue aRealValue,LPSPropValue aFilterValue) -+{ -+ ULONG conditionType = 0 ; -+ conditionType = aRestriction->rt; -+ -+ BOOL bTagEq=(aRealValue && -+ PROP_TYPE( aRealValue->ulPropTag ) != PT_ERROR) && -+ aFilterValue; -+ // PROP_TYPE( aRealValue->ulPropTag ) == PROP_TYPE( aFilterValue->ulPropTag )); -+ switch (conditionType) -+ { -+ case RES_EXIST : -+ return (aRealValue && PROP_TYPE( aRealValue->ulPropTag ) != PT_ERROR) ; -+ break ; -+ case RES_CONTENT : -+ if (bTagEq) -+ { -+ switch(aRestriction->res.resContent.ulFuzzyLevel) -+ { -+ case FL_FULLSTRING : -+ return !stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA); -+ break; -+ case FL_PREFIX : -+ return stristr(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) == aRealValue->Value.lpszA; -+ break; -+ case FL_SUBSTRING : -+ default: -+ return stristr(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) != NULL; -+ break; -+ } -+ } -+ return FALSE; -+ break ; -+ case RES_PROPERTY : -+ if (bTagEq) -+ { -+ switch(aRestriction->res.resProperty.relop) -+ { -+ case RELOP_GE : -+ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) >= 0; -+ break; -+ case RELOP_GT : -+ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) > 0; -+ break; -+ case RELOP_LE : -+ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) <= 0; -+ break; -+ case RELOP_LT : -+ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) < 0; -+ break; -+ case RELOP_EQ : -+ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) == 0; -+ break; -+ case RELOP_NE : -+ return stricmp(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) != 0; -+ break; -+ case RELOP_RE : -+ default: -+ return stristr(aRealValue->Value.lpszA,aFilterValue->Value.lpszA) != NULL; -+ break; -+ -+ } -+ } -+ return FALSE; -+ break ; -+ case RES_BITMASK : -+ return FALSE; //not support -+ break ; -+ case RES_SIZE : -+ return FALSE;//not been used now -+ break ; -+ case RES_COMPAREPROPS : -+ return FALSE;//not been used now -+ break ; -+ case RES_NOT : -+ return FALSE;//not need care here -+ break; -+ case RES_AND : -+ return FALSE;//not need care here -+ break; -+ case RES_OR : -+ return FALSE;//not need care here -+ break; -+ case RES_COMMENT : -+ return TRUE;//comment -+ break; -+ case RES_SUBRESTRICTION : -+ return FALSE;//not been used now -+ break ; -+ } -+ return TRUE; -+} -+ -+BOOL nsMapiAddressBook::GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction, -+ nsMapiEntryArray *aList, ULONG aMapiType) -+{ -+ if (aList) -+ aList->CleanUp(); -+ -+ nsMapiInterfaceWrapper<LPMAPICONTAINER> parent ; -+ nsMapiInterfaceWrapper<LPMAPITABLE> contents ; -+ ULONG objType = 0 ; -+ ULONG rowCount = 0 ; -+ -+ -+ nsMapiInterfaceWrapper<LPMAPIPROP> pFolder; -+ nsCString cs; -+ aParent.ToString(cs); -+ -+ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId, -+ 0, MAPI_BEST_ACCESS, &objType, pFolder); -+ if (HR_FAILED(mLastError)) -+ { -+ PRINTF(("Cannot open folder %08x.\n", mLastError)) ; -+ return FALSE; -+ } -+ -+ -+ LPSPropValue msgClass=GetMapiProperty(*(LPMAPIPROP*)&pFolder,PR_MESSAGE_CLASS); -+ if (msgClass && strcmp("IPM.DistList",msgClass->Value.lpszA) == 0) -+ { -+ HRESULT hr; -+ LPSPropValue aValue = NULL ; -+ ULONG aValueCount = 0 ; -+ -+ LPSPropTagArray properties = NULL ; -+ mMAPIAllocateBuffer(CbNewSPropTagArray(1), -+ (void **)&properties); -+ properties->cValues = 1; -+ properties->aulPropTag [0] = GetEmailPropertyTag(*(LPMAPIPROP*)&pFolder,OUTLOOK_EMAIL_LIST1); -+ hr = pFolder->GetProps(properties, 0, &aValueCount, &aValue) ; -+ -+ SBinaryArray *sa=&aValue->Value.MVbin; -+ -+ LPENTRYID lpEID; -+ ULONG cbEID; -+ -+ ULONG idx; -+ nsMapiEntry testEntry; -+ nsCString sClass; -+ for (idx=0;sa->lpbin && idx<sa->cValues ;idx++) -+ { -+ lpEID= (LPENTRYID) sa->lpbin[idx].lpb; -+ cbEID = sa->lpbin[idx].cb; -+ testEntry.Assign(sa->lpbin[idx].cb,NS_REINTERPRET_CAST(LPENTRYID,sa->lpbin[idx].lpb)); -+ -+ if (GetPropertyString(testEntry,PR_MESSAGE_CLASS,sClass)) //Error get property -+ { -+ aList->AddItem(cbEID,lpEID); -+ } -+ } -+ Filter(aRestriction,aList); -+ } -+ else -+ { -+ if (aRestriction && !CorrectRestriction(*(LPMAPICONTAINER*)&pFolder,1,aRestriction)) -+ return FALSE; -+ mLastError = OpenEntry(aParent.mByteCount, aParent.mEntryId, -+ &IID_IMAPIContainer, MAPI_BEST_ACCESS, &objType, -+ parent) ; -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot open parent %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ -+ mLastError = parent->GetContentsTable(0, contents) ; -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot get contents %08x.\n", mLastError)) ; -+ return FALSE; -+ } -+ if (aRestriction) { -+ mLastError = contents->Restrict(aRestriction, TBL_BATCH) ; -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot set restriction %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ } -+ mLastError = contents->SetColumns((LPSPropTagArray)&ContentsColumns, 0); -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot set columns %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ mLastError = contents->GetRowCount(0, &rowCount) ; -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot get result count %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ do { -+ LPSRowSet rowSet = NULL ; -+ -+ rowCount = 0 ; -+ mLastError = contents->QueryRows(1, 0, &rowSet) ; -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot query rows %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ rowCount = rowSet->cRows ; -+ if (rowCount > 0 && aList) -+ { -+ if (aMapiType == 0 || rowSet->aRow->lpProps[ContentsColumnObjectType].Value.ul == aMapiType) -+ { -+ SPropValue& currentValue = rowSet->aRow->lpProps[ContentsColumnEntryId] ; -+ aList->AddItem(currentValue.Value.bin.cb, -+ NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ; -+ } -+ else if (aMapiType == MAPI_DISTLIST) -+ { -+ if (strcmp("IPM.DistList",rowSet->aRow->lpProps[ContentsColumnMessageClass].Value.lpszA)==0) -+ { -+ SPropValue& currentValue = rowSet->aRow->lpProps[ContentsColumnEntryId] ; -+ aList->AddItem(currentValue.Value.bin.cb, -+ NS_REINTERPRET_CAST(LPENTRYID, currentValue.Value.bin.lpb)) ; -+ -+ } -+} -+ -+ } -+ MyFreeProws(rowSet) ; -+ } while (rowCount > 0) ; -+ } -+ -+ -+ return TRUE ; -+} -+ -+BOOL nsMapiAddressBook::GetMAPIProperties(const nsMapiEntry& aObject, const ULONG *aPropertyTags, -+ ULONG aNbProperties, LPSPropValue& aValue, -+ ULONG& aValueCount) -+{ -+ nsMapiInterfaceWrapper<LPMAPIPROP> object ; -+ ULONG objType = 0 ; -+ LPSPropTagArray properties = NULL ; -+ ULONG i = 0 ; -+ -+ mLastError = OpenEntry(aObject.mByteCount, aObject.mEntryId, -+ &IID_IMAPIProp, MAPI_BEST_ACCESS, &objType, -+ object) ; -+ -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot open entry %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ AllocateBuffer(CbNewSPropTagArray(aNbProperties), -+ NS_REINTERPRET_CAST(void **, &properties)); -+ properties->cValues = aNbProperties ; -+ for (i = 0 ; i < aNbProperties ; ++ i) -+ { -+ properties->aulPropTag [i] = GetRealMapiPropertyTag(*(LPMAPIPROP*)&object,aPropertyTags [i],TRUE); -+ } -+ mLastError = object->GetProps(properties, 0 , &aValueCount, &aValue) ; -+ FreeBuffer(properties) ; -+ -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Error get props %08x.\n", mLastError)) ; -+ } -+ return HR_SUCCEEDED(mLastError); -+} -+ -+BOOL nsMapiAddressBook::SetMAPIProperties(const nsMapiEntry& aObject, ULONG aNbProperties, -+ LPSPropValue& aValues) -+{ -+ nsMapiInterfaceWrapper<LPMESSAGE> object; -+ ULONG objType = 0 ; -+ LPSPropProblemArray problems = NULL ; -+ ULONG i = 0 ; -+ -+ LPMDB lpMsgStore=GetMsgStore(aObject); -+ -+ if (!lpMsgStore) -+ { -+ return FALSE; -+ } -+ mLastError = lpMsgStore->OpenEntry(aObject.mByteCount, aObject.mEntryId, -+ &IID_IMAPIProp, MAPI_BEST_ACCESS , &objType, -+ object) ; -+ lpMsgStore->Release(); -+ -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot open entry %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ for (i = 0 ; i < aNbProperties ; ++ i) -+ { -+ aValues[i].ulPropTag = GetRealMapiPropertyTag(*(LPMESSAGE*)&object,aValues[i].ulPropTag,TRUE); -+ } -+ mLastError = object->SetProps(aNbProperties, aValues, &problems) ; -+ if (HR_FAILED(mLastError)) { -+ PRINTF(("Cannot update the object %08x.\n", mLastError)) ; -+ return FALSE ; -+ } -+ if (problems) { -+ for (ULONG i = 0 ; i < problems->cProblem ; ++ i) { -+ PRINTF(("Problem %d: index %d code %08x.\n", i, -+ problems->aProblem [i].ulIndex, -+ problems->aProblem [i].scode)) ; -+ } -+ } -+ mLastError = object->SaveChanges(0) ; -+ if (MAPI_E_OBJECT_CHANGED == mLastError) -+ { -+ mLastError = object->SaveChanges(FORCE_SAVE ) ; -+ } -+ return HR_SUCCEEDED(mLastError) ; -+} -+ -+BOOL nsMapiAddressBook::GetDefaultContainer(nsMapiEntry& aContainer) -+{ -+ return FALSE ; -+} -+ -+BOOL nsMapiAddressBook::IsOK(void) -+{ -+ return mRootSession && mLibUsage; -+} -+ - BOOL nsMapiAddressBook::Initialize(void) - { -- if (mAddressBook) { return TRUE ; } -+ - nsAutoLock guard(mMutex) ; - - if (!LoadMapiLibrary()) { - PRINTF(("Cannot load library.\n")) ; - return FALSE ; - } -- mAddressBook = mRootBook ; -- return TRUE ; -+ return TRUE; - } - - void nsMapiAddressBook::AllocateBuffer(ULONG aByteCount, LPVOID *aBuffer) -@@ -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; -+} -Index: mailnews/addrbook/src/nsMapiAddressBook.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h,v -retrieving revision 1.3 -diff -u -r1.3 nsMapiAddressBook.h ---- misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h 28 Sep 2001 20:06:25 -0000 1.3 -+++ misc/build/mozilla/mailnews/addrbook/src/nsMapiAddressBook.h 17 May 2004 03:23:55 -0000 -@@ -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___ -Index: mailnews/addrbook/src/nsWabAddressBook.cpp -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp,v -retrieving revision 1.6 -diff -u -r1.6 nsWabAddressBook.cpp ---- misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp 30 Oct 2001 07:59:16 -0000 1.6 -+++ misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.cpp 17 May 2004 03:23:55 -0000 -@@ -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()) { -Index: mailnews/addrbook/src/nsWabAddressBook.h -=================================================================== -RCS file: /cvsroot/mozilla/mailnews/addrbook/src/nsWabAddressBook.h,v -retrieving revision 1.2 -diff -u -r1.2 nsWabAddressBook.h ---- misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 28 Sep 2001 20:06:25 -0000 1.2 -+++ misc/build/mozilla/mailnews/addrbook/src/nsWabAddressBook.h 17 May 2004 03:23:55 -0000 -@@ -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 : - } ; -Index: profile/src/nsProfile.cpp -=================================================================== -RCS file: /cvsroot/mozilla/profile/src/nsProfile.cpp,v -retrieving revision 1.298 -diff -u -r1.298 nsProfile.cpp ---- misc/build/mozilla/profile/src/nsProfile.cpp 28 Feb 2004 22:34:02 -0000 1.298 -+++ misc/build/mozilla/profile/src/nsProfile.cpp 17 May 2004 03:24:08 -0000 -@@ -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); -Index: security/nss/lib/nss/config.mk -=================================================================== -RCS file: /cvsroot/mozilla/security/nss/lib/nss/config.mk,v -retrieving revision 1.21 -diff -u -r1.21 config.mk ---- misc/build/mozilla/security/nss/lib/nss/config.mk 20 Apr 2003 04:23:32 -0000 1.21 -+++ misc/build/mozilla/security/nss/lib/nss/config.mk 17 May 2004 03:24:08 -0000 -@@ -105,7 +105,7 @@ - ifeq ($(OS_TARGET),SunOS) - # The -R '$ORIGIN' linker option instructs libnss3.so to search for its - # dependencies (libsoftokn3.so) in the same directory where it resides. --MKSHLIB += -R '$$ORIGIN' -+#MKSHLIB += -R '$$ORIGIN' - endif - - ifeq (,$(filter-out WINNT WIN95,$(OS_TARGET))) ---- 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; -@@ -212,6 +213,7 @@ - PK11_GetBestSlot; - PK11_GetBestSlotMultiple; - PK11_GetBestWrapMechanism; -+PK11_GetCertFromPrivateKey; - PK11_GetCurrentWrapIndex; - PK11_GetMechanism; - PK11_GetModuleID; -Index: security/nss/lib/softoken/config.mk -=================================================================== -RCS file: /cvsroot/mozilla/security/nss/lib/softoken/config.mk,v -retrieving revision 1.14 -diff -u -r1.14 config.mk ---- misc/build/mozilla/security/nss/lib/softoken/config.mk 16 May 2003 20:21:20 -0000 1.14 -+++ misc/build/mozilla/security/nss/lib/softoken/config.mk 17 May 2004 03:24:08 -0000 -@@ -88,7 +88,7 @@ - ifeq ($(CPU_ARCH),sparc) - # The -R '$ORIGIN' linker option instructs libsoftokn3.so to search for its - # dependencies (libfreebl_*.so) in the same directory where it resides. --MKSHLIB += -R '$$ORIGIN' -+#MKSHLIB += -R '$$ORIGIN' - endif - endif - endif - -Index: mailnews/addrbook/src/nsAbMD5sum.cpp -=================================================================== ---- misc/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2005-01-09 00:07:11.359375000 -0500 -+++ misc/build/mozilla/mailnews/addrbook/src/nsAbMD5sum.cpp 2004-03-29 16:43:58.000000000 +0800 -@@ -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); -+} - -Index: jmorecfg.h -=================================================================== -RCS file: /cvsroot/mozilla/jpeg/jmorecfg.h,v -retrieving revision 3.12 -diff -u -r3.12 jmorecfg.h ---- misc/build/mozilla/jpeg/jmorecfg.h 5 Mar 2004 22:17:45 -0000 3.12 -+++ misc/build/mozilla/jpeg/jmorecfg.h 17 May 2004 03:48:38 -0000 -@@ -108,8 +108,8 @@ - /* Defines for MMX/SSE2 support. */ - - #if defined(XP_WIN32) && defined(_M_IX86) --#define HAVE_MMX_INTEL_MNEMONICS --#define HAVE_SSE2_INTEL_MNEMONICS -+//#define HAVE_MMX_INTEL_MNEMONICS -+//#define HAVE_SSE2_INTEL_MNEMONICS - #endif |