From fb6913d5136edc70e21c6ea36565ddf13e8116fc Mon Sep 17 00:00:00 2001 From: "chuang%netscape.com" Date: Tue, 18 Apr 2000 06:26:53 +0000 Subject: [PATCH] Bug 32286, 32287, 32292, mailing list backend feature, r=putterman git-svn-id: svn://10.0.0.236/trunk@66262 18797224-902f-48f8-a5cc-f745e15eee43 --- .../mailnews/addrbook/public/nsIAbCard.idl | 1 + .../addrbook/public/nsIAbDirectory.idl | 3 + .../addrbook/public/nsIAddrDBListener.idl | 4 + .../addrbook/public/nsIAddrDatabase.idl | 8 +- .../addrbook/public/nsIAddressBook.idl | 3 +- .../addrbook/src/nsAbCardProperty.cpp | 77 +++- .../mailnews/addrbook/src/nsAbDirProperty.cpp | 98 ++++- .../mailnews/addrbook/src/nsAbDirectory.cpp | 139 ++++++- mozilla/mailnews/addrbook/src/nsAbDirectory.h | 2 + .../mailnews/addrbook/src/nsAbRDFResource.cpp | 6 + .../mailnews/addrbook/src/nsAddrDatabase.cpp | 369 ++++++++++++++---- .../mailnews/addrbook/src/nsAddrDatabase.h | 10 + .../mailnews/addrbook/src/nsAddressBook.cpp | 34 ++ .../addrbook/src/nsCardDataSource.cpp | 6 +- .../addrbook/src/nsDirectoryDataSource.cpp | 25 +- 15 files changed, 655 insertions(+), 130 deletions(-) diff --git a/mozilla/mailnews/addrbook/public/nsIAbCard.idl b/mozilla/mailnews/addrbook/public/nsIAbCard.idl index f90580e072f..74f5207f052 100644 --- a/mozilla/mailnews/addrbook/public/nsIAbCard.idl +++ b/mozilla/mailnews/addrbook/public/nsIAbCard.idl @@ -71,6 +71,7 @@ interface nsIAbCard : nsISupports { attribute wstring notes; attribute unsigned long lastModifiedDate; attribute wstring name; + readonly attribute string printCardUrl; attribute boolean sendPlainText; attribute boolean isMailList; diff --git a/mozilla/mailnews/addrbook/public/nsIAbDirectory.idl b/mozilla/mailnews/addrbook/public/nsIAbDirectory.idl index 0c0d3f2a70f..68e8c448ded 100644 --- a/mozilla/mailnews/addrbook/public/nsIAbDirectory.idl +++ b/mozilla/mailnews/addrbook/public/nsIAbDirectory.idl @@ -49,8 +49,10 @@ interface nsIAbDirectory : nsISupports { boolean hasCard(in nsIAbCard cards); boolean hasDirectory(in nsIAbDirectory dir); void createNewDirectory(in wstring dirName, in string fileName, in boolean migrating); + void createNewMailingList(in string uri, in nsIAbDirectory list); string getDirUri(); void addMailListToDirectory(in nsIAbDirectory mailList); + void copyMailList(in nsIAbDirectory srcList); attribute wstring listName; attribute wstring listNickName; @@ -61,4 +63,5 @@ interface nsIAbDirectory : nsISupports { void addAddressToList(in nsIAbCard card); void addMailListToDatabase(in string uri); + void editMailListToDatabase(in string uri); }; diff --git a/mozilla/mailnews/addrbook/public/nsIAddrDBListener.idl b/mozilla/mailnews/addrbook/public/nsIAddrDBListener.idl index 7691cc2d121..565dcf54285 100644 --- a/mozilla/mailnews/addrbook/public/nsIAddrDBListener.idl +++ b/mozilla/mailnews/addrbook/public/nsIAddrDBListener.idl @@ -21,6 +21,7 @@ */ #include "nsISupports.idl" #include "nsIAbCard.idl" +#include "nsIAbDirectory.idl" interface nsIAddrDBAnnouncer; @@ -32,6 +33,9 @@ interface nsIAddrDBListener : nsISupports { void onCardEntryChange (in unsigned long abCode, in nsIAbCard card, in nsIAddrDBListener instigator); + void onListEntryChange (in unsigned long abCode, + in nsIAbDirectory list, + in nsIAddrDBListener instigator); void onAnnouncerGoingAway(in nsIAddrDBAnnouncer instigator); }; diff --git a/mozilla/mailnews/addrbook/public/nsIAddrDatabase.idl b/mozilla/mailnews/addrbook/public/nsIAddrDatabase.idl index da804aa73af..7ba33ea562d 100644 --- a/mozilla/mailnews/addrbook/public/nsIAddrDatabase.idl +++ b/mozilla/mailnews/addrbook/public/nsIAddrDatabase.idl @@ -52,13 +52,19 @@ interface nsIAddrDatabase : nsIAddrDBAnnouncer { void forceClosed(); void createNewCardAndAddToDB(in nsIAbCard newCard, in boolean beNotify); - void CreateMailListAndAddToDB(in nsIAbDirectory newList, in boolean beNotify); + void createNewListCardAndAddToDB(in unsigned long listRowID, in nsIAbCard newCard, in boolean beNotify); + void createMailListAndAddToDB(in nsIAbDirectory newList, in boolean beNotify); nsIEnumerator enumerateCards(in nsIAbDirectory directory); nsIEnumerator EnumerateListAddresses(in nsIAbDirectory directory); void GetMailingListsFromDB(in nsIAbDirectory parentDir); void deleteCard(in nsIAbCard card, in boolean beNotify); void editCard(in nsIAbCard card, in boolean beNotify); boolean containsCard(in nsIAbCard card); + void deleteMailList(in nsIAbDirectory mailList, in boolean beNotify); + void editMailList(in nsIAbDirectory mailList, in boolean beNotify); + boolean containsMailList(in nsIAbDirectory mailList); + void deleteCardFromMailList(in nsIAbDirectory mailList, in nsIAbCard card, in boolean beNotify); + wstring getDirectoryName(); nsIAbCard getCardForEmailAddress(in nsIAbDirectory directory, in string emailAddress); diff --git a/mozilla/mailnews/addrbook/public/nsIAddressBook.idl b/mozilla/mailnews/addrbook/public/nsIAddressBook.idl index 7244e21fca3..52be4f30124 100644 --- a/mozilla/mailnews/addrbook/public/nsIAddressBook.idl +++ b/mozilla/mailnews/addrbook/public/nsIAddressBook.idl @@ -23,7 +23,7 @@ #include "nsISupports.idl" #include "xulstubs.idl" #include "nsIRDFCompositeDataSource.idl" -#include "nsIAbCard.idl" +#include "nsIAddrDatabase.idl" %{C++ @@ -46,5 +46,6 @@ interface nsIAddressBook : nsISupports { void importAddressBook(); void convertLDIFtoMAB(in nsIFileSpec fileSpec, in boolean migrating); void convertNA2toLDIF(in nsIFileSpec srcFileSpec, in nsIFileSpec dstFileSpec); + void getAbDatabaseFromURI(in string URI, out nsIAddrDatabase db); }; diff --git a/mozilla/mailnews/addrbook/src/nsAbCardProperty.cpp b/mozilla/mailnews/addrbook/src/nsAbCardProperty.cpp index afd94111914..25e69c3d429 100644 --- a/mozilla/mailnews/addrbook/src/nsAbCardProperty.cpp +++ b/mozilla/mailnews/addrbook/src/nsAbCardProperty.cpp @@ -36,10 +36,13 @@ #include "nsAddrDatabase.h" #include "nsIAddrBookSession.h" #include "nsIPref.h" +#include "nsIAddressBook.h" static NS_DEFINE_CID(kAddressBookDBCID, NS_ADDRDATABASE_CID); static NS_DEFINE_CID(kAddrBookSessionCID, NS_ADDRBOOKSESSION_CID); static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); +static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); +static NS_DEFINE_CID(kAddrBookCID, NS_ADDRESSBOOK_CID); /* The definition is nsAddressBook.cpp */ @@ -633,7 +636,7 @@ NS_IMETHODIMP nsAbCardProperty::GetCardURI(char **uri) if (file && m_dbRowID) { if (m_bIsMailList) - cardURI = PR_smprintf("%s%s/List%ld", kCardDataSourceRoot, file, m_dbRowID); + cardURI = PR_smprintf("%s%s/ListCard%ld", kCardDataSourceRoot, file, m_dbRowID); else cardURI = PR_smprintf("%s%s/Card%ld", kCardDataSourceRoot, file, m_dbRowID); } @@ -664,23 +667,51 @@ nsresult nsAbCardProperty::GetCardDatabase(const char *uri) const char* file = nsnull; file = &(uri[PL_strlen(kDirectoryDataSourceRoot)]); (*dbPath) += file; + + if (dbPath->Exists()) + { + NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); - NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); - - if (NS_SUCCEEDED(rv) && addrDBFactory) - rv = addrDBFactory->Open(dbPath, PR_TRUE, getter_AddRefs(mCardDatabase), PR_TRUE); + if (NS_SUCCEEDED(rv) && addrDBFactory) + rv = addrDBFactory->Open(dbPath, PR_TRUE, getter_AddRefs(mCardDatabase), PR_TRUE); + } + else + rv = NS_ERROR_FAILURE; } return rv; } NS_IMETHODIMP nsAbCardProperty::AddCardToDatabase(const char *uri) { + nsresult rv = NS_OK; + PRBool bInMailList = PR_FALSE; + if (!mCardDatabase && uri) - GetCardDatabase(uri); + rv = GetCardDatabase(uri); + if (NS_FAILED(rv)) //maillist + { + NS_WITH_SERVICE(nsIAddressBook, addresBook, kAddrBookCID, &rv); + if (NS_SUCCEEDED(rv)) + rv = addresBook->GetAbDatabaseFromURI(uri, getter_AddRefs(mCardDatabase)); + bInMailList = PR_TRUE; + } if (mCardDatabase) { - mCardDatabase->CreateNewCardAndAddToDB(this, PR_TRUE); + if (bInMailList) + { + char* listString = PL_strrstr(uri, "MailList"); + if (listString) + { + listString += PL_strlen("MailList"); + PRInt32 listID = atoi(listString); + mCardDatabase->CreateNewListCardAndAddToDB(listID, this, PR_TRUE); + } + else + return NS_ERROR_FAILURE; + } + else + mCardDatabase->CreateNewCardAndAddToDB(this, PR_TRUE); mCardDatabase->Commit(kLargeCommit); return NS_OK; } @@ -1218,3 +1249,35 @@ nsAbCardProperty::SetName(const PRUnichar * aName) return NS_OK; } +NS_IMETHODIMP +nsAbCardProperty::GetPrintCardUrl(char * *aPrintCardUrl) +{ +static const char *kAbPrintUrlFormat = "addbook:printone?email=%s&folder=%s"; + + if (!aPrintCardUrl) + return NS_ERROR_NULL_POINTER; + + PRUnichar *email = nsnull; + GetPrimaryEmail(&email); + nsString emailStr(email); + + PRUnichar *dirName = nsnull; + if (mCardDatabase) + mCardDatabase->GetDirectoryName(&dirName); + nsString dirNameStr(dirName); + dirNameStr.ReplaceSubstring(" ", "%20"); + + char *emailCharStr = emailStr.ToNewCString(); + char *dirCharStr = dirNameStr.ToNewCString(); + + *aPrintCardUrl = PR_smprintf(kAbPrintUrlFormat, emailCharStr, dirCharStr); + + nsAllocator::Free(emailCharStr); + nsAllocator::Free(dirCharStr); + + PR_FREEIF(dirName); + PR_FREEIF(email); + + return NS_OK; +} + diff --git a/mozilla/mailnews/addrbook/src/nsAbDirProperty.cpp b/mozilla/mailnews/addrbook/src/nsAbDirProperty.cpp index fa2cf0d39cd..8f0d2ed763f 100644 --- a/mozilla/mailnews/addrbook/src/nsAbDirProperty.cpp +++ b/mozilla/mailnews/addrbook/src/nsAbDirProperty.cpp @@ -33,6 +33,7 @@ #include "nsAddrDatabase.h" #include "nsIAbListener.h" #include "nsIAddrBookSession.h" +#include "nsIAddressBook.h" #include "mdb.h" #include "prlog.h" @@ -46,8 +47,8 @@ extern const char *kDirectoryDataSourceRoot; static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_CID(kAbCardCID, NS_ABCARD_CID); -static NS_DEFINE_CID(kAddressBookDBCID, NS_ADDRDATABASE_CID); static NS_DEFINE_CID(kAddrBookSessionCID, NS_ADDRBOOKSESSION_CID); +static NS_DEFINE_CID(kAddrBookCID, NS_ADDRESSBOOK_CID); nsAbDirProperty::nsAbDirProperty(void) : m_DirName(""), m_LastModifiedDate(0), @@ -201,6 +202,10 @@ NS_IMETHODIMP nsAbDirProperty::CreateNewDirectory(const PRUnichar *dirName, const char *fileName, PRBool migrating) { return NS_OK; } +NS_IMETHODIMP +nsAbDirProperty::CreateNewMailingList(const char* uri, nsIAbDirectory *list) +{ return NS_OK; } + NS_IMETHODIMP nsAbDirProperty::GetDirUri(char **uri) { return NS_OK; } @@ -309,29 +314,90 @@ NS_IMETHODIMP nsAbDirProperty::AddMailListToDatabase(const char *uri) nsCOMPtr listDatabase; - NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); + NS_WITH_SERVICE(nsIAddressBook, addresBook, kAddrBookCID, &rv); if (NS_SUCCEEDED(rv)) - { - nsFileSpec* dbPath; - abSession->GetUserProfileDirectory(&dbPath); - - const char* file = nsnull; - file = &(uri[PL_strlen(kDirectoryDataSourceRoot)]); - (*dbPath) += file; - - NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); - - if (NS_SUCCEEDED(rv) && addrDBFactory) - rv = addrDBFactory->Open(dbPath, PR_TRUE, getter_AddRefs(listDatabase), PR_TRUE); - } + rv = addresBook->GetAbDatabaseFromURI(uri, getter_AddRefs(listDatabase)); if (listDatabase) { listDatabase->CreateMailListAndAddToDB(this, PR_TRUE); listDatabase->Commit(kLargeCommit); listDatabase = null_nsCOMPtr(); - return NS_OK; + + NS_WITH_SERVICE(nsIRDFService, rdfService, kRDFServiceCID, &rv); + if(NS_FAILED(rv)) + return rv; + 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); + + char *listUri = PR_smprintf("%s/MailList%ld", uri, m_dbRowID); + if (listUri) + { + parentDir->CreateNewMailingList(listUri, this); + PR_smprintf_free(listUri); + return NS_OK; + } + else + return NS_ERROR_FAILURE; } else return NS_ERROR_FAILURE; } + +NS_IMETHODIMP nsAbDirProperty::EditMailListToDatabase(const char *uri) +{ + nsresult rv = NS_OK; + + nsCOMPtr listDatabase; + + NS_WITH_SERVICE(nsIAddressBook, addresBook, kAddrBookCID, &rv); + if (NS_SUCCEEDED(rv)) + rv = addresBook->GetAbDatabaseFromURI(uri, getter_AddRefs(listDatabase)); + + if (listDatabase) + { + listDatabase->EditMailList(this, PR_TRUE); + listDatabase->Commit(kLargeCommit); + listDatabase = null_nsCOMPtr(); + + //notify RDF property change + return NS_OK; + + } + else + return NS_ERROR_FAILURE; +} + + +NS_IMETHODIMP nsAbDirProperty::CopyMailList(nsIAbDirectory* srcList) +{ + PRUnichar *str = nsnull; + srcList->GetListName(&str); + SetListName(str); + PR_FREEIF(str); + srcList->GetListNickName(&str); + SetListNickName(str); + PR_FREEIF(str); + srcList->GetDescription(&str); + SetDescription(str); + PR_FREEIF(str); + + SetIsMailList(PR_TRUE); + + nsISupportsArray* pAddressLists; + srcList->GetAddressLists(&pAddressLists); + NS_IF_ADDREF(pAddressLists); + SetAddressLists(pAddressLists); + + PRUint32 rowID; + srcList->GetDbRowID(&rowID); + SetDbRowID(rowID); + + return NS_OK; +} diff --git a/mozilla/mailnews/addrbook/src/nsAbDirectory.cpp b/mozilla/mailnews/addrbook/src/nsAbDirectory.cpp index 7ca7109d027..5a180a0481a 100644 --- a/mozilla/mailnews/addrbook/src/nsAbDirectory.cpp +++ b/mozilla/mailnews/addrbook/src/nsAbDirectory.cpp @@ -33,6 +33,7 @@ #include "nsAddrDatabase.h" #include "nsIAbListener.h" #include "nsIAddrBookSession.h" +#include "nsIAddressBook.h" #include "nsIFileSpec.h" #include "nsIFileLocator.h" @@ -50,6 +51,7 @@ static NS_DEFINE_CID(kAbCardCID, NS_ABCARD_CID); static NS_DEFINE_CID(kAddressBookDBCID, NS_ADDRDATABASE_CID); static NS_DEFINE_CID(kFileLocatorCID, NS_FILELOCATOR_CID); static NS_DEFINE_CID(kAddrBookSessionCID, NS_ADDRBOOKSESSION_CID); +static NS_DEFINE_CID(kAddrBookCID, NS_ADDRESSBOOK_CID); nsAbDirectory::nsAbDirectory(void) : nsAbRDFResource(), @@ -130,6 +132,56 @@ NS_IMETHODIMP nsAbDirectory::OnCardEntryChange return NS_OK; } +NS_IMETHODIMP nsAbDirectory::OnListEntryChange +(PRUint32 abCode, nsIAbDirectory *list, nsIAddrDBListener *instigator) +{ + return NS_OK; + + nsresult rv = NS_OK; + if (abCode == AB_NotifyInserted && list) + { + NS_WITH_SERVICE(nsIRDFService, rdf, kRDFServiceCID, &rv); + + if(NS_FAILED(rv)) + return rv; + + char* listURI = nsnull; + rv = list->GetDirUri(&listURI); + if (NS_FAILED(rv) || !listURI) + return NS_ERROR_NULL_POINTER; + + nsCOMPtr res; + rv = rdf->GetResource(listURI, getter_AddRefs(res)); + if(listURI) + PR_smprintf_free(listURI); + if (NS_SUCCEEDED(rv)) + { + nsCOMPtr listDir = do_QueryInterface(res); + if (listDir) + { + listDir->CopyMailList(list); + if (mDatabase) + { + nsCOMPtr listener(do_QueryInterface(listDir, &rv)); + if (NS_FAILED(rv)) + return NS_ERROR_NULL_POINTER; + mDatabase->AddListener(listener); + } + nsCOMPtr listSupports(do_QueryInterface(listDir)); + if (listSupports) + NotifyItemAdded(listSupports); + } + } + } + else if (abCode == AB_NotifyDeleted && list) + { + nsCOMPtr listSupports(do_QueryInterface(list, &rv)); + if(NS_SUCCEEDED(rv)) + NotifyItemDeleted(listSupports); + } + return NS_OK; +} + NS_IMETHODIMP nsAbDirectory::GetChildNodes(nsIEnumerator* *result) { if (!mInitialized) @@ -296,10 +348,7 @@ NS_IMETHODIMP nsAbDirectory::CreateNewDirectory(const PRUnichar *dirName, const newDir->SetDirName((PRUnichar *)dirName); newDir->SetServer(server); -// nsCOMPtr dirSupports(do_QueryInterface(newDir, &rv)); - -// if (NS_SUCCEEDED(rv)) - NotifyItemAdded(newDir); + NotifyItemAdded(newDir); return rv; } else @@ -308,6 +357,23 @@ NS_IMETHODIMP nsAbDirectory::CreateNewDirectory(const PRUnichar *dirName, const return NS_ERROR_NULL_POINTER; } +NS_IMETHODIMP nsAbDirectory::CreateNewMailingList(const char* uri, nsIAbDirectory *list) +{ + if (!uri) + return NS_ERROR_NULL_POINTER; + + nsCOMPtr newList; + nsresult rv = AddDirectory(uri, getter_AddRefs(newList)); + if (NS_SUCCEEDED(rv) && newList) + { + newList->CopyMailList(list); + NotifyItemAdded(newList); + return rv; + } + else + return NS_ERROR_NULL_POINTER; +} + NS_IMETHODIMP nsAbDirectory::AddChildCards(const char *uriName, nsIAbCard **childCard) { if(!childCard) @@ -369,7 +435,12 @@ NS_IMETHODIMP nsAbDirectory::DeleteCards(nsISupportsArray *cards) card = do_QueryInterface(cardSupports, &rv); if (card) { - mDatabase->DeleteCard(card, PR_TRUE); + if (IsMailingList()) + mDatabase->DeleteCardFromMailList(this, card, PR_TRUE); + else + { + mDatabase->DeleteCard(card, PR_TRUE); + } } } mDatabase->Commit(kLargeCommit); @@ -464,8 +535,8 @@ NS_IMETHODIMP nsAbDirectory::DeleteDirectories(nsISupportsArray *dierctories) { DIR_Server *server = nsnull; rv = directory->GetServer(&server); - if (server) - { + if (server) + { //it's an address book DeleteDirectoryCards(directory, server); DIR_DeleteServerFromList(server); @@ -473,6 +544,30 @@ NS_IMETHODIMP nsAbDirectory::DeleteDirectories(nsISupportsArray *dierctories) rv = mSubDirectories->RemoveElement(directory); NotifyItemDeleted(directory); } + else + { //it's a mailing list + nsresult rv = NS_OK; + + char *uri; + rv = directory->GetDirUri(&uri); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr database; + NS_WITH_SERVICE(nsIAddressBook, addresBook, kAddrBookCID, &rv); + if (NS_SUCCEEDED(rv)) + { + rv = addresBook->GetAbDatabaseFromURI(uri, getter_AddRefs(database)); + nsAllocator::Free(uri); + + if (NS_SUCCEEDED(rv)) + rv = database->DeleteMailList(directory, PR_TRUE); + + if (NS_SUCCEEDED(rv)) + database->Commit(kLargeCommit); + + NotifyItemDeleted(directory); + } + } } } @@ -501,9 +596,33 @@ NS_IMETHODIMP nsAbDirectory::HasDirectory(nsIAbDirectory *dir, PRBool *hasDir) if (!hasDir) return NS_ERROR_NULL_POINTER; - DIR_Server* dirServer = nsnull; - dir->GetServer(&dirServer); - nsresult rv = DIR_ContainsServer(dirServer, hasDir); + nsresult rv = NS_ERROR_FAILURE; + PRBool bIsMailingList = PR_FALSE; + dir->GetIsMailList(&bIsMailingList); + if (bIsMailingList) + { + char *uri; + rv = dir->GetDirUri(&uri); + if (NS_FAILED(rv)) return rv; + nsCOMPtr database; + NS_WITH_SERVICE(nsIAddressBook, addresBook, kAddrBookCID, &rv); + if (NS_SUCCEEDED(rv)) + { + rv = addresBook->GetAbDatabaseFromURI(uri, getter_AddRefs(database)); + nsAllocator::Free(uri); + } + if(NS_SUCCEEDED(rv) && database) + { + if(NS_SUCCEEDED(rv)) + rv = database->ContainsMailList(dir, hasDir); + } + } + else + { + DIR_Server* dirServer = nsnull; + dir->GetServer(&dirServer); + rv = DIR_ContainsServer(dirServer, hasDir); + } return rv; } diff --git a/mozilla/mailnews/addrbook/src/nsAbDirectory.h b/mozilla/mailnews/addrbook/src/nsAbDirectory.h index 45b72f19768..8fca6b2e536 100644 --- a/mozilla/mailnews/addrbook/src/nsAbDirectory.h +++ b/mozilla/mailnews/addrbook/src/nsAbDirectory.h @@ -58,11 +58,13 @@ public: NS_IMETHOD HasCard(nsIAbCard *cards, PRBool *hasCard); NS_IMETHOD HasDirectory(nsIAbDirectory *dir, PRBool *hasDir); NS_IMETHOD CreateNewDirectory(const PRUnichar *dirName, const char *fileName, PRBool migrating); + NS_IMETHOD CreateNewMailingList(const char* uri, nsIAbDirectory *list); NS_IMETHOD GetDirUri(char **uri); // nsIAddrDBListener methods: NS_IMETHOD OnCardAttribChange(PRUint32 abCode, nsIAddrDBListener *instigator); NS_IMETHOD OnCardEntryChange(PRUint32 abCode, nsIAbCard *card, nsIAddrDBListener *instigator); + NS_IMETHOD OnListEntryChange(PRUint32 abCode, nsIAbDirectory *list, nsIAddrDBListener *instigator); PRBool IsMailingList(){ return (mIsMailingList == 1); } diff --git a/mozilla/mailnews/addrbook/src/nsAbRDFResource.cpp b/mozilla/mailnews/addrbook/src/nsAbRDFResource.cpp index e8a22b4f8c2..3dedc461a74 100644 --- a/mozilla/mailnews/addrbook/src/nsAbRDFResource.cpp +++ b/mozilla/mailnews/addrbook/src/nsAbRDFResource.cpp @@ -73,6 +73,12 @@ NS_IMETHODIMP nsAbRDFResource::OnCardEntryChange return NS_OK; } +NS_IMETHODIMP nsAbRDFResource::OnListEntryChange +(PRUint32 abCode, nsIAbDirectory *list, nsIAddrDBListener *instigator) +{ + return NS_OK; +} + NS_IMETHODIMP nsAbRDFResource::OnAnnouncerGoingAway(nsIAddrDBAnnouncer *instigator) { return NS_OK; diff --git a/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp b/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp index f58f627e537..63280b79339 100644 --- a/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp +++ b/mozilla/mailnews/addrbook/src/nsAddrDatabase.cpp @@ -120,12 +120,14 @@ const char *kAddressCharSetColumn = "AddrCharSet"; const char *kMailListName = "ListName"; const char *kMailListNickName = "ListNickName"; const char *kMailListDescription = "ListDescription"; -const char *kMailListTotalAddresses = "ListTotalAddresses"; +const char *kMailListTotalAddresses = "ListTotalAddresses"; // total number of email addresses in a mailing list +const char *kMailListTotalLists = "ListTotalLists"; // total number of mail list in a mailing list struct mdbOid gAddressBookTableOID; struct mdbOid gAnonymousTableOID; -static const char *kMailListAddressFormat = "ListAddress%d"; +static const char *kMailListAddressFormat = "Address%d"; +static const char *kMailListListFormat = "List%d"; nsAddrDatabase::nsAddrDatabase() : m_mdbEnv(nsnull), m_mdbStore(nsnull), @@ -866,6 +868,7 @@ nsresult nsAddrDatabase::InitMDBInfo() { m_mdbTokensInitialized = PR_TRUE; err = GetStore()->StringToToken(GetEnv(), kCardRowScope, &m_CardRowScopeToken); + err = GetStore()->StringToToken(GetEnv(), kListRowScope, &m_ListRowScopeToken); gAddressBookTableOID.mOid_Scope = m_CardRowScopeToken; gAddressBookTableOID.mOid_Id = ID_PAB_TABLE; gAnonymousTableOID.mOid_Scope = m_CardRowScopeToken; @@ -1412,6 +1415,87 @@ NS_IMETHODIMP nsAddrDatabase::CreateNewCardAndAddToDB(nsIAbCard *newCard, PRBool return err; } +NS_IMETHODIMP nsAddrDatabase::CreateNewListCardAndAddToDB(PRUint32 listRowID, nsIAbCard *newCard, PRBool notify /* = FALSE */) +{ + if (!newCard || !m_mdbPabTable) + return NS_ERROR_NULL_POINTER; + + nsIMdbRow* pListRow = nsnull; + mdbOid listRowOid; + listRowOid.mOid_Scope = m_ListRowScopeToken; + listRowOid.mOid_Id = listRowID; + nsresult err = GetStore()->GetRow(GetEnv(), &listRowOid, &pListRow); + + if (pListRow) + { + PRUint32 totalAddress = GetListAddressTotal(pListRow) + 1; + SetListAddressTotal(pListRow, totalAddress); + err = AddListCardColumnsToRow(newCard, pListRow, totalAddress); + // do notification + if (notify) + { + NotifyCardEntryChange(AB_NotifyInserted, newCard, NULL); + } + } + return err; + +} + +nsresult nsAddrDatabase::AddListCardColumnsToRow(nsIAbCard *pCard, nsIMdbRow *pListRow, PRUint32 pos) +{ + if (!pCard && !pListRow ) + return NS_ERROR_NULL_POINTER; + + nsresult err = NS_OK; + PRUnichar *email = nsnull; + pCard->GetPrimaryEmail(&email); + PRInt32 emailLength = nsCRT::strlen(email); + if (email) + { + char* pUTF8Email = nsnull; + INTL_ConvertFromUnicode(email, emailLength, (char**)&pUTF8Email); + if (pUTF8Email) + { + nsIMdbRow *pCardRow = nsnull; + err = GetRowForEmailAddress(pUTF8Email, &pCardRow); + if (NS_FAILED(err) || !pCardRow) + { + //New Email, then add a new row with this email + + err = GetNewRow(&pCardRow); + + if (NS_SUCCEEDED(err) && pCardRow) + { + AddPrimaryEmail(pCardRow, pUTF8Email); + err = m_mdbPabTable->AddRow(GetEnv(), pCardRow); + } + } + PR_FREEIF(pUTF8Email); + + if (!pCardRow) + return NS_ERROR_NULL_POINTER; + + //add a column with address row id to the list row + mdb_token listAddressColumnToken; + + char columnStr[16]; + sprintf(columnStr, kMailListAddressFormat, pos); //let it starts from 1 + GetStore()->StringToToken(GetEnv(), columnStr, &listAddressColumnToken); + + mdbOid outOid; + + if (pCardRow->GetOid(GetEnv(), &outOid) == NS_OK) + { + //save address row ID to the list row + err = AddIntColumn(pListRow, listAddressColumnToken, outOid.mOid_Id); + } + pCardRow->CutStrongRef(GetEnv()); + } + } + PR_FREEIF(email); + + return NS_OK; +} nsresult nsAddrDatabase::AddListAttributeColumnsToRow(nsIAbDirectory *list, nsIMdbRow *listRow) { @@ -1424,8 +1508,7 @@ nsresult nsAddrDatabase::AddListAttributeColumnsToRow(nsIAbDirectory *list, nsIM m_mdbPabTable->GetOid(GetEnv(), &tableOid); listRow->GetOid(GetEnv(), &rowOid); -// list->SetDbTableID(tableOid.mOid_Id); -// list->SetDbRowID(rowOid.mOid_Id); + list->SetDbRowID(rowOid.mOid_Id); // add the row to the singleton table. if (NS_SUCCEEDED(err) && listRow) @@ -1475,10 +1558,9 @@ nsresult nsAddrDatabase::AddListAttributeColumnsToRow(nsIAbDirectory *list, nsIM NS_IF_ADDREF(pAddressLists); PRUint32 count; pAddressLists->Count(&count); - AddIntColumn(listRow, m_ListTotalColumnToken, count); + SetListAddressTotal(listRow, count); - - PRUint32 i; + PRUint32 i, pos; for (i = 0; i < count; i++) { nsISupports* pSupport = pAddressLists->ElementAt(i); @@ -1486,63 +1568,8 @@ nsresult nsAddrDatabase::AddListAttributeColumnsToRow(nsIAbDirectory *list, nsIM if (NS_FAILED(err)) continue; - - PRUnichar *email = nsnull; - pCard->GetPrimaryEmail(&email); - PRInt32 emailLength = nsCRT::strlen(email); - if (email) - { - char* pUTF8Email = nsnull; - INTL_ConvertFromUnicode(email, emailLength, (char**)&pUTF8Email); - if (pUTF8Email) - { - nsIMdbRow *pCardRow = nsnull; - err = GetRowForEmailAddress(pUTF8Email, &pCardRow); - if (NS_FAILED(err) || !pCardRow) - { - //New Email, then add a new row with this email - - err = GetNewRow(&pCardRow); - - if (NS_SUCCEEDED(err) && pCardRow) - { - AddPrimaryEmail(pCardRow, pUTF8Email); - err = m_mdbPabTable->AddRow(GetEnv(), pCardRow); - } - } - PR_FREEIF(pUTF8Email); - - if (!pCardRow) - return NS_ERROR_NULL_POINTER; - - //add a column with address row id to the list row - mdb_token listAddressColumnToken; - - char columnStr[16]; - sprintf(columnStr, kMailListAddressFormat, i + 1); //let it starts from 1 - GetStore()->StringToToken(GetEnv(), columnStr, &listAddressColumnToken); - - mdbOid outOid; - - if (pCardRow->GetOid(GetEnv(), &outOid) == NS_OK) - { - //save member uri to the list row - char* listMemberURI = nsnull; - char* file = nsnull; - - file = m_dbName.GetLeafName(); - listMemberURI = PR_smprintf("%s%s/Card%ld", kCardDataSourceRoot, file, outOid.mOid_Id); - AddCharStringColumn(listRow, listAddressColumnToken, listMemberURI); - if (file) - nsCRT::free(file); - if (listMemberURI) - PR_smprintf_free(listMemberURI); - } - pCardRow->CutStrongRef(GetEnv()); - } - } - PR_FREEIF(email); - + pos = i + 1; + err = AddListCardColumnsToRow(pCard, listRow, pos); } } return NS_OK; @@ -1555,6 +1582,11 @@ PRUint32 nsAddrDatabase::GetListAddressTotal(nsIMdbRow* listRow) return count; } +nsresult nsAddrDatabase::SetListAddressTotal(nsIMdbRow* listRow, PRUint32 total) +{ + return AddIntColumn(listRow, m_ListTotalColumnToken, total); +} + nsresult nsAddrDatabase::GetAddressRowByPos(nsIMdbRow* listRow, PRUint16 pos, nsIMdbRow** cardRow) { mdb_token listAddressColumnToken; @@ -1563,11 +1595,9 @@ nsresult nsAddrDatabase::GetAddressRowByPos(nsIMdbRow* listRow, PRUint16 pos, ns sprintf(columnStr, kMailListAddressFormat, pos); GetStore()->StringToToken(GetEnv(), columnStr, &listAddressColumnToken); - //change from rowid to uri nsAutoString tempString; mdb_id rowID; nsresult err = GetIntColumn(listRow, listAddressColumnToken, (PRUint32*)&rowID, 0); -//nsesult err = GetStringColumn(listRow, listAddressColumnToken, tempString); if (NS_SUCCEEDED(err)) { err = GetCardRowByRowID(rowID, cardRow); @@ -1597,12 +1627,6 @@ NS_IMETHODIMP nsAddrDatabase::CreateMailListAndAddToDB(nsIAbDirectory *newList, } if (NS_FAILED(err)) return err; - // do notification - if (notify) - { ; -// NotifyCardEntryChange(AB_NotifyInserted, newList, NULL); - } - return err; } @@ -1880,6 +1904,36 @@ NS_IMETHODIMP nsAddrDatabase::EditAnonymousAttributesInDB() return DoAnonymousAttributesTransaction(AB_NotifyPropertyChanged); } +void nsAddrDatabase::DeleteCardFromAllMailLists(mdb_id cardRowID) +{ + nsIMdbTableRowCursor* rowCursor; + m_mdbPabTable->GetTableRowCursor(GetEnv(), -1, &rowCursor); + + if (rowCursor) + { + nsIMdbRow* pListRow = nsnull; + mdb_pos rowPos; + do + { + mdb_err err = rowCursor->NextRow(GetEnv(), &pListRow, &rowPos); + + if (NS_SUCCEEDED(err) && pListRow) + { + mdbOid rowOid; + + if (pListRow->GetOid(GetEnv(), &rowOid) == NS_OK) + { + if (IsListRowScopeToken(rowOid.mOid_Scope)) + DeleteCardFromListRow(pListRow, cardRowID); + } + pListRow->CutStrongRef(GetEnv()); + } + } while (pListRow); + + rowCursor->CutStrongRef(GetEnv()); + } +} + NS_IMETHODIMP nsAddrDatabase::DeleteCard(nsIAbCard *card, PRBool notify) { if (!card || !m_mdbPabTable) @@ -1902,6 +1956,10 @@ NS_IMETHODIMP nsAddrDatabase::DeleteCard(nsIAbCard *card, PRBool notify) { err = m_mdbPabTable->CutRow(GetEnv(), pCardRow); + //delete the person card from all mailing list + if (!bIsMailList) + DeleteCardFromAllMailLists(rowOid.mOid_Id); + if (NS_SUCCEEDED(err)) { @@ -1918,6 +1976,88 @@ NS_IMETHODIMP nsAddrDatabase::DeleteCard(nsIAbCard *card, PRBool notify) return NS_OK; } +nsresult nsAddrDatabase::DeleteCardFromListRow(nsIMdbRow* pListRow, mdb_id cardRowID) +{ + if (!pListRow) + return NS_ERROR_NULL_POINTER; + + nsresult err = NS_OK; + +// PRUint32 cardRowID; +// card->GetDbRowID(&cardRowID); + + //todo: cut the card column and total column + PRUint32 totalAddress = GetListAddressTotal(pListRow); + + PRUint32 pos; + for (pos = 1; pos <= totalAddress; pos++) + { + mdb_token listAddressColumnToken; + mdb_id rowID; + + char columnStr[16]; + sprintf(columnStr, kMailListAddressFormat, pos); + GetStore()->StringToToken(GetEnv(), columnStr, &listAddressColumnToken); + + err = GetIntColumn(pListRow, listAddressColumnToken, (PRUint32*)&rowID, 0); + + if (cardRowID == rowID) + { + if (pos == totalAddress) + err = pListRow->CutColumn(GetEnv(), listAddressColumnToken); + else + { + //replace the deleted one with the last one and delete the last one + mdb_id lastRowID; + mdb_token lastAddressColumnToken; + sprintf(columnStr, kMailListAddressFormat, totalAddress); + GetStore()->StringToToken(GetEnv(), columnStr, &lastAddressColumnToken); + + err = GetIntColumn(pListRow, lastAddressColumnToken, (PRUint32*)&lastRowID, 0); + err = AddIntColumn(pListRow, listAddressColumnToken, lastRowID); + err = pListRow->CutColumn(GetEnv(), lastAddressColumnToken); + } + break; + } + } + return NS_OK; +} + +NS_IMETHODIMP nsAddrDatabase::DeleteCardFromMailList(nsIAbDirectory *mailList, nsIAbCard *card, PRBool beNotify) +{ + if (!card || !m_mdbPabTable) + return NS_ERROR_NULL_POINTER; + + nsresult err = NS_OK; + + // get the right row + nsIMdbRow* pListRow = nsnull; + mdbOid listRowOid; + listRowOid.mOid_Scope = m_ListRowScopeToken; + mailList->GetDbRowID((PRUint32*)&listRowOid.mOid_Id); + err = GetStore()->GetRow(GetEnv(), &listRowOid, &pListRow); + + if (pListRow) + { + PRUint32 cardRowID; + card->GetDbRowID(&cardRowID); + err = DeleteCardFromListRow(pListRow, cardRowID); + + if (NS_SUCCEEDED(err)) + { + nsCOMPtr listener(do_QueryInterface(card, &err)); + if (NS_FAILED(err)) + return NS_ERROR_NULL_POINTER; + RemoveListener(listener); + + if (beNotify) + NotifyCardEntryChange(AB_NotifyDeleted, card, NULL); + } + pListRow->CutStrongRef(GetEnv()); + } + return NS_OK; +} + NS_IMETHODIMP nsAddrDatabase::EditCard(nsIAbCard *card, PRBool notify) { if (!card || !m_mdbPabTable) @@ -1960,6 +2100,75 @@ NS_IMETHODIMP nsAddrDatabase::ContainsCard(nsIAbCard *card, PRBool *hasCard) return err; } +NS_IMETHODIMP nsAddrDatabase::DeleteMailList(nsIAbDirectory *mailList, PRBool notify) +{ + if (!mailList || !m_mdbPabTable) + return NS_ERROR_NULL_POINTER; + + nsresult err = NS_OK; + + // get the row + nsIMdbRow* pListRow = nsnull; + mdbOid rowOid; + rowOid.mOid_Scope = m_ListRowScopeToken; + mailList->GetDbRowID((PRUint32*)&rowOid.mOid_Id); + err = GetStore()->GetRow(GetEnv(), &rowOid, &pListRow); + if (pListRow) + { + err = m_mdbPabTable->CutRow(GetEnv(), pListRow); + + if (NS_SUCCEEDED(err)) + { + + nsCOMPtr listener(do_QueryInterface(mailList, &err)); + if (NS_FAILED(err)) + return NS_ERROR_NULL_POINTER; + RemoveListener(listener); + } + pListRow->CutStrongRef(GetEnv()); + } + return NS_OK; +} + +NS_IMETHODIMP nsAddrDatabase::EditMailList(nsIAbDirectory *mailList, PRBool notify) +{ + if (!mailList || !m_mdbPabTable) + return NS_ERROR_NULL_POINTER; + + nsresult err = NS_OK; + + nsIMdbRow* pListRow = nsnull; + mdbOid rowOid; + rowOid.mOid_Scope = m_ListRowScopeToken; + mailList->GetDbRowID((PRUint32*)&rowOid.mOid_Id); + err = GetStore()->GetRow(GetEnv(), &rowOid, &pListRow); + if (pListRow) + err = AddListAttributeColumnsToRow(mailList, pListRow); + if (NS_FAILED(err)) return err; + + if (pListRow) + pListRow->CutStrongRef(GetEnv()); + return NS_OK; +} + +NS_IMETHODIMP nsAddrDatabase::ContainsMailList(nsIAbDirectory *mailList, PRBool *hasList) +{ + if (!mailList || !m_mdbPabTable) + return NS_ERROR_NULL_POINTER; + + nsresult err = NS_OK; + mdb_bool hasOid; + mdbOid rowOid; + + rowOid.mOid_Scope = m_ListRowScopeToken; + mailList->GetDbRowID((PRUint32*)&rowOid.mOid_Id); + err = m_mdbPabTable->HasOid(GetEnv(), &rowOid, &hasOid); + if (NS_SUCCEEDED(err)) + *hasList = hasOid; + + return err; +} + NS_IMETHODIMP nsAddrDatabase::GetNewRow(nsIMdbRow * *newRow) { nsresult err = NS_OK; @@ -3186,7 +3395,7 @@ nsresult nsAddrDatabase::CreateABListCard(nsIMdbRow* cardRow, nsIAbCard **result char* file = nsnull; file = m_dbName.GetLeafName(); - cardURI = PR_smprintf("%s%s/List%ld", kCardDataSourceRoot, file, rowID); + cardURI = PR_smprintf("%s%s/ListCard%ld", kCardDataSourceRoot, file, rowID); nsCOMPtr personCard; rv = m_dbDirectory->AddChildCards(cardURI, getter_AddRefs(personCard)); if (personCard) @@ -3246,9 +3455,10 @@ nsresult nsAddrDatabase::CreateABList(nsIMdbRow* listRow, nsIAbDirectory **resul mailList->SetDbRowID(rowID); mailList->SetIsMailList(PR_TRUE); - nsCOMPtr listener(do_QueryInterface(mailList, &rv)); +/* nsCOMPtr listener(do_QueryInterface(mailList, &rv)); if (NS_FAILED(rv)) return NS_ERROR_NULL_POINTER; + AddListener(listener);*/ m_dbDirectory->AddMailListToDirectory(mailList); @@ -3357,3 +3567,14 @@ NS_IMETHODIMP nsAddrDatabase::CreateCollationKey(const PRUnichar* sourceStr, nsS rv = m_collationKeyGenerator->CreateSortKey(kCollationCaseInSensitive, sourceString, resultStr) ; return rv; } + +NS_IMETHODIMP nsAddrDatabase::GetDirectoryName(PRUnichar **name) +{ + if (m_dbDirectory && name) + { + return m_dbDirectory->GetDirName(name); + } + else + return NS_ERROR_FAILURE; +} + diff --git a/mozilla/mailnews/addrbook/src/nsAddrDatabase.h b/mozilla/mailnews/addrbook/src/nsAddrDatabase.h index ba4112bfe17..c18f9789f57 100644 --- a/mozilla/mailnews/addrbook/src/nsAddrDatabase.h +++ b/mozilla/mailnews/addrbook/src/nsAddrDatabase.h @@ -78,6 +78,7 @@ public: NS_IMETHOD ForceClosed(); NS_IMETHOD CreateNewCardAndAddToDB(nsIAbCard *newCard, PRBool notify); + NS_IMETHOD CreateNewListCardAndAddToDB(PRUint32 listRowID, nsIAbCard *newCard, PRBool notify); NS_IMETHOD CreateMailListAndAddToDB(nsIAbDirectory *newList, PRBool notify); NS_IMETHOD EnumerateCards(nsIAbDirectory *directory, nsIEnumerator **result); NS_IMETHOD GetMailingListsFromDB(nsIAbDirectory *parentDir); @@ -85,6 +86,10 @@ public: NS_IMETHOD DeleteCard(nsIAbCard *newCard, PRBool notify); NS_IMETHOD EditCard(nsIAbCard *card, PRBool notify); NS_IMETHOD ContainsCard(nsIAbCard *card, PRBool *hasCard); + NS_IMETHOD DeleteMailList(nsIAbDirectory *mailList, PRBool notify); + NS_IMETHOD EditMailList(nsIAbDirectory *mailList, PRBool notify); + NS_IMETHOD ContainsMailList(nsIAbDirectory *mailList, PRBool *hasCard); + NS_IMETHOD DeleteCardFromMailList(nsIAbDirectory *mailList, nsIAbCard *card, PRBool beNotify); NS_IMETHOD GetCardForEmailAddress(nsIAbDirectory *directory, const char *emailAddress, nsIAbCard **card); @@ -217,6 +222,7 @@ public: { return AddCharStringColumn(row, m_NotesColumnToken, value); } NS_IMETHOD CreateCollationKey(const PRUnichar *sourceStr, nsString& resultStr); + NS_IMETHOD GetDirectoryName(PRUnichar **name); ////////////////////////////////////////////////////////////////////////////// // nsAddrDatabase methods: @@ -279,6 +285,7 @@ protected: nsresult GetListFromDB(nsIAbDirectory *newCard, nsIMdbRow* cardRow); nsresult GetAnonymousAttributesFromDB(); nsresult AddAttributeColumnsToRow(nsIAbCard *card, nsIMdbRow *cardRow); + nsresult AddListCardColumnsToRow(nsIAbCard *pCard, nsIMdbRow *pListRow, PRUint32 pos); nsresult AddListAttributeColumnsToRow(nsIAbDirectory *list, nsIMdbRow *listRow); nsresult RemoveAnonymousList(nsVoidArray* pArray); nsresult SetAnonymousAttribute(nsVoidArray** pAttrAray, @@ -291,6 +298,9 @@ protected: nsresult FindAttributeRow(nsIMdbTable* pTable, mdb_token columnToken, nsIMdbRow** row); nsresult GetRowForEmailAddress(const char *emailAddress, nsIMdbRow **cardRow); nsresult CreateCard(nsIMdbRow* cardRow, mdb_id listRowID, nsIAbCard **result); + nsresult SetListAddressTotal(nsIMdbRow* listRow, PRUint32 total); + nsresult DeleteCardFromListRow(nsIMdbRow* pListRow, mdb_id cardRowID); + void DeleteCardFromAllMailLists(mdb_id cardRowID); nsresult GetCollationKeyGenerator(); diff --git a/mozilla/mailnews/addrbook/src/nsAddressBook.cpp b/mozilla/mailnews/addrbook/src/nsAddressBook.cpp index 54ed62000b5..bd2d51ae29a 100644 --- a/mozilla/mailnews/addrbook/src/nsAddressBook.cpp +++ b/mozilla/mailnews/addrbook/src/nsAddressBook.cpp @@ -337,6 +337,40 @@ NS_IMETHODIMP nsAddressBook::SetWebShellWindow(nsIDOMWindow *aWin) return NS_OK; } +NS_IMETHODIMP nsAddressBook::GetAbDatabaseFromURI(const char *uri, nsIAddrDatabase **db) +{ + nsCOMPtr database; + + nsresult rv = NS_ERROR_NULL_POINTER; + if (uri) + { + nsFileSpec* dbPath = nsnull; + + NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); + if(NS_SUCCEEDED(rv)) + abSession->GetUserProfileDirectory(&dbPath); + + nsString file(&(uri[PL_strlen(kDirectoryDataSourceRoot)])); + PRInt32 pos = file.Find("/"); + if (pos != -1) + file.Truncate(pos); + (*dbPath) += file; + + NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); + + if (NS_SUCCEEDED(rv) && addrDBFactory) + rv = addrDBFactory->Open(dbPath, PR_TRUE, getter_AddRefs(database), PR_TRUE); + if (NS_SUCCEEDED(rv) && database) + { + *db = database; + NS_IF_ADDREF(*db); + } + else + rv = NS_ERROR_NULL_POINTER; + } + return rv; +} + typedef enum { diff --git a/mozilla/mailnews/addrbook/src/nsCardDataSource.cpp b/mozilla/mailnews/addrbook/src/nsCardDataSource.cpp index 14dce6a420e..208dce42d8f 100644 --- a/mozilla/mailnews/addrbook/src/nsCardDataSource.cpp +++ b/mozilla/mailnews/addrbook/src/nsCardDataSource.cpp @@ -323,7 +323,7 @@ NS_IMETHODIMP nsAbCardDataSource::GetTargets(nsIRDFResource* source, return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(cursor); *targets = cursor; - rv = NS_OK; + return NS_OK; } } else { @@ -336,10 +336,10 @@ NS_IMETHODIMP nsAbCardDataSource::GetTargets(nsIRDFResource* source, return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(cursor); *targets = cursor; - rv = NS_OK; + return NS_OK; } - return rv; + return NS_NewEmptyEnumerator(targets); } NS_IMETHODIMP nsAbCardDataSource::HasAssertion(nsIRDFResource* source, diff --git a/mozilla/mailnews/addrbook/src/nsDirectoryDataSource.cpp b/mozilla/mailnews/addrbook/src/nsDirectoryDataSource.cpp index 5525bd1a6f3..b5ce950df56 100644 --- a/mozilla/mailnews/addrbook/src/nsDirectoryDataSource.cpp +++ b/mozilla/mailnews/addrbook/src/nsDirectoryDataSource.cpp @@ -196,6 +196,8 @@ NS_IMETHODIMP nsAbDirectoryDataSource::GetTargets(nsIRDFResource* source, nsISimpleEnumerator** targets) { nsresult rv = NS_RDF_NO_VALUE; + if(!targets) + return NS_ERROR_NULL_POINTER; nsCOMPtr directory(do_QueryInterface(source, &rv)); if (NS_SUCCEEDED(rv) && directory) @@ -212,7 +214,7 @@ NS_IMETHODIMP nsAbDirectoryDataSource::GetTargets(nsIRDFResource* source, return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(cursor); *targets = cursor; - rv = NS_OK; + return NS_OK; } else if((kNC_DirName == property)) { @@ -222,7 +224,7 @@ NS_IMETHODIMP nsAbDirectoryDataSource::GetTargets(nsIRDFResource* source, return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(cursor); *targets = cursor; - rv = NS_OK; + return NS_OK; } else if((kNC_CardChild == property)) { @@ -237,7 +239,7 @@ NS_IMETHODIMP nsAbDirectoryDataSource::GetTargets(nsIRDFResource* source, return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(cursor); *targets = cursor; - rv = NS_OK; + return NS_OK; } } else if((kNC_DirUri == property)) @@ -248,23 +250,10 @@ NS_IMETHODIMP nsAbDirectoryDataSource::GetTargets(nsIRDFResource* source, return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(cursor); *targets = cursor; - rv = NS_OK; + return NS_OK; } } - else { - //create empty cursor - nsCOMPtr assertions; - NS_NewISupportsArray(getter_AddRefs(assertions)); - nsArrayEnumerator* cursor = - new nsArrayEnumerator(assertions); - if(cursor == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - NS_ADDREF(cursor); - *targets = cursor; - rv = NS_OK; - } - - return rv; + return NS_NewEmptyEnumerator(targets); } NS_IMETHODIMP nsAbDirectoryDataSource::Assert(nsIRDFResource* source,