This commit is contained in:
leif%netscape.com 2005-11-15 20:08:47 +00:00
Родитель b1095ee90a
Коммит 8f12c6c114
2 изменённых файлов: 154 добавлений и 87 удалений

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

@ -184,6 +184,14 @@ nsLDAPAutoCompleteSession::OnStartLookup(const PRUnichar *searchString,
mState = SEARCHING;
return StartLDAPSearch();
case INITIALIZING:
// We don't need to do anything here (for now at least), because
// we can't really abandon the initialization. If we allowed the
// initialization to be aborted, we could potentially lock the
// UI thread again, since the DNS service might be stalled.
//
return NS_OK;
case BINDING:
case SEARCHING:
// we should never get here
@ -222,16 +230,22 @@ nsLDAPAutoCompleteSession::OnStopLookup()
// nothing to stop
return NS_OK;
case BINDING:
// XXXdmose should this really be the same as searching?
// waiting for nsILDAPService landing to see. mState should at
// least be set differently.
case INITIALIZING:
// We can't or shouldn't abor the initialization, because then the
// DNS service can hang again...
//
return NS_OK;
case BINDING:
case SEARCHING:
// Abandon the operation, if there is one
//
if (mOperation) {
nsresult rv = mOperation->Abandon();
if (NS_FAILED(rv)) {
// since there's nothing interesting that can or should be done
// if this abandon failed, warn about it and move on
// since there's nothing interesting that can or should be
// done if this abandon failed, warn about it and move on
//
NS_WARNING("nsLDAPAutoCompleteSession::OnStopLookup(): "
"error calling mOperation->Abandon()");
@ -240,10 +254,12 @@ nsLDAPAutoCompleteSession::OnStopLookup()
// force nsCOMPtr to release mOperation
//
mOperation = 0;
}
// reset the status
// Set the status properly, set to UNBOUND of we were binding, or
// to BOUND if we were searching.
//
mState = BOUND;
mState = (mState == BINDING ? UNBOUND : BOUND);
}
mResultsArray = 0;
@ -395,6 +411,95 @@ nsLDAPAutoCompleteSession::OnLDAPMessage(nsILDAPMessage *aMessage)
}
}
// void onLDAPInit (in nsresult aStatus);
//
NS_IMETHODIMP
nsLDAPAutoCompleteSession::OnLDAPInit(nsresult aStatus)
{
nsresult rv; // temp for xpcom return values
nsCOMPtr<nsILDAPMessageListener> selfProxy;
// Check the status from the initialization of the LDAP connection
//
if (NS_FAILED(aStatus)) {
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_FAILURE;
}
// create and initialize an LDAP operation (to be used for the bind)
//
mOperation = do_CreateInstance("@mozilla.org/network/ldap-operation;1",
&rv);
if (NS_FAILED(rv)) {
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_FAILURE;
}
// get a proxy object so the callback happens on the main thread
//
rv = NS_GetProxyForObject(NS_UI_THREAD_EVENTQ,
NS_GET_IID(nsILDAPMessageListener),
NS_STATIC_CAST(nsILDAPMessageListener *, this),
PROXY_ASYNC | PROXY_ALWAYS,
getter_AddRefs(selfProxy));
if (NS_FAILED(rv)) {
NS_ERROR("nsLDAPAutoCompleteSession::OnLDAPInit(): couldn't "
"create proxy to this object for callback");
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_FAILURE;
}
// our OnLDAPMessage accepts all result callbacks
//
rv = mOperation->Init(mConnection, selfProxy);
if (NS_FAILED(rv)) {
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_UNEXPECTED; // this should never happen
}
// kick off a bind operation
//
PR_LOG(sLDAPAutoCompleteLogModule, PR_LOG_DEBUG,
("nsLDAPAutoCompleteSession:OnLDAPInit(): initiating "
"SimpleBind\n"));
rv = mOperation->SimpleBind(NULL);
if (NS_FAILED(rv)) {
switch (rv) {
case NS_ERROR_LDAP_SERVER_DOWN:
// XXXdmose try to rebind for this one? wait for nsILDAPServer to
// see...
//
case NS_ERROR_LDAP_CONNECT_ERROR:
case NS_ERROR_LDAP_ENCODING_ERROR:
case NS_ERROR_OUT_OF_MEMORY:
PR_LOG(sLDAPAutoCompleteLogModule, PR_LOG_DEBUG,
("nsLDAPAutoCompleteSession::OnLDAPInit(): mSimpleBind "
"failed, rv = 0x%lx", rv));
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_OK;
case NS_ERROR_UNEXPECTED:
default:
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_UNEXPECTED;
}
}
// Change our state to binding.
//
mState = BINDING;
return NS_OK;
}
nsresult
nsLDAPAutoCompleteSession::OnLDAPBind(nsILDAPMessage *aMessage)
{
@ -820,8 +925,8 @@ nsLDAPAutoCompleteSession::StartLDAPSearch()
nsresult
nsLDAPAutoCompleteSession::InitConnection()
{
nsCOMPtr<nsILDAPMessageListener> selfProxy;
nsresult rv; // temp for xpcom return values
nsCOMPtr<nsILDAPMessageListener> selfProxy;
// create an LDAP connection
//
@ -865,13 +970,35 @@ nsLDAPAutoCompleteSession::InitConnection()
return NS_ERROR_FAILURE;
}
rv = mConnection->Init(host, port, 0);
// get a proxy object so the callback happens on the main thread
//
rv = NS_GetProxyForObject(NS_UI_THREAD_EVENTQ,
NS_GET_IID(nsILDAPMessageListener),
NS_STATIC_CAST(nsILDAPMessageListener *, this),
PROXY_ASYNC | PROXY_ALWAYS,
getter_AddRefs(selfProxy));
if (NS_FAILED(rv)) {
NS_ERROR("nsLDAPAutoCompleteSession::InitConnection(): couldn't "
"create proxy to this object for callback");
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_FAILURE;
}
// Initialize the connection. This will cause an asynchronous DNS
// lookup to occur, and we'll finish the binding of the connection
// in the OnLDAPInit() listener function.
//
rv = mConnection->Init(host, port, 0, selfProxy);
if NS_FAILED(rv) {
switch (rv) {
case NS_ERROR_OUT_OF_MEMORY:
case NS_ERROR_NOT_AVAILABLE:
case NS_ERROR_FAILURE:
PR_LOG(sLDAPAutoCompleteLogModule, PR_LOG_DEBUG,
("nsLDAPAutoCompleteSession::InitConnection(): mSimpleBind "
"failed, rv = 0x%lx", rv));
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return rv;
@ -884,75 +1011,9 @@ nsLDAPAutoCompleteSession::InitConnection()
}
}
// create and initialize an LDAP operation (to be used for the bind)
// set our state to initializing
//
mOperation = do_CreateInstance("@mozilla.org/network/ldap-operation;1",
&rv);
if (NS_FAILED(rv)) {
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_FAILURE;
}
// get a proxy object so the callback happens on the main thread
//
rv = NS_GetProxyForObject(NS_UI_THREAD_EVENTQ,
NS_GET_IID(nsILDAPMessageListener),
NS_STATIC_CAST(nsILDAPMessageListener *, this),
PROXY_ASYNC | PROXY_ALWAYS,
getter_AddRefs(selfProxy));
if (NS_FAILED(rv)) {
NS_ERROR("nsLDAPAutoCompleteSession::InitLDAPConnection(): couldn't "
"create proxy to this object for callback");
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_FAILURE;
}
// our OnLDAPMessage accepts all result callbacks
//
rv = mOperation->Init(mConnection, selfProxy);
if (NS_FAILED(rv)) {
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_UNEXPECTED; // this should never happen
}
// kick off a bind operation
//
PR_LOG(sLDAPAutoCompleteLogModule, PR_LOG_DEBUG,
("nsLDAPAutoCompleteSession:InitConnection: initiating "
"SimpleBind\n"));
rv = mOperation->SimpleBind(NULL);
if (NS_FAILED(rv)) {
switch (rv) {
case NS_ERROR_LDAP_SERVER_DOWN:
// XXXdmose try to rebind for this one? wait for nsILDAPServer to
// see...
//
case NS_ERROR_LDAP_CONNECT_ERROR:
case NS_ERROR_LDAP_ENCODING_ERROR:
case NS_ERROR_OUT_OF_MEMORY:
PR_LOG(sLDAPAutoCompleteLogModule, PR_LOG_DEBUG,
("nsLDAPAutoCompleteSession::InitConnection(): mSimpleBind "
"failed, rv = 0x%lx", rv));
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_OK;
case NS_ERROR_UNEXPECTED:
default:
mState = UNBOUND;
FinishAutoCompleteLookup(nsIAutoCompleteStatus::failed);
return NS_ERROR_UNEXPECTED;
}
}
// set our state
//
mState = BINDING;
mState = INITIALIZING;
return NS_OK;
}
@ -993,6 +1054,11 @@ nsLDAPAutoCompleteSession::FinishAutoCompleteLookup(AutoCompleteStatus
mResults = 0;
mListener = 0;
mOperation = 0;
// If we are unbound, drop the connection (if any)
//
if (mState == UNBOUND)
mConnection = 0;
}
// methods for nsILDAPAutoCompleteSession

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

@ -52,7 +52,8 @@ class nsLDAPAutoCompleteSession : public nsILDAPMessageListener,
virtual ~nsLDAPAutoCompleteSession();
protected:
enum SessionState { UNBOUND, BINDING, BOUND, SEARCHING } mState;
enum SessionState { UNBOUND, INITIALIZING, BINDING, BOUND,
SEARCHING } mState;
PRUint32 mEntriesReturned; // # of entries returned?
nsCOMPtr<nsILDAPConnection> mConnection; // connection used for search
nsCOMPtr<nsILDAPOperation> mOperation; // current ldap op