From 74311a9c0039017d3f904fe75bf3f4a94cfafcf4 Mon Sep 17 00:00:00 2001 From: "chuang%netscape.com" Date: Mon, 9 Aug 1999 19:09:32 +0000 Subject: [PATCH] fix Bug 11399 and add remove address book backend --- mailnews/addrbook/public/nsIAddressBook.idl | 2 +- .../addrbook/resources/content/abCommon.js | 1 + .../addrbook/resources/content/addressbook.js | 12 ++++ mailnews/addrbook/src/nsAbCard.cpp | 2 - mailnews/addrbook/src/nsAbDirectory.cpp | 37 +++++------ mailnews/addrbook/src/nsAbRDFResource.cpp | 22 +++---- mailnews/addrbook/src/nsAddressBook.cpp | 65 +++++++------------ mailnews/addrbook/src/nsAddressBook.h | 2 +- mailnews/addrbook/src/nsCardDataSource.cpp | 29 +++++---- mailnews/addrbook/src/nsDirPrefs.cpp | 61 ++++++++++------- mailnews/addrbook/src/nsDirPrefs.h | 1 + .../addrbook/src/nsDirectoryDataSource.cpp | 2 +- 12 files changed, 123 insertions(+), 113 deletions(-) diff --git a/mailnews/addrbook/public/nsIAddressBook.idl b/mailnews/addrbook/public/nsIAddressBook.idl index 576ac5a415a6..e749de836e3b 100644 --- a/mailnews/addrbook/public/nsIAddressBook.idl +++ b/mailnews/addrbook/public/nsIAddressBook.idl @@ -34,7 +34,7 @@ interface nsIAddressBook : nsISupports { void DeleteCards(in nsIDOMXULElement tree, in nsIDOMXULElement srcDir, in nsIDOMNodeList node); void NewAddressBook(in nsIRDFCompositeDataSource db, in nsIDOMXULElement srcDir, in string name); - void DeleteAddressBook(in nsIDOMXULElement tree, in nsIDOMXULElement srcDir, in nsIDOMNodeList node); + void DeleteAddressBooks(in nsIRDFCompositeDataSource db, in nsIDOMXULElement srcDir, in nsIDOMNodeList node); void PrintCard(); void PrintAddressbook(); void SetWebShellWindow(in nsIDOMWindow win); diff --git a/mailnews/addrbook/resources/content/abCommon.js b/mailnews/addrbook/resources/content/abCommon.js index 27e3e5d22588..d0b6aaca1a32 100644 --- a/mailnews/addrbook/resources/content/abCommon.js +++ b/mailnews/addrbook/resources/content/abCommon.js @@ -112,6 +112,7 @@ function GetSelectedAddresses() function ChangeDirectoryByDOMNode(dirNode) { var uri = dirNode.getAttribute('id'); + dump("uri = " + uri + "\n"); ChangeDirectoryByURI(uri); } diff --git a/mailnews/addrbook/resources/content/addressbook.js b/mailnews/addrbook/resources/content/addressbook.js index 3e4c1334ca9e..97d30aedff2b 100644 --- a/mailnews/addrbook/resources/content/addressbook.js +++ b/mailnews/addrbook/resources/content/addressbook.js @@ -35,6 +35,18 @@ function AbDelete() } +function AbDeleteDirectory() +{ + dump("\AbDeleteDirectory from XUL\n"); + var tree = document.getElementById('dirTree'); + var selArray = tree.getElementsByAttribute('selected', 'true'); + if ( selArray && selArray.length ) + { + top.addressbook.DeleteAddressBooks(tree.database, tree, selArray); + } +} + + function UpdateCardView() { var selArray = document.getElementById('resultsTree').getElementsByAttribute('selected', 'true'); diff --git a/mailnews/addrbook/src/nsAbCard.cpp b/mailnews/addrbook/src/nsAbCard.cpp index ccc5849d6b5e..910f8e2961d8 100644 --- a/mailnews/addrbook/src/nsAbCard.cpp +++ b/mailnews/addrbook/src/nsAbCard.cpp @@ -141,8 +141,6 @@ nsresult nsAbCard::AddSubNode(nsAutoString name, nsIAbCard **childCard) *childCard = card; NS_IF_ADDREF(*childCard); - (void)nsServiceManager::ReleaseService(kRDFServiceCID, rdf); - return rv; } diff --git a/mailnews/addrbook/src/nsAbDirectory.cpp b/mailnews/addrbook/src/nsAbDirectory.cpp index e3d5b92abbb7..1d78fcedfc98 100644 --- a/mailnews/addrbook/src/nsAbDirectory.cpp +++ b/mailnews/addrbook/src/nsAbDirectory.cpp @@ -192,8 +192,6 @@ NS_IMETHODIMP nsAbDirectory::AddDirectory(const char *uriName, nsIAbDirectory ** *childDir = directory; NS_IF_ADDREF(*childDir); - (void)nsServiceManager::ReleaseService(kRDFServiceCID, rdf); - return rv; } @@ -321,30 +319,31 @@ NS_IMETHODIMP nsAbDirectory::DeleteCards(nsISupportsArray *cards) NS_IMETHODIMP nsAbDirectory::DeleteDirectories(nsISupportsArray *dierctories) { - nsresult rv = NS_OK; -/* - if (!mDatabase) - rv = GetAbDatabase(); + nsresult rv = NS_ERROR_FAILURE; - if (NS_SUCCEEDED(rv) && mDatabase) + PRUint32 i, dirCount; + rv = dierctories->Count(&dirCount); + if (NS_FAILED(rv)) return rv; + for (i = 0; i < dirCount; i++) { - PRUint32 cardCount; - rv = cards->Count(&cardCount); - if (NS_FAILED(rv)) return rv; - for(PRUint32 i = 0; i < cardCount; i++) + nsCOMPtr dirSupports; + nsCOMPtr directory; + dirSupports = getter_AddRefs(dierctories->ElementAt(i)); + directory = do_QueryInterface(dirSupports, &rv); + if (NS_SUCCEEDED(rv) && directory) { - nsCOMPtr cardSupports; - nsCOMPtr card; - cardSupports = getter_AddRefs(cards->ElementAt(i)); - card = do_QueryInterface(cardSupports, &rv); - if (card) + DIR_Server *server = nsnull; + rv = directory->GetServer(&server); + if (server) { - mDatabase->DeleteCard(card, PR_TRUE); + DIR_DeleteServerFromList(server); + + rv = mSubDirectories->RemoveElement(directory); + NotifyItemDeleted(directory); } } - mDatabase->Commit(kLargeCommit); } -*/ + return rv; } diff --git a/mailnews/addrbook/src/nsAbRDFResource.cpp b/mailnews/addrbook/src/nsAbRDFResource.cpp index e46a20bcb07e..a43b98dc2050 100644 --- a/mailnews/addrbook/src/nsAbRDFResource.cpp +++ b/mailnews/addrbook/src/nsAbRDFResource.cpp @@ -76,30 +76,30 @@ NS_IMETHODIMP nsAbRDFResource::OnAnnouncerGoingAway(nsIAddrDBAnnouncer *instigat nsresult nsAbRDFResource::GetAbDatabase() { - nsresult openAddrDB = NS_OK; + nsresult rv = NS_OK; if (!mDatabase && mURI) { - nsresult rv = NS_OK; nsFileSpec* dbPath = nsnull; NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); if(NS_SUCCEEDED(rv)) abSession->GetUserProfileDirectory(&dbPath); - + const char* file = nsnull; file = &(mURI[PL_strlen(kDirectoryDataSourceRoot)]); (*dbPath) += file; - if (NS_SUCCEEDED(rv)) - { - NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); + NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); - if (NS_SUCCEEDED(rv) && addrDBFactory) - openAddrDB = addrDBFactory->Open(dbPath, PR_TRUE, getter_AddRefs(mDatabase), PR_TRUE); + if (NS_SUCCEEDED(rv) && addrDBFactory) + rv = addrDBFactory->Open(dbPath, PR_TRUE, getter_AddRefs(mDatabase), PR_TRUE); - if (mDatabase) - mDatabase->AddListener(this); - } + if (mDatabase) + mDatabase->AddListener(this); + + return NS_OK; } + if (!mDatabase) + return NS_ERROR_NULL_POINTER; return NS_OK; } diff --git a/mailnews/addrbook/src/nsAddressBook.cpp b/mailnews/addrbook/src/nsAddressBook.cpp index 118bc3ba4fd7..7d84f2c81c63 100644 --- a/mailnews/addrbook/src/nsAddressBook.cpp +++ b/mailnews/addrbook/src/nsAddressBook.cpp @@ -154,8 +154,6 @@ NS_IMETHODIMP nsAddressBook::NewAddressBook if(!db || !srcDirectory || !name) return NS_ERROR_NULL_POINTER; -// DIR_Server * server = nsnull; -// nsresult rv = DIR_AddNewAddressBook(name, &server); nsresult rv = NS_OK; NS_WITH_SERVICE(nsIRDFService, rdfService, kRDFServiceCID, &rv); if(NS_FAILED(rv)) @@ -180,68 +178,51 @@ NS_IMETHODIMP nsAddressBook::NewAddressBook rv = NS_NewISupportsArray(getter_AddRefs(nameArray)); if(NS_FAILED(rv)) return NS_ERROR_OUT_OF_MEMORY; - /* - nsCOMPtr itemResource; - char *uri = PR_smprintf("%s%s", kDirectoryDataSourceRoot, server->fileName); - rv = rdfService->GetResource(uri, getter_AddRefs(itemResource)); - if (uri) - PR_smprintf_free(uri); - nsCOMPtr newDir = do_QueryInterface(itemResource); - if (newDir) - { - newDir->SetDirName(server->description); - newDir->SetServer(server); - } - else - return NS_ERROR_NULL_POINTER; -*/ nsString nameStr = name; nsCOMPtr nameLiteral; rdfService->GetLiteral(nameStr.GetUnicode(), getter_AddRefs(nameLiteral)); nameArray->AppendElement(nameLiteral); -// resourceArray->AppendElement(itemResource); - DoCommand(db, "http://home.netscape.com/NC-rdf#NewDirectory", dirArray, nameArray); return rv; } -NS_IMETHODIMP nsAddressBook::DeleteAddressBook -(nsIDOMXULElement *tree, nsIDOMXULElement *srcDirectory, nsIDOMNodeList *nodeList) +NS_IMETHODIMP nsAddressBook::DeleteAddressBooks +(nsIRDFCompositeDataSource* db, nsIDOMXULElement *srcDirectory, nsIDOMNodeList *nodeList) { - nsresult rv; - - if(!tree || !srcDirectory || !nodeList) + if(!db || !srcDirectory || !nodeList) return NS_ERROR_NULL_POINTER; - nsCOMPtr database; - nsCOMPtr resourceArray, dirArray; - nsCOMPtr resource; - - rv = srcDirectory->GetResource(getter_AddRefs(resource)); - + nsresult rv = NS_OK; + NS_WITH_SERVICE(nsIRDFService, rdfService, kRDFServiceCID, &rv); if(NS_FAILED(rv)) return rv; - rv = tree->GetDatabase(getter_AddRefs(database)); + nsCOMPtr dirArray; + + rv = NS_NewISupportsArray(getter_AddRefs(dirArray)); if(NS_FAILED(rv)) - return rv; + return NS_ERROR_OUT_OF_MEMORY; + nsCOMPtr parentResource; + char *parentUri = PR_smprintf("%s", kDirectoryDataSourceRoot); + rv = rdfService->GetResource(parentUri, getter_AddRefs(parentResource)); + nsCOMPtr parentDir = do_QueryInterface(parentResource); + if (!parentDir) + return NS_ERROR_NULL_POINTER; + if (parentUri) + PR_smprintf_free(parentUri); + + dirArray->AppendElement(parentResource); + + + nsCOMPtr resourceArray; rv = ConvertDOMListToResourceArray(nodeList, getter_AddRefs(resourceArray)); if(NS_FAILED(rv)) return rv; - rv = NS_NewISupportsArray(getter_AddRefs(dirArray)); - if(NS_FAILED(rv)) - { - return NS_ERROR_OUT_OF_MEMORY; - } - - dirArray->AppendElement(resource); - - rv = DoCommand(database, NC_RDF_DELETE, dirArray, resourceArray); - + DoCommand(db, NC_RDF_DELETE, dirArray, resourceArray); return rv; } diff --git a/mailnews/addrbook/src/nsAddressBook.h b/mailnews/addrbook/src/nsAddressBook.h index 0f4782bd3c02..23adcc557df0 100644 --- a/mailnews/addrbook/src/nsAddressBook.h +++ b/mailnews/addrbook/src/nsAddressBook.h @@ -42,7 +42,7 @@ public: // nsIAddressBook NS_IMETHOD DeleteCards(nsIDOMXULElement *tree, nsIDOMXULElement *srcDirectory, nsIDOMNodeList *nodeList); NS_IMETHOD NewAddressBook(nsIRDFCompositeDataSource* db, nsIDOMXULElement *srcDirectory, const char *name); - NS_IMETHOD DeleteAddressBook(nsIDOMXULElement *tree, nsIDOMXULElement *srcDirectory, nsIDOMNodeList *nodeList); + NS_IMETHOD DeleteAddressBooks(nsIRDFCompositeDataSource* db, nsIDOMXULElement *srcDirectory, nsIDOMNodeList *nodeList); NS_IMETHOD PrintCard(); NS_IMETHOD PrintAddressbook(); NS_IMETHOD SetWebShellWindow(nsIDOMWindow *win); diff --git a/mailnews/addrbook/src/nsCardDataSource.cpp b/mailnews/addrbook/src/nsCardDataSource.cpp index 77c00353d12e..45b23f18f2ae 100644 --- a/mailnews/addrbook/src/nsCardDataSource.cpp +++ b/mailnews/addrbook/src/nsCardDataSource.cpp @@ -66,24 +66,27 @@ nsAbCardDataSource::nsAbCardDataSource(): nsAbCardDataSource::~nsAbCardDataSource (void) { - mRDFService->UnregisterDataSource(this); + mRDFService->UnregisterDataSource(this); - nsresult rv = NS_OK; - NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); - if(NS_SUCCEEDED(rv)) - abSession->RemoveAddressBookListener(this); + nsresult rv = NS_OK; + NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); + if(NS_SUCCEEDED(rv)) + abSession->RemoveAddressBookListener(this); - nsrefcnt refcnt; + nsrefcnt refcnt; - NS_RELEASE2(kNC_DisplayName, refcnt); - NS_RELEASE2(kNC_PrimaryEmail, refcnt); - NS_RELEASE2(kNC_WorkPhone, refcnt); + NS_RELEASE2(kNC_DisplayName, refcnt); + NS_RELEASE2(kNC_PrimaryEmail, refcnt); + NS_RELEASE2(kNC_WorkPhone, refcnt); - NS_RELEASE2(kNC_Delete, refcnt); - NS_RELEASE2(kNC_NewCard, refcnt); + NS_RELEASE2(kNC_Delete, refcnt); + NS_RELEASE2(kNC_NewCard, refcnt); - nsServiceManager::ReleaseService(kRDFServiceCID, mRDFService); // XXX probably need shutdown listener here - mRDFService = nsnull; + if (mRDFService) + { + nsServiceManager::ReleaseService(kRDFServiceCID, mRDFService); + mRDFService = nsnull; + } } nsresult nsAbCardDataSource::Init() diff --git a/mailnews/addrbook/src/nsDirPrefs.cpp b/mailnews/addrbook/src/nsDirPrefs.cpp index 03d10513a8d8..69390f92cde5 100644 --- a/mailnews/addrbook/src/nsDirPrefs.cpp +++ b/mailnews/addrbook/src/nsDirPrefs.cpp @@ -400,7 +400,7 @@ nsresult DIR_ContainsServer(DIR_Server* pServer, PRBool *hasDir) } } *hasDir = PR_FALSE; - return NS_ERROR_FAILURE; + return NS_OK; } nsresult DIR_AddNewAddressBook(const char *name, DIR_Server** pServer) @@ -1884,7 +1884,7 @@ static nsresult dir_DeleteServerContents (DIR_Server *server) return NS_OK; } -nsresult DIR_DeleteServer (DIR_Server *server) +nsresult DIR_DeleteServer(DIR_Server *server) { if (server) { @@ -1895,6 +1895,32 @@ nsresult DIR_DeleteServer (DIR_Server *server) return NS_OK; } +nsresult DIR_DeleteServerFromList(DIR_Server *server) +{ + if (!server) + return NS_ERROR_NULL_POINTER; + + nsresult rv = NS_OK; + nsFileSpec* dbPath = nsnull; + + NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); + if(NS_SUCCEEDED(rv)) + abSession->GetUserProfileDirectory(&dbPath); + + if (dbPath) + { + nsFileSpec prefFile = (*dbPath); + prefFile += server->fileName; + prefFile.Delete(PR_FALSE); + + nsVoidArray *dirList = DIR_GetDirectories(); + DIR_SetServerPosition(dirList, server, DIR_POS_DELETE); + DIR_DeleteServer(server); + return NS_OK; + } + return NS_ERROR_NULL_POINTER; +} + nsresult DIR_DeleteServerList(nsVoidArray *wholeList) { DIR_Server *server = nsnull; @@ -2651,14 +2677,16 @@ void DIR_SetFileName(char** fileName, const char* defaultName) NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); if(NS_SUCCEEDED(rv)) abSession->GetUserProfileDirectory(&dbPath); - - (*dbPath) += defaultName; - dbPath->MakeUnique(defaultName); - char* file = nsnull; - file = dbPath->GetLeafName(); - *fileName = PL_strdup(file); - if (file) - nsCRT::free(file); + if (dbPath) + { + (*dbPath) += defaultName; + dbPath->MakeUnique(defaultName); + char* file = nsnull; + file = dbPath->GetLeafName(); + *fileName = PL_strdup(file); + if (file) + nsCRT::free(file); + } } /**************************************************************** @@ -3286,20 +3314,7 @@ void DIR_ClearPrefBranch(const char *branch) if (NS_FAILED(rv) || !pPref) return; - /* This little function provides a way to delete a prefs object but still - * allow reassignment of that object later. - */ - char *recreateBranch = nsnull; - pPref->DeleteBranch (branch); - recreateBranch = PR_smprintf("pref_inittree(\"%s\")", branch); - if (recreateBranch) - { -#ifdef PREF_QuietEvaluateJSBuffer - PREF_QuietEvaluateJSBuffer (recreateBranch, PL_strlen(recreateBranch)); -#endif /* PREF_QuietEvaluateJSBuffer */ - PR_smprintf_free(recreateBranch); - } } diff --git a/mailnews/addrbook/src/nsDirPrefs.h b/mailnews/addrbook/src/nsDirPrefs.h index 7006eeb351fa..5f09a7321225 100644 --- a/mailnews/addrbook/src/nsDirPrefs.h +++ b/mailnews/addrbook/src/nsDirPrefs.h @@ -254,6 +254,7 @@ PRBool DIR_AreServersSame (DIR_Server *first, DIR_Server *second); DIR_Server *DIR_LookupServer(char *serverName, PRInt32 port, char *searchBase); nsresult DIR_DeleteServer (DIR_Server *); +nsresult DIR_DeleteServerFromList (DIR_Server *); nsresult DIR_DeleteServerList(nsVoidArray *wholeList); #define DIR_POS_APPEND 0x80000000 diff --git a/mailnews/addrbook/src/nsDirectoryDataSource.cpp b/mailnews/addrbook/src/nsDirectoryDataSource.cpp index 12e9ff809c92..2a28eb5fce49 100644 --- a/mailnews/addrbook/src/nsDirectoryDataSource.cpp +++ b/mailnews/addrbook/src/nsDirectoryDataSource.cpp @@ -472,7 +472,7 @@ NS_IMETHODIMP nsAbDirectoryDataSource::OnItemRemoved(nsISupports *parentDirector if(NS_SUCCEEDED(rv)) { //Notify a directory was deleted. - NotifyObservers(parentResource, kNC_DirName, itemNode, PR_FALSE); + NotifyObservers(parentResource, kNC_Child, itemNode, PR_FALSE); } } }