Edit Mailing list backend and fix for mailing list add, delete problem

This commit is contained in:
chuang%netscape.com 2000-05-11 21:16:52 +00:00
Родитель 115137c0f8
Коммит dacc2ecc05
10 изменённых файлов: 159 добавлений и 91 удалений

Просмотреть файл

@ -44,7 +44,7 @@ interface nsIAbDirectory : nsISupports {
readonly attribute nsIEnumerator childCards;
nsIAbCard addChildCards(in string uriName);
nsIAbDirectory addDirectory(in string uriName);
void deleteDirectories(in nsISupportsArray dierctories);
void deleteDirectory(in nsIAbDirectory dierctory);
void deleteCards(in nsISupportsArray cards);
boolean hasCard(in nsIAbCard cards);
boolean hasDirectory(in nsIAbDirectory dir);

Просмотреть файл

@ -24,6 +24,7 @@
#include "xulstubs.idl"
#include "nsIRDFCompositeDataSource.idl"
#include "nsIAddrDatabase.idl"
#include "nsISupportsArray.idl"
%{C++
@ -39,7 +40,7 @@ interface nsIAddressBook : nsISupports {
void deleteCards(in nsIDOMXULElement tree, in nsIDOMXULElement srcDir, in nsIDOMNodeList node);
void newAddressBook(in nsIRDFCompositeDataSource db, in nsIDOMXULElement srcDir, in wstring name);
void deleteAddressBooks(in nsIRDFCompositeDataSource db, in nsIDOMXULElement srcDir, in nsIDOMNodeList node);
void deleteAddressBooks(in nsIRDFCompositeDataSource db, in nsISupportsArray parentDir, in nsIDOMNodeList node);
void printCard();
void printAddressbook();
void setWebShellWindow(in nsIDOMWindow win);

Просмотреть файл

@ -62,6 +62,15 @@ nsAbDirProperty::nsAbDirProperty(void)
nsAbDirProperty::~nsAbDirProperty(void)
{
PR_FREEIF(m_DbPath);
if (m_AddressList)
{
PRUint32 count;
nsresult rv = m_AddressList->Count(&count);
NS_ASSERTION(NS_SUCCEEDED(rv), "Count failed");
PRInt32 i;
for (i = count - 1; i >= 0; i--)
m_AddressList->RemoveElementAt(i);
}
}
NS_IMPL_ADDREF(nsAbDirProperty)
@ -180,7 +189,7 @@ nsAbDirProperty::AddDirectory(const char *uriName, nsIAbDirectory **childDir)
{ return NS_OK; }
NS_IMETHODIMP
nsAbDirProperty::DeleteDirectories(nsISupportsArray *dierctories)
nsAbDirProperty::DeleteDirectory(nsIAbDirectory *dierctory)
{ return NS_OK; }
NS_IMETHODIMP
@ -302,6 +311,7 @@ NS_IMETHODIMP nsAbDirProperty::AddAddressToList(nsIAbCard *card)
if (!m_AddressList)
NS_NewISupportsArray(getter_AddRefs(m_AddressList));
m_AddressList->AppendElement(card);
NS_IF_ADDREF(card);
return NS_OK;
}
@ -325,13 +335,10 @@ NS_IMETHODIMP nsAbDirProperty::AddMailListToDatabase(const char *uri)
if(NS_FAILED(rv))
return rv;
nsCOMPtr<nsIRDFResource> parentResource;
char *parentUri = PR_smprintf("%s", kDirectoryDataSourceRoot);
rv = rdfService->GetResource(parentUri, getter_AddRefs(parentResource));
rv = rdfService->GetResource(uri, 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)

Просмотреть файл

@ -153,7 +153,7 @@ NS_IMETHODIMP nsAbDirectory::OnListEntryChange
nsCOMPtr<nsIRDFResource> res;
rv = rdf->GetResource(listURI, getter_AddRefs(res));
if(listURI)
PR_smprintf_free(listURI);
nsAllocator::Free(listURI);
if (NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIAbDirectory> listDir = do_QueryInterface(res);
@ -341,6 +341,11 @@ NS_IMETHODIMP nsAbDirectory::CreateNewDirectory(const PRUnichar *dirName, const
char *uri = PR_smprintf("%s%s", kDirectoryDataSourceRoot, server->fileName);
if (uri)
{
nsCOMPtr<nsIAddrDatabase> database;
NS_WITH_SERVICE(nsIAddressBook, addresBook, kAddrBookCID, &rv);
if (NS_SUCCEEDED(rv))
rv = addresBook->GetAbDatabaseFromURI(uri, getter_AddRefs(database));
rv = AddDirectory(uri, getter_AddRefs(newDir));
PR_smprintf_free(uri);
if (NS_SUCCEEDED(rv) && newDir)
@ -440,6 +445,29 @@ NS_IMETHODIMP nsAbDirectory::DeleteCards(nsISupportsArray *cards)
else
{
mDatabase->DeleteCard(card, PR_TRUE);
PRBool bIsMailList = PR_FALSE;
card->GetIsMailList(&bIsMailList);
if (bIsMailList)
{
//to do, get mailing list dir side uri and notify rdf to remove it
PRUint32 rowID;
card->GetDbRowID(&rowID);
char *listUri = PR_smprintf("%s/MailList%ld", mURI, rowID);
if (listUri)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsIRDFService, rdfService, kRDFServiceCID, &rv);
if(NS_FAILED(rv))
return rv;
nsCOMPtr<nsIRDFResource> listResource;
rv = rdfService->GetResource(listUri, getter_AddRefs(listResource));
nsCOMPtr<nsIAbDirectory> listDir = do_QueryInterface(listResource);
if (listDir)
NotifyItemDeleted(listDir);
PR_smprintf_free(listUri);
return NS_OK;
}
}
}
}
}
@ -450,6 +478,11 @@ NS_IMETHODIMP nsAbDirectory::DeleteCards(nsISupportsArray *cards)
nsresult nsAbDirectory::DeleteDirectoryCards(nsIAbDirectory* directory, DIR_Server *server)
{
if (!server->fileName) // file name does not exist
return NS_OK;
if (PL_strlen(server->fileName) == 0) // file name does not exist
return NS_OK;
nsresult rv = NS_OK;
nsFileSpec* dbPath = nsnull;
nsCOMPtr<nsIAddrDatabase> database;
@ -518,55 +551,45 @@ nsresult nsAbDirectory::DeleteDirectoryCards(nsIAbDirectory* directory, DIR_Serv
return rv;
}
NS_IMETHODIMP nsAbDirectory::DeleteDirectories(nsISupportsArray *dierctories)
NS_IMETHODIMP nsAbDirectory::DeleteDirectory(nsIAbDirectory *directory)
{
nsresult rv = NS_ERROR_FAILURE;
PRUint32 i, dirCount;
rv = dierctories->Count(&dirCount);
if (NS_FAILED(rv)) return rv;
for (i = 0; i < dirCount; i++)
if (directory)
{
nsCOMPtr<nsISupports> dirSupports;
nsCOMPtr<nsIAbDirectory> directory;
dirSupports = getter_AddRefs(dierctories->ElementAt(i));
directory = do_QueryInterface(dirSupports, &rv);
if (NS_SUCCEEDED(rv) && directory)
{
DIR_Server *server = nsnull;
rv = directory->GetServer(&server);
if (server)
{ //it's an address book
DeleteDirectoryCards(directory, server);
DIR_Server *server = nsnull;
rv = directory->GetServer(&server);
if (server)
{ //it's an address book
DeleteDirectoryCards(directory, server);
DIR_DeleteServerFromList(server);
DIR_DeleteServerFromList(server);
rv = mSubDirectories->RemoveElement(directory);
NotifyItemDeleted(directory);
}
else
{ //it's a mailing list
nsresult rv = NS_OK;
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;
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);
nsCOMPtr<nsIAddrDatabase> database;
NS_WITH_SERVICE(nsIAddressBook, addresBook, kAddrBookCID, &rv);
if (NS_SUCCEEDED(rv))
{
rv = addresBook->GetAbDatabaseFromURI(uri, getter_AddRefs(database));
nsAllocator::Free(uri);
rv = database->DeleteMailList(directory, PR_TRUE);
if (NS_SUCCEEDED(rv))
rv = database->DeleteMailList(directory, PR_TRUE);
if (NS_SUCCEEDED(rv))
database->Commit(kLargeCommit);
if (NS_SUCCEEDED(rv))
database->Commit(kLargeCommit);
NotifyItemDeleted(directory);
}
NotifyItemDeleted(directory);
}
}
}

Просмотреть файл

@ -53,7 +53,7 @@ public:
NS_IMETHOD GetChildCards(nsIEnumerator* *result);
NS_IMETHOD AddChildCards(const char *uriName, nsIAbCard **childCard);
NS_IMETHOD AddDirectory(const char *uriName, nsIAbDirectory **childDir);
NS_IMETHOD DeleteDirectories(nsISupportsArray *directories);
NS_IMETHOD DeleteDirectory(nsIAbDirectory *directory);
NS_IMETHOD DeleteCards(nsISupportsArray *cards);
NS_IMETHOD HasCard(nsIAbCard *cards, PRBool *hasCard);
NS_IMETHOD HasDirectory(nsIAbDirectory *dir, PRBool *hasDir);

Просмотреть файл

@ -1642,6 +1642,11 @@ nsresult nsAddrDatabase::AddListCardColumnsToRow(nsIAbCard *pCard, nsIMdbRow *pL
AddPrimaryEmail(pCardRow, pUTF8Email);
err = m_mdbPabTable->AddRow(GetEnv(), pCardRow);
}
//notify RDF a new card row
nsCOMPtr<nsIAbCard> newCard;
CreateABCard(pCardRow, getter_AddRefs(newCard));
NotifyCardEntryChange(AB_NotifyInserted, newCard, NULL);
}
PR_FREEIF(pUTF8Email);
@ -1797,6 +1802,11 @@ NS_IMETHODIMP nsAddrDatabase::CreateMailListAndAddToDB(nsIAbDirectory *newList,
AddListAttributeColumnsToRow(newList, listRow);
AddRecordKeyColumnToRow(listRow);
err = m_mdbPabTable->AddRow(GetEnv(), listRow);
nsCOMPtr<nsIAbCard> listCard;
CreateABListCard(listRow, getter_AddRefs(listCard));
NotifyCardEntryChange(AB_NotifyInserted, listCard, NULL);
listRow->CutStrongRef(GetEnv());
}
if (NS_FAILED(err)) return err;
@ -3200,6 +3210,27 @@ nsresult nsAddrDatabase::GetListFromDB(nsIAbDirectory *newList, nsIMdbRow* listR
PR_Free(unicodeStr);
}
PRUint32 totalAddress = GetListAddressTotal(listRow);
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);
nsIMdbRow* cardRow;
err = GetIntColumn(listRow, listAddressColumnToken, (PRUint32*)&rowID, 0);
err = GetCardRowByRowID(rowID, &cardRow);
nsCOMPtr<nsIAbCard> card;
err = CreateABCard(cardRow, getter_AddRefs(card));
newList->AddAddressToList(card);
// NS_IF_ADDREF(card);
}
return err;
}

Просмотреть файл

@ -161,7 +161,7 @@ NS_IMETHODIMP nsAddressBook::DeleteCards
dirArray->AppendElement(resource);
rv = DoCommand(database, NC_RDF_DELETE, dirArray, resourceArray);
rv = DoCommand(database, NC_RDF_DELETECARD, dirArray, resourceArray);
return rv;
}
@ -202,14 +202,14 @@ NS_IMETHODIMP nsAddressBook::NewAddressBook
rdfService->GetLiteral(nameStr.GetUnicode(), getter_AddRefs(nameLiteral));
nameArray->AppendElement(nameLiteral);
DoCommand(db, "http://home.netscape.com/NC-rdf#NewDirectory", dirArray, nameArray);
DoCommand(db, NC_RDF_NEWDIRECTORY, dirArray, nameArray);
return rv;
}
NS_IMETHODIMP nsAddressBook::DeleteAddressBooks
(nsIRDFCompositeDataSource* db, nsIDOMXULElement *srcDirectory, nsIDOMNodeList *nodeList)
(nsIRDFCompositeDataSource* db, nsISupportsArray *parentDir, nsIDOMNodeList *nodeList)
{
if(!db || !srcDirectory || !nodeList)
if(!db || !parentDir || !nodeList)
return NS_ERROR_NULL_POINTER;
nsresult rv = NS_OK;
@ -217,31 +217,12 @@ NS_IMETHODIMP nsAddressBook::DeleteAddressBooks
if(NS_FAILED(rv))
return rv;
nsCOMPtr<nsISupportsArray> dirArray;
rv = NS_NewISupportsArray(getter_AddRefs(dirArray));
if(NS_FAILED(rv))
return NS_ERROR_OUT_OF_MEMORY;
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);
dirArray->AppendElement(parentResource);
nsCOMPtr<nsISupportsArray> resourceArray;
rv = ConvertDOMListToResourceArray(nodeList, getter_AddRefs(resourceArray));
if(NS_FAILED(rv))
return rv;
DoCommand(db, NC_RDF_DELETE, dirArray, resourceArray);
DoCommand(db, NC_RDF_DELETE, parentDir, resourceArray);
return rv;
}

Просмотреть файл

@ -36,6 +36,7 @@
#define NC_RDF_NEWABCARD "http://home.netscape.com/NC-rdf#NewCard"
#define NC_RDF_DELETE "http://home.netscape.com/NC-rdf#Delete"
#define NC_RDF_DELETECARD "http://home.netscape.com/NC-rdf#DeleteCards"
#define NC_RDF_NEWDIRECTORY "http://home.netscape.com/NC-rdf#NewDirectory"
class nsAddressBook : public nsIAddressBook, public nsICmdLineHandler

Просмотреть файл

@ -61,6 +61,7 @@ nsIRDFResource* nsAbDirectoryDataSource::kNC_DirUri = nsnull;
// commands
nsIRDFResource* nsAbDirectoryDataSource::kNC_Delete = nsnull;
nsIRDFResource* nsAbDirectoryDataSource::kNC_DeleteCards = nsnull;
nsIRDFResource* nsAbDirectoryDataSource::kNC_NewDirectory = nsnull;
#define NC_RDF_CHILD "http://home.netscape.com/NC-rdf#child"
@ -70,6 +71,7 @@ nsIRDFResource* nsAbDirectoryDataSource::kNC_NewDirectory = nsnull;
//Directory Commands
#define NC_RDF_DELETE "http://home.netscape.com/NC-rdf#Delete"
#define NC_RDF_DELETECARDS "http://home.netscape.com/NC-rdf#DeleteCards"
#define NC_RDF_NEWDIRECTORY "http://home.netscape.com/NC-rdf#NewDirectory"
////////////////////////////////////////////////////////////////////////
@ -102,6 +104,7 @@ nsAbDirectoryDataSource::~nsAbDirectoryDataSource (void)
NS_RELEASE2(kNC_DirUri, refcnt);
NS_RELEASE2(kNC_Delete, refcnt);
NS_RELEASE2(kNC_DeleteCards, refcnt);
NS_RELEASE2(kNC_NewDirectory, refcnt);
/* free all directories */
@ -133,6 +136,7 @@ nsAbDirectoryDataSource::Init()
mRDFService->GetResource(NC_RDF_DIRURI, &kNC_DirUri);
mRDFService->GetResource(NC_RDF_DELETE, &kNC_Delete);
mRDFService->GetResource(NC_RDF_DELETECARDS, &kNC_DeleteCards);
mRDFService->GetResource(NC_RDF_NEWDIRECTORY, &kNC_NewDirectory);
}
@ -341,6 +345,7 @@ nsAbDirectoryDataSource::GetAllCommands(nsIRDFResource* source,
rv = NS_NewISupportsArray(getter_AddRefs(cmds));
if (NS_FAILED(rv)) return rv;
cmds->AppendElement(kNC_Delete);
cmds->AppendElement(kNC_DeleteCards);
cmds->AppendElement(kNC_NewDirectory);
}
@ -365,7 +370,7 @@ nsAbDirectoryDataSource::IsCommandEnabled(nsISupportsArray/*<nsIRDFResource>*/*
directory = do_QueryInterface(source, &rv);
if (NS_SUCCEEDED(rv)) {
// we don't care about the arguments -- directory commands are always enabled
if (!((aCommand == kNC_Delete) ||
if (!((aCommand == kNC_Delete) || (aCommand == kNC_DeleteCards) ||
(aCommand == kNC_NewDirectory))) {
*aResult = PR_FALSE;
return NS_OK;
@ -385,14 +390,17 @@ nsAbDirectoryDataSource::DoCommand(nsISupportsArray/*<nsIRDFResource>*/* aSource
nsresult rv = aSources->Count(&cnt);
if (NS_FAILED(rv)) return rv;
if ((aCommand == kNC_Delete))
rv = DoDeleteFromDirectory(aSources, aArguments);
for (i = 0; i < cnt; i++)
{
nsCOMPtr<nsISupports> supports = getter_AddRefs(aSources->ElementAt(i));
nsCOMPtr<nsIAbDirectory> directory = do_QueryInterface(supports, &rv);
if (NS_SUCCEEDED(rv))
{
if ((aCommand == kNC_Delete))
rv = DoDeleteFromDirectory(directory, aArguments);
if ((aCommand == kNC_DeleteCards))
rv = DoDeleteCardsFromDirectory(directory, aArguments);
else if((aCommand == kNC_NewDirectory))
rv = DoNewDirectory(directory, aArguments);
}
@ -565,16 +573,41 @@ nsAbDirectoryDataSource::createDirectoryChildNode(nsIAbDirectory *directory,
return NS_RDF_NO_VALUE;
}
nsresult nsAbDirectoryDataSource::DoDeleteFromDirectory(nsIAbDirectory *directory, nsISupportsArray *arguments)
nsresult nsAbDirectoryDataSource::DoDeleteFromDirectory(nsISupportsArray *parentDirs, nsISupportsArray *delDirs)
{
PRUint32 item, itemCount;
nsresult rv = parentDirs->Count(&itemCount);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsISupportsArray> dirArray;
NS_NewISupportsArray(getter_AddRefs(dirArray));
for (item = 0; item < itemCount; item++)
{
nsCOMPtr<nsISupports> supports = getter_AddRefs(parentDirs->ElementAt(item));
nsCOMPtr<nsIAbDirectory> parent = do_QueryInterface(supports, &rv);
if (NS_SUCCEEDED(rv))
{
nsCOMPtr<nsISupports> supports = getter_AddRefs(delDirs->ElementAt(item));
nsCOMPtr<nsIAbDirectory> deletedDir(do_QueryInterface(supports));
if(deletedDir)
{
rv = parent->DeleteDirectory(deletedDir);
}
}
}
return rv;
}
nsresult nsAbDirectoryDataSource::DoDeleteCardsFromDirectory(nsIAbDirectory *directory, nsISupportsArray *arguments)
{
nsresult rv = NS_OK;
PRUint32 itemCount;
rv = arguments->Count(&itemCount);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsISupportsArray> cardArray, dirArray;
nsCOMPtr<nsISupportsArray> cardArray;
NS_NewISupportsArray(getter_AddRefs(cardArray));
NS_NewISupportsArray(getter_AddRefs(dirArray));
//Split up deleted items into different type arrays to be passed to the folder
//for deletion.
@ -583,31 +616,19 @@ nsresult nsAbDirectoryDataSource::DoDeleteFromDirectory(nsIAbDirectory *director
{
nsCOMPtr<nsISupports> supports = getter_AddRefs(arguments->ElementAt(item));
nsCOMPtr<nsIAbCard> deletedCard(do_QueryInterface(supports));
nsCOMPtr<nsIAbDirectory> deletedDir(do_QueryInterface(supports));
if (deletedCard)
{
cardArray->AppendElement(supports);
}
else if(deletedDir)
{
dirArray->AppendElement(supports);
}
}
PRUint32 cnt;
rv = cardArray->Count(&cnt);
if (NS_FAILED(rv)) return rv;
if (cnt > 0)
rv = directory->DeleteCards(cardArray);
rv = dirArray->Count(&cnt);
if (NS_FAILED(rv)) return rv;
if (cnt > 0)
rv = directory->DeleteDirectories(dirArray);
return rv;
}
nsresult nsAbDirectoryDataSource::DoNewDirectory(nsIAbDirectory *directory, nsISupportsArray *arguments)
{
nsresult rv = NS_OK;

Просмотреть файл

@ -102,8 +102,10 @@ protected:
static nsresult getDirectoryArcLabelsOut(nsIAbDirectory *directory,
nsISupportsArray **arcs);
nsresult DoDeleteFromDirectory(nsIAbDirectory *directory,
nsISupportsArray *arguments);
nsresult DoDeleteFromDirectory(nsISupportsArray *parentDirs,
nsISupportsArray *delDirs);
nsresult DoDeleteCardsFromDirectory(nsIAbDirectory *directory,
nsISupportsArray *delDirs);
nsresult DoDirectoryAssert(nsIAbDirectory *directory,
nsIRDFResource *property, nsIRDFNode *target);
@ -121,6 +123,7 @@ protected:
// commands
static nsIRDFResource* kNC_Delete;
static nsIRDFResource* kNC_DeleteCards;
static nsIRDFResource* kNC_NewDirectory;
};