/// <summary> /// Sends an unconfirmed request /// </summary> /// <param name="address">The address of the destination device</param> /// <param name="expectingReply">True if a reply is expected to the request, false otherwise</param> /// <param name="request">The request to send</param> public void SendUnconfirmedRequest(Address address, bool expectingReply, IUnconfirmedRequest request) { lock (_lock) { _sendUnconfirmedRequest(address, expectingReply, request); } }
/// <summary> /// Processes a received unconfirmed request /// </summary> /// <param name="appgram">The inbound appgram</param> /// <param name="message">The unconfirmed request message</param> /// <param name="buffer">The buffer containing the request content</param> /// <param name="offset">The offset of the request content in the buffer</param> /// <param name="end">The end of the request content</param> private InboundUnconfirmedRequest _processUnconfirmedRequest(InboundAppgram appgram, UnconfirmedRequestMessage message, byte[] buffer, int offset, int end) { UnconfirmedServiceChoice choice = (UnconfirmedServiceChoice)message.ServiceChoice; IUnconfirmedRequest request = _loadUnconfirmedRequest(choice, buffer, offset, end); DeviceTableEntry source = null; if (request.ServiceChoice == UnconfirmedServiceChoice.IAm) { // the only request that we handle at the host level is an IAm request, // which is necessary for TSM operations, since information about the remote // host is needed source = _processIAmRequest(appgram, (IAmRequest)request); } else { source = _devices.GetByAddress(appgram.Source); } InboundUnconfirmedRequest inbound = new InboundUnconfirmedRequest( appgram.Source, source, request); return(inbound); }
/// <summary> /// Loads an unconfirmed request from its tagged form /// </summary> /// <param name="serviceChoice">The service choice of the unconfirmed request</param> /// <param name="buffer">The buffer containing the tagged form</param> /// <param name="offset">The offset of the tagged form</param> /// <param name="end">The end of the tagged form</param> /// <returns>The loaded unconfirmed request</returns> private IUnconfirmedRequest _loadUnconfirmedRequest(UnconfirmedServiceChoice serviceChoice, byte[] buffer, int offset, int end) { IUnconfirmedRequest request = null; switch (serviceChoice) { case UnconfirmedServiceChoice.IAm: request = Tags.Decode <IAmRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.IHave: request = Tags.Decode <IHaveRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.TimeSynchronization: request = Tags.Decode <TimeSynchronizationRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.UnconfirmedCOVNotification: request = Tags.Decode <UnconfirmedCOVNotificationRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.UnconfirmedEventNotification: request = Tags.Decode <UnconfirmedEventNotificationRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.UnconfirmedPrivateTransfer: request = Tags.Decode <UnconfirmedPrivateTransferRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.UnconfirmedTextMessage: request = Tags.Decode <UnconfirmedTextMessageRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.UtcTimeSynchronization: request = Tags.Decode <UtcTimeSynchronizationRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.WhoHas: request = Tags.Decode <WhoHasRequest>(buffer, offset, end); break; case UnconfirmedServiceChoice.WhoIs: request = Tags.Decode <WhoIsRequest>(buffer, offset, end); break; default: throw new RejectException(RejectReason.UnrecognizedService); } return(request); }
/// <summary> /// Saves an unconfirmed request to its tagged form /// </summary> /// <param name="request">The request to save</param> /// <returns>The unconfirmed request content</returns> private byte[] _saveUnconfirmedRequest(IUnconfirmedRequest request) { switch (request.ServiceChoice) { case UnconfirmedServiceChoice.IAm: return(Tags.EncodeBytes((IAmRequest)request)); case UnconfirmedServiceChoice.IHave: return(Tags.EncodeBytes((IHaveRequest)request)); case UnconfirmedServiceChoice.TimeSynchronization: return(Tags.EncodeBytes((TimeSynchronizationRequest)request)); case UnconfirmedServiceChoice.UnconfirmedCOVNotification: return(Tags.EncodeBytes((UnconfirmedCOVNotificationRequest)request)); case UnconfirmedServiceChoice.UnconfirmedEventNotification: return(Tags.EncodeBytes((UnconfirmedEventNotificationRequest)request)); case UnconfirmedServiceChoice.UnconfirmedPrivateTransfer: return(Tags.EncodeBytes((UnconfirmedPrivateTransferRequest)request)); case UnconfirmedServiceChoice.UnconfirmedTextMessage: return(Tags.EncodeBytes((UnconfirmedTextMessageRequest)request)); case UnconfirmedServiceChoice.UtcTimeSynchronization: return(Tags.EncodeBytes((UtcTimeSynchronizationRequest)request)); case UnconfirmedServiceChoice.WhoHas: return(Tags.EncodeBytes((WhoHasRequest)request)); case UnconfirmedServiceChoice.WhoIs: return(Tags.EncodeBytes((WhoIsRequest)request)); default: throw new RejectException(RejectReason.UnrecognizedService); } }
/// <summary> /// Saves an unconfirmed request /// </summary> /// <param name="sink">The sink to save to</param> /// <param name="request">The request to save</param> public void Save(IValueSink sink, IUnconfirmedRequest request) { Value <T> .Save(sink, (T)request); }
/// <summary> /// Constructs a new inbound unconfirmed request /// </summary> /// <param name="sourceAddress">The device that sent the request</param> /// <param name="source">The device table entry of the device that sent the request</param> /// <param name="request">The request instance</param> public InboundUnconfirmedRequest(Address sourceAddress, DeviceTableEntry source, IUnconfirmedRequest request) { this.SourceAddress = sourceAddress; this.Source = source; this.Request = request; }
/// <summary> /// Sends an unconfirmed request /// </summary> /// <param name="instance">The instance of the destination device</param> /// <param name="expectingReply">True if a reply is expected to the request, false otherwise</param> /// <param name="request">The request to send</param> public void SendUnconfirmedRequest(uint instance, bool expectingReply, IUnconfirmedRequest request) { lock (_lock) { } }
/// <summary> /// Sends an unconfirmed request /// </summary> /// <param name="destination">The destination address</param> /// <param name="expectingReply">Whether or not a response is expected</param> /// <param name="request">The unconfirmed request</param> private void _sendUnconfirmedRequest(Address destination, bool expectingReply, IUnconfirmedRequest request) { UnconfirmedRequestMessage message = new UnconfirmedRequestMessage(); message.ServiceChoice = (byte)request.ServiceChoice; byte[] raw = _saveUnconfirmedRequest(request); OutboundAppgram appgram = new OutboundAppgram(); appgram.Content = new AppgramContent(message, new BufferSegment(raw, 0, raw.Length)); appgram.Destination = destination; appgram.ExpectingReply = expectingReply; appgram.Priority = NetgramPriority.Normal; if (_router != null) { _router.SendAppgram(appgram); } }