diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-08 22:11:23 +0200 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-08 22:11:23 +0200 |
| commit | 75c3c7ee363064d748f4ea8e004cd7e8c1a139a0 (patch) | |
| tree | 870e0c220ea79be033ad90c8fa9c4d4f0d379668 /Software/Visual_Studio/Tango.Transport | |
| parent | 436ceaea56ecff755476a3796cff72e1da39dfc6 (diff) | |
| download | Tango-75c3c7ee363064d748f4ea8e004cd7e8c1a139a0.tar.gz Tango-75c3c7ee363064d748f4ea8e004cd7e8c1a139a0.zip | |
Implemented custom request handlers on transporters.
Implemented logout vm handling on FSE.
Improvements on RDP.
Diffstat (limited to 'Software/Visual_Studio/Tango.Transport')
4 files changed, 104 insertions, 18 deletions
diff --git a/Software/Visual_Studio/Tango.Transport/IRequestHandler.cs b/Software/Visual_Studio/Tango.Transport/IRequestHandler.cs deleted file mode 100644 index 90879f474..000000000 --- a/Software/Visual_Studio/Tango.Transport/IRequestHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Remoting.Messaging; -using System.Text; -using System.Threading.Tasks; - -namespace Tango.Transport -{ - public interface IRequestHandler<T> where T : class - { - void OnRequestReceived(T request); - } -} diff --git a/Software/Visual_Studio/Tango.Transport/ITransporter.cs b/Software/Visual_Studio/Tango.Transport/ITransporter.cs index a3ca5275f..af80f6b1e 100644 --- a/Software/Visual_Studio/Tango.Transport/ITransporter.cs +++ b/Software/Visual_Studio/Tango.Transport/ITransporter.cs @@ -13,6 +13,8 @@ using System.Collections.ObjectModel; namespace Tango.Transport { + public delegate void RequestHandlerCallbackDelegate<Request>(Request request, String token); + /// <summary> /// Represents a transportation engine which can send and receive <see cref="TangoMessage{T}"/> message using a <see cref="ITransportAdapter">Transport adapter</see>. /// </summary> @@ -34,9 +36,18 @@ namespace Tango.Transport /// </summary> Exception FailedStateException { get; } - //void RegisterRequestHandler<T>(IRequestHandler<T> handler) where T: class; + /// <summary> + /// Registers a custom request handler. + /// </summary> + /// <typeparam name="Request">The type of the request.</typeparam> + /// <param name="callback">The callback.</param> + void RegisterRequestHandler<Request>(RequestHandlerCallbackDelegate<Request> callback) where Request : class; - //void UnregisterRequestHandler<T>(IRequestHandler<T> handler) where T : class; + /// <summary> + /// Copies this instance request handlers to the specified instance. + /// </summary> + /// <param name="transporter">The transporter to copy the handlers to.</param> + void CopyRequestHandlers(ITransporter transporter); /// <summary> /// Sends a request. diff --git a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj index c4663290a..120584798 100644 --- a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj +++ b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj @@ -116,7 +116,6 @@ <Compile Include="Discovery\UsbCommunicationScanner.cs" /> <Compile Include="Encoders\ProtoEncoder.cs" /> <Compile Include="ExtensionMethods\TcpClientExtensions.cs" /> - <Compile Include="IRequestHandler.cs" /> <Compile Include="ITransportComponent.cs" /> <Compile Include="ITransportAdapter.cs" /> <Compile Include="Adapters\TcpTransportAdapter.cs" /> @@ -187,7 +186,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs index 339473929..73f573fc7 100644 --- a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs +++ b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs @@ -34,6 +34,12 @@ namespace Tango.Transport { protected static long _component_counter = 1; + private class RequestHandler + { + public Type RequestType { get; set; } + public Action<Object, String> Callback { get; set; } + } + private const int MESSAGE_TOKEN_LENGTH = 36; private ProducerConsumerQueue<TransportMessageBase> _sendingQueue; private ConcurrentList<TransportMessageBase> _pendingRequests; @@ -44,6 +50,7 @@ namespace Tango.Transport private ITransportAdapter _adapter; private Dictionary<String, PendingResponse> _pendingResponses; private DateTime _lastKeepAliveTime; + private List<RequestHandler> _requestHandlers; private static JsonSerializerSettings _genericMessageSettings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All, @@ -295,6 +302,54 @@ namespace Tango.Transport /// <param name="container">The request.</param> protected virtual void OnRequestReceived(MessageContainer container) { + if (_requestHandlers.Count > 0) + { + if (container.Type != MessageType.GenericRequest) + { + var handlers = _requestHandlers.Where(x => x.RequestType.Name == container.Type.ToOriginalName()).ToList(); + + if (handlers.Count > 0) //Handle + { + var request = MessageFactory.ExtractMessageFromContainer(container); + + foreach (var handler in handlers) + { + try + { + handler.Callback.Invoke(request, container.Token); + } + catch + { + //Ignore any exception on the client side. + } + } + } + } + else + { + var genericRequest = MessageFactory.ExtractMessageFromContainer<GenericRequest>(container); + + var handlers = _requestHandlers.Where(x => x.RequestType.AssemblyQualifiedName == genericRequest.Type).ToList(); + + if (handlers.Count > 0) + { + var innerRequest = ProtoSerializer.DeserializeFromByteString(handlers[0].RequestType, genericRequest.Data); + + foreach (var handler in handlers) + { + try + { + handler.Callback.Invoke(innerRequest, container.Token); + } + catch + { + //Ignore any exception on the client side. + } + } + } + } + } + RequestReceived?.Invoke(this, container); } @@ -405,6 +460,7 @@ namespace Tango.Transport _sendingQueue = new ProducerConsumerQueue<TransportMessageBase>(); _pendingRequests = new ConcurrentList<TransportMessageBase>(); _arrivedResponses = new ProducerConsumerQueue<byte[]>(); + _requestHandlers = new List<RequestHandler>(); RequestTimeout = TimeSpan.FromSeconds(5); EnableKeepAliveAutoResponse = true; KeepAliveTimeout = TimeSpan.FromSeconds(2); @@ -1142,6 +1198,40 @@ namespace Tango.Transport #endregion + #region Request Handlers + + /// <summary> + /// Registers a custom request handler. + /// </summary> + /// <typeparam name="Request">The type of the request.</typeparam> + /// <param name="callback">The callback.</param> + public void RegisterRequestHandler<Request>(RequestHandlerCallbackDelegate<Request> callback) where Request : class + { + RequestHandler handler = new RequestHandler(); + handler.RequestType = typeof(Request); + handler.Callback = (obj, token) => + { + callback?.Invoke(obj as Request, token); + }; + + _requestHandlers.Add(handler); + } + + /// <summary> + /// Copies this instance request handlers to the specified instance. + /// </summary> + /// <param name="transporter">The transporter to copy the handlers to.</param> + public void CopyRequestHandlers(ITransporter transporter) + { + foreach (var handler in _requestHandlers.ToList()) + { + (transporter as TransporterBase)._requestHandlers.Add(handler); + _requestHandlers.Remove(handler); + } + } + + #endregion + #region Private Methods /// <summary> |
