internal virtual void OnAttach(uint remoteHandle, Attach attach) { lock (this.ThisLock) { if (this.state == LinkState.AttachSent) { this.state = LinkState.Attached; } else if (this.state == LinkState.DetachPipe) { this.state = LinkState.DetachSent; } else { throw new AmqpException(ErrorCode.IllegalState, Fx.Format(SRAmqp.AmqpIllegalOperationState, "OnAttach", this.state)); } } if (this.onAttached != null) { this.onAttached(this, attach); } }
internal bool OnDetach(Detach detach) { lock (this.ThisLock) { if (this.state == State.DetachSent) { this.state = State.End; } else if (this.state == State.Attached) { this.SendDetach(null); this.state = State.End; } else { throw new AmqpException(ErrorCode.IllegalState, Fx.Format(SRAmqp.AmqpIllegalOperationState, "OnDetach", this.state)); } this.OnClose(detach.Error); this.NotifyClosed(detach.Error); return(true); } }
internal bool OnEnd(End end) { lock (this.ThisLock) { if (this.state == State.EndSent) { this.state = State.End; } else if (this.state == State.Opened) { this.SendEnd(); this.state = State.End; } else { throw new AmqpException(ErrorCode.IllegalState, Fx.Format(SRAmqp.AmqpIllegalOperationState, "OnEnd", this.state)); } this.OnClose(end.Error); this.NotifyClosed(end.Error); return(true); } }
/// <summary> /// Closes the connection. /// </summary> /// <param name="error"></param> /// <returns></returns> protected override bool OnClose(Error error) { lock (this.ThisLock) { State newState = State.Start; if (this.state == State.OpenPipe) { newState = State.OpenClosePipe; } else if (state == State.OpenSent) { newState = State.ClosePipe; } else if (this.state == State.Opened) { newState = State.CloseSent; } else if (this.state == State.CloseReceived) { newState = State.End; } else if (this.state == State.End) { return(true); } else { throw new AmqpException(ErrorCode.IllegalState, Fx.Format(SRAmqp.AmqpIllegalOperationState, "Close", this.state)); } this.SendClose(error); this.state = newState; return(this.state == State.End); } }
internal void OnBegin(ushort remoteChannel, Begin begin) { lock (this.ThisLock) { if (this.state == State.BeginSent) { this.state = State.Opened; } else if (this.state == State.EndPipe) { this.state = State.EndSent; } else { throw new AmqpException(ErrorCode.IllegalState, Fx.Format(SRAmqp.AmqpIllegalOperationState, "OnBegin", this.state)); } } if (begin.HandleMax < this.handleMax) { this.handleMax = begin.HandleMax; } }
void Parse(string address) { // amqp[s]://user:[email protected]:port/foo/bar ParseState state = ParseState.Scheme; int startIndex = 0; for (int i = 0; i < address.Length; ++i) { switch (address[i]) { case ':': if (state == ParseState.Scheme) { this.Scheme = address.Substring(startIndex, i - startIndex); state = ParseState.Slash1; } else if (state == ParseState.User) { this.User = address.Substring(startIndex, i - startIndex); state = ParseState.Password; startIndex = i + 1; } else if (state == ParseState.Host) { this.Host = address.Substring(startIndex, i - startIndex); state = ParseState.Port; startIndex = i + 1; } else { throw new AmqpException(ErrorCode.InvalidField, Fx.Format(SRAmqp.InvalidAddressFormat)); } break; case '/': if (state == ParseState.Slash1) { state = ParseState.Slash2; } else if (state == ParseState.Slash2) { state = ParseState.User; startIndex = i + 1; } else if (state == ParseState.User || state == ParseState.Host) { this.Host = address.Substring(startIndex, i - startIndex); state = ParseState.Path; startIndex = i; } else if (state == ParseState.Port) { this.Port = int.Parse(address.Substring(startIndex, i - startIndex)); state = ParseState.Path; startIndex = i; } else if (state == ParseState.Password) { this.Host = this.User; this.User = null; this.Port = int.Parse(address.Substring(startIndex, i - startIndex)); state = ParseState.Path; startIndex = i; } break; case '@': if (state == ParseState.Password) { this.Password = address.Substring(startIndex, i - startIndex); state = ParseState.Host; startIndex = i + 1; } else { throw new AmqpException(ErrorCode.InvalidField, Fx.Format(SRAmqp.InvalidAddressFormat)); } break; default: break; } if (state == ParseState.Path) { this.Path = address.Substring(startIndex); break; } } // check state in case of no trailing slash if (state == ParseState.User || state == ParseState.Host) { this.Host = address.Substring(startIndex); } else if (state == ParseState.Password) { this.Host = this.User; this.User = null; if (startIndex < address.Length - 1) { this.Port = int.Parse(address.Substring(startIndex)); } } else if (state == ParseState.Port) { this.Port = int.Parse(address.Substring(startIndex)); } if (this.Password != null && this.Password.Length > 0) { this.Password = Uri.UnescapeDataString(this.Password); } if (this.User != null && this.User.Length > 0) { this.User = Uri.UnescapeDataString(this.User); } if (this.Host != null) { this.Host = Uri.UnescapeDataString(this.Host); } }