NS_IMETHODIMP nsAbBSDirectory::DeleteDirectory(nsIAbDirectory *directory) { NS_ENSURE_ARG_POINTER(directory); nsresult rv = EnsureInitialized(); NS_ENSURE_SUCCESS(rv, rv); DIR_Server *server = nsnull; mServers.Get(directory, &server); if (!server) return NS_ERROR_FAILURE; GetDirectories getDirectories(server); mServers.EnumerateRead(GetDirectories_getDirectory, (void*)&getDirectories); DIR_DeleteServerFromList(server); nsCOMPtr<nsIAbDirFactoryService> dirFactoryService = do_GetService(NS_ABDIRFACTORYSERVICE_CONTRACTID,&rv); NS_ENSURE_SUCCESS (rv, rv); PRUint32 count = getDirectories.directories.Count(); nsCOMPtr<nsIAbManager> abManager = do_GetService(NS_ABMANAGER_CONTRACTID); for (PRUint32 i = 0; i < count; i++) { nsCOMPtr<nsIAbDirectory> d = getDirectories.directories[i]; mServers.Remove(d); rv = mSubDirectories.RemoveObject(d); if (abManager) abManager->NotifyDirectoryDeleted(this, d); nsCOMPtr<nsIRDFResource> resource(do_QueryInterface (d, &rv)); nsCString uri; resource->GetValueUTF8(uri); nsCOMPtr<nsIAbDirFactory> dirFactory; rv = dirFactoryService->GetDirFactory(uri, getter_AddRefs(dirFactory)); if (NS_FAILED(rv)) continue; rv = dirFactory->DeleteDirectory(d); } return rv; }
NS_IMETHODIMP nsAbBSDirectory::DeleteDirectory(nsIAbDirectory *directory) { NS_ENSURE_ARG_POINTER(directory); nsresult rv = EnsureInitialized(); NS_ENSURE_SUCCESS(rv, rv); DIR_Server *server = nullptr; mServers.Get(directory, &server); if (!server) return NS_ERROR_FAILURE; struct GetDirectories { GetDirectories(DIR_Server* aServer) : mServer(aServer) { } nsCOMArray<nsIAbDirectory> directories; DIR_Server* mServer; }; GetDirectories getDirectories(server); for (auto iter = mServers.Iter(); !iter.Done(); iter.Next()) { if (iter.UserData() == getDirectories.mServer) { nsCOMPtr<nsIAbDirectory> abDir = do_QueryInterface(iter.Key()); getDirectories.directories.AppendObject(abDir); } } DIR_DeleteServerFromList(server); nsCOMPtr<nsIAbDirFactoryService> dirFactoryService = do_GetService(NS_ABDIRFACTORYSERVICE_CONTRACTID,&rv); NS_ENSURE_SUCCESS (rv, rv); uint32_t count = getDirectories.directories.Count(); nsCOMPtr<nsIAbManager> abManager = do_GetService(NS_ABMANAGER_CONTRACTID); for (uint32_t i = 0; i < count; i++) { nsCOMPtr<nsIAbDirectory> d = getDirectories.directories[i]; mServers.Remove(d); mSubDirectories.RemoveObject(d); if (abManager) abManager->NotifyDirectoryDeleted(this, d); nsCString uri; rv = d->GetURI(uri); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIAbDirFactory> dirFactory; rv = dirFactoryService->GetDirFactory(uri, getter_AddRefs(dirFactory)); if (NS_FAILED(rv)) continue; rv = dirFactory->DeleteDirectory(d); } return rv; }