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
This commit is contained in:
chuang%netscape.com
2000-04-18 06:26:53 +00:00
parent 908cf8b20d
commit fb6913d513
15 changed files with 655 additions and 130 deletions

View File

@@ -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;

View File

@@ -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);
};

View File

@@ -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);
};

View File

@@ -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);

View File

@@ -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);
};

View File

@@ -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;
}

View File

@@ -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<nsIAddrDatabase> 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<nsIRDFResource> parentResource;
char *parentUri = PR_smprintf("%s", kDirectoryDataSourceRoot);
rv = rdfService->GetResource(parentUri, getter_AddRefs(parentResource));
nsCOMPtr<nsIAbDirectory> 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<nsIAddrDatabase> 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;
}

View File

@@ -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<nsIRDFResource> res;
rv = rdf->GetResource(listURI, getter_AddRefs(res));
if(listURI)
PR_smprintf_free(listURI);
if (NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIAbDirectory> listDir = do_QueryInterface(res);
if (listDir)
{
listDir->CopyMailList(list);
if (mDatabase)
{
nsCOMPtr<nsIAddrDBListener> listener(do_QueryInterface(listDir, &rv));
if (NS_FAILED(rv))
return NS_ERROR_NULL_POINTER;
mDatabase->AddListener(listener);
}
nsCOMPtr<nsISupports> listSupports(do_QueryInterface(listDir));
if (listSupports)
NotifyItemAdded(listSupports);
}
}
}
else if (abCode == AB_NotifyDeleted && list)
{
nsCOMPtr<nsISupports> 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<nsISupports> 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<nsIAbDirectory> 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<nsIAddrDatabase> 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<nsIAddrDatabase> 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;
}

View File

@@ -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); }

View File

@@ -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;

View File

@@ -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<nsIAddrDBListener> 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<nsIAddrDBListener> 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<nsIAbCard> 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<nsIAddrDBListener> listener(do_QueryInterface(mailList, &rv));
/* nsCOMPtr<nsIAddrDBListener> 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;
}

View File

@@ -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();

View File

@@ -337,6 +337,40 @@ NS_IMETHODIMP nsAddressBook::SetWebShellWindow(nsIDOMWindow *aWin)
return NS_OK;
}
NS_IMETHODIMP nsAddressBook::GetAbDatabaseFromURI(const char *uri, nsIAddrDatabase **db)
{
nsCOMPtr<nsIAddrDatabase> 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
{

View File

@@ -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,

View File

@@ -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<nsIAbDirectory> 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<nsISupportsArray> 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,