private static void ConnectionCreatedCallback(object request, object state)
{
SmtpConnection.ConnectAndHandshakeAsyncResult owningObject = (SmtpConnection.ConnectAndHandshakeAsyncResult)request;
if (state is Exception)
{
owningObject.InvokeCallback((Exception)state);
}
else
{
SmtpPooledStream pooledStream = (SmtpPooledStream)((PooledStream)state);
try
{
while ((pooledStream.creds != null) && (pooledStream.creds != owningObject.connection.credentials))
{
owningObject.connection.connectionPool.PutConnection(pooledStream, pooledStream.Owner, owningObject.connection.Timeout, false);
pooledStream = (SmtpPooledStream)owningObject.connection.connectionPool.GetConnection(owningObject, m_ConnectionCreatedCallback, owningObject.connection.Timeout);
if (pooledStream == null)
{
return;
}
}
if (Logging.On)
{
Logging.Associate(Logging.Web, owningObject.connection, pooledStream);
}
pooledStream.Owner = owningObject.connection;
pooledStream.creds = owningObject.connection.credentials;
lock (owningObject.connection)
{
if (owningObject.connection.isClosed)
{
owningObject.connection.connectionPool.PutConnection(pooledStream, pooledStream.Owner, owningObject.connection.Timeout, false);
owningObject.InvokeCallback(null);
return;
}
owningObject.connection.pooledStream = pooledStream;
}
owningObject.Handshake();
}
catch (Exception exception)
{
owningObject.InvokeCallback(exception);
}
}
}