aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Transport
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-08 22:11:23 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-08 22:11:23 +0200
commit75c3c7ee363064d748f4ea8e004cd7e8c1a139a0 (patch)
tree870e0c220ea79be033ad90c8fa9c4d4f0d379668 /Software/Visual_Studio/Tango.Transport
parent436ceaea56ecff755476a3796cff72e1da39dfc6 (diff)
downloadTango-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')
-rw-r--r--Software/Visual_Studio/Tango.Transport/IRequestHandler.cs14
-rw-r--r--Software/Visual_Studio/Tango.Transport/ITransporter.cs15
-rw-r--r--Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj3
-rw-r--r--Software/Visual_Studio/Tango.Transport/TransporterBase.cs90
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>