зеркало из https://github.com/mozilla/pjs.git
fix for bug #221318
migrate vCards from 4.x also fix some problems with pop account migration. r/sr=bienvenu
This commit is contained in:
Родитель
fee0655e91
Коммит
7e7af69639
|
@ -59,5 +59,6 @@ interface nsIAddressBook : nsISupports
|
|||
boolean mailListNameExists(in wstring name);
|
||||
nsIAbCard escapedVCardToAbCard(in string escapedVCardStr);
|
||||
string abCardToEscapedVCard(in nsIAbCard aCard);
|
||||
void convert4xVCardPrefs(in string prefRoot, out string escapedVCardStr);
|
||||
};
|
||||
|
||||
|
|
|
@ -2041,5 +2041,97 @@ NS_IMETHODIMP nsAddressBook::AbCardToEscapedVCard(nsIAbCard *aCard, char **aEsca
|
|||
return rv;
|
||||
}
|
||||
|
||||
static nsresult addProperty(char **currentVCard, const char *currentRoot, const char *mask)
|
||||
{
|
||||
// keep in mind as we add properties that we want to filter out any begin and end vcard types....because
|
||||
// we add those automatically...
|
||||
|
||||
const char *beginPhrase = "begin";
|
||||
char *children = nsnull;
|
||||
|
||||
nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID);
|
||||
if (currentVCard && prefBranch)
|
||||
{
|
||||
PRUint32 childCount;
|
||||
char **childArray;
|
||||
nsresult rv = prefBranch->GetChildList(currentRoot, &childCount, &childArray);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
for (PRUint32 i = 0; i < childCount; ++i)
|
||||
{
|
||||
char *child = childArray[i];
|
||||
|
||||
if (!strcmp(child, currentRoot))
|
||||
continue;
|
||||
|
||||
// first iterate over the child in case the child has children
|
||||
addProperty(currentVCard, child, mask);
|
||||
|
||||
// child length should be greater than the mask....
|
||||
if (strlen(child) > strlen(mask) + 1) // + 1 for the '.' in .property
|
||||
{
|
||||
nsXPIDLCString value;
|
||||
prefBranch->GetCharPref(child, getter_Copies(value));
|
||||
if (mask)
|
||||
child += strlen(mask) + 1; // eat up the "mail.identity.vcard" part...
|
||||
// turn all '.' into ';' which is what vcard format uses
|
||||
char * marker = strchr(child, '.');
|
||||
while (marker)
|
||||
{
|
||||
*marker = ';';
|
||||
marker = strchr(child, '.');
|
||||
}
|
||||
|
||||
// filter property to make sure it is one we want to add.....
|
||||
if ((PL_strncasecmp(child, beginPhrase, strlen(beginPhrase)) != 0) && (PL_strncasecmp(child, VCEndProp, strlen(VCEndProp)) != 0))
|
||||
{
|
||||
if (!value.IsEmpty()) // only add the value is not an empty string...
|
||||
if (*currentVCard)
|
||||
{
|
||||
char * tempString = *currentVCard;
|
||||
*currentVCard = PR_smprintf ("%s%s:%s%s", tempString, child, value.get(), "\n");
|
||||
PR_FREEIF(tempString);
|
||||
}
|
||||
else
|
||||
*currentVCard = PR_smprintf ("%s:%s%s", child, value.get(), "\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
NS_ASSERTION(0, "child length should be greater than the mask");
|
||||
}
|
||||
}
|
||||
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(childCount, childArray);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAddressBook::Convert4xVCardPrefs(const char *prefRoot, char **escapedVCardStr)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(prefRoot);
|
||||
NS_ENSURE_ARG_POINTER(escapedVCardStr);
|
||||
|
||||
char *vCardString = nsnull;
|
||||
vCardString = PL_strdup("begin:vcard \n");
|
||||
|
||||
nsresult rv = addProperty(&vCardString, prefRoot, prefRoot);
|
||||
NS_ENSURE_SUCCESS(rv,rv);
|
||||
|
||||
char *vcard = PR_smprintf("%send:vcard\n", vCardString);
|
||||
PR_FREEIF(vCardString);
|
||||
|
||||
VObject *vObj = parse_MIME(vcard, strlen(vcard));
|
||||
PR_FREEIF(vcard);
|
||||
|
||||
nsCOMPtr<nsIAbCard> cardFromVCard = do_CreateInstance(NS_ABCARDPROPERTY_CONTRACTID);
|
||||
convertFromVObject(vObj, cardFromVCard);
|
||||
|
||||
if (vObj)
|
||||
cleanVObject(vObj);
|
||||
|
||||
rv = cardFromVCard->ConvertToEscapedVCard(escapedVCardStr);
|
||||
NS_ENSURE_SUCCESS(rv,rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
CMDLINEHANDLER_IMPL(nsAddressBook,"-addressbook","general.startup.addressbook","chrome://messenger/content/addressbook/addressbook.xul","Start with the addressbook.",NS_ADDRESSBOOKSTARTUPHANDLER_CONTRACTID,"Addressbook Startup Handler",PR_FALSE,"", PR_TRUE)
|
||||
|
||||
|
|
|
@ -96,7 +96,6 @@
|
|||
#endif
|
||||
|
||||
static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID);
|
||||
static NS_DEFINE_CID(kAddressBookCID, NS_ADDRESSBOOK_CID);
|
||||
|
||||
#define IMAP_SCHEMA "imap:/"
|
||||
#define IMAP_SCHEMA_LENGTH 6
|
||||
|
@ -171,6 +170,8 @@ static NS_DEFINE_CID(kAddressBookCID, NS_ADDRESSBOOK_CID);
|
|||
#define PREF_4X_NEWS_MAX_ARTICLES "news.max_articles"
|
||||
#define PREF_4X_NEWS_NOTIFY_ON "news.notify.on"
|
||||
#define PREF_4X_NEWS_MARK_OLD_READ "news.mark_old_read"
|
||||
#define PREF_4X_MAIL_ATTACH_VCARD "mail.attach_vcard"
|
||||
#define PREF_4X_MAIL_IDENTITY_VCARD_ROOT "mail.identity.vcard"
|
||||
|
||||
#define PREF_4X_AUTOCOMPLETE_ON_LOCAL_AB "ldap_2.autoComplete.useAddressBooks"
|
||||
#define PREF_MOZILLA_AUTOCOMPLETE_ON_LOCAL_AB "mail.enable_autocomplete"
|
||||
|
@ -211,8 +212,7 @@ static NS_DEFINE_CID(kAddressBookCID, NS_ADDRESSBOOK_CID);
|
|||
nsXPIDLCString macro_oldStr; \
|
||||
nsresult macro_rv; \
|
||||
macro_rv = IDENTITY->MACRO_GETTER(getter_Copies(macro_oldStr)); \
|
||||
if (NS_FAILED(macro_rv)) return macro_rv; \
|
||||
if (!macro_oldStr) { \
|
||||
if (NS_FAILED(macro_rv) || !macro_oldStr) { \
|
||||
IDENTITY->MACRO_SETTER(""); \
|
||||
}\
|
||||
else { \
|
||||
|
@ -788,9 +788,23 @@ nsMessengerMigrator::MigrateIdentity(nsIMsgIdentity *identity)
|
|||
MIGRATE_SIMPLE_STR_PREF(PREF_4X_MAIL_IDENTITY_REPLY_TO,identity,SetReplyTo)
|
||||
MIGRATE_SIMPLE_WSTR_PREF(PREF_4X_MAIL_IDENTITY_ORGANIZATION,identity,SetOrganization)
|
||||
MIGRATE_SIMPLE_BOOL_PREF(PREF_4X_MAIL_COMPOSE_HTML,identity,SetComposeHtml)
|
||||
MIGRATE_SIMPLE_FILE_PREF_TO_FILE_PREF(PREF_4X_MAIL_SIGNATURE_FILE,identity,SetSignature);
|
||||
MIGRATE_SIMPLE_FILE_PREF_TO_BOOL_PREF(PREF_4X_MAIL_SIGNATURE_FILE,identity,SetAttachSignature);
|
||||
MIGRATE_SIMPLE_INT_PREF(PREF_4X_MAIL_SIGNATURE_DATE,identity,SetSignatureDate);
|
||||
MIGRATE_SIMPLE_FILE_PREF_TO_FILE_PREF(PREF_4X_MAIL_SIGNATURE_FILE,identity,SetSignature)
|
||||
MIGRATE_SIMPLE_FILE_PREF_TO_BOOL_PREF(PREF_4X_MAIL_SIGNATURE_FILE,identity,SetAttachSignature)
|
||||
MIGRATE_SIMPLE_INT_PREF(PREF_4X_MAIL_SIGNATURE_DATE,identity,SetSignatureDate)
|
||||
|
||||
MIGRATE_SIMPLE_BOOL_PREF(PREF_4X_MAIL_ATTACH_VCARD, identity, SetAttachVCard)
|
||||
nsCOMPtr <nsIAddressBook> ab = do_CreateInstance(NS_ADDRESSBOOK_CONTRACTID);
|
||||
if (ab)
|
||||
{
|
||||
nsXPIDLCString escapedVCardStr;
|
||||
rv = ab->Convert4xVCardPrefs(PREF_4X_MAIL_IDENTITY_VCARD_ROOT, getter_Copies(escapedVCardStr));
|
||||
if (NS_SUCCEEDED(rv) && !escapedVCardStr.IsEmpty())
|
||||
{
|
||||
rv = identity->SetEscapedVCard(escapedVCardStr.get());
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to set escaped vCard string");
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE: if you add prefs here, make sure you update nsMsgIdentity::Copy() */
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -2000,7 +2014,7 @@ nsMessengerMigrator::migrateAddressBookPrefEnum(const char *aPref, void *aClosur
|
|||
NS_ASSERTION(NS_SUCCEEDED(rv),"ab migration failed: failed to append filename");
|
||||
if (NS_FAILED(rv)) return;
|
||||
|
||||
nsCOMPtr <nsIAddressBook> ab = do_CreateInstance(kAddressBookCID, &rv);
|
||||
nsCOMPtr <nsIAddressBook> ab = do_CreateInstance(NS_ADDRESSBOOK_CONTRACTID, &rv);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv) && ab, "failed to get address book");
|
||||
if (NS_FAILED(rv) || !ab) return;
|
||||
|
||||
|
|
|
@ -655,7 +655,7 @@ nsMsgIdentity::setFolderPref(const char *prefname, const char *value)
|
|||
|
||||
// get the old folder, and clear the special folder flag on it
|
||||
rv = getFolderPref(prefname, getter_Copies(oldpref), PR_FALSE);
|
||||
if (NS_SUCCEEDED(rv) && (const char*)oldpref)
|
||||
if (NS_SUCCEEDED(rv) && !oldpref.IsEmpty())
|
||||
{
|
||||
rv = rdf->GetResource(oldpref, getter_AddRefs(res));
|
||||
if (NS_SUCCEEDED(rv) && res)
|
||||
|
@ -668,7 +668,7 @@ nsMsgIdentity::setFolderPref(const char *prefname, const char *value)
|
|||
|
||||
// set the new folder, and set the special folder flags on it
|
||||
rv = setCharPref(prefname, value);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
if (NS_SUCCEEDED(rv) && value && *value)
|
||||
{
|
||||
rv = rdf->GetResource(nsDependentCString(value), getter_AddRefs(res));
|
||||
if (NS_SUCCEEDED(rv) && res)
|
||||
|
@ -726,8 +726,8 @@ NS_IMETHODIMP nsMsgIdentity::GetIntAttribute(const char *aName, PRInt32 *val)
|
|||
nsresult macro_rv; \
|
||||
nsCOMPtr <nsILocalFile>macro_spec; \
|
||||
macro_rv = SRC_ID->MACRO_GETTER(getter_AddRefs(macro_spec)); \
|
||||
if (NS_FAILED(macro_rv)) return macro_rv; \
|
||||
this->MACRO_SETTER(macro_spec); \
|
||||
if (NS_SUCCEEDED(macro_rv)) \
|
||||
this->MACRO_SETTER(macro_spec); \
|
||||
}
|
||||
|
||||
#define COPY_IDENTITY_INT_VALUE(SRC_ID,MACRO_GETTER,MACRO_SETTER) \
|
||||
|
@ -735,8 +735,8 @@ NS_IMETHODIMP nsMsgIdentity::GetIntAttribute(const char *aName, PRInt32 *val)
|
|||
nsresult macro_rv; \
|
||||
PRInt32 macro_oldInt; \
|
||||
macro_rv = SRC_ID->MACRO_GETTER(¯o_oldInt); \
|
||||
if (NS_FAILED(macro_rv)) return macro_rv; \
|
||||
this->MACRO_SETTER(macro_oldInt); \
|
||||
if (NS_SUCCEEDED(macro_rv)) \
|
||||
this->MACRO_SETTER(macro_oldInt); \
|
||||
}
|
||||
|
||||
#define COPY_IDENTITY_BOOL_VALUE(SRC_ID,MACRO_GETTER,MACRO_SETTER) \
|
||||
|
@ -744,8 +744,8 @@ NS_IMETHODIMP nsMsgIdentity::GetIntAttribute(const char *aName, PRInt32 *val)
|
|||
nsresult macro_rv; \
|
||||
PRBool macro_oldBool; \
|
||||
macro_rv = SRC_ID->MACRO_GETTER(¯o_oldBool); \
|
||||
if (NS_FAILED(macro_rv)) return macro_rv; \
|
||||
this->MACRO_SETTER(macro_oldBool); \
|
||||
if (NS_SUCCEEDED(macro_rv)) \
|
||||
this->MACRO_SETTER(macro_oldBool); \
|
||||
}
|
||||
|
||||
#define COPY_IDENTITY_STR_VALUE(SRC_ID,MACRO_GETTER,MACRO_SETTER) \
|
||||
|
@ -753,13 +753,14 @@ NS_IMETHODIMP nsMsgIdentity::GetIntAttribute(const char *aName, PRInt32 *val)
|
|||
nsXPIDLCString macro_oldStr; \
|
||||
nsresult macro_rv; \
|
||||
macro_rv = SRC_ID->MACRO_GETTER(getter_Copies(macro_oldStr)); \
|
||||
if (NS_FAILED(macro_rv)) return macro_rv; \
|
||||
if (!macro_oldStr) { \
|
||||
if (NS_SUCCEEDED(macro_rv)) { \
|
||||
if (!macro_oldStr) { \
|
||||
this->MACRO_SETTER(""); \
|
||||
} \
|
||||
else { \
|
||||
this->MACRO_SETTER(macro_oldStr); \
|
||||
} \
|
||||
} \
|
||||
else { \
|
||||
this->MACRO_SETTER(macro_oldStr); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
static const PRUnichar unicharEmptyString[] = { (PRUnichar)'\0' };
|
||||
|
@ -768,14 +769,15 @@ static const PRUnichar unicharEmptyString[] = { (PRUnichar)'\0' };
|
|||
{ \
|
||||
nsXPIDLString macro_oldStr; \
|
||||
nsresult macro_rv; \
|
||||
macro_rv = SRC_ID->MACRO_GETTER(getter_Copies(macro_oldStr)); \
|
||||
if (NS_FAILED(macro_rv)) return macro_rv; \
|
||||
if (!macro_oldStr) { \
|
||||
macro_rv = SRC_ID->MACRO_GETTER(getter_Copies(macro_oldStr)); \
|
||||
if (NS_SUCCEEDED(macro_rv)) { \
|
||||
if (!macro_oldStr) { \
|
||||
this->MACRO_SETTER(unicharEmptyString); \
|
||||
} \
|
||||
else { \
|
||||
} \
|
||||
else { \
|
||||
this->MACRO_SETTER(macro_oldStr); \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -794,7 +796,8 @@ nsMsgIdentity::Copy(nsIMsgIdentity *identity)
|
|||
COPY_IDENTITY_INT_VALUE(identity,GetReplyOnTop,SetReplyOnTop)
|
||||
COPY_IDENTITY_BOOL_VALUE(identity,GetSigBottom,SetSigBottom)
|
||||
COPY_IDENTITY_INT_VALUE(identity,GetSignatureDate,SetSignatureDate)
|
||||
|
||||
COPY_IDENTITY_BOOL_VALUE(identity,GetAttachVCard,SetAttachVCard)
|
||||
COPY_IDENTITY_STR_VALUE(identity,GetEscapedVCard,SetEscapedVCard)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -2295,6 +2295,7 @@ nsPrefMigration::DetermineOldPath(nsIFileSpec *profilePath, const char *oldPathN
|
|||
"ldap_2.server.*.description"
|
||||
"intl.font*.fixed_font"
|
||||
"intl.font*.prop_font"
|
||||
"mail.identity.vcard.*"
|
||||
*/
|
||||
|
||||
static const char *prefsToConvert[] = {
|
||||
|
@ -2443,6 +2444,21 @@ void ldapPrefEnumerationFunction(const char *name, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
static
|
||||
void vCardPrefEnumerationFunction(const char *name, void *data)
|
||||
{
|
||||
nsCStringArray *arr;
|
||||
arr = (nsCStringArray *)data;
|
||||
#ifdef DEBUG_UTF8_CONVERSION
|
||||
printf("vCardPrefEnumerationFunction: %s\n", name);
|
||||
#endif
|
||||
|
||||
// the 4.x vCard prefs might need converting
|
||||
nsCString str(name);
|
||||
arr->AppendCString(str);
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
nsIPref *prefs;
|
||||
const char* charSet;
|
||||
|
@ -2481,6 +2497,7 @@ nsPrefConverter::ConvertPrefsToUTF8()
|
|||
|
||||
prefs->EnumerateChildren("intl.font",fontPrefEnumerationFunction,(void *)(&prefsToMigrate));
|
||||
prefs->EnumerateChildren("ldap_2.servers",ldapPrefEnumerationFunction,(void *)(&prefsToMigrate));
|
||||
prefs->EnumerateChildren("mail.identity.vcard",vCardPrefEnumerationFunction,(void *)(&prefsToMigrate));
|
||||
|
||||
PrefEnumerationClosure closure;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче