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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user