hook up to the addressbook migration code. r=bienvenu

This commit is contained in:
sspitzer%netscape.com 2000-03-22 21:39:57 +00:00
Родитель ca03a26a56
Коммит dc59f1654f
5 изменённых файлов: 213 добавлений и 18 удалений

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

@ -32,6 +32,7 @@
%}
interface nsIDOMWindow;
interface nsIFileSpec;
[scriptable, uuid(D60B84F1-2A8C-11d3-9E07-00A0C92B5F0D)]
interface nsIAddressBook : nsISupports {
@ -43,5 +44,6 @@ interface nsIAddressBook : nsISupports {
void printAddressbook();
void setWebShellWindow(in nsIDOMWindow win);
void importAddressBook();
void convertLDIFtoMAB(in nsIFileSpec fileSpec);
};

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

@ -348,7 +348,7 @@ class AddressBookParser
protected:
nsCAutoString mLine;
nsIFileSpecWithUI* mFileSpec;
nsCOMPtr <nsIFileSpec> mFileSpec;
char* mDbUri;
nsCOMPtr<nsIAddrDatabase> mDatabase;
PRInt32 mFileType;
@ -364,13 +364,13 @@ protected:
char * str_getline( char **next );
public:
AddressBookParser(nsIFileSpecWithUI* fileSpec);
AddressBookParser(nsIFileSpec *fileSpec);
~AddressBookParser();
nsresult ParseFile();
};
AddressBookParser::AddressBookParser(nsIFileSpecWithUI* fileSpec)
AddressBookParser::AddressBookParser(nsIFileSpec * fileSpec)
{
mFileSpec = fileSpec;
mDbUri = nsnull;
@ -397,8 +397,7 @@ nsresult AddressBookParser::ParseFile()
/* Get database file name */
char *leafName = nsnull;
nsString fileString;
if (mFileSpec)
{
if (mFileSpec) {
mFileSpec->GetLeafName(&leafName);
fileString = leafName;
if (-1 != fileString.Find(kTabExtension) || -1 != fileString.Find(kTxtExtension))
@ -1249,6 +1248,23 @@ void AddressBookParser::AddLdifColToDatabase(nsIMdbRow* newRow, char* typeSlot,
}
}
NS_IMETHODIMP nsAddressBook::ConvertLDIFtoMAB(nsIFileSpec *fileSpec)
{
nsresult rv;
if (!fileSpec) return NS_ERROR_FAILURE;
rv = fileSpec->OpenStreamForReading();
if (NS_FAILED(rv)) return rv;
AddressBookParser abParser(fileSpec);
rv = abParser.ParseFile();
if (NS_FAILED(rv)) return rv;
rv = fileSpec->CloseStream();
return rv;
}
NS_IMETHODIMP nsAddressBook::ImportAddressBook()
{
nsresult rv = NS_ERROR_FAILURE;
@ -1257,20 +1273,13 @@ NS_IMETHODIMP nsAddressBook::ImportAddressBook()
if (!fileSpec)
return NS_ERROR_FAILURE;
rv = fileSpec->ChooseInputFile(
"Open File", nsIFileSpecWithUI::eAllFiles, nsnull, nsnull);
// XXX: todo "Open File" should be in a string bundle
rv = fileSpec->ChooseInputFile("Open File", nsIFileSpecWithUI::eAllFiles, nsnull, nsnull);
if (NS_FAILED(rv))
return rv;
rv = fileSpec->OpenStreamForReading();
if (NS_SUCCEEDED(rv))
{
AddressBookParser abParser(fileSpec);
rv = abParser.ParseFile();
rv = fileSpec->CloseStream();
}
return rv;
rv = ConvertLDIFtoMAB(fileSpec);
return rv;
}
CMDLINEHANDLER_IMPL(nsAddressBook,"-addressbook","general.startup.addressbook","chrome://addressbook/content/","Start with the addressbook.",NS_ADDRESSBOOKSTARTUPHANDLER_PROGID,"Addressbook Startup Handler",PR_FALSE,"", PR_TRUE)

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

@ -415,7 +415,7 @@ static nsresult dir_ConvertToMabFileName()
PRInt32 pos = name.Find(ABFileName_kPreviousSuffix);
if (pos > 0)
{
//Move old abook.na2 to end of the list anf change the description
//Move old abook.na2 to end of the list and change the description
DIR_Server * newServer = nsnull;
DIR_CopyServer(server, &newServer);
newServer->position = count + 1;
@ -3422,7 +3422,10 @@ nsresult DIR_GetServerPreferences(nsVoidArray** list)
if (version < kCurrentListVersion)
{
pPref->SetIntPref(PREF_LDAP_VERSION_NAME, kCurrentListVersion);
// not needed, we do ab conversion now
#if 0
dir_ConvertToMabFileName();
#endif
}
/* Write the merged list so we get it next time we ask */
if (savePrefs)

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

@ -60,7 +60,9 @@
#include "nsEscape.h"
#include "nsIUserInfo.h"
#include "nsIAbUpgrader.h"
#include "nsIAddressBook.h"
#include "nsAbBaseCID.h"
#define BUF_STR_LEN 1024
@ -77,6 +79,8 @@ static NS_DEFINE_CID(kSmtpServiceCID, NS_SMTPSERVICE_CID);
static NS_DEFINE_CID(kFileLocatorCID, NS_FILELOCATOR_CID);
static NS_DEFINE_CID(kMsgAccountManagerCID, NS_MSGACCOUNTMANAGER_CID);
static NS_DEFINE_IID(kIFileLocatorIID, NS_IFILELOCATOR_IID);
static NS_DEFINE_CID(kAB4xUpgraderServiceCID, NS_AB4xUPGRADER_CID);
static NS_DEFINE_CID(kAddressBookCID, NS_ADDRESSBOOK_CID);
#define IMAP_SCHEMA "imap:/"
#define IMAP_SCHEMA_LENGTH 6
@ -673,6 +677,9 @@ nsMessengerMigrator::UpgradePrefs()
rv = MigrateNewsAccounts(identity);
if (NS_FAILED(rv)) return rv;
rv = MigrateAddressBooks();
if (NS_FAILED(rv)) return rv;
// we're done migrating, let's save the prefs
rv = m_prefs->SavePrefFile();
if (NS_FAILED(rv)) return rv;
@ -1656,7 +1663,177 @@ nsMessengerMigrator::MigrateOldImapPrefs(nsIMsgIncomingServer *server, const cha
return NS_OK;
}
static PRBool charEndsWith(const char *str, const char *endStr)
{
PRUint32 endStrLen = PL_strlen(endStr);
PRUint32 strLen = PL_strlen(str);
if (strLen < endStrLen) return PR_FALSE;
PRUint32 pos = strLen - endStrLen;
if (PL_strncmp(str + pos, endStr, endStrLen) == 0) {
return PR_TRUE;
}
else {
return PR_FALSE;
}
}
#define ADDRESSBOOK_PREF_NAME_ROOT "ldap_2.servers."
#define ADDRESSBOOK_PREF_NAME_SUFFIX ".filename"
#define ADDRESSBOOK_PREF_VALUE_4x_SUFFIX ".na2"
#define ADDRESSBOOK_PREF_VALUE_5x_SUFFIX ".mab"
#define TEMP_LDIF_FILE_SUFFIX ".ldif"
#if defined(DEBUG_sspitzer) || defined(DEBUG_seth)
#define DEBUG_AB_MIGRATION 1
#endif
nsresult
nsMessengerMigrator::Convert4xAddressBookToLDIF(nsIFileSpec *srcFileSpec, nsIFileSpec *dstFileSpec)
{
nsresult rv = NS_OK;
if (!srcFileSpec || !dstFileSpec) return NS_ERROR_NULL_POINTER;
nsCOMPtr <nsIAbUpgrader> abUpgrader = do_GetService(NS_AB4xUPGRADER_PROGID, &rv);
if (NS_FAILED(rv)) return rv;
if (!abUpgrader) return NS_ERROR_FAILURE;
rv = abUpgrader->StartUpgrade4xAddrBook(srcFileSpec, dstFileSpec);
if (NS_SUCCEEDED(rv)) {
PRBool done = PR_FALSE;
do {
rv = abUpgrader->ContinueExport(&done);
printf("grinding...\n");
} while (NS_SUCCEEDED(rv) && !done);
}
return rv;
}
void
nsMessengerMigrator::migrateAddressBookPrefEnum(const char *aPref, void *aClosure)
{
nsresult rv = NS_OK;
nsIPref *prefs = (nsIPref *)aClosure;
#ifdef DEBUG_AB_MIGRATION
printf("investigate pref: %s\n",aPref);
#endif
// we only care about ldap_2.servers.*.filename" prefs
if (!charEndsWith(aPref, ADDRESSBOOK_PREF_NAME_SUFFIX)) return;
nsXPIDLCString abFileName;
rv = prefs->CopyCharPref(aPref,getter_Copies(abFileName));
NS_ASSERTION(NS_SUCCEEDED(rv),"ab migration failed: failed to get ab filename");
if (NS_FAILED(rv)) return;
NS_ASSERTION(((const char *)abFileName), "ERROR: empty addressbook file name");
if (!((const char *)abFileName)) return;
NS_ASSERTION(PL_strlen((const char *)abFileName),"ERROR: empty addressbook file name");
if (!(PL_strlen((const char *)abFileName))) return;
#ifdef DEBUG_AB_MIGRATION
printf("pref value: %s\n",(const char *)abFileName);
#endif /* DEBUG_AB_MIGRATION */
// if this a 5.x addressbook file name, skip it.
if (charEndsWith((const char *)abFileName, ADDRESSBOOK_PREF_VALUE_5x_SUFFIX)) return;
nsCAutoString abName;
abName = (const char *)abFileName;
PRInt32 len = abName.Length();
PRInt32 suffixLen = PL_strlen(ADDRESSBOOK_PREF_VALUE_4x_SUFFIX);
NS_ASSERTION(len > suffixLen, "ERROR: bad length of addressbook filename");
if (len <= suffixLen) return;
abName.SetLength(len - suffixLen);
// get 5.0 profile root.
nsCOMPtr <nsIFileSpec> ab4xFile;
nsCOMPtr <nsIFileSpec> tmpLDIFFile;
#ifdef DEBUG_AB_MIGRATION
printf("turn %s%s into %s%s\n", (const char *)abName,ADDRESSBOOK_PREF_VALUE_4x_SUFFIX,(const char *)abName,TEMP_LDIF_FILE_SUFFIX);
#endif /* DEBUG_AB_MIGRATION */
nsCOMPtr<nsIFileLocator> locator = do_GetService(kFileLocatorCID,&rv);
NS_ASSERTION(NS_SUCCEEDED(rv) && locator,"ab migration failed: failed to get locator");
if (NS_FAILED(rv) || !locator) return;
rv = locator->GetFileLocation(nsSpecialFileSpec::App_UserProfileDirectory50, getter_AddRefs(ab4xFile));
NS_ASSERTION(NS_SUCCEEDED(rv) && ab4xFile,"ab migration failed: failed to get profile dir");
if (NS_FAILED(rv) || !ab4xFile) return;
rv = ab4xFile->AppendRelativeUnixPath((const char *)abFileName);
NS_ASSERTION(NS_SUCCEEDED(rv),"ab migration failed: failed to append filename");
if (NS_FAILED(rv)) return;
nsSpecialSystemDirectory file(nsSpecialSystemDirectory::OS_TemporaryDirectory);
rv = NS_NewFileSpecWithSpec(file, getter_AddRefs(tmpLDIFFile));
NS_ASSERTION(NS_SUCCEEDED(rv) && tmpLDIFFile,"ab migration failed: failed to get tmp dir");
if (NS_FAILED(rv) || !tmpLDIFFile) return;
nsCAutoString ldifFileName;
ldifFileName = (const char *)abName;
ldifFileName += TEMP_LDIF_FILE_SUFFIX;
rv = tmpLDIFFile->AppendRelativeUnixPath((const char *)ldifFileName);
NS_ASSERTION(NS_SUCCEEDED(rv),"ab migration failed: failed to append filename");
if (NS_FAILED(rv)) return;
rv = Convert4xAddressBookToLDIF(ab4xFile, tmpLDIFFile);
NS_ASSERTION(NS_SUCCEEDED(rv),"ab migration failed: failed to convert to ldif");
if (NS_FAILED(rv)) return;
#ifdef DEBUG_AB_MIGRATION
printf("convert %s%s into %s%s\n",(const char *)abName,TEMP_LDIF_FILE_SUFFIX,(const char *)abName,ADDRESSBOOK_PREF_VALUE_5x_SUFFIX);
#endif /* DEBUG_AB_MIGRATION */
nsCOMPtr <nsIAddressBook> ab = do_CreateInstance(kAddressBookCID, &rv);
NS_ASSERTION(NS_SUCCEEDED(rv) && ab, "failed to get address book");
if (NS_FAILED(rv) || !ab) return;
rv = ab->ConvertLDIFtoMAB(tmpLDIFFile);
NS_ASSERTION(NS_SUCCEEDED(rv),"ab migration filed: ldif to mab conversion failed\n");
if (NS_FAILED(rv)) return;
#ifdef DEBUG_AB_MIGRATION
printf("set %s the pref to %s%s\n",aPref,(const char *)abName,ADDRESSBOOK_PREF_VALUE_5x_SUFFIX);
#endif /* DEBUG_AB_MIGRATION */
nsCAutoString newPrefValue;
newPrefValue = (const char *)abName;
newPrefValue += ADDRESSBOOK_PREF_VALUE_5x_SUFFIX;
rv = prefs->SetCharPref((const char *)aPref,(const char *)newPrefValue);
NS_ASSERTION(NS_SUCCEEDED(rv),"ab migration failed: failed to set pref");
if (NS_FAILED(rv)) return;
#ifdef DEBUG_AB_MIGRATION
printf("remove the tmp file\n");
#endif /* DEBUG_AB_MIGRATION */
rv = tmpLDIFFile->Delete(PR_TRUE);
NS_ASSERTION(NS_SUCCEEDED(rv),"failed to delete the temp ldif file");
if (NS_FAILED(rv)) return;
return;
}
nsresult
nsMessengerMigrator::MigrateAddressBooks()
{
nsresult rv = NS_OK;
nsCOMPtr <nsIAbUpgrader> abUpgrader = do_GetService(NS_AB4xUPGRADER_PROGID, &rv);
if (NS_FAILED(rv) || !abUpgrader) {
printf("the addressbook migrator is only in the commercial builds.\n");
return NS_OK;
}
rv = m_prefs->EnumerateChildren(ADDRESSBOOK_PREF_NAME_ROOT, migrateAddressBookPrefEnum, (void *)m_prefs);
return rv;
}
#ifdef USE_NEWSRC_MAP_FILE
#define NEWSRC_MAP_FILE_COOKIE "netscape-newsrc-map-file"
#endif /* USE_NEWSRC_MAP_FILE */

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

@ -113,6 +113,10 @@ private:
nsresult MigrateNewsAccount(nsIMsgIdentity *identity, const char *hostAndPort, nsFileSpec &newsrcfile, nsFileSpec &newsHostsDir, PRBool isSecure);
nsresult MigrateOldNntpPrefs(nsIMsgIncomingServer *server, const char *hostAndPort, nsFileSpec &newsrcfile);
nsresult MigrateAddressBooks();
static void migrateAddressBookPrefEnum(const char *aPref, void *aClosure);
static nsresult Convert4xAddressBookToLDIF(nsIFileSpec *srcFileSpec, nsIFileSpec *dstFileSpec);
nsresult ProceedWithMigration();
nsresult Convert4XUri(const char *old_uri, PRBool for_news, const char *aUsername, const char *aHostname, const char *default_folder_name, char **new_uri);