migrate vCards from 4.x

also fix some problems with pop account migration.

r/sr=bienvenu
This commit is contained in:
scott%scott-macgregor.org 2003-10-20 05:36:53 +00:00
Родитель 9335e3bc94
Коммит 316910e7cd
5 изменённых файлов: 155 добавлений и 28 удалений

Просмотреть файл

@ -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(&macro_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(&macro_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;