/// <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> /// Retrieves the registration instance for a specific unconfirmed request type /// </summary> /// <param name="serviceChoice">The service choice of the unconfirmed request type</param> /// <returns>The registration instance</returns> public IRegistration GetRegistration(UnconfirmedServiceChoice serviceChoice) { for (int i = 0; i < _registrations.Count; i++) { if (_registrations[i].ServiceChoice == serviceChoice) { return(_registrations[i]); } } throw new Exception("Could not retrieve registration for unregistered service: " + serviceChoice); }
/// <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> /// Registers an unconfirmed request type with the registrar /// </summary> /// <param name="serviceChoice">The service choice of the request type</param> public void Register <T>(UnconfirmedServiceChoice serviceChoice) where T : IUnconfirmedRequest { for (int i = 0; i < _registrations.Count; i++) { if (_registrations[i].ServiceChoice == serviceChoice) { throw new Exception("Service choice is already registered"); } } Registration <T> registration = new Registration <T>(serviceChoice); this._registrations.Add(registration); }
/// <summary> /// Constructs a new registration instance /// </summary> /// <param name="serviceChoice">The service choice of the registration</param> public Registration(UnconfirmedServiceChoice serviceChoice) { this.ServiceChoice = serviceChoice; }