From 5ef80436ca96f9286b694a0db0cf4df56d15dff1 Mon Sep 17 00:00:00 2001 From: "bugzilla%standard8.demon.co.uk" Date: Sat, 5 Nov 2005 16:08:26 +0000 Subject: [PATCH] Back out part of bug 119948 part 2 as it broke builds with --disable-ldap git-svn-id: svn://10.0.0.236/trunk@184187 18797224-902f-48f8-a5cc-f745e15eee43 --- .../mailnews/addrbook/src/nsAddressBook.cpp | 243 ++++++++---------- mozilla/mailnews/addrbook/src/nsAddressBook.h | 10 +- 2 files changed, 113 insertions(+), 140 deletions(-) diff --git a/mozilla/mailnews/addrbook/src/nsAddressBook.cpp b/mozilla/mailnews/addrbook/src/nsAddressBook.cpp index b140aad5656..b324837099e 100644 --- a/mozilla/mailnews/addrbook/src/nsAddressBook.cpp +++ b/mozilla/mailnews/addrbook/src/nsAddressBook.cpp @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -87,71 +87,84 @@ #include "nsAutoPtr.h" #include "nsIMsgVCardService.h" #include "nsCRT.h" -#include "nsIAbLDAPAttributeMap.h" #ifdef MOZ_XUL_APP #include "nsICommandLine.h" #endif +// according to RFC 2849 +// SEP = (CR LF / LF) +// so we LF for unix and beos (since that is the natural line ending for +// those platforms, see nsCRT.h) +// +// otherwise we use CR LF (windows linebreak) +#if defined(XP_UNIX) || defined(XP_BEOS) +#define LDIF_LINEBREAK "\012" +#define LDIF_LINEBREAK_LEN 1 +#else +#define LDIF_LINEBREAK "\015\012" +#define LDIF_LINEBREAK_LEN 2 +#endif + // our schema is not fixed yet, but we still want some sort of objectclass // for now, use obsolete in the class name, hinting that this will change // see bugs bug #116692 and #118454 #define MOZ_AB_OBJECTCLASS "mozillaAbPersonAlpha" const ExportAttributesTableStruct EXPORT_ATTRIBUTES_TABLE[EXPORT_ATTRIBUTES_TABLE_COUNT] = { - {kFirstNameColumn, PR_TRUE}, - {kLastNameColumn, PR_TRUE}, - {kDisplayNameColumn, PR_TRUE}, - {kNicknameColumn, PR_TRUE}, - {kPriEmailColumn, PR_TRUE}, - {k2ndEmailColumn, PR_TRUE}, - {kDefaultEmailColumn, PR_FALSE}, - {kCardTypeColumn, PR_FALSE}, - {kAimScreenNameColumn, PR_FALSE}, - {kPreferMailFormatColumn, PR_FALSE}, - {kLastModifiedDateColumn, PR_FALSE}, - {kWorkPhoneColumn, PR_TRUE}, - {kWorkPhoneTypeColumn, PR_FALSE}, - {kHomePhoneColumn, PR_TRUE}, - {kHomePhoneTypeColumn, PR_FALSE}, - {kFaxColumn, PR_TRUE}, - {kFaxTypeColumn, PR_FALSE}, - {kPagerColumn, PR_TRUE}, - {kPagerTypeColumn, PR_FALSE}, - {kCellularColumn, PR_TRUE}, - {kCellularTypeColumn, PR_FALSE}, - {kHomeAddressColumn, PR_TRUE}, - {kHomeAddress2Column, PR_TRUE}, - {kHomeCityColumn, PR_TRUE}, - {kHomeStateColumn, PR_TRUE}, - {kHomeZipCodeColumn, PR_TRUE}, - {kHomeCountryColumn, PR_TRUE}, - {kWorkAddressColumn, PR_TRUE}, - {kWorkAddress2Column, PR_TRUE}, - {kWorkCityColumn, PR_TRUE}, - {kWorkStateColumn, PR_TRUE}, - {kWorkZipCodeColumn, PR_TRUE}, - {kWorkCountryColumn, PR_TRUE}, - {kJobTitleColumn, PR_TRUE}, - {kDepartmentColumn, PR_TRUE}, - {kCompanyColumn, PR_TRUE}, - {kWebPage1Column, PR_TRUE}, - {kWebPage2Column, PR_TRUE}, - {kBirthYearColumn, PR_TRUE}, // unused for now - {kBirthMonthColumn, PR_TRUE}, // unused for now - {kBirthDayColumn, PR_TRUE}, // unused for now - {kCustom1Column, PR_TRUE}, - {kCustom2Column, PR_TRUE}, - {kCustom3Column, PR_TRUE}, - {kCustom4Column, PR_TRUE}, - {kNotesColumn, PR_TRUE}, - {kAnniversaryYearColumn, PR_FALSE}, - {kAnniversaryMonthColumn, PR_FALSE}, - {kAnniversaryDayColumn, PR_FALSE}, - {kSpouseNameColumn, PR_FALSE}, - {kFamilyNameColumn, PR_FALSE}, - {kDefaultAddressColumn, PR_FALSE}, - {kCategoryColumn, PR_FALSE}, + {kFirstNameColumn, "givenName", PR_TRUE}, + {kLastNameColumn, "sn", PR_TRUE}, + {kDisplayNameColumn, "cn", PR_TRUE}, + {kNicknameColumn, MOZ_AB_LDIF_PREFIX "Nickname", PR_TRUE}, + {kPriEmailColumn, "mail", PR_TRUE}, + {k2ndEmailColumn, MOZ_AB_LDIF_PREFIX "SecondEmail", PR_TRUE}, + {kDefaultEmailColumn, MOZ_AB_LDIF_PREFIX "DefaultEmail", PR_FALSE}, + {kCardTypeColumn, MOZ_AB_LDIF_PREFIX "CardType", PR_FALSE}, + {kAimScreenNameColumn, "nsAIMid", PR_FALSE}, + {kPreferMailFormatColumn, MOZ_AB_LDIF_PREFIX "UseHtmlMail", PR_FALSE}, + {kLastModifiedDateColumn, "modifytimestamp", PR_FALSE}, + {kWorkPhoneColumn, "telephoneNumber", PR_TRUE}, + {kWorkPhoneTypeColumn, MOZ_AB_LDIF_PREFIX "WorkPhoneType", PR_FALSE}, + {kHomePhoneColumn, "homePhone", PR_TRUE}, + {kHomePhoneTypeColumn, MOZ_AB_LDIF_PREFIX "HomePhoneType", PR_FALSE}, + {kFaxColumn, "fax", PR_TRUE}, + {kFaxTypeColumn, MOZ_AB_LDIF_PREFIX "FaxNumberType", PR_FALSE}, + {kPagerColumn, "pager", PR_TRUE}, + {kPagerTypeColumn, MOZ_AB_LDIF_PREFIX "PagerNumberType", PR_FALSE}, + {kCellularColumn, "mobile", PR_TRUE}, + {kCellularTypeColumn, MOZ_AB_LDIF_PREFIX "CellularNumberType", PR_FALSE}, + {kHomeAddressColumn, "homeStreet", PR_TRUE}, + {kHomeAddress2Column, MOZ_AB_LDIF_PREFIX "HomeStreet2", PR_TRUE}, + {kHomeCityColumn, MOZ_AB_LDIF_PREFIX "HomeLocalityName", PR_TRUE}, + {kHomeStateColumn, MOZ_AB_LDIF_PREFIX "HomeState", PR_TRUE}, + {kHomeZipCodeColumn, MOZ_AB_LDIF_PREFIX "HomePostalCode", PR_TRUE}, + {kHomeCountryColumn, MOZ_AB_LDIF_PREFIX "HomeCountryName", PR_TRUE}, + {kWorkAddressColumn, "street", PR_TRUE}, + {kWorkAddress2Column, MOZ_AB_LDIF_PREFIX "WorkStreet2", PR_TRUE}, + {kWorkCityColumn, "l", PR_TRUE}, + {kWorkStateColumn, "st", PR_TRUE}, + {kWorkZipCodeColumn, "postalCode", PR_TRUE}, + {kWorkCountryColumn, "c", PR_TRUE}, + {kJobTitleColumn, "title", PR_TRUE}, + {kDepartmentColumn, "department", PR_TRUE}, + {kCompanyColumn, "company", PR_TRUE}, + {kWebPage1Column, MOZ_AB_LDIF_PREFIX "WorkUrl", PR_TRUE}, + {kWebPage2Column, MOZ_AB_LDIF_PREFIX "HomeUrl", PR_TRUE}, + {kBirthYearColumn, nsnull, PR_TRUE}, // unused for now + {kBirthMonthColumn, nsnull, PR_TRUE}, // unused for now + {kBirthDayColumn, nsnull, PR_TRUE}, // unused for now + {kCustom1Column, MOZ_AB_LDIF_PREFIX "Custom1", PR_TRUE}, + {kCustom2Column, MOZ_AB_LDIF_PREFIX "Custom2", PR_TRUE}, + {kCustom3Column, MOZ_AB_LDIF_PREFIX "Custom3", PR_TRUE}, + {kCustom4Column, MOZ_AB_LDIF_PREFIX "Custom4", PR_TRUE}, + {kNotesColumn, "description", PR_TRUE}, + {kAnniversaryYearColumn, MOZ_AB_LDIF_PREFIX "AnniversaryYear", PR_FALSE}, + {kAnniversaryMonthColumn, MOZ_AB_LDIF_PREFIX "AnniversaryMonth", PR_FALSE}, + {kAnniversaryDayColumn, MOZ_AB_LDIF_PREFIX "AnniversaryDay", PR_FALSE}, + {kSpouseNameColumn, MOZ_AB_LDIF_PREFIX "SpouseName", PR_FALSE}, + {kFamilyNameColumn, MOZ_AB_LDIF_PREFIX "FamilyName", PR_FALSE}, + {kDefaultAddressColumn, MOZ_AB_LDIF_PREFIX "DefaultAddress", PR_FALSE}, + {kCategoryColumn, MOZ_AB_LDIF_PREFIX "Category", PR_FALSE}, }; // @@ -374,6 +387,8 @@ NS_IMETHODIMP nsAddressBook::MailListNameExists(const PRUnichar *name, PRBool *e #define CSV_DELIM_LEN 1 #define TAB_DELIM "\t" #define TAB_DELIM_LEN 1 +#define LDIF_DELIM (nsnull) +#define LDIF_DELIM_LEN 0 #define CSV_FILE_EXTENSION ".csv" #define TAB_FILE_EXTENSION ".tab" @@ -551,9 +566,9 @@ nsAddressBook::ExportDirectoryToDelimitedText(nsIAbDirectory *aDirectory, const } } } - rv = outputStream->Write(NS_LINEBREAK, NS_LINEBREAK_LEN, &writeCount); + rv = outputStream->Write(MSG_LINEBREAK, MSG_LINEBREAK_LEN, &writeCount); NS_ENSURE_SUCCESS(rv,rv); - if (NS_LINEBREAK_LEN != writeCount) + if (MSG_LINEBREAK_LEN != writeCount) return NS_ERROR_FAILURE; #endif @@ -655,9 +670,9 @@ nsAddressBook::ExportDirectoryToDelimitedText(nsIAbDirectory *aDirectory, const } // write out the linebreak that separates the cards - rv = outputStream->Write(NS_LINEBREAK, NS_LINEBREAK_LEN, &writeCount); + rv = outputStream->Write(MSG_LINEBREAK, MSG_LINEBREAK_LEN, &writeCount); NS_ENSURE_SUCCESS(rv,rv); - if (NS_LINEBREAK_LEN != writeCount) + if (MSG_LINEBREAK_LEN != writeCount) return NS_ERROR_FAILURE; } } @@ -690,18 +705,6 @@ nsAddressBook::ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *a if (NS_FAILED(rv)) return rv; - // Get the default attribute map for ldap. We use the default attribute - // map rather than one for a specific server because if people want an - // ldif export using a servers specific schema, then they can use ldapsearch - nsCOMPtr mapSrv = - do_GetService("@mozilla.org/addressbook/ldap-attribute-map-service;1", &rv); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr attrMap; - rv = mapSrv->GetMapForPrefBranch(NS_LITERAL_CSTRING("ldap_2.servers.default.attrmap"), - getter_AddRefs(attrMap)); - NS_ENSURE_SUCCESS(rv, rv); - PRUint32 i; PRUint32 writeCount; PRUint32 length; @@ -723,7 +726,7 @@ nsAddressBook::ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *a if (isMailList) { nsCString mailListCStr; - rv = AppendLDIFForMailList(card, attrMap, mailListCStr); + rv = AppendLDIFForMailList(card, mailListCStr); NS_ENSURE_SUCCESS(rv,rv); length = mailListCStr.Length(); @@ -736,7 +739,7 @@ nsAddressBook::ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *a nsXPIDLString value; nsCString valueCStr; - rv = AppendBasicLDIFForCard(card, attrMap, valueCStr); + rv = AppendBasicLDIFForCard(card, valueCStr); NS_ENSURE_SUCCESS(rv,rv); length = valueCStr.Length(); @@ -747,13 +750,8 @@ nsAddressBook::ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *a valueCStr.Truncate(); - nsCAutoString ldapAttribute; - for (i = 0; i < EXPORT_ATTRIBUTES_TABLE_COUNT; i++) { - if (NS_SUCCEEDED(attrMap->GetFirstAttribute(nsDependentCString(EXPORT_ATTRIBUTES_TABLE[i].abColName), - ldapAttribute) && - !ldapAttribute.IsEmpty())) { - + if (EXPORT_ATTRIBUTES_TABLE[i].ldapPropertyName) { rv = card->GetCardValue(EXPORT_ATTRIBUTES_TABLE[i].abColName, getter_Copies(value)); NS_ENSURE_SUCCESS(rv,rv); @@ -767,10 +765,10 @@ nsAddressBook::ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *a } if (!value.IsEmpty()) { - rv = AppendProperty(ldapAttribute.get(), value.get(), valueCStr); + rv = AppendProperty(EXPORT_ATTRIBUTES_TABLE[i].ldapPropertyName, value.get(), valueCStr); NS_ENSURE_SUCCESS(rv,rv); - valueCStr += NS_LINEBREAK; + valueCStr += LDIF_LINEBREAK; } else valueCStr.Truncate(); @@ -791,9 +789,9 @@ nsAddressBook::ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *a } // write out the linebreak that separates the cards - rv = outputStream->Write(NS_LINEBREAK, NS_LINEBREAK_LEN, &writeCount); + rv = outputStream->Write(LDIF_LINEBREAK, LDIF_LINEBREAK_LEN, &writeCount); NS_ENSURE_SUCCESS(rv,rv); - if (NS_LINEBREAK_LEN != writeCount) + if (LDIF_LINEBREAK_LEN != writeCount) return NS_ERROR_FAILURE; } } @@ -808,55 +806,41 @@ nsAddressBook::ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *a return NS_OK; } -nsresult nsAddressBook::AppendLDIFForMailList(nsIAbCard *aCard, nsIAbLDAPAttributeMap *aAttrMap, nsACString &aResult) +nsresult nsAddressBook::AppendLDIFForMailList(nsIAbCard *aCard, nsACString &aResult) { nsresult rv; nsXPIDLString attrValue; - rv = AppendDNForCard("dn", aCard, aAttrMap, aResult); - NS_ENSURE_SUCCESS(rv,rv); - - aResult += NS_LINEBREAK \ - "objectclass: top" NS_LINEBREAK \ - "objectclass: groupOfNames" NS_LINEBREAK; - rv = aCard->GetCardValue(kDisplayNameColumn, getter_Copies(attrValue)); NS_ENSURE_SUCCESS(rv,rv); - nsCAutoString ldapAttributeName; - - rv = aAttrMap->GetFirstAttribute(NS_LITERAL_CSTRING(kDisplayNameColumn), - ldapAttributeName); - NS_ENSURE_SUCCESS(rv, rv); - - rv = AppendProperty(ldapAttributeName.get(), attrValue.get(), aResult); + rv = AppendDNForCard("dn", aCard, aResult); NS_ENSURE_SUCCESS(rv,rv); - aResult += NS_LINEBREAK; - rv = aAttrMap->GetFirstAttribute(NS_LITERAL_CSTRING(kNicknameColumn), - ldapAttributeName); - NS_ENSURE_SUCCESS(rv, rv); + aResult += LDIF_LINEBREAK \ + "objectclass: top" LDIF_LINEBREAK \ + "objectclass: groupOfNames" LDIF_LINEBREAK; + + rv = AppendProperty("cn", attrValue.get(), aResult); + NS_ENSURE_SUCCESS(rv,rv); + aResult += LDIF_LINEBREAK; rv = aCard->GetCardValue(kNicknameColumn, getter_Copies(attrValue)); NS_ENSURE_SUCCESS(rv,rv); if (!attrValue.IsEmpty()) { - rv = AppendProperty(ldapAttributeName.get(), attrValue.get(), aResult); + rv = AppendProperty("mozillaNickname", attrValue.get(), aResult); NS_ENSURE_SUCCESS(rv,rv); - aResult += NS_LINEBREAK; + aResult += LDIF_LINEBREAK; } - rv = aAttrMap->GetFirstAttribute(NS_LITERAL_CSTRING(kNotesColumn), - ldapAttributeName); - NS_ENSURE_SUCCESS(rv, rv); - rv = aCard->GetCardValue(kNotesColumn, getter_Copies(attrValue)); NS_ENSURE_SUCCESS(rv,rv); if (!attrValue.IsEmpty()) { - rv = AppendProperty(ldapAttributeName.get(), attrValue.get(), aResult); + rv = AppendProperty("description", attrValue.get(), aResult); NS_ENSURE_SUCCESS(rv,rv); - aResult += NS_LINEBREAK; + aResult += LDIF_LINEBREAK; } nsCOMPtr rdfService = do_GetService("@mozilla.org/rdf/rdf-service;1", &rv); @@ -884,23 +868,22 @@ nsresult nsAddressBook::AppendLDIFForMailList(nsIAbCard *aCard, nsIAbLDAPAttribu nsCOMPtr listCard = do_QueryElementAt(addresses, i, &rv); NS_ENSURE_SUCCESS(rv,rv); - rv = AppendDNForCard("member", listCard, aAttrMap, aResult); + rv = AppendDNForCard("member", listCard, aResult); NS_ENSURE_SUCCESS(rv,rv); - aResult += NS_LINEBREAK; + aResult += LDIF_LINEBREAK; } } } - aResult += NS_LINEBREAK; + aResult += LDIF_LINEBREAK; return NS_OK; } -nsresult nsAddressBook::AppendDNForCard(const char *aProperty, nsIAbCard *aCard, nsIAbLDAPAttributeMap *aAttrMap, nsACString &aResult) +nsresult nsAddressBook::AppendDNForCard(const char *aProperty, nsIAbCard *aCard, nsACString &aResult) { nsXPIDLString email; nsXPIDLString displayName; - nsCAutoString ldapAttributeName; nsresult rv = aCard->GetCardValue(kPriEmailColumn, getter_Copies(email)); NS_ENSURE_SUCCESS(rv,rv); @@ -910,25 +893,15 @@ nsresult nsAddressBook::AppendDNForCard(const char *aProperty, nsIAbCard *aCard, nsString cnStr; - rv = aAttrMap->GetFirstAttribute(NS_LITERAL_CSTRING(kDisplayNameColumn), - ldapAttributeName); - NS_ENSURE_SUCCESS(rv, rv); - if (!displayName.IsEmpty()) { - cnStr += NS_ConvertUTF8toUTF16(ldapAttributeName).get(); - cnStr += NS_LITERAL_STRING("=") + displayName; + cnStr += NS_LITERAL_STRING("cn=") + displayName; if (!email.IsEmpty()) { cnStr.AppendLiteral(","); } } - rv = aAttrMap->GetFirstAttribute(NS_LITERAL_CSTRING(kPriEmailColumn), - ldapAttributeName); - NS_ENSURE_SUCCESS(rv, rv); - if (!email.IsEmpty()) { - cnStr += NS_ConvertUTF8toUTF16(ldapAttributeName).get(); - cnStr += NS_LITERAL_STRING("=") + email; + cnStr += NS_LITERAL_STRING("mail=") + email; } rv = AppendProperty(aProperty, cnStr.get(), aResult); @@ -936,16 +909,16 @@ nsresult nsAddressBook::AppendDNForCard(const char *aProperty, nsIAbCard *aCard, return rv; } -nsresult nsAddressBook::AppendBasicLDIFForCard(nsIAbCard *aCard, nsIAbLDAPAttributeMap *aAttrMap, nsACString &aResult) +nsresult nsAddressBook::AppendBasicLDIFForCard(nsIAbCard *aCard, nsACString &aResult) { - nsresult rv = AppendDNForCard("dn", aCard, aAttrMap, aResult); + nsresult rv = AppendDNForCard("dn", aCard, aResult); NS_ENSURE_SUCCESS(rv,rv); - aResult += NS_LINEBREAK \ - "objectclass: top" NS_LINEBREAK \ - "objectclass: person" NS_LINEBREAK \ - "objectclass: organizationalPerson" NS_LINEBREAK \ - "objectclass: inetOrgPerson" NS_LINEBREAK \ - "objectclass: " MOZ_AB_OBJECTCLASS NS_LINEBREAK; + aResult += LDIF_LINEBREAK \ + "objectclass: top" LDIF_LINEBREAK \ + "objectclass: person" LDIF_LINEBREAK \ + "objectclass: organizationalPerson" LDIF_LINEBREAK \ + "objectclass: inetOrgPerson" LDIF_LINEBREAK \ + "objectclass: " MOZ_AB_OBJECTCLASS LDIF_LINEBREAK; return rv; diff --git a/mozilla/mailnews/addrbook/src/nsAddressBook.h b/mozilla/mailnews/addrbook/src/nsAddressBook.h index 680a69bba97..940695d8229 100644 --- a/mozilla/mailnews/addrbook/src/nsAddressBook.h +++ b/mozilla/mailnews/addrbook/src/nsAddressBook.h @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -58,7 +58,6 @@ class nsILocalFile; class nsIAbDirectory; -class nsIAbLDAPAttributeMap; #define NC_RDF_NEWABCARD NC_NAMESPACE_URI "NewCard" #define NC_RDF_MODIFY NC_NAMESPACE_URI "Modify" @@ -71,6 +70,7 @@ class nsIAbLDAPAttributeMap; struct ExportAttributesTableStruct { const char* abColName; + const char* ldapPropertyName; PRBool includeForPlainText; }; @@ -120,9 +120,9 @@ protected: private: nsresult ExportDirectoryToDelimitedText(nsIAbDirectory *aDirectory, const char *aDelim, PRUint32 aDelimLen, nsILocalFile *aLocalFile); nsresult ExportDirectoryToLDIF(nsIAbDirectory *aDirectory, nsILocalFile *aLocalFile); - nsresult AppendLDIFForMailList(nsIAbCard *aCard, nsIAbLDAPAttributeMap *aAttrMap, nsACString &aResult); - nsresult AppendDNForCard(const char *aProperty, nsIAbCard *aCard, nsIAbLDAPAttributeMap *aAttrMap, nsACString &aResult); - nsresult AppendBasicLDIFForCard(nsIAbCard *aCard, nsIAbLDAPAttributeMap *aAttrMap, nsACString &aResult); + nsresult AppendLDIFForMailList(nsIAbCard *aCard, nsACString &aResult); + nsresult AppendDNForCard(const char *aProperty, nsIAbCard *aCard, nsACString &aResult); + nsresult AppendBasicLDIFForCard(nsIAbCard *aCard, nsACString &aResult); nsresult AppendProperty(const char *aProperty, const PRUnichar *aValue, nsACString &aResult); PRBool IsSafeLDIFString(const PRUnichar *aStr); };