nsresult DIR_DeleteServerFromList(DIR_Server *server) { if (!server) return NS_ERROR_NULL_POINTER; nsresult rv = NS_OK; nsCOMPtr<nsILocalFile> dbPath; nsCOMPtr<nsIAbManager> abManager = do_GetService(NS_ABMANAGER_CONTRACTID, &rv); if (NS_SUCCEEDED(rv)) rv = abManager->GetUserProfileDirectory(getter_AddRefs(dbPath)); if (NS_SUCCEEDED(rv)) { // close the database, as long as it isn't the special ones // (personal addressbook and collected addressbook) // which can never be deleted. There was a bug where we would slap in // "abook.mab" as the file name for LDAP directories, which would cause a crash // on delete of LDAP directories. this is just extra protection. if (server->fileName && strcmp(server->fileName, kPersonalAddressbook) && strcmp(server->fileName, kCollectedAddressbook)) { nsCOMPtr<nsIAddrDatabase> database; rv = dbPath->AppendNative(nsDependentCString(server->fileName)); NS_ENSURE_SUCCESS(rv, rv); // close file before delete it nsCOMPtr<nsIAddrDatabase> addrDBFactory = do_GetService(NS_ADDRDATABASE_CONTRACTID, &rv); if (NS_SUCCEEDED(rv) && addrDBFactory) rv = addrDBFactory->Open(dbPath, PR_FALSE, PR_TRUE, getter_AddRefs(database)); if (database) /* database exists */ { database->ForceClosed(); rv = dbPath->Remove(PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); } } nsVoidArray *dirList = DIR_GetDirectories(); DIR_SetServerPosition(dirList, server, DIR_POS_DELETE); DIR_DeleteServer(server); return SavePrefsFile(); } return NS_ERROR_NULL_POINTER; }
nsresult nsAbBSDirectory::EnsureInitialized() { if (mInitialized) return NS_OK; nsresult rv; nsCOMPtr<nsIAbDirFactoryService> dirFactoryService = do_GetService(NS_ABDIRFACTORYSERVICE_CONTRACTID,&rv); NS_ENSURE_SUCCESS (rv, rv); nsVoidArray *directories = DIR_GetDirectories(); if (!directories) return NS_ERROR_FAILURE; PRInt32 count = directories->Count(); for (PRInt32 i = 0; i < count; i++) { DIR_Server *server = (DIR_Server *)(directories->ElementAt(i)); // if this is a 4.x, local .na2 addressbook (PABDirectory) // we must skip it. // mozilla can't handle 4.x .na2 addressbooks // note, the filename might be na2 for 4.x LDAP directories // (we used the .na2 file for replication), and we don't want to skip // those. see bug #127007 PRUint32 fileNameLen = strlen(server->fileName); if (((fileNameLen > kABFileName_PreviousSuffixLen) && strcmp(server->fileName + fileNameLen - kABFileName_PreviousSuffixLen, kABFileName_PreviousSuffix) == 0) && (server->dirType == PABDirectory)) continue; // Set the uri property nsCAutoString URI (server->uri); // This is in case the uri is never set // in the nsDirPref.cpp code. if (!server->uri) { URI = NS_LITERAL_CSTRING(kMDBDirectoryRoot); URI += nsDependentCString(server->fileName); } /* * Check that we are not converting from a * a 4.x address book file e.g. pab.na2 * check if the URI ends with ".na2" */ if (StringEndsWith(URI, NS_LITERAL_CSTRING(kABFileName_PreviousSuffix))) URI.Replace(kMDBDirectoryRootLen, URI.Length() - kMDBDirectoryRootLen, server->fileName); // Create the directories rv = CreateDirectoriesFromFactory(URI, server, PR_FALSE /* notify */); // If we failed, this could be because something has set a pref for us // which is now broke (e.g. no factory present). So just ignore this one // and move on. if (NS_FAILED(rv)) NS_WARNING("CreateDirectoriesFromFactory failed - Invalid factory?"); } mInitialized = PR_TRUE; // sort directories by position... return NS_OK; }