make ldap quick search from address book cache ldap connections, 239474, r=sspitzer, sr=mscott

This commit is contained in:
bienvenu%nventure.com 2004-07-24 19:50:29 +00:00
Родитель 9293d9881b
Коммит be738c693e
2 изменённых файлов: 47 добавлений и 71 удалений

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

@ -64,7 +64,6 @@ public:
nsAbQueryLDAPMessageListener ( nsAbQueryLDAPMessageListener (
nsAbLDAPDirectoryQuery* directoryQuery, nsAbLDAPDirectoryQuery* directoryQuery,
PRInt32 contextID,
nsILDAPURL* url, nsILDAPURL* url,
nsILDAPConnection* connection, nsILDAPConnection* connection,
nsIAbDirectoryQueryArguments* queryArguments, nsIAbDirectoryQueryArguments* queryArguments,
@ -87,6 +86,8 @@ protected:
friend class nsAbLDAPDirectoryQuery; friend class nsAbLDAPDirectoryQuery;
nsresult Cancel (); nsresult Cancel ();
nsresult Initiate (); nsresult Initiate ();
nsresult DoSearch();
protected: protected:
nsAbLDAPDirectoryQuery* mDirectoryQuery; nsAbLDAPDirectoryQuery* mDirectoryQuery;
@ -102,6 +103,7 @@ protected:
PRBool mFinished; PRBool mFinished;
PRBool mInitialized; PRBool mInitialized;
PRBool mCanceled; PRBool mCanceled;
PRBool mWaitingForPrevQueryToFinish;
nsCOMPtr<nsILDAPOperation> mSearchOperation; nsCOMPtr<nsILDAPOperation> mSearchOperation;
@ -113,7 +115,6 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(nsAbQueryLDAPMessageListener, nsILDAPMessageListen
nsAbQueryLDAPMessageListener::nsAbQueryLDAPMessageListener ( nsAbQueryLDAPMessageListener::nsAbQueryLDAPMessageListener (
nsAbLDAPDirectoryQuery* directoryQuery, nsAbLDAPDirectoryQuery* directoryQuery,
PRInt32 contextID,
nsILDAPURL* url, nsILDAPURL* url,
nsILDAPConnection* connection, nsILDAPConnection* connection,
nsIAbDirectoryQueryArguments* queryArguments, nsIAbDirectoryQueryArguments* queryArguments,
@ -121,7 +122,6 @@ nsAbQueryLDAPMessageListener::nsAbQueryLDAPMessageListener (
PRInt32 resultLimit, PRInt32 resultLimit,
PRInt32 timeOut) : PRInt32 timeOut) :
mDirectoryQuery (directoryQuery), mDirectoryQuery (directoryQuery),
mContextID (contextID),
mUrl (url), mUrl (url),
mConnection (connection), mConnection (connection),
mQueryArguments (queryArguments), mQueryArguments (queryArguments),
@ -132,6 +132,7 @@ nsAbQueryLDAPMessageListener::nsAbQueryLDAPMessageListener (
mFinished (PR_FALSE), mFinished (PR_FALSE),
mInitialized(PR_FALSE), mInitialized(PR_FALSE),
mCanceled (PR_FALSE), mCanceled (PR_FALSE),
mWaitingForPrevQueryToFinish(PR_FALSE),
mLock(0) mLock(0)
{ {
@ -175,6 +176,8 @@ nsresult nsAbQueryLDAPMessageListener::Cancel ()
return NS_OK; return NS_OK;
mCanceled = PR_TRUE; mCanceled = PR_TRUE;
if (!mFinished)
mWaitingForPrevQueryToFinish = PR_TRUE;
return NS_OK; return NS_OK;
} }
@ -219,10 +222,14 @@ NS_IMETHODIMP nsAbQueryLDAPMessageListener::OnLDAPMessage(nsILDAPMessage *aMessa
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
break; break;
case nsILDAPMessage::RES_SEARCH_ENTRY: case nsILDAPMessage::RES_SEARCH_ENTRY:
if (!mFinished && !mWaitingForPrevQueryToFinish)
{
rv = OnLDAPMessageSearchEntry (aMessage, getter_AddRefs (queryResult)); rv = OnLDAPMessageSearchEntry (aMessage, getter_AddRefs (queryResult));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
}
break; break;
case nsILDAPMessage::RES_SEARCH_RESULT: case nsILDAPMessage::RES_SEARCH_RESULT:
mWaitingForPrevQueryToFinish = PR_FALSE;
rv = OnLDAPMessageSearchResult (aMessage, getter_AddRefs (queryResult)); rv = OnLDAPMessageSearchResult (aMessage, getter_AddRefs (queryResult));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
default: default:
@ -235,6 +242,12 @@ NS_IMETHODIMP nsAbQueryLDAPMessageListener::OnLDAPMessage(nsILDAPMessage *aMessa
rv = mSearchOperation->Abandon (); rv = mSearchOperation->Abandon ();
rv = QueryResultStatus (nsnull, getter_AddRefs (queryResult), nsIAbDirectoryQueryResult::queryResultStopped); rv = QueryResultStatus (nsnull, getter_AddRefs (queryResult), nsIAbDirectoryQueryResult::queryResultStopped);
// reset because we might re-use this listener...except don't do this
// until the search is done, so we'll ignore results from a previous
// search.
if (messageType == nsILDAPMessage::RES_SEARCH_RESULT)
mCanceled = mFinished = PR_FALSE;
} }
if (queryResult) if (queryResult)
@ -444,6 +457,15 @@ nsresult nsAbQueryLDAPMessageListener::OnLDAPMessageBind (nsILDAPMessage *aMessa
return NS_OK; return NS_OK;
} }
mBound = PR_TRUE;
return DoSearch();
}
nsresult nsAbQueryLDAPMessageListener::DoSearch()
{
nsresult rv;
mCanceled = mFinished = PR_FALSE;
mSearchOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv); mSearchOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
@ -478,9 +500,6 @@ nsresult nsAbQueryLDAPMessageListener::OnLDAPMessageBind (nsILDAPMessage *aMessa
rv = mSearchOperation->SearchExt (dn, scope, filter, rv = mSearchOperation->SearchExt (dn, scope, filter,
attributes.GetSize (), attributes.GetArray (), attributes.GetSize (), attributes.GetArray (),
mTimeOut, mResultLimit); mTimeOut, mResultLimit);
NS_ENSURE_SUCCESS(rv, rv);
mBound = PR_TRUE;
return rv; return rv;
} }
@ -592,8 +611,6 @@ nsresult nsAbQueryLDAPMessageListener::OnLDAPMessageSearchEntry (nsILDAPMessage
nsresult nsAbQueryLDAPMessageListener::OnLDAPMessageSearchResult (nsILDAPMessage *aMessage, nsresult nsAbQueryLDAPMessageListener::OnLDAPMessageSearchResult (nsILDAPMessage *aMessage,
nsIAbDirectoryQueryResult** result) nsIAbDirectoryQueryResult** result)
{ {
mDirectoryQuery->RemoveListener (mContextID);
nsresult rv; nsresult rv;
PRInt32 errorCode; PRInt32 errorCode;
rv = aMessage->GetErrorCode(&errorCode); rv = aMessage->GetErrorCode(&errorCode);
@ -631,7 +648,6 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(nsAbLDAPDirectoryQuery, nsIAbDirectoryQuery)
nsAbLDAPDirectoryQuery::nsAbLDAPDirectoryQuery() : nsAbLDAPDirectoryQuery::nsAbLDAPDirectoryQuery() :
mProtocolVersion (nsILDAPConnection::VERSION3), mProtocolVersion (nsILDAPConnection::VERSION3),
mInitialized(PR_FALSE), mInitialized(PR_FALSE),
mCounter (1),
mLock (nsnull) mLock (nsnull)
{ {
} }
@ -664,7 +680,7 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* argu
PRInt32* _retval) PRInt32* _retval)
{ {
nsresult rv; nsresult rv;
PRBool alreadyInitialized = mInitialized;
rv = Initiate (); rv = Initiate ();
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
@ -673,10 +689,7 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* argu
PRBool doSubDirectories; PRBool doSubDirectories;
rv = arguments->GetQuerySubDirectories (&doSubDirectories); rv = arguments->GetQuerySubDirectories (&doSubDirectories);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (doSubDirectories) scope = (doSubDirectories) ? "sub" : "one";
scope = "sub";
else
scope = "one";
// Get the return attributes // Get the return attributes
nsCAutoString returnAttributes; nsCAutoString returnAttributes;
@ -785,22 +798,24 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* argu
rv = GetLDAPConnection (getter_AddRefs (ldapConnection)); rv = GetLDAPConnection (getter_AddRefs (ldapConnection));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
// Initiate contextID for message listener // too soon? Do we need a new listener?
PRInt32 contextID; if (alreadyInitialized)
// Enter lock
{ {
nsAutoLock lock (mLock); nsAbQueryLDAPMessageListener *msgListener =
contextID = mCounter++; NS_STATIC_CAST(nsAbQueryLDAPMessageListener *,
NS_STATIC_CAST(nsILDAPMessageListener *, mListener.get()));
if (msgListener)
{
msgListener->mUrl = url;
return msgListener->DoSearch();
}
} }
// Exit lock
// Initiate LDAP message listener // Initiate LDAP message listener
nsCOMPtr<nsILDAPMessageListener> messageListener;
nsAbQueryLDAPMessageListener* _messageListener = nsAbQueryLDAPMessageListener* _messageListener =
new nsAbQueryLDAPMessageListener ( new nsAbQueryLDAPMessageListener (
this, this,
contextID,
url, url,
ldapConnection, ldapConnection,
arguments, arguments,
@ -809,22 +824,13 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* argu
timeOut); timeOut);
if (_messageListener == NULL) if (_messageListener == NULL)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
messageListener = _messageListener; mListener = _messageListener;
nsVoidKey key (NS_REINTERPRET_CAST(void *,contextID)); *_retval = 1;
// Enter lock
{
nsAutoLock lock1(mLock);
mListeners.Put (&key, _messageListener);
}
// Exit lock
*_retval = contextID;
// Now lets initialize the LDAP connection properly. We'll kick // Now lets initialize the LDAP connection properly. We'll kick
// off the bind operation in the callback function, |OnLDAPInit()|. // off the bind operation in the callback function, |OnLDAPInit()|.
rv = ldapConnection->Init(host.get(), port, options, mLogin, rv = ldapConnection->Init(host.get(), port, options, mLogin,
messageListener, nsnull, mProtocolVersion); mListener, nsnull, mProtocolVersion);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
return rv; return rv;
@ -838,44 +844,17 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::StopQuery(PRInt32 contextID)
rv = Initiate (); rv = Initiate ();
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
nsAbQueryLDAPMessageListener* _messageListener; if (!mListener)
// Enter Lock
{
nsAutoLock lock(mLock);
nsVoidKey key (NS_REINTERPRET_CAST(void *,contextID));
_messageListener = (nsAbQueryLDAPMessageListener* )mListeners.Remove (&key);
if (!_messageListener)
return NS_OK; return NS_OK;
} nsAbQueryLDAPMessageListener *listener =
// Exit Lock NS_STATIC_CAST(nsAbQueryLDAPMessageListener *,
NS_STATIC_CAST(nsILDAPMessageListener *, mListener.get()));
rv = _messageListener->Cancel (); if (listener)
rv = listener->Cancel ();
return rv; return rv;
} }
nsresult nsAbLDAPDirectoryQuery::RemoveListener (PRInt32 contextID)
{
nsresult rv;
rv = Initiate ();
NS_ENSURE_SUCCESS(rv, rv);
nsAutoLock lock(mLock);
nsVoidKey key (NS_REINTERPRET_CAST(void *,contextID));
mListeners.Remove (&key);
return NS_OK;
}
nsresult nsAbLDAPDirectoryQuery::getLdapReturnAttributes ( nsresult nsAbLDAPDirectoryQuery::getLdapReturnAttributes (
nsIAbDirectoryQueryArguments* arguments, nsIAbDirectoryQueryArguments* arguments,

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

@ -63,7 +63,6 @@ public:
virtual nsresult GetLDAPURL (nsILDAPURL** url) = 0; virtual nsresult GetLDAPURL (nsILDAPURL** url) = 0;
virtual nsresult CreateCard (nsILDAPURL* url, const char* dn, nsIAbCard** card) = 0; virtual nsresult CreateCard (nsILDAPURL* url, const char* dn, nsIAbCard** card) = 0;
protected: protected:
nsresult getLdapReturnAttributes ( nsresult getLdapReturnAttributes (
nsIAbDirectoryQueryArguments* arguments, nsIAbDirectoryQueryArguments* arguments,
@ -71,16 +70,14 @@ protected:
protected: protected:
friend class nsAbQueryLDAPMessageListener; friend class nsAbQueryLDAPMessageListener;
nsresult RemoveListener (PRInt32 contextID);
nsresult Initiate (); nsresult Initiate ();
nsXPIDLCString mLogin; // authenticate to the LDAP server as... nsXPIDLCString mLogin; // authenticate to the LDAP server as...
nsCOMPtr<nsILDAPURL> mDirectoryUrl; // the URL for the server nsCOMPtr<nsILDAPURL> mDirectoryUrl; // the URL for the server
PRUint32 mProtocolVersion; // version of LDAP (see nsILDAPConnection.idl) PRUint32 mProtocolVersion; // version of LDAP (see nsILDAPConnection.idl)
private: private:
nsHashtable mListeners; nsCOMPtr <nsILDAPMessageListener> mListener;
PRBool mInitialized; PRBool mInitialized;
PRInt32 mCounter;
PRLock* mLock; PRLock* mLock;
}; };