in proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java [797:886]
private void processAttach()
{
if(_connectionEndpoint != null && _isOpenSent && !_isCloseSent)
{
EndpointImpl endpoint = _connectionEndpoint.getTransportHead();
while(endpoint != null)
{
if(endpoint instanceof LinkImpl)
{
LinkImpl link = (LinkImpl) endpoint;
TransportLink<?> transportLink = getTransportState(link);
SessionImpl session = link.getSession();
TransportSession transportSession = getTransportState(session);
if(link.getLocalState() != EndpointState.UNINITIALIZED && !transportLink.attachSent() && transportSession.isLocalChannelSet())
{
if( (link.getRemoteState() == EndpointState.ACTIVE
&& !transportLink.isLocalHandleSet()) || link.getRemoteState() == EndpointState.UNINITIALIZED)
{
Role role = endpoint instanceof ReceiverImpl ? Role.RECEIVER : Role.SENDER;
UnsignedInteger localHandle = transportSession.allocateLocalHandle(transportLink);
if(link.getRemoteState() == EndpointState.UNINITIALIZED)
{
transportSession.addHalfOpenLink(transportLink, Role.SENDER == role);
}
Attach attach = new Attach();
attach.setHandle(localHandle);
attach.setName(transportLink.getName());
if(link.getSenderSettleMode() != null)
{
attach.setSndSettleMode(link.getSenderSettleMode());
}
if(link.getReceiverSettleMode() != null)
{
attach.setRcvSettleMode(link.getReceiverSettleMode());
}
if(link.getSource() != null)
{
attach.setSource(link.getSource());
}
if(link.getTarget() != null)
{
attach.setTarget(link.getTarget());
}
if(link.getProperties() != null)
{
attach.setProperties(link.getProperties());
}
if(link.getOfferedCapabilities() != null)
{
attach.setOfferedCapabilities(link.getOfferedCapabilities());
}
if(link.getDesiredCapabilities() != null)
{
attach.setDesiredCapabilities(link.getDesiredCapabilities());
}
if(link.getMaxMessageSize() != null)
{
attach.setMaxMessageSize(link.getMaxMessageSize());
}
attach.setRole(role);
if(link instanceof SenderImpl)
{
attach.setInitialDeliveryCount(UnsignedInteger.ZERO);
}
writeFrame(transportSession.getLocalChannel(), attach, null, null);
transportLink.sentAttach();
}
}
}
endpoint = endpoint.transportNext();
}
}
}