Relanding Bug 394781 now the regressions should be fixed (An address database (nsIAddrDatabase) should be got from the directory not from the address book service via uri). r=bienvenu,sr=mscott

git-svn-id: svn://10.0.0.236/trunk@235444 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bugzilla%standard8.plus.com 2007-09-10 16:11:46 +00:00
parent 0e7bb557f7
commit 8617c22925
26 changed files with 307 additions and 239 deletions

View File

@ -289,7 +289,7 @@ function AbEditSelectedDirectory()
var directory = GetDirectoryFromURI(selecteduri);
if (directory.isMailList) {
var dirUri = GetParentDirectoryFromMailingListURI(selecteduri);
goEditListDialog(dirUri, null, selecteduri, UpdateCardView);
goEditListDialog(null, selecteduri, UpdateCardView);
}
else {
if (directory instanceof Components.interfaces.nsIAbLDAPDirectory) {
@ -437,7 +437,7 @@ function AbEditCard(card)
return;
if (card.isMailList) {
goEditListDialog(GetSelectedDirectory(), card, card.mailListURI, UpdateCardView);
goEditListDialog(card, card.mailListURI, UpdateCardView);
}
else {
goEditCardDialog(GetSelectedDirectory(), card, UpdateCardView);
@ -843,12 +843,12 @@ function goNewListDialog(selectedAB)
{selectedAB:selectedAB});
}
function goEditListDialog(abURI, abCard, listURI, okCallback)
function goEditListDialog(abCard, listURI, okCallback)
{
window.openDialog("chrome://messenger/content/addressbook/abEditListDialog.xul",
"",
"chrome,resizable=no,titlebar,modal,centerscreen",
{abURI:abURI, abCard:abCard, listURI:listURI, okCallback:okCallback});
{abCard:abCard, listURI:listURI, okCallback:okCallback});
}
function goNewCardDialog(selectedAB)

View File

@ -56,7 +56,7 @@
#define kABFileName_CurrentSuffix ".mab" /* v3 address book extension */
%}
[scriptable, uuid(2c6bf966-88fb-4054-85ee-967ef4750e94)]
[scriptable, uuid(0e4fe001-a62f-41fe-bddb-5ccd8b2911a0)]
interface nsIAbDirectory : nsISupports {
// Types of operation
@ -180,20 +180,27 @@ interface nsIAbDirectory : nsISupports {
// Specific to a directory which stores mail lists
// Creates a new mailing list in the directory
// with the properties defined by list
void addMailList (in nsIAbDirectory list);
/**
* Creates a new mailing list in the directory. Currently only supported
* for top-level directories.
*
* @param list The new mailing list to add.
*/
void addMailList(in nsIAbDirectory list);
// Specific to a directory which is a mail list
attribute wstring listNickName;
attribute wstring description;
/**
* Edits an existing mailing list (specified as listCard)
* into the directory specified by the uri
* XXX javadoc me
* Edits an existing mailing list (specified as listCard) into its parent
* directory. You should call this function on the resource with the same
* uri as the listCard.
*
* @param listCard A nsIAbCard version of the mailing list with the new
* values.
*/
void editMailListToDatabase(in string uri, in nsIAbCard listCard);
void editMailListToDatabase(in nsIAbCard listCard);
// Copies mail list properties from the srcList
void copyMailList(in nsIAbDirectory srcList);

View File

@ -39,6 +39,8 @@
#include "nsISupports.idl"
interface nsIMutableArray;
interface nsILocalFile;
interface nsIAddrDatabase;
interface nsIAbLDAPAttributeMap;
interface nsILDAPURL;
@ -51,7 +53,7 @@ interface nsILDAPURL;
* XXX This should really inherit from nsIAbDirectory, and some day it will.
* But for now, doing that complicates implementation.
*/
[scriptable, uuid(fb4adf7f-a299-49d1-ac47-9ce181e8e80d)]
[scriptable, uuid(684c8f3e-dcd1-4f16-9cfc-f0f77080a249)]
interface nsIAbLDAPDirectory : nsISupports
{
/**
@ -103,5 +105,15 @@ interface nsIAbLDAPDirectory : nsISupports
* directories rdf uri, e.g. moz-abldapdirectory://<pref base name>/.
*/
attribute nsILDAPURL lDAPURL;
/**
* The replication (offline) file that this database uses.
*/
readonly attribute nsILocalFile replicationFile;
/**
* A database that is set up for the replication file.
*/
readonly attribute nsIAddrDatabase replicationDatabase;
};

View File

@ -38,15 +38,17 @@
#include "nsISupports.idl"
#include "nsIAbCard.idl"
#include "nsIAbDirectory.idl"
interface nsILocalFile;
interface nsIAbDirectory;
interface nsIAbCard;
interface nsIAddrDatabase;
%{C++
#define kMDBDirectoryRoot "moz-abmdbdirectory://"
#define kMDBDirectoryRootLen 21
%}
[scriptable, uuid(db732ce9-a030-4aba-b4e5-96314ba5ec36)]
[scriptable, uuid(6f25d820-f708-49b8-8a41-7332b856a197)]
interface nsIAbMDBDirectory : nsISupports {
// Creates an RDF directory component from the
@ -57,6 +59,19 @@ interface nsIAbMDBDirectory : nsISupports {
// This just returns the uri on the RDF resource
string getDirUri();
/**
* Supplies a nsILocalFile point to the database file for this directory
*
* @exception NS_ERROR_NOT_INITIALIZED If there is no filename preference
* present or it is empty
*/
readonly attribute nsILocalFile databaseFile;
/**
* Supplies a nsIAddrDatabase that uses the databaseFile. See also
* databaseFile for possible exceptions.
*/
readonly attribute nsIAddrDatabase database;
// Mail list specific
//

View File

@ -36,15 +36,15 @@
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
#include "nsIRDFCompositeDataSource.idl"
#include "nsIAddrDatabase.idl"
#include "nsISupportsArray.idl"
interface nsIDOMWindow;
interface nsIAbDirectory;
interface nsIAbCard;
interface nsIAbDirectoryProperties;
interface nsISupportsArray;
interface nsIRDFDataSource;
[scriptable, uuid(8b1bdc86-c6bd-4df0-8123-8b30c3e3ae43)]
[scriptable, uuid(70ed1e50-4824-443f-aaea-c0efb7f2ec1a)]
interface nsIAddressBook : nsISupports
{
/**
@ -63,7 +63,6 @@ interface nsIAddressBook : nsISupports
void deleteAddressBooks(in nsIRDFDataSource aDS, in nsISupportsArray aParentDir, in nsISupportsArray aResourceArray);
void exportAddressBook(in nsIDOMWindow aParentWin, in nsIAbDirectory aDirectory);
nsIAddrDatabase getAbDatabaseFromURI(in string URI);
boolean mailListNameExists(in wstring name);
nsIAbCard escapedVCardToAbCard(in string escapedVCardStr);
string abCardToEscapedVCard(in nsIAbCard aCard);

View File

@ -283,8 +283,7 @@ function AbEditSelectedDirectory()
var selecteduri = GetSelectedDirectory();
var directory = GetDirectoryFromURI(selecteduri);
if (directory.isMailList) {
var dirUri = GetParentDirectoryFromMailingListURI(selecteduri);
goEditListDialog(dirUri, null, selecteduri, UpdateCardView);
goEditListDialog(null, selecteduri, UpdateCardView);
}
else {
if (directory instanceof Components.interfaces.nsIAbLDAPDirectory) {
@ -414,7 +413,7 @@ function AbEditCard(card)
return;
if (card.isMailList) {
goEditListDialog(GetSelectedDirectory(), card, card.mailListURI, UpdateCardView);
goEditListDialog(card, card.mailListURI, UpdateCardView);
}
else {
goEditCardDialog(GetSelectedDirectory(), card, UpdateCardView);
@ -826,12 +825,12 @@ function goNewListDialog(selectedAB)
{selectedAB:selectedAB});
}
function goEditListDialog(abURI, abCard, listURI, okCallback)
function goEditListDialog(abCard, listURI, okCallback)
{
window.openDialog("chrome://messenger/content/addressbook/abEditListDialog.xul",
"",
"chrome,resizable=no,titlebar,modal,centerscreen",
{abURI:abURI, abCard:abCard, listURI:listURI, okCallback:okCallback});
{abCard:abCard, listURI:listURI, okCallback:okCallback});
}
function goNewCardDialog(selectedAB)

View File

@ -38,7 +38,6 @@
top.MAX_RECIPIENTS = 1;
var inputElementType = "";
var gParentURI;
var gListCard;
var gEditList;
var gOkCallback = null;
@ -263,7 +262,7 @@ function EditListOKButton()
gListCard.notes = gEditList.description;
}
gEditList.editMailListToDatabase(gParentURI, gListCard);
gEditList.editMailListToDatabase(gListCard);
if (gOkCallback)
gOkCallback();
@ -277,7 +276,6 @@ function OnLoadEditList()
{
InitCommonJS();
gParentURI = window.arguments[0].abURI;
gListCard = window.arguments[0].abCard;
var listUri = window.arguments[0].listURI;
gOkCallback = window.arguments[0].okCallback;

View File

@ -53,7 +53,7 @@
#include "nsString.h"
#include "nsReadableUtils.h"
#include "prmem.h"
#include "nsIAddressBook.h"
#include "nsIAbMDBDirectory.h"
NS_IMPL_ISUPPORTS2(nsAbAddressCollecter, nsIAbAddressCollecter, nsIObserver)
@ -352,22 +352,21 @@ nsresult nsAbAddressCollecter::SetAbURI(const nsACString &aURI)
m_abURI = aURI;
nsresult rv;
nsCOMPtr<nsIAddrBookSession> abSession = do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = addressBook->GetAbDatabaseFromURI(m_abURI.get(), getter_AddRefs(m_database));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIRDFService> rdfService = do_GetService("@mozilla.org/rdf/rdf-service;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr <nsIRDFResource> resource;
nsCOMPtr<nsIRDFResource> resource;
rv = rdfService->GetResource(m_abURI, getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv, rv);
m_directory = do_QueryInterface(resource, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAbMDBDirectory> mdbDir(do_QueryInterface(m_directory, &rv));
NS_ENSURE_SUCCESS(rv, rv);
rv = mdbDir->GetDatabase(getter_AddRefs(m_database));
NS_ENSURE_SUCCESS(rv, rv);
return rv;
}

View File

@ -53,7 +53,7 @@
#include "nsIIOService.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsAbMDBDirectory.h"
#include "nsIAbMDBDirectory.h"
NS_IMPL_ISUPPORTS2(nsAbAutoCompleteSession, nsIAbAutoCompleteSession, nsIAutoCompleteSession)

View File

@ -48,6 +48,7 @@
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsIAbDirectory.h"
#include "nsIAddrDatabase.h"
#include "plbase64.h"
#include "nsIAddrBookSession.h"
#include "nsIStringBundle.h"

View File

@ -297,7 +297,7 @@ nsAbDirProperty::CreateDirectoryByURI(const nsAString &aDisplayName,
NS_IMETHODIMP nsAbDirProperty::AddMailList(nsIAbDirectory *list)
{ return NS_ERROR_NOT_IMPLEMENTED; }
NS_IMETHODIMP nsAbDirProperty::EditMailListToDatabase(const char *uri, nsIAbCard *listCard)
NS_IMETHODIMP nsAbDirProperty::EditMailListToDatabase(nsIAbCard *listCard)
{ return NS_ERROR_NOT_IMPLEMENTED; }
NS_IMETHODIMP nsAbDirProperty::AddCard(nsIAbCard *childCard, nsIAbCard **addedCard)

View File

@ -57,6 +57,9 @@
#include "nsIAbMDBDirectory.h"
#include "nsILDAPURL.h"
#include "nsILDAPConnection.h"
#include "nsAppDirectoryServiceDefs.h"
#include "nsDirectoryServiceUtils.h"
#include "nsILocalFile.h"
#define kDefaultMaxHits 100
@ -569,3 +572,47 @@ NS_IMETHODIMP nsAbLDAPDirectory::GetAttributeMap(nsIAbLDAPAttributeMap **aAttrib
return mapSvc->GetMapForPrefBranch(m_DirPrefId, aAttributeMap);
}
NS_IMETHODIMP nsAbLDAPDirectory::GetReplicationFile(nsILocalFile **aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
nsCString fileName;
nsresult rv = GetStringValue("filename", EmptyCString(), fileName);
NS_ENSURE_SUCCESS(rv, rv);
if (fileName.IsEmpty())
return NS_ERROR_NOT_INITIALIZED;
nsCOMPtr<nsIFile> profileDir;
rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
getter_AddRefs(profileDir));
NS_ENSURE_SUCCESS(rv, rv);
rv = profileDir->AppendNative(fileName);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsILocalFile> replFile(do_QueryInterface(profileDir, &rv));
NS_ENSURE_SUCCESS(rv, rv);
NS_ADDREF(*aResult = replFile);
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPDirectory::GetReplicationDatabase(nsIAddrDatabase **aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
nsresult rv;
nsCOMPtr<nsILocalFile> databaseFile;
rv = GetReplicationFile(getter_AddRefs(databaseFile));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrDatabase> addrDBFactory =
do_GetService(NS_ADDRDATABASE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
return addrDBFactory->Open(databaseFile, PR_FALSE /* no create */, PR_TRUE,
aResult);
}

View File

@ -54,7 +54,7 @@
#include "nsIAddressBook.h"
#include "nsIAddrBookSession.h"
#include "nsIAddrDBListener.h"
#include "nsIAddrDatabase.h"
#include "nsEnumeratorUtils.h"
#include "nsAbBaseCID.h"

View File

@ -182,3 +182,13 @@ NS_IMETHODIMP nsAbMDBDirProperty::CardForEmailAddress(const char * aEmailAddress
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsAbMDBDirProperty::GetDatabaseFile(nsILocalFile **aResult)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsAbMDBDirProperty::GetDatabase(nsIAddrDatabase **aResult)
{
return NS_ERROR_NOT_IMPLEMENTED;
}

View File

@ -48,7 +48,6 @@
#include "nsIAbMDBCard.h"
#include "nsIAbListener.h"
#include "nsIAddrBookSession.h"
#include "nsIAddressBook.h"
#include "nsIURL.h"
#include "nsNetCID.h"
#include "nsAbDirectoryQuery.h"
@ -60,6 +59,9 @@
#include "mdb.h"
#include "prprf.h"
#include "nsIPrefService.h"
#include "nsAppDirectoryServiceDefs.h"
#include "nsDirectoryServiceUtils.h"
#include "nsILocalFile.h"
// XXX todo
// fix this -1,0,1 crap, use an enum or #define
@ -91,8 +93,10 @@ NS_IMETHODIMP nsAbMDBDirectory::Init(const char *aUri)
nsCAutoString uri;
uri = aUri;
mIsMailingList = (uri.Find("MailList") == kNotFound) ? 0 : 1;
// Mailing lists don't have their own prefs.
if (m_DirPrefId.IsEmpty() && (uri.Find("MailList") == kNotFound))
if (m_DirPrefId.IsEmpty() && !mIsMailingList)
{
// Find the first ? (of the search params) if there is one.
// We know we can start at the end of the moz-abmdbdirectory:// because
@ -227,29 +231,20 @@ NS_IMETHODIMP nsAbMDBDirectory::DeleteDirectory(nsIAbDirectory *directory)
nsCOMPtr<nsIAbMDBDirectory> dbdirectory(do_QueryInterface(directory, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCString uri;
rv = dbdirectory->GetDirUri(getter_Copies(uri));
nsCOMPtr<nsIAddrDatabase> database;
rv = dbdirectory->GetDatabase(getter_AddRefs(database));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrDatabase> database;
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID, &rv);
rv = database->DeleteMailList(directory, PR_TRUE);
if (NS_SUCCEEDED(rv))
{
rv = addressBook->GetAbDatabaseFromURI(uri.get(), getter_AddRefs(database));
database->Commit(nsAddrDBCommitType::kLargeCommit);
if (NS_SUCCEEDED(rv))
rv = database->DeleteMailList(directory, PR_TRUE);
if (m_AddressList)
m_AddressList->RemoveElement(directory);
rv = mSubDirectories.RemoveObject(directory);
if (NS_SUCCEEDED(rv))
database->Commit(nsAddrDBCommitType::kLargeCommit);
if (m_AddressList)
m_AddressList->RemoveElement(directory);
rv = mSubDirectories.RemoveObject(directory);
NotifyItemDeleted(directory);
}
NotifyItemDeleted(directory);
return rv;
}
@ -372,7 +367,7 @@ NS_IMETHODIMP nsAbMDBDirectory::AddDirectory(const char *uriName, nsIAbDirectory
NS_IMETHODIMP nsAbMDBDirectory::GetDirUri(char **uri)
{
NS_ASSERTION(uri, "Null out param");
NS_ENSURE_ARG_POINTER(uri);
NS_ASSERTION(!mURI.IsEmpty(), "Not initialized?");
*uri = ToNewCString(mURI);
@ -383,7 +378,49 @@ NS_IMETHODIMP nsAbMDBDirectory::GetDirUri(char **uri)
return NS_OK;
}
NS_IMETHODIMP nsAbMDBDirectory::GetDatabaseFile(nsILocalFile **aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
nsCString fileName;
nsresult rv = GetStringValue("filename", EmptyCString(), fileName);
NS_ENSURE_SUCCESS(rv, rv);
if (fileName.IsEmpty())
return NS_ERROR_NOT_INITIALIZED;
nsCOMPtr<nsIFile> profileDir;
rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
getter_AddRefs(profileDir));
NS_ENSURE_SUCCESS(rv, rv);
rv = profileDir->AppendNative(fileName);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsILocalFile> dbFile = do_QueryInterface(profileDir, &rv);
NS_ENSURE_SUCCESS(rv, rv);
NS_ADDREF(*aResult = dbFile);
return NS_OK;
}
NS_IMETHODIMP nsAbMDBDirectory::GetDatabase(nsIAddrDatabase **aResult)
{
NS_ENSURE_ARG_POINTER(aResult);
nsresult rv;
nsCOMPtr<nsILocalFile> databaseFile;
rv = GetDatabaseFile(getter_AddRefs(databaseFile));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrDatabase> addrDBFactory =
do_GetService(NS_ADDRDATABASE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
return addrDBFactory->Open(databaseFile, PR_FALSE /* no create */, PR_TRUE,
aResult);
}
// nsIAbDirectory methods
@ -477,11 +514,8 @@ NS_IMETHODIMP nsAbMDBDirectory::DeleteCards(nsISupportsArray *cards)
// before we do the delete, make this directory (which represents the search)
// a listener on the database, so that it will get notified when the cards are deleted
// after delete, remove this query as a listener.
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIAddrDatabase> database;
rv = addressBook->GetAbDatabaseFromURI(mURINoQuery.get(), getter_AddRefs(database));
rv = GetDatabase(getter_AddRefs(database));
NS_ENSURE_SUCCESS(rv,rv);
rv = database->AddListener(this);
@ -640,20 +674,11 @@ NS_IMETHODIMP nsAbMDBDirectory::HasDirectory(nsIAbDirectory *dir, PRBool *hasDir
dir->GetIsMailList(&bIsMailingList);
if (bIsMailingList)
{
nsCString uri;
rv = dbdir->GetDirUri(getter_Copies(uri));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrDatabase> database;
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID, &rv);
rv = dbdir->GetDatabase(getter_AddRefs(database));
if (NS_SUCCEEDED(rv))
{
rv = addressBook->GetAbDatabaseFromURI(uri.get(), getter_AddRefs(database));
}
if(NS_SUCCEEDED(rv) && database)
{
if(NS_SUCCEEDED(rv))
rv = database->ContainsMailList(dir, hasDir);
}
rv = database->ContainsMailList(dir, hasDir);
}
return rv;
@ -842,30 +867,21 @@ NS_IMETHODIMP nsAbMDBDirectory::DropCard(nsIAbCard* aCard, PRBool needToCopyCard
return NS_OK;
}
NS_IMETHODIMP nsAbMDBDirectory::EditMailListToDatabase(const char *uri, nsIAbCard *listCard)
NS_IMETHODIMP nsAbMDBDirectory::EditMailListToDatabase(nsIAbCard *listCard)
{
if (mIsQueryURI)
return NS_ERROR_NOT_IMPLEMENTED;
nsresult rv = NS_OK;
if (!mIsMailingList)
return NS_ERROR_UNEXPECTED;
nsCOMPtr<nsIAddrDatabase> listDatabase;
nsresult rv = GetAbDatabase();
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv))
rv = addressBook->GetAbDatabaseFromURI(uri, getter_AddRefs(listDatabase));
mDatabase->EditMailList(this, listCard, PR_TRUE);
mDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
if (listDatabase)
{
listDatabase->EditMailList(this, listCard, PR_TRUE);
listDatabase->Commit(nsAddrDBCommitType::kLargeCommit);
listDatabase = nsnull;
return NS_OK;
}
else
return NS_ERROR_FAILURE;
return NS_OK;
}
// nsIAddrDBListener methods
@ -897,7 +913,7 @@ NS_IMETHODIMP nsAbMDBDirectory::OnCardEntryChange
break;
}
NS_ENSURE_SUCCESS(rv, rv);
NS_ENSURE_SUCCESS(rv, rv);
return rv;
}
@ -1020,16 +1036,43 @@ nsresult nsAbMDBDirectory::GetAbDatabase()
{
NS_ASSERTION(!mURI.IsEmpty(), "Not initialized?");
nsresult rv = NS_OK;
if (mDatabase)
return NS_OK;
if (!mDatabase) {
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsresult rv;
rv = addressBook->GetAbDatabaseFromURI(mURI.get(), getter_AddRefs(mDatabase));
if (NS_SUCCEEDED(rv))
rv = mDatabase->AddListener(this);
if (mIsMailingList)
{
// Get the database of the parent directory.
nsCString parentURI(mURINoQuery);
PRInt32 pos = parentURI.RFindChar('/');
// If we didn't find a / something really bad has happened
if (pos == -1)
return NS_ERROR_FAILURE;
parentURI = StringHead(parentURI, pos);
nsCOMPtr<nsIRDFService> rdfService =
do_GetService("@mozilla.org/rdf/rdf-service;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIRDFResource> resource;
rv = rdfService->GetResource(parentURI, getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAbMDBDirectory> mdbDir(do_QueryInterface(resource, &rv));
NS_ENSURE_SUCCESS(rv, rv);
rv = mdbDir->GetDatabase(getter_AddRefs(mDatabase));
}
else
rv = GetDatabase(getter_AddRefs(mDatabase));
if (NS_SUCCEEDED(rv))
rv = mDatabase->AddListener(this);
return rv;
}

View File

@ -85,6 +85,8 @@ public:
NS_IMETHOD RemoveEmailAddressAt(PRUint32 aIndex);
NS_IMETHOD AddDirectory(const char *uriName, nsIAbDirectory **childDir);
NS_IMETHOD GetDirUri(char **uri);
NS_IMETHOD GetDatabaseFile(nsILocalFile **aResult);
NS_IMETHOD GetDatabase(nsIAddrDatabase **aResult);
NS_IMETHOD CardForEmailAddress(const char * aEmailAddress, nsIAbCard ** aAbCard);
// nsIAbDirectory methods:
@ -98,7 +100,7 @@ public:
NS_IMETHOD AddCard(nsIAbCard *card, nsIAbCard **addedCard);
NS_IMETHOD ModifyCard(nsIAbCard *aModifiedCard);
NS_IMETHOD DropCard(nsIAbCard *card, PRBool needToCopyCard);
NS_IMETHOD EditMailListToDatabase(const char *uri, nsIAbCard *listCard);
NS_IMETHOD EditMailListToDatabase(nsIAbCard *listCard);
// nsIAbDirectorySearch methods
NS_DECL_NSIABDIRECTORYSEARCH

View File

@ -524,7 +524,7 @@ NS_IMETHODIMP nsAbOutlookDirectory::AddMailList(nsIAbDirectory *aMailList)
if (!didCopy) {
retCode = newList->CopyMailList(aMailList) ;
NS_ENSURE_SUCCESS(retCode, retCode) ;
retCode = newList->EditMailListToDatabase(mURINoQuery.get(), nsnull) ;
retCode = newList->EditMailListToDatabase(nsnull);
NS_ENSURE_SUCCESS(retCode, retCode) ;
}
m_AddressList->AppendElement(newList) ;
@ -532,21 +532,26 @@ NS_IMETHODIMP nsAbOutlookDirectory::AddMailList(nsIAbDirectory *aMailList)
return retCode ;
}
NS_IMETHODIMP nsAbOutlookDirectory::EditMailListToDatabase(const char *aUri, nsIAbCard *listCard)
NS_IMETHODIMP nsAbOutlookDirectory::EditMailListToDatabase(nsIAbCard *listCard)
{
if (mIsQueryURI) { return NS_ERROR_NOT_IMPLEMENTED ; }
nsresult retCode = NS_OK ;
nsString name;
nsAbWinHelperGuard mapiAddBook (mAbWinType) ;
if (mIsQueryURI)
return NS_ERROR_NOT_IMPLEMENTED;
if (!mapiAddBook->IsOK()) { return NS_ERROR_FAILURE ; }
retCode = GetDirName(name);
NS_ENSURE_SUCCESS(retCode, retCode) ;
if (!mapiAddBook->SetPropertyUString(*mMapiData, PR_DISPLAY_NAME_W, name.get())) {
return NS_ERROR_FAILURE ;
}
retCode = CommitAddressList() ;
return retCode ;
nsresult rv;
nsString name;
nsAbWinHelperGuard mapiAddBook(mAbWinType);
if (!mapiAddBook->IsOK())
return NS_ERROR_FAILURE;
rv = GetDirName(name);
NS_ENSURE_SUCCESS(rv, rv);
if (!mapiAddBook->SetPropertyUString(*mMapiData, PR_DISPLAY_NAME_W,
name.get()))
return NS_ERROR_FAILURE;
return CommitAddressList();
}
struct OutlookTableAttr

View File

@ -76,7 +76,7 @@ public:
NS_IMETHOD ModifyCard(nsIAbCard *aModifiedCard);
NS_IMETHOD DropCard(nsIAbCard *aData, PRBool needToCopyCard);
NS_IMETHOD AddMailList(nsIAbDirectory *aMailList);
NS_IMETHOD EditMailListToDatabase(const char *aUri, nsIAbCard *listCard);
NS_IMETHOD EditMailListToDatabase(nsIAbCard *listCard);
// nsAbDirectoryRDFResource method
NS_IMETHOD Init(const char *aUri);

View File

@ -225,91 +225,19 @@ nsresult nsAddressBook::DoCommand(nsIRDFDataSource* db,
return rv;
}
NS_IMETHODIMP nsAddressBook::GetAbDatabaseFromURI(const char *aURI, nsIAddrDatabase **aDB)
{
NS_ENSURE_ARG_POINTER(aURI);
NS_ENSURE_ARG_POINTER(aDB);
nsresult rv;
nsCOMPtr<nsIAddrBookSession> abSession =
do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsILocalFile> dbPath;
rv = abSession->GetUserProfileDirectory(getter_AddRefs(dbPath));
NS_ENSURE_SUCCESS(rv,rv);
/* directory URIs are of the form
* moz-abmdbdirectory://foo
* mailing list URIs are of the form
* moz-abmdbdirectory://foo/bar
*
* if we are passed a mailing list URI, we want the db for the parent.
*/
if (strlen(aURI) < kMDBDirectoryRootLen)
return NS_ERROR_UNEXPECTED;
nsCAutoString file(aURI + kMDBDirectoryRootLen);
PRInt32 pos = file.Find("/");
if (pos != kNotFound)
file.SetLength(pos);
rv = dbPath->AppendNative(file);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIAddrDatabase> addrDBFactory =
do_GetService(NS_ADDRDATABASE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
/* Don't create otherwise we end up re-opening a deleted address book */
/* bug 66410 */
rv = addrDBFactory->Open(dbPath, PR_FALSE /* no create */, PR_TRUE, aDB);
return rv;
}
nsresult nsAddressBook::GetAbDatabaseFromFile(char* pDbFile, nsIAddrDatabase **db)
{
nsresult rv = NS_OK;
nsCOMPtr<nsIAddrDatabase> database;
if (pDbFile)
{
nsCOMPtr<nsILocalFile> dbPath;
nsCOMPtr<nsIAddrBookSession> abSession =
do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
if(NS_SUCCEEDED(rv))
{
rv = abSession->GetUserProfileDirectory(getter_AddRefs(dbPath));
NS_ENSURE_SUCCESS(rv, rv);
}
nsCAutoString file(pDbFile);
rv = dbPath->AppendNative(file);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIAddrDatabase> addrDBFactory =
do_GetService(NS_ADDRDATABASE_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv) && addrDBFactory)
rv = addrDBFactory->Open(dbPath, PR_TRUE, PR_TRUE, getter_AddRefs(database));
if (NS_SUCCEEDED(rv) && database)
{
NS_IF_ADDREF(*db = database);
}
else
rv = NS_ERROR_NULL_POINTER;
}
return NS_OK;
}
NS_IMETHODIMP nsAddressBook::MailListNameExists(const PRUnichar *name, PRBool *exist)
{
*exist = PR_FALSE;
nsVoidArray* pDirectories = DIR_GetDirectories();
if (pDirectories)
{
nsresult rv;
nsCOMPtr<nsIRDFService> rdfService = do_GetService (NS_RDF_CONTRACTID "/rdf-service;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIRDFResource> resource;
nsCOMPtr<nsIAbMDBDirectory> directory;
PRInt32 count = pDirectories->Count();
/* check: only show personal address book for now */
/* not showing 4.x address book unitl we have the converting done */
@ -319,15 +247,16 @@ NS_IMETHODIMP nsAddressBook::MailListNameExists(const PRUnichar *name, PRBool *e
DIR_Server *server = (DIR_Server *)pDirectories->ElementAt(i);
if (server->dirType == PABDirectory)
{
/* check: this is a 4.x file, remove when conversion is done */
PRUint32 fileNameLen = strlen(server->fileName);
if ((fileNameLen > kABFileName_PreviousSuffixLen) &&
strcmp(server->fileName + fileNameLen - kABFileName_PreviousSuffixLen, kABFileName_PreviousSuffix) == 0)
continue;
rv = rdfService->GetResource(nsDependentCString(server->uri),
getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv, rv);
directory = do_QueryInterface(resource, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrDatabase> database;
nsresult rv = GetAbDatabaseFromFile(server->fileName, getter_AddRefs(database));
if (NS_SUCCEEDED(rv) && database)
nsresult rv = directory->GetDatabase(getter_AddRefs(database));
if (NS_SUCCEEDED(rv))
{
database->FindMailListbyUnicodeName(name, exist);
if (*exist)

View File

@ -102,7 +102,6 @@ public:
protected:
nsresult DoCommand(nsIRDFDataSource *db, const nsACString& command,
nsISupportsArray *srcArray, nsISupportsArray *arguments);
nsresult GetAbDatabaseFromFile(char* pDbFile, nsIAddrDatabase **db);
private:
nsresult ExportDirectoryToDelimitedText(nsIAbDirectory *aDirectory, const char *aDelim, PRUint32 aDelimLen, nsILocalFile *aLocalFile);

View File

@ -68,6 +68,7 @@
#include "nsNetCID.h"
#include "nsIFileStreams.h"
#include "nsUnicharUtils.h"
#include "nsIAbCard.h"
//---------------------------------------------------------------------------
// nsMsgSearchTerm specifies one criterion, e.g. name contains phil
//---------------------------------------------------------------------------

View File

@ -46,6 +46,7 @@
#include "nsIRDFService.h"
#include "nsIRDFResource.h"
#include "nsIMsgHeaderParser.h"
#include "nsIAbDirectory.h"
#include "nsIAbMDBDirectory.h"
#include "nsIAbMDBCard.h"
#include "nsIAbCard.h"

View File

@ -65,6 +65,7 @@
#include "nsILocaleService.h"
#include "nsCollationCID.h"
#include "nsAbBaseCID.h"
#include "nsIAbCard.h"
#include "nsIAbMDBDirectory.h"
#include "nsISpamSettings.h"
#include "nsIMsgFilterPlugin.h"

View File

@ -4066,19 +4066,6 @@ nsresult nsMsgCompose::AttachmentPrettyName(const char* scheme, const char* char
return NS_OK;
}
static nsresult OpenAddressBook(const char * dbUri, nsIAddrDatabase** aDatabase)
{
NS_ENSURE_ARG_POINTER(aDatabase);
nsresult rv;
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
rv = addressBook->GetAbDatabaseFromURI(dbUri, aDatabase);
NS_ENSURE_SUCCESS(rv,rv);
return rv;
}
nsresult nsMsgCompose::GetABDirectories(const nsACString& dirUri, nsISupportsArray* directoriesArray, PRBool searchSubDirectory)
{
static PRBool collectedAddressbookFound;
@ -4155,7 +4142,8 @@ nsresult nsMsgCompose::GetABDirectories(const nsACString& dirUri, nsISupportsArr
return rv;
}
nsresult nsMsgCompose::BuildMailListArray(nsIAddrDatabase* database, nsIAbDirectory* parentDir, nsISupportsArray* array)
nsresult nsMsgCompose::BuildMailListArray(nsIAbDirectory* parentDir,
nsISupportsArray* array)
{
nsresult rv;
@ -4305,6 +4293,7 @@ NS_IMETHODIMP nsMsgCompose::CheckAndPopulateRecipients(PRBool populateMailList,
PRBool stillNeedToSearch = PR_TRUE;
nsCOMPtr<nsIAddrDatabase> abDataBase;
nsCOMPtr<nsIAbDirectory> abDirectory;
nsCOMPtr<nsIAbMDBDirectory> mdbDirectory;
nsCOMPtr <nsIAbCard> existingCard;
nsCOMPtr <nsISupportsArray> mailListAddresses;
nsCOMPtr<nsIMsgHeaderParser> parser (do_GetService(NS_MAILNEWS_MIME_HEADER_PARSER_CONTRACTID));
@ -4319,7 +4308,7 @@ NS_IMETHODIMP nsMsgCompose::CheckAndPopulateRecipients(PRBool populateMailList,
GetABDirectories(NS_LITERAL_CSTRING(kAllDirectoryRoot), addrbookDirArray, PR_TRUE);
PRInt32 nbrRecipients;
PRBool dirtyABDatabase;
PRBool dirtyABDatabase = PR_FALSE;
PRUint32 nbrAddressbook;
addrbookDirArray->Count(&nbrAddressbook);
for (k = 0; k < (PRInt32)nbrAddressbook && stillNeedToSearch; k ++)
@ -4340,22 +4329,21 @@ NS_IMETHODIMP nsMsgCompose::CheckAndPopulateRecipients(PRBool populateMailList,
nsCOMPtr<nsIRDFResource> source(do_QueryInterface(abDirectory));
nsCString uri;
rv = source->GetValue(getter_Copies(uri));
NS_ENSURE_SUCCESS(rv, rv);
mdbDirectory = do_QueryInterface(abDirectory, &rv);
if (NS_FAILED(rv))
continue;
PRBool supportsMailingLists;
rv = abDirectory->GetSupportsMailingLists(&supportsMailingLists);
if (NS_FAILED(rv) || !supportsMailingLists)
continue;
dirtyABDatabase = PR_FALSE;
rv = OpenAddressBook(uri.get(), getter_AddRefs(abDataBase));
if (NS_FAILED(rv) || !abDataBase)
rv = mdbDirectory->GetDatabase(getter_AddRefs(abDataBase));
if (NS_FAILED(rv))
continue;
/* Collect all mailing list defined in this address book */
rv = BuildMailListArray(abDataBase, abDirectory, mailListArray);
rv = BuildMailListArray(abDirectory, mailListArray);
if (NS_FAILED(rv))
return rv;

View File

@ -127,7 +127,8 @@ private:
nsresult CreateMessage(const char * originalMsgURI, MSG_ComposeType type, nsIMsgCompFields* compFields);
void CleanUpRecipients(nsString& recipients);
nsresult GetABDirectories(const nsACString& dirUri, nsISupportsArray* directoriesArray, PRBool searchSubDirectory);
nsresult BuildMailListArray(nsIAddrDatabase* database, nsIAbDirectory* parentDir, nsISupportsArray* array);
nsresult BuildMailListArray(nsIAbDirectory* parentDir,
nsISupportsArray* array);
nsresult GetMailListAddresses(nsString& name, nsISupportsArray* mailListArray, nsISupportsArray** addresses);
nsresult TagConvertible(nsIDOMNode *node, PRInt32 *_retval);
nsresult _BodyConvertible(nsIDOMNode *node, PRInt32 *_retval);

View File

@ -68,6 +68,7 @@
#include "nsProxiedService.h"
#include "msgCore.h"
#include "ImportDebug.h"
#include "nsIAbMDBDirectory.h"
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
PR_STATIC_CALLBACK( void) ImportAddressThread( void *stuff);
@ -741,17 +742,27 @@ void AddressThreadData::DriverAbort()
}
nsIAddrDatabase *GetAddressBookFromUri( const char *pUri)
nsIAddrDatabase *GetAddressBookFromUri(const char *pUri)
{
nsIAddrDatabase * pDatabase = nsnull;
if (pUri) {
nsresult rv = NS_OK;
NS_WITH_PROXIED_SERVICE(nsIAddressBook, addressBook,
NS_ADDRESSBOOK_CONTRACTID,
NS_PROXY_TO_MAIN_THREAD, &rv);
if (addressBook)
rv = addressBook->GetAbDatabaseFromURI(pUri, &pDatabase);
nsIAddrDatabase * pDatabase = nsnull;
if (pUri) {
nsresult rv;
NS_WITH_PROXIED_SERVICE(nsIRDFService, rdfService,
"@mozilla.org/rdf/rdf-service;1",
NS_PROXY_TO_MAIN_THREAD, &rv);
if (NS_SUCCEEDED(rv) && rdfService)
{
nsCOMPtr<nsIRDFResource> resource;
rv = rdfService->GetResource(nsDependentCString(pUri),
getter_AddRefs(resource));
if (NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIAbMDBDirectory> directory = do_QueryInterface(resource, &rv);
if (NS_SUCCEEDED(rv))
directory->GetDatabase(&pDatabase);
}
}
}
return pDatabase;
}