diff --git a/mailnews/addrbook/public/nsIAbLDAPDirectory.idl b/mailnews/addrbook/public/nsIAbLDAPDirectory.idl index cf05c02b035..06d38dd5885 100644 --- a/mailnews/addrbook/public/nsIAbLDAPDirectory.idl +++ b/mailnews/addrbook/public/nsIAbLDAPDirectory.idl @@ -40,6 +40,7 @@ interface nsIMutableArray; interface nsIAbLDAPAttributeMap; +interface nsILDAPURL; %{C++ #define kLDAPDirectoryRoot "moz-abldapdirectory://" @@ -50,7 +51,7 @@ interface nsIAbLDAPAttributeMap; * XXX This should really inherit from nsIAbDirectory, and some day it will. * But for now, doing that complicates implementation. */ -[scriptable, uuid(9857182c-9051-4788-9393-735ae7bdd8b3)] +[scriptable, uuid(d67b4a29-10d5-4409-a693-3e8bab184948)] interface nsIAbLDAPDirectory : nsISupports { /** @@ -89,5 +90,13 @@ interface nsIAbLDAPDirectory : nsISupports * The attribute map that is associated with this directory's server. */ readonly attribute nsIAbLDAPAttributeMap attributeMap; + + /** + * The LDAP URL for this directory. Note that this differs from + * nsIAbDirectory::URI. This attribute will give you a true ldap + * url, e.g. ldap://localhost:389/ whereas the uri will give you the + * directories rdf uri, e.g. moz-abldapdirectory:///. + */ + readonly attribute nsILDAPURL lDAPURL; }; diff --git a/mailnews/addrbook/public/nsIAbLDAPReplicationData.idl b/mailnews/addrbook/public/nsIAbLDAPReplicationData.idl index abd83f4e33a..c7601715cee 100644 --- a/mailnews/addrbook/public/nsIAbLDAPReplicationData.idl +++ b/mailnews/addrbook/public/nsIAbLDAPReplicationData.idl @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -35,17 +36,19 @@ * ***** END LICENSE BLOCK ***** */ #include "nsISupports.idl" -#include "nsILDAPMessageListener.idl" +interface nsIAbLDAPDirectory; +interface nsILDAPConnection; +interface nsILDAPURL; interface nsIAbLDAPReplicationQuery; interface nsIWebProgressListener; /** * this service does replication of an LDAP directory to a local Mork AB Database. */ -[scriptable, uuid(00D568A2-3C3B-11d6-B7B9-00B0D06E5F27)] -interface nsIAbLDAPProcessReplicationData : nsILDAPMessageListener { - +[scriptable, uuid(e628bbc9-8793-4f0b-bce4-990d399b1fca)] +interface nsIAbLDAPProcessReplicationData : nsISupports +{ /** * readonly attribute giving the current replication state */ @@ -83,16 +86,15 @@ interface nsIAbLDAPProcessReplicationData : nsILDAPMessageListener { /** * this method initializes the implementation */ - void init (in nsIAbLDAPReplicationQuery query, in nsIWebProgressListener progressListener); + void init(in nsIAbLDAPDirectory directory, + in nsILDAPConnection connection, + in nsILDAPURL url, + in nsIAbLDAPReplicationQuery query, + in nsIWebProgressListener progressListener); /** * this method a aborts the ongoing processing */ void abort(); - - /** - * this utility method populates authentication data from Dir Server - */ - void populateAuthData(); }; diff --git a/mailnews/addrbook/public/nsIAbLDAPReplicationQuery.idl b/mailnews/addrbook/public/nsIAbLDAPReplicationQuery.idl index 808811eb8d4..8628c73cafa 100644 --- a/mailnews/addrbook/public/nsIAbLDAPReplicationQuery.idl +++ b/mailnews/addrbook/public/nsIAbLDAPReplicationQuery.idl @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -19,6 +20,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): + * Mark Banner * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -45,67 +47,53 @@ interface nsIAbLDAPDirectory; /** * this interface provides methods to perform LDAP Replication Queries */ -[scriptable, uuid(91c213f7-a381-4b1d-adf3-af58a2bb95d2)] -interface nsIAbLDAPReplicationQuery : nsISupports { - - readonly attribute nsILDAPURL replicationURL; - readonly attribute nsILDAPConnection connection; - readonly attribute nsILDAPOperation operation; - - readonly attribute nsIAbLDAPDirectory lDAPDirectory; - - /** - * initialize for the query - */ - void init (in ACString aPrefName, in nsIWebProgressListener aProgressListener); +[scriptable, uuid(6d33127c-faef-4140-bb19-bb03c1590917)] +interface nsIAbLDAPReplicationQuery : nsISupports +{ + /** + * initialize for the query + */ + void init(in ACString aPrefName, in nsIWebProgressListener aProgressListener); - /** - * Starts an LDAP query to do replication as needed - */ - void doReplicationQuery(); + /** + * Starts an LDAP query to do replication as needed + */ + void doReplicationQuery(); /** - * connects to an LDAP Server using a DN - */ - void connectToLDAPServer(in nsILDAPURL aURL, in AUTF8String aAuthDN); + * Cancels the currently executing query + */ + void cancelQuery(); /** - * Starts an LDAP query to replicate all entries - */ - void queryAllEntries(); - - /** - * Cancels the currently executing query - */ - void cancelQuery(); - - /** - * this method is the callback when query is done, failed or successful - */ - void done(in boolean aSuccess); + * this method is the callback when query is done, failed or successful + */ + void done(in boolean aSuccess); }; - +// XXX This interface currently isn't implemented as it didn't work. +// Bug 311632 should fix it [scriptable, uuid(126202D1-4460-11d6-B7C2-00B0D06E5F27)] -interface nsIAbLDAPChangeLogQuery : nsISupports { +interface nsIAbLDAPChangeLogQuery : nsISupports +{ /** - * Starts an LDAP query to find auth DN - */ - void queryAuthDN(in AUTF8String aValueUsedToFindDn); + * Starts an LDAP query to find auth DN + */ + void queryAuthDN(in AUTF8String aValueUsedToFindDn); /** - * Starts an LDAP query to search server's Root DSE - */ - void queryRootDSE(); + * Starts an LDAP query to search server's Root DSE + */ + void queryRootDSE(); /** - * Starts an LDAP ChangeLog query to find changelog entries - */ - void queryChangeLog(in AUTF8String aChangeLogDN, in PRInt32 aLastChangeNo); + * Starts an LDAP ChangeLog query to find changelog entries + */ + void queryChangeLog(in AUTF8String aChangeLogDN, in PRInt32 aLastChangeNo); /** - * Starts an LDAP query to find changed entries - */ - void queryChangedEntries(in AUTF8String aChangedEntryDN); + * Starts an LDAP query to find changed entries + */ + void queryChangedEntries(in AUTF8String aChangedEntryDN); }; diff --git a/mailnews/addrbook/src/nsAbLDAPDirectory.h b/mailnews/addrbook/src/nsAbLDAPDirectory.h index 4b13f2ca95a..d218a2b5dee 100644 --- a/mailnews/addrbook/src/nsAbLDAPDirectory.h +++ b/mailnews/addrbook/src/nsAbLDAPDirectory.h @@ -77,7 +77,6 @@ public: // nsAbLDAPDirectoryQuery methods nsresult GetLDAPConnection (nsILDAPConnection** connection); - nsresult GetLDAPURL (nsILDAPURL** url); nsresult CreateCard (nsILDAPURL* uri, const char* dn, nsIAbCard** card); // nsIAbDirectorySearch methods diff --git a/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp b/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp index 3681880e858..044ee73f6ff 100644 --- a/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp +++ b/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp @@ -432,10 +432,10 @@ nsAbLDAPDirectoryQuery::~nsAbLDAPDirectoryQuery() } NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* arguments, - nsIAbDirectoryQueryResultListener* listener, - PRInt32 resultLimit, - PRInt32 timeOut, - PRInt32* _retval) + nsIAbDirectoryQueryResultListener* listener, + PRInt32 resultLimit, + PRInt32 timeOut, + PRInt32* _retval) { PRBool alreadyInitialized = mInitialized; mInitialized = PR_TRUE; @@ -492,7 +492,10 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* argu } // Set up the search ldap url - rv = GetLDAPURL(getter_AddRefs(mDirectoryUrl)); + nsCOMPtr directory(do_QueryInterface(this, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = directory->GetLDAPURL(getter_AddRefs(mDirectoryUrl)); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString host; diff --git a/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h b/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h index 47fd6b2ee98..e5e659d0c7f 100644 --- a/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h +++ b/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h @@ -60,7 +60,6 @@ public: void setLdapUrl (const char* aldapUrl); virtual nsresult GetLDAPConnection (nsILDAPConnection** connection) = 0; - virtual nsresult GetLDAPURL (nsILDAPURL** url) = 0; virtual nsresult CreateCard (nsILDAPURL* url, const char* dn, nsIAbCard** card) = 0; protected: diff --git a/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp b/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp index 10319adc328..d9ec629ac11 100644 --- a/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp +++ b/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp @@ -67,6 +67,9 @@ nsAbLDAPListenerBase::~nsAbLDAPListenerBase() nsresult nsAbLDAPListenerBase::Initiate() { + if (!mConnection || !mDirectoryUrl) + return NS_ERROR_NULL_POINTER; + if (mInitialized) return NS_OK; @@ -81,6 +84,9 @@ nsresult nsAbLDAPListenerBase::Initiate() NS_IMETHODIMP nsAbLDAPListenerBase::OnLDAPInit(nsILDAPConnection *aConn, nsresult aStatus) { + if (!mConnection || !mDirectoryUrl) + return NS_ERROR_NULL_POINTER; + nsresult rv; nsXPIDLString passwd; @@ -225,6 +231,7 @@ NS_IMETHODIMP nsAbLDAPListenerBase::OnLDAPInit(nsILDAPConnection *aConn, nsresul NS_STATIC_CAST(nsILDAPMessageListener *, this), NS_PROXY_SYNC | NS_PROXY_ALWAYS, getter_AddRefs(proxyListener)); + NS_ENSURE_SUCCESS(rv, rv); rv = ldapOperation->Init(mConnection, proxyListener, nsnull); NS_ENSURE_SUCCESS(rv, rv); @@ -269,7 +276,7 @@ nsresult nsAbLDAPListenerBase::OnLDAPMessageBind(nsILDAPMessage *aMessage) // pop up a dialog telling the user to go manually delete // this password in the password manager. } - } + } // XXX this error should be propagated back to the UI somehow return NS_ERROR_FAILURE; diff --git a/mailnews/addrbook/src/nsAbLDAPListenerBase.h b/mailnews/addrbook/src/nsAbLDAPListenerBase.h index ffc7e7b413c..455d43ad9b0 100644 --- a/mailnews/addrbook/src/nsAbLDAPListenerBase.h +++ b/mailnews/addrbook/src/nsAbLDAPListenerBase.h @@ -53,9 +53,9 @@ class nsAbLDAPListenerBase : public nsILDAPMessageListener public: // Note that the directoryUrl is the details of the ldap directory // without any search params or attributes specified. - nsAbLDAPListenerBase(nsILDAPURL* directoryUrl, - nsILDAPConnection* connection, - const nsACString &login, + nsAbLDAPListenerBase(nsILDAPURL* directoryUrl = nsnull, + nsILDAPConnection* connection = nsnull, + const nsACString &login = EmptyCString(), const PRInt32 timeOut = 0); virtual ~nsAbLDAPListenerBase(); @@ -74,8 +74,6 @@ protected: PRBool mBound; PRBool mInitialized; - nsCOMPtr mOperation; - PRLock* mLock; }; diff --git a/mailnews/addrbook/src/nsAbLDAPReplicationData.cpp b/mailnews/addrbook/src/nsAbLDAPReplicationData.cpp index 675d2589a3c..1e223306837 100644 --- a/mailnews/addrbook/src/nsAbLDAPReplicationData.cpp +++ b/mailnews/addrbook/src/nsAbLDAPReplicationData.cpp @@ -56,12 +56,13 @@ // independently along with its related independent nsAbLDAPReplicationQuery object. NS_IMPL_THREADSAFE_ISUPPORTS2(nsAbLDAPProcessReplicationData, nsIAbLDAPProcessReplicationData, nsILDAPMessageListener) -nsAbLDAPProcessReplicationData::nsAbLDAPProcessReplicationData() - : mState(kIdle), - mProtocol(-1), - mCount(0), - mDBOpen(PR_FALSE), - mInitialized(PR_FALSE) +nsAbLDAPProcessReplicationData::nsAbLDAPProcessReplicationData() : + nsAbLDAPListenerBase(), + mState(kIdle), + mProtocol(-1), + mCount(0), + mDBOpen(PR_FALSE), + mInitialized(PR_FALSE) { } @@ -72,35 +73,45 @@ nsAbLDAPProcessReplicationData::~nsAbLDAPProcessReplicationData() mReplicationDB->Close(PR_FALSE); } -NS_IMETHODIMP nsAbLDAPProcessReplicationData::Init(nsIAbLDAPReplicationQuery *query, nsIWebProgressListener *progressListener) +NS_IMETHODIMP nsAbLDAPProcessReplicationData::Init( + nsIAbLDAPDirectory *aDirectory, + nsILDAPConnection *aConnection, + nsILDAPURL* aURL, + nsIAbLDAPReplicationQuery *aQuery, + nsIWebProgressListener *aProgressListener) { - NS_ENSURE_ARG_POINTER(query); + NS_ENSURE_ARG_POINTER(aDirectory); + NS_ENSURE_ARG_POINTER(aConnection); + NS_ENSURE_ARG_POINTER(aURL); + NS_ENSURE_ARG_POINTER(aQuery); - mQuery = query; + mDirectory = aDirectory; + mConnection = aConnection; + mDirectoryUrl = aURL; + mQuery = aQuery; - nsresult rv = mQuery->GetLDAPDirectory(getter_AddRefs(mDirectory)); - if(NS_FAILED(rv)) { - mQuery = nsnull; - return rv; - } + mListener = aProgressListener; - rv = mDirectory->GetAttributeMap(getter_AddRefs(mAttrMap)); - if (NS_FAILED(rv)) { - mQuery = nsnull; - return rv; - } + nsresult rv = mDirectory->GetAttributeMap(getter_AddRefs(mAttrMap)); + if (NS_FAILED(rv)) { + mQuery = nsnull; + return rv; + } - mListener = progressListener; + rv = mDirectory->GetAuthDn(mLogin); + if (NS_FAILED(rv)) { + mQuery = nsnull; + return rv; + } - mInitialized = PR_TRUE; + mInitialized = PR_TRUE; - return rv; + return rv; } NS_IMETHODIMP nsAbLDAPProcessReplicationData::GetReplicationState(PRInt32 *aReplicationState) { NS_ENSURE_ARG_POINTER(aReplicationState); - *aReplicationState = mState; return NS_OK; } @@ -112,243 +123,165 @@ NS_IMETHODIMP nsAbLDAPProcessReplicationData::GetProtocolUsed(PRInt32 *aProtocol return NS_OK; } -NS_IMETHODIMP nsAbLDAPProcessReplicationData::OnLDAPInit(nsILDAPConnection *aConn, nsresult aStatus) -{ - if(!mInitialized) - return NS_ERROR_NOT_INITIALIZED; - - // Make sure that the Init() worked properly - if(NS_FAILED(aStatus)) { - Done(PR_FALSE); - return NS_ERROR_FAILURE; - } - - nsCOMPtr listener; - nsresult rv = NS_GetProxyForObject(NS_PROXY_TO_CURRENT_THREAD, - NS_GET_IID(nsILDAPMessageListener), - NS_STATIC_CAST(nsILDAPMessageListener*, this), - NS_PROXY_SYNC | NS_PROXY_ALWAYS, - getter_AddRefs(listener)); - if(NS_FAILED(rv)) { - Done(PR_FALSE); - return rv; - } - - nsCOMPtr operation; - rv = mQuery->GetOperation(getter_AddRefs(operation)); - if(NS_FAILED(rv)) { - Done(PR_FALSE); - return rv; - } - - nsCOMPtr connection; - rv = mQuery->GetConnection(getter_AddRefs(connection)); - if(NS_FAILED(rv)) { - Done(PR_FALSE); - return rv; - } - - rv = operation->Init(connection, listener, nsnull); - if(NS_FAILED(rv)) { - Done(PR_FALSE); - return rv; - } - - // Bind - rv = operation->SimpleBind(mAuthPswd); - mState = mAuthPswd.IsEmpty() ? kAnonymousBinding : kAuthenticatedBinding; - - if(NS_FAILED(rv)) { - Done(PR_FALSE); - } - - return rv; -} - NS_IMETHODIMP nsAbLDAPProcessReplicationData::OnLDAPMessage(nsILDAPMessage *aMessage) { - NS_ENSURE_ARG_POINTER(aMessage); - if(!mInitialized) - return NS_ERROR_NOT_INITIALIZED; + NS_ENSURE_ARG_POINTER(aMessage); - PRInt32 messageType; - nsresult rv = aMessage->GetType(&messageType); - if(NS_FAILED(rv)) { -#ifdef DEBUG_rdayal - printf("LDAP Replication : OnLDAPMessage : couldnot GetType \n"); -#endif - Done(PR_FALSE); - return rv; - } - - switch(messageType) - { - case nsILDAPMessage::RES_BIND: - rv = OnLDAPBind(aMessage); - break; - case nsILDAPMessage::RES_SEARCH_ENTRY: - rv = OnLDAPSearchEntry(aMessage); - break; - case nsILDAPMessage::RES_SEARCH_RESULT: - rv = OnLDAPSearchResult(aMessage); - break; - default: - // for messageTypes we do not handle return NS_OK to LDAP and move ahead. - rv = NS_OK; - break; - } + if (!mInitialized) + return NS_ERROR_NOT_INITIALIZED; + PRInt32 messageType; + nsresult rv = aMessage->GetType(&messageType); + if (NS_FAILED(rv)) { + Done(PR_FALSE); return rv; + } + + switch (messageType) + { + case nsILDAPMessage::RES_BIND: + rv = OnLDAPMessageBind(aMessage); + if (NS_FAILED(rv)) + rv = Abort(); + break; + case nsILDAPMessage::RES_SEARCH_ENTRY: + rv = OnLDAPSearchEntry(aMessage); + break; + case nsILDAPMessage::RES_SEARCH_RESULT: + rv = OnLDAPSearchResult(aMessage); + break; + default: + // for messageTypes we do not handle return NS_OK to LDAP and move ahead. + rv = NS_OK; + break; + } + + return rv; } NS_IMETHODIMP nsAbLDAPProcessReplicationData::Abort() { - if(!mInitialized) - return NS_ERROR_NOT_INITIALIZED; - -#ifdef DEBUG_rdayal - printf ("ChangeLog Replication : ABORT called !!! \n"); -#endif - - nsCOMPtr operation; - nsresult rv = mQuery->GetOperation(getter_AddRefs(operation)); - if(operation && mState != kIdle) - { - rv = operation->AbandonExt(); - if(NS_SUCCEEDED(rv)) - mState = kIdle; - } - - if(mReplicationDB && mDBOpen) { - mReplicationDB->ForceClosed(); // force close since we need to delete the file. - mDBOpen = PR_FALSE; - - // delete the unsaved replication file - if(mReplicationFile) { - rv = mReplicationFile->Remove(PR_FALSE); - if(NS_SUCCEEDED(rv) && mDirectory) { - nsCAutoString fileName; - rv = mDirectory->GetReplicationFileName(fileName); - // now put back the backed up replicated file if aborted - if(NS_SUCCEEDED(rv) && mBackupReplicationFile) - rv = mBackupReplicationFile->MoveToNative(nsnull, fileName); - } - } - } - - - Done(PR_FALSE); - - return rv; -} - -// this should get the authDN from prefs and password from PswdMgr -NS_IMETHODIMP nsAbLDAPProcessReplicationData::PopulateAuthData() -{ - if (!mDirectory) + if (!mInitialized) return NS_ERROR_NOT_INITIALIZED; - nsCAutoString authDn; - nsresult rv = mDirectory->GetAuthDn(authDn); - NS_ENSURE_SUCCESS(rv, rv); + nsresult rv = NS_OK; - mAuthDN.Assign(authDn); + if (mState != kIdle && mOperation) { + rv = mOperation->AbandonExt(); + if (NS_SUCCEEDED(rv)) + mState = kIdle; + } - nsCOMPtr passwordMgrInt = do_GetService(NS_PASSWORDMANAGER_CONTRACTID, &rv); - if(NS_SUCCEEDED(rv) && passwordMgrInt) { - // Get the current server URI - nsCOMPtr url; - rv = mQuery->GetReplicationURL(getter_AddRefs(url)); - if (NS_FAILED(rv)) - return rv; - nsCAutoString serverUri; - rv = url->GetSpec(serverUri); - if (NS_FAILED(rv)) - return rv; + if (mReplicationDB && mDBOpen) { + // force close since we need to delete the file. + mReplicationDB->ForceClosed(); + mDBOpen = PR_FALSE; - nsCAutoString hostFound; - nsAutoString userNameFound; - nsAutoString passwordFound; - - // Get password entry corresponding to the server URI we are passing in. - rv = passwordMgrInt->FindPasswordEntry(serverUri, EmptyString(), - EmptyString(), hostFound, - userNameFound, passwordFound); - if (NS_FAILED(rv)) - return rv; - - if (!passwordFound.IsEmpty()) - CopyUTF16toUTF8(passwordFound, mAuthPswd); + // delete the unsaved replication file + if (mReplicationFile) { + rv = mReplicationFile->Remove(PR_FALSE); + if (NS_SUCCEEDED(rv) && mDirectory) { + nsCAutoString fileName; + rv = mDirectory->GetReplicationFileName(fileName); + // now put back the backed up replicated file if aborted + if (NS_SUCCEEDED(rv) && mBackupReplicationFile) + rv = mBackupReplicationFile->MoveToNative(nsnull, fileName); + } } + } - return rv; + Done(PR_FALSE); + + return rv; } -nsresult nsAbLDAPProcessReplicationData::OnLDAPBind(nsILDAPMessage *aMessage) +nsresult nsAbLDAPProcessReplicationData::DoTask() { - NS_ENSURE_ARG_POINTER(aMessage); - if(!mInitialized) - return NS_ERROR_NOT_INITIALIZED; - - PRInt32 errCode; - - nsresult rv = aMessage->GetErrorCode(&errCode); - if(NS_FAILED(rv)) { - Done(PR_FALSE); - return rv; - } - - if(errCode != nsILDAPErrors::SUCCESS) { - Done(PR_FALSE); - return NS_ERROR_FAILURE; - } - - rv = OpenABForReplicatedDir(PR_TRUE); - if(NS_FAILED(rv)) { - // do not call done here since it is called by OpenABForReplicationDir - return rv; - } - - rv = mQuery->QueryAllEntries(); - if(NS_FAILED(rv)) { - Done(PR_FALSE); - return rv; - } - - mState = kReplicatingAll; - - if(mListener && NS_SUCCEEDED(rv)) - mListener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_START, PR_TRUE); + if (!mInitialized) + return NS_ERROR_NOT_INITIALIZED; + nsresult rv = OpenABForReplicatedDir(PR_TRUE); + if (NS_FAILED(rv)) + // do not call done here since it is called by OpenABForReplicationDir return rv; + + mOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr proxyListener; + rv = NS_GetProxyForObject(NS_PROXY_TO_MAIN_THREAD, + NS_GET_IID(nsILDAPMessageListener), + NS_STATIC_CAST(nsILDAPMessageListener*, this), + NS_PROXY_SYNC | NS_PROXY_ALWAYS, + getter_AddRefs(proxyListener)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = mOperation->Init(mConnection, proxyListener, nsnull); + NS_ENSURE_SUCCESS(rv, rv); + + // get the relevant attributes associated with the directory server url + nsCAutoString urlFilter; + rv = mDirectoryUrl->GetFilter(urlFilter); + if (NS_FAILED(rv)) + return rv; + + nsCAutoString dn; + rv = mDirectoryUrl->GetDn(dn); + if (NS_FAILED(rv)) + return rv; + + if (dn.IsEmpty()) + return NS_ERROR_UNEXPECTED; + + PRInt32 scope; + rv = mDirectoryUrl->GetScope(&scope); + if (NS_FAILED(rv)) + return rv; + + CharPtrArrayGuard attributes; + rv = mDirectoryUrl->GetAttributes(attributes.GetSizeAddr(), + attributes.GetArrayAddr()); + if (NS_FAILED(rv)) + return rv; + + mState = kReplicatingAll; + + if (mListener && NS_SUCCEEDED(rv)) + mListener->OnStateChange(nsnull, nsnull, + nsIWebProgressListener::STATE_START, PR_TRUE); + + return mOperation->SearchExt(dn, scope, urlFilter, + attributes.GetSize(), attributes.GetArray(), + 0, 0); } nsresult nsAbLDAPProcessReplicationData::OnLDAPSearchEntry(nsILDAPMessage *aMessage) { NS_ENSURE_ARG_POINTER(aMessage); - if(!mInitialized) + if (!mInitialized) return NS_ERROR_NOT_INITIALIZED; // since this runs on the main thread and is single threaded, this will // take care of entries returned by LDAP Connection thread after Abort. - if(!mReplicationDB || !mDBOpen) + if (!mReplicationDB || !mDBOpen) return NS_ERROR_FAILURE; - nsresult rv = NS_OK; + nsresult rv = NS_OK; - // Although we would may naturally create an nsIAbLDAPCard here, we don't - // need to as we are writing this straight to the database, so just create - // the database version instead. - nsCOMPtr dbCard(do_CreateInstance(NS_ABMDBCARD_CONTRACTID, &rv)); - if(NS_FAILED(rv)) { - Abort(); - return rv; - } + // Although we would may naturally create an nsIAbLDAPCard here, we don't + // need to as we are writing this straight to the database, so just create + // the database version instead. + nsCOMPtr dbCard(do_CreateInstance(NS_ABMDBCARD_CONTRACTID, + &rv)); + if (NS_FAILED(rv)) { + Abort(); + return rv; + } - nsCOMPtr newCard(do_QueryInterface(dbCard, &rv)); - if(NS_FAILED(rv)) { - Abort(); - return rv; - } + nsCOMPtr newCard(do_QueryInterface(dbCard, &rv)); + if (NS_FAILED(rv)) { + Abort(); + return rv; + } rv = mAttrMap->SetCardPropertiesFromLDAPMessage(aMessage, newCard); if (NS_FAILED(rv)) @@ -403,7 +336,7 @@ nsresult nsAbLDAPProcessReplicationData::OnLDAPSearchEntry(nsILDAPMessage *aMess mCount ++; - if(!(mCount % 10)) // inform the listener every 10 entries + if (mListener && !(mCount % 10)) // inform the listener every 10 entries { mListener->OnProgressChange(nsnull,nsnull,mCount, -1, mCount, -1); // in case if the LDAP Connection thread is starved and causes problem @@ -614,8 +547,8 @@ void nsAbLDAPProcessReplicationData::Done(PRBool aSuccess) if(mListener) mListener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, aSuccess); - // since this is called when all is done here, either on success, failure or abort - // releas the query now. + // since this is called when all is done here, either on success, + // failure or abort release the query now. mQuery = nsnull; } diff --git a/mailnews/addrbook/src/nsAbLDAPReplicationData.h b/mailnews/addrbook/src/nsAbLDAPReplicationData.h index d5006aabff1..228a2bd6933 100644 --- a/mailnews/addrbook/src/nsAbLDAPReplicationData.h +++ b/mailnews/addrbook/src/nsAbLDAPReplicationData.h @@ -43,6 +43,7 @@ #include "nsIAbLDAPReplicationData.h" #include "nsIWebProgressListener.h" #include "nsIAbLDAPReplicationQuery.h" +#include "nsAbLDAPListenerBase.h" #include "nsIAddrDatabase.h" #include "nsILocalFile.h" #include "nsDirPrefs.h" @@ -50,21 +51,26 @@ #include "nsIAbLDAPDirectory.h" #include "nsString.h" -class nsAbLDAPProcessReplicationData : public nsIAbLDAPProcessReplicationData +class nsAbLDAPProcessReplicationData : public nsIAbLDAPProcessReplicationData, + public nsAbLDAPListenerBase { public: NS_DECL_ISUPPORTS NS_DECL_NSIABLDAPPROCESSREPLICATIONDATA - NS_DECL_NSILDAPMESSAGELISTENER nsAbLDAPProcessReplicationData(); virtual ~nsAbLDAPProcessReplicationData(); - + + // nsILDAPMessageListener + NS_IMETHOD OnLDAPMessage(nsILDAPMessage *aMessage); + protected : - nsCOMPtr mQuery; + virtual nsresult DoTask(); // pointer to the interfaces used by this object nsCOMPtr mListener; + // pointer to the query to call back to once we've finished + nsCOMPtr mQuery; nsCOMPtr mReplicationDB; nsCOMPtr mReplicationFile; @@ -78,11 +84,9 @@ protected : PRBool mInitialized; nsCOMPtr mDirectory; - nsCString mAuthDN; // authDN of the user - nsCString mAuthPswd; // pswd of the authDN user + nsCOMPtr mOperation; nsCOMPtr mAttrMap; // maps ab properties to ldap attrs - virtual nsresult OnLDAPBind(nsILDAPMessage *aMessage); virtual nsresult OnLDAPSearchEntry(nsILDAPMessage *aMessage); virtual nsresult OnLDAPSearchResult(nsILDAPMessage *aMessage); diff --git a/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp b/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp index 7122961d985..16dd57414e8 100644 --- a/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp +++ b/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp @@ -51,7 +51,8 @@ #include "prmem.h" #include "nsIRDFService.h" -NS_IMPL_ISUPPORTS1(nsAbLDAPReplicationQuery, nsIAbLDAPReplicationQuery) +NS_IMPL_THREADSAFE_ISUPPORTS1(nsAbLDAPReplicationQuery, + nsIAbLDAPReplicationQuery) nsAbLDAPReplicationQuery::nsAbLDAPReplicationQuery() : mInitialized(PR_FALSE) @@ -67,14 +68,14 @@ nsresult nsAbLDAPReplicationQuery::InitLDAPData() nsCAutoString resourceURI(kLDAPDirectoryRoot); resourceURI.Append(mDirPrefName); - + nsCOMPtr resource; rv = rdfService->GetResource(resourceURI, getter_AddRefs(resource)); NS_ENSURE_SUCCESS(rv, rv); - + mDirectory = do_QueryInterface(resource, &rv); NS_ENSURE_SUCCESS(rv, rv); - + nsCAutoString fileName; rv = mDirectory->GetReplicationFileName(fileName); NS_ENSURE_SUCCESS(rv, rv); @@ -102,21 +103,12 @@ nsresult nsAbLDAPReplicationQuery::InitLDAPData() rv = mDirectory->SetReplicationFileName(fileName); NS_ENSURE_SUCCESS(rv, rv); - mURL = do_CreateInstance(NS_LDAPURL_CONTRACTID, &rv); - if (NS_FAILED(rv)) - return rv; - - nsCOMPtr abDirectory(do_QueryInterface(mDirectory, &rv)); + rv = mDirectory->GetLDAPURL(getter_AddRefs(mURL)); NS_ENSURE_SUCCESS(rv, rv); - nsCAutoString uri; - rv = abDirectory->GetURI(uri); + rv = mDirectory->GetAuthDn(mLogin); NS_ENSURE_SUCCESS(rv, rv); - rv = mURL->SetSpec(uri); - if (NS_FAILED(rv)) - return rv; - mConnection = do_CreateInstance(NS_LDAPCONNECTION_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; @@ -126,40 +118,32 @@ nsresult nsAbLDAPReplicationQuery::InitLDAPData() return rv; } -nsresult nsAbLDAPReplicationQuery::CreateNewLDAPOperation() +nsresult nsAbLDAPReplicationQuery::ConnectToLDAPServer() { - nsresult rv; - nsCOMPtr oldListener; - mOperation->GetMessageListener(getter_AddRefs(oldListener)); - // release old and create a new instance - mOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - return mOperation->Init(mConnection, oldListener, nsnull); -} - - -NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, const nsACString & aAuthDN) -{ - NS_ENSURE_ARG_POINTER(aURL); - if (!mInitialized) + if (!mInitialized || !mURL) return NS_ERROR_NOT_INITIALIZED; nsCAutoString host; - nsresult rv = aURL->GetHost(host); + nsresult rv = mURL->GetHost(host); if (NS_FAILED(rv)) return rv; if (host.IsEmpty()) return NS_ERROR_UNEXPECTED; PRInt32 port; - rv = aURL->GetPort(&port); + rv = mURL->GetPort(&port); if (NS_FAILED(rv)) return rv; if (!port) return NS_ERROR_UNEXPECTED; PRUint32 options; - rv = aURL->GetOptions(&options); + rv = mURL->GetOptions(&options); + if (NS_FAILED(rv)) + return NS_ERROR_UNEXPECTED; + + nsCOMPtr mDp = do_QueryInterface(mDataProcessor, + &rv); if (NS_FAILED(rv)) return NS_ERROR_UNEXPECTED; @@ -167,7 +151,7 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co nsCOMPtr listener; rv = NS_GetProxyForObject(NS_PROXY_TO_CURRENT_THREAD, NS_GET_IID(nsILDAPMessageListener), - NS_STATIC_CAST(nsILDAPMessageListener*, mDataProcessor), + mDp, NS_PROXY_SYNC | NS_PROXY_ALWAYS, getter_AddRefs(listener)); if (!listener) @@ -176,20 +160,9 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co // this could be a rebind call PRInt32 replicationState = nsIAbLDAPProcessReplicationData::kIdle; rv = mDataProcessor->GetReplicationState(&replicationState); - if(NS_FAILED(rv)) + if (NS_FAILED(rv) || + replicationState != nsIAbLDAPProcessReplicationData::kIdle) return rv; - if((replicationState != nsIAbLDAPProcessReplicationData::kIdle)) - { - // release old and create a new instance - mConnection = do_CreateInstance(NS_LDAPCONNECTION_CONTRACTID, &rv); - if(NS_FAILED(rv)) - return rv; - - // release old and create a new instance - mOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv); - if(NS_FAILED(rv)) - return rv; - } PRUint32 protocolVersion; rv = mDirectory->GetProtocolVersion(&protocolVersion); @@ -198,7 +171,7 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co // initialize the LDAP connection return mConnection->Init(host.get(), port, (options & nsILDAPURL::OPT_SECURE) ? PR_TRUE : PR_FALSE, - aAuthDN, listener, nsnull, protocolVersion); + mLogin, listener, nsnull, protocolVersion); } NS_IMETHODIMP nsAbLDAPReplicationQuery::Init(const nsACString & aPrefName, nsIWebProgressListener *aProgressListener) @@ -212,55 +185,21 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::Init(const nsACString & aPrefName, nsIWe if (NS_FAILED(rv)) return rv; - mDataProcessor = do_CreateInstance(NS_ABLDAP_PROCESSREPLICATIONDATA_CONTRACTID, &rv); + mDataProcessor = + do_CreateInstance(NS_ABLDAP_PROCESSREPLICATIONDATA_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; // 'this' initialized mInitialized = PR_TRUE; - return mDataProcessor->Init(this, aProgressListener); + return mDataProcessor->Init(mDirectory, mConnection, mURL, this, + aProgressListener); } NS_IMETHODIMP nsAbLDAPReplicationQuery::DoReplicationQuery() { - return ConnectToLDAPServer(mURL, EmptyCString()); -} - -NS_IMETHODIMP nsAbLDAPReplicationQuery::QueryAllEntries() -{ - if (!mInitialized) - return NS_ERROR_NOT_INITIALIZED; - - // get the search filter associated with the directory server url; - // - nsCAutoString urlFilter; - nsresult rv = mURL->GetFilter(urlFilter); - if (NS_FAILED(rv)) - return rv; - - nsCAutoString dn; - rv = mURL->GetDn(dn); - if (NS_FAILED(rv)) - return rv; - if (dn.IsEmpty()) - return NS_ERROR_UNEXPECTED; - - PRInt32 scope; - rv = mURL->GetScope(&scope); - if (NS_FAILED(rv)) - return rv; - - CharPtrArrayGuard attributes; - rv = mURL->GetAttributes(attributes.GetSizeAddr(), attributes.GetArrayAddr()); - if (NS_FAILED(rv)) - return rv; - - rv = CreateNewLDAPOperation(); - NS_ENSURE_SUCCESS(rv, rv); - return mOperation->SearchExt(dn, scope, urlFilter, - attributes.GetSize(), attributes.GetArray(), - 0, 0); + return ConnectToLDAPServer(); } NS_IMETHODIMP nsAbLDAPReplicationQuery::CancelQuery() @@ -275,7 +214,7 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::Done(PRBool aSuccess) { if (!mInitialized) return NS_ERROR_NOT_INITIALIZED; - + nsresult rv = NS_OK; nsCOMPtr replicationService = do_GetService(NS_ABLDAP_REPLICATIONSERVICE_CONTRACTID, &rv); @@ -284,46 +223,3 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::Done(PRBool aSuccess) return rv; } - - -NS_IMETHODIMP nsAbLDAPReplicationQuery::GetOperation(nsILDAPOperation * *aOperation) -{ - NS_ENSURE_ARG_POINTER(aOperation); - if (!mInitialized) - return NS_ERROR_NOT_INITIALIZED; - - NS_IF_ADDREF(*aOperation = mOperation); - - return NS_OK; -} - -NS_IMETHODIMP nsAbLDAPReplicationQuery::GetConnection(nsILDAPConnection * *aConnection) -{ - NS_ENSURE_ARG_POINTER(aConnection); - if (!mInitialized) - return NS_ERROR_NOT_INITIALIZED; - - NS_IF_ADDREF(*aConnection = mConnection); - - return NS_OK; -} - -NS_IMETHODIMP nsAbLDAPReplicationQuery::GetReplicationURL(nsILDAPURL * *aReplicationURL) -{ - NS_ENSURE_ARG_POINTER(aReplicationURL); - if (!mInitialized) - return NS_ERROR_NOT_INITIALIZED; - - NS_IF_ADDREF(*aReplicationURL = mURL); - - return NS_OK; -} - -NS_IMETHODIMP nsAbLDAPReplicationQuery::GetLDAPDirectory(nsIAbLDAPDirectory * *aDirectory) -{ - NS_ENSURE_ARG_POINTER(aDirectory); - - NS_IF_ADDREF(*aDirectory = mDirectory); - - return NS_OK; -} diff --git a/mailnews/addrbook/src/nsAbLDAPReplicationQuery.h b/mailnews/addrbook/src/nsAbLDAPReplicationQuery.h index a8f4c48521c..8011ae74c92 100644 --- a/mailnews/addrbook/src/nsAbLDAPReplicationQuery.h +++ b/mailnews/addrbook/src/nsAbLDAPReplicationQuery.h @@ -57,7 +57,7 @@ public: nsAbLDAPReplicationQuery(); nsresult InitLDAPData(); - nsresult CreateNewLDAPOperation(); + nsresult ConnectToLDAPServer(); protected : // pointer to interfaces used by this object @@ -68,8 +68,9 @@ protected : nsCOMPtr mDataProcessor; - PRBool mInitialized; - nsCString mDirPrefName; + PRBool mInitialized; + nsCString mDirPrefName; + nsCString mLogin; }; #endif // nsAbLDAPReplicationQuery_h__