зеркало из https://github.com/mozilla/pjs.git
make ldap quick search from address book cache ldap connections, 239474, r=sspitzer, sr=mscott
This commit is contained in:
Родитель
9293d9881b
Коммит
be738c693e
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче