public static AmqpLinkSettings Create(Attach attach) { AmqpLinkSettings settings = new AmqpLinkSettings(); settings.LinkName = attach.LinkName; settings.Role = !attach.Role.Value; settings.Source = attach.Source; settings.Target = attach.Target; settings.SndSettleMode = attach.SndSettleMode; settings.RcvSettleMode = attach.RcvSettleMode; settings.MaxMessageSize = attach.MaxMessageSize; settings.Properties = attach.Properties; if (settings.Role.Value) { settings.TransferLimit = AmqpConstants.DefaultLinkCredit; } else { settings.InitialDeliveryCount = 0; } return settings; }
public static Attach Clone(this Attach attach) { Attach clone = new Attach(); clone.LinkName = attach.LinkName; clone.Role = attach.Role; clone.SndSettleMode = attach.SndSettleMode; clone.RcvSettleMode = attach.RcvSettleMode; clone.Source = attach.Source; clone.Target = attach.Target; clone.Unsettled = attach.Unsettled; clone.IncompleteUnsettled = attach.IncompleteUnsettled; clone.InitialDeliveryCount = attach.InitialDeliveryCount; clone.MaxMessageSize = attach.MaxMessageSize; clone.OfferedCapabilities = attach.OfferedCapabilities; clone.DesiredCapabilities = attach.DesiredCapabilities; clone.Properties = attach.Properties; return clone; }
bool TryCreateRemoteLink(Attach attach, out AmqpLink link) { link = null; AmqpLinkSettings linkSettings = AmqpLinkSettings.Create(attach); try { link = this.linkFactory.CreateLink(this, linkSettings); link.RemoteHandle = attach.Handle; this.linksByRemoteHandle.Add(attach.Handle.Value, link); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } attach.Source = null; attach.Target = null; this.SendCommand(attach); if (link != null) { link.TryClose(exception); } return false; } return true; }
Error Negotiate(Attach attach) { if (attach.MaxMessageSize.HasValue && attach.MaxMessageSize.Value != 0) { this.settings.MaxMessageSize = this.settings.MaxMessageSize.HasValue ? Math.Min(this.settings.MaxMessageSize.Value, attach.MaxMessageSize.Value) : attach.MaxMessageSize.Value; } return null; }
void OnReceiveAttach(Attach attach) { StateTransition stateTransition; this.TransitState("R:ATTACH", StateTransition.ReceiveOpen, out stateTransition); Error error = this.Negotiate(attach); if (error != null) { this.OnLinkOpenFailed(new AmqpException(error)); return; } if (stateTransition.From == AmqpObjectState.OpenSent) { if (this.IsReceiver) { Source source = this.settings.Source as Source; if (source != null && source.Dynamic()) { source.Address = ((Source)attach.Source).Address; } } else { Target target = this.settings.Target as Target; if (target != null && target.Dynamic()) { target.Address = ((Target)attach.Target).Address; } } } if (stateTransition.To == AmqpObjectState.Opened) { if ((this.IsReceiver && attach.Source == null) || (!this.IsReceiver && attach.Target == null)) { // not linkendpoint was created on the remote side // a detach should be sent immediately by peer with error return; } if (this.IsReceiver) { this.deliveryCount = attach.InitialDeliveryCount.Value; this.settings.Source = attach.Source; } else { this.settings.Target = attach.Target; } this.CompleteOpen(false, null); } else if (stateTransition.To == AmqpObjectState.OpenReceived) { Utils.Trace(TraceLevel.Verbose, "{0}: opending.", this); try { this.Session.Connection.AmqpSettings.RuntimeProvider.BeginOpenLink(this, this.DefaultOpenTimeout, this.OnProviderLinkOpened, null); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } this.OnLinkOpenFailed(exception); } } }