aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2020-04-21 14:21:19 +0300
committerAvi Levkovich <avi@twine-s.com>2020-04-21 14:21:19 +0300
commitcd728bf3a7d1db76747cb18bcfe396c83d690e86 (patch)
tree99347262eef3f175a7ff1441b6c5a031be74d26f /Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop
parent7fe23e68512e2462de107e76ae3a92ddd381ac77 (diff)
parent97a784b6ce43960bdb92465b08f26d3562a4f202 (diff)
downloadTango-cd728bf3a7d1db76747cb18bcfe396c83d690e86.tar.gz
Tango-cd728bf3a7d1db76747cb18bcfe396c83d690e86.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs91
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs12
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/RemoteDesktopClient.cs20
3 files changed, 79 insertions, 44 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs
index 849befc27..7ba020174 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs
@@ -10,6 +10,7 @@ using System.Windows.Input;
using Tango.Core;
using Tango.Core.DI;
using Tango.Integration.ExternalBridge;
+using Tango.Logging;
using Tango.PPC.Common.Application;
using Tango.PPC.Common.ExternalBridge;
using Tango.PPC.Common.OS;
@@ -30,15 +31,6 @@ namespace Tango.PPC.Common.RemoteDesktop
[TangoCreateWhenRegistered]
public class DefaultRemoteDesktopService : ExtendedObject, IRemoteDesktopService, IExternalBridgeRequestHandler
{
- private class RemoteDesktopClient
- {
- public String Token { get; set; }
- public ExternalBridgeReceiver Receiver { get; set; }
- public bool InitialPacketSent { get; set; }
- public WebRtcClient WebRtcClient { get; set; }
- public bool IsWebRtcReady { get; set; }
- }
-
private RemoteDesktopPacket _initialPacket;
private RasterScreenCaptureEngine _engine;
private PPCSettings _settings;
@@ -47,14 +39,24 @@ namespace Tango.PPC.Common.RemoteDesktop
private IOperationSystemManager _osManager;
private IPPCApplicationManager _appManager;
+ /// <summary>
+ /// Gets or sets a value indicating whether this <see cref="IPPCService" /> is enabled.
+ /// </summary>
+ public bool Enabled { get; set; } = true;
private bool _isStarted;
+ /// <summary>
+ /// Gets a value indicating whether the remote desktop service has started.
+ /// </summary>
public bool IsStarted
{
get { return _isStarted; }
private set { _isStarted = value; RaisePropertyChangedAuto(); }
}
+ /// <summary>
+ /// Gets a value indicating whether there is any active remote desktop session with a remote peer.
+ /// </summary>
public bool InSession
{
get
@@ -63,6 +65,12 @@ namespace Tango.PPC.Common.RemoteDesktop
}
}
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DefaultRemoteDesktopService"/> class.
+ /// </summary>
+ /// <param name="applicationManager">The application manager.</param>
+ /// <param name="externalBridge">The external bridge.</param>
+ /// <param name="osManager">The os manager.</param>
public DefaultRemoteDesktopService(IPPCApplicationManager applicationManager, IPPCExternalBridgeService externalBridge, IOperationSystemManager osManager)
{
_osManager = osManager;
@@ -74,6 +82,8 @@ namespace Tango.PPC.Common.RemoteDesktop
};
_settings = SettingsManager.Default.GetOrCreate<PPCSettings>();
+ Enabled = _settings.EnableRemoteDesktop;
+
applicationManager.ApplicationReady += ApplicationManager_ApplicationReady;
externalBridge.RegisterRequestHandler(this);
@@ -118,14 +128,10 @@ namespace Tango.PPC.Common.RemoteDesktop
_engine.Comparer.MaxDifferencesThrow = _engine.CaptureRegion.Width * _engine.CaptureRegion.Height / 2;
}
- [ExternalBridgeRequestHandlerMethod(typeof(StartRemoteDesktopSessionRequest))]
- public async void OnStartRemoteDesktopSessionRequestReceived(StartRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver)
+ [ExternalBridgeRequestHandlerMethod(typeof(StartRemoteDesktopSessionRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnStartRemoteDesktopSessionRequestReceived(StartRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver)
{
- if (!_settings.EnableRemoteDesktop)
- {
- await receiver.SendErrorResponse(new AuthenticationException("Remote desktop is disabled on this machine."), token);
- return;
- }
+ this.ThrowIfDisabled();
var client = _clients.SingleOrDefault(x => x.Receiver == receiver);
@@ -146,19 +152,17 @@ namespace Tango.PPC.Common.RemoteDesktop
FrameRate = _engine.FrameRate
}, token);
- if (_settings.EnableRemoteDesktop)
+
+ if (!_engine.IsStarted)
{
- if (!_engine.IsStarted)
- {
- _engine.Start();
- }
+ _engine.Start();
}
RaisePropertyChanged(nameof(InSession));
}
- [ExternalBridgeRequestHandlerMethod(typeof(WebRtcIceCandidateRequest))]
- public async void OnWebRtcIceCandidateRequestReceived(WebRtcIceCandidateRequest request, String token, ExternalBridgeReceiver receiver)
+ [ExternalBridgeRequestHandlerMethod(typeof(WebRtcIceCandidateRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnWebRtcIceCandidateRequestReceived(WebRtcIceCandidateRequest request, String token, ExternalBridgeReceiver receiver)
{
var client = _clients.SingleOrDefault(x => x.Receiver == receiver);
@@ -171,13 +175,13 @@ namespace Tango.PPC.Common.RemoteDesktop
}
catch (Exception ex)
{
- LogManager.Log($"Error adding WebRTC ice candidate received from the remote connection.\n{ex.FlattenMessage()}");
+ LogManager.Log(ex, "Error adding WebRTC ice candidate received from the remote connection.");
}
}
}
- [ExternalBridgeRequestHandlerMethod(typeof(WebRtcOfferRequest))]
- public async void OnWebRtcOfferRequestReceived(WebRtcOfferRequest request, String token, ExternalBridgeReceiver receiver)
+ [ExternalBridgeRequestHandlerMethod(typeof(WebRtcOfferRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnWebRtcOfferRequestReceived(WebRtcOfferRequest request, String token, ExternalBridgeReceiver receiver)
{
var client = _clients.SingleOrDefault(x => x.Receiver == receiver);
@@ -196,7 +200,7 @@ namespace Tango.PPC.Common.RemoteDesktop
}
catch (Exception ex)
{
- LogManager.Log(ex, $"Error sending ice candidate to remote peer.\n{ex.FlattenMessage()}");
+ LogManager.Log(ex, "Error sending ice candidate to remote peer.");
}
};
client.WebRtcClient.Ready += (x, e) =>
@@ -219,18 +223,18 @@ namespace Tango.PPC.Common.RemoteDesktop
}
catch (Exception ex)
{
- LogManager.Log($"Error initializing the web RTC client.\n{ex.FlattenMessage()}");
+ throw LogManager.Log(ex, "Error initializing the WebRTC client.");
}
}
catch (Exception ex)
{
- LogManager.Log($"Error responding to WebRTC offer request.\n{ex.FlattenMessage()}");
+ throw LogManager.Log(ex, "Error responding to WebRTC offer request.");
}
}
}
- [ExternalBridgeRequestHandlerMethod(typeof(StopRemoteDesktopSessionRequest))]
- public async void OnStopRemoteDesktopSessionRequestReceived(StopRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver)
+ [ExternalBridgeRequestHandlerMethod(typeof(StopRemoteDesktopSessionRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnStopRemoteDesktopSessionRequestReceived(StopRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver)
{
var client = _clients.SingleOrDefault(x => x.Receiver == receiver);
@@ -260,7 +264,7 @@ namespace Tango.PPC.Common.RemoteDesktop
}
[ExternalBridgeRequestHandlerMethod(typeof(MouseStateRequest))]
- public async void OnMouseStateRequestReceived(MouseStateRequest request, String token, ExternalBridgeReceiver receiver)
+ public async Task OnMouseStateRequestReceived(MouseStateRequest request, String token, ExternalBridgeReceiver receiver)
{
MouseController.SetCursorPosition((int)request.Location.X, (int)request.Location.Y);
@@ -292,7 +296,7 @@ namespace Tango.PPC.Common.RemoteDesktop
}
[ExternalBridgeRequestHandlerMethod(typeof(KeyboardStateRequest))]
- public async void OnKeyboardStateRequestReceived(KeyboardStateRequest request, String token, ExternalBridgeReceiver receiver)
+ public async Task OnKeyboardStateRequestReceived(KeyboardStateRequest request, String token, ExternalBridgeReceiver receiver)
{
if (request.EventType == KeyboardEventType.Down)
{
@@ -309,8 +313,8 @@ namespace Tango.PPC.Common.RemoteDesktop
}
}
- [ExternalBridgeRequestHandlerMethod(typeof(RemoteDesktopCommandRequest))]
- public async void OnRemoteDesktopCommandRequest(RemoteDesktopCommandRequest request, String token, ExternalBridgeReceiver receiver)
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDesktopCommandRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDesktopCommandRequest(RemoteDesktopCommandRequest request, String token, ExternalBridgeReceiver receiver)
{
switch (request.Command)
{
@@ -346,7 +350,7 @@ namespace Tango.PPC.Common.RemoteDesktop
}
catch (Exception ex)
{
- Debug.WriteLine(ex);
+ LogManager.Log(ex, LogCategory.Debug, "Error pushing remote desktop frame via WebRTC channel.");
}
}
@@ -382,7 +386,6 @@ namespace Tango.PPC.Common.RemoteDesktop
if (!e.Frame.DifferenceAvailable)
{
- Debug.WriteLine("Using Jpeg...");
packet = new RemoteDesktopPacket()
{
Bitmap = e.Frame.ToEncoder<TurboJpegEncoder>().ToArray(30)
@@ -403,7 +406,7 @@ namespace Tango.PPC.Common.RemoteDesktop
diffFrame.Dispose();
}
- Debug.WriteLine($"Bitmap Size: {packet.Bitmap.Length / 1000} kb");
+ Debug.WriteLine($"Remote Desktop Bitmap Size: {packet.Bitmap.Length / 1000} kb");
foreach (var client in _clients.ToList().Where(x => x.InitialPacketSent))
{
@@ -429,7 +432,7 @@ namespace Tango.PPC.Common.RemoteDesktop
e.Frame.Dispose();
}
- private void WebRtcClient_TextMessageReceived(object sender, DataMessageReceivedEventArgs<string> e)
+ private async void WebRtcClient_TextMessageReceived(object sender, DataMessageReceivedEventArgs<string> e)
{
try
{
@@ -437,16 +440,16 @@ namespace Tango.PPC.Common.RemoteDesktop
if (request.GetType() == typeof(MouseStateRequest))
{
- OnMouseStateRequestReceived(request as MouseStateRequest, null, null);
+ await OnMouseStateRequestReceived(request as MouseStateRequest, null, null);
}
else if (request.GetType() == typeof(KeyboardStateRequest))
{
- OnKeyboardStateRequestReceived(request as KeyboardStateRequest, null, null);
+ await OnKeyboardStateRequestReceived(request as KeyboardStateRequest, null, null);
}
}
catch (Exception ex)
{
- LogManager.Log(ex, "Error deserializing incoming from message on the WebRTC data Channel.");
+ LogManager.Log(ex, "Error deserializing incoming message on the WebRTC data Channel.");
}
}
@@ -456,6 +459,8 @@ namespace Tango.PPC.Common.RemoteDesktop
if (client != null)
{
+ LogManager.Log("Remote desktop client disconnected. Disposing WebRTC channel...");
+
_clients.Remove(client);
try
@@ -467,7 +472,7 @@ namespace Tango.PPC.Common.RemoteDesktop
}
catch (Exception ex)
{
- LogManager.Log($"Error disposing the WebRTC client.\n{ex.FlattenMessage()}");
+ LogManager.Log(ex, "Error disposing the WebRTC channel.");
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs
index 5760b94dc..5e4a801d7 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs
@@ -6,9 +6,19 @@ using System.Threading.Tasks;
namespace Tango.PPC.Common.RemoteDesktop
{
- public interface IRemoteDesktopService
+ /// <summary>
+ /// Represents a PPC remote desktop service.
+ /// </summary>
+ public interface IRemoteDesktopService : IPPCService
{
+ /// <summary>
+ /// Gets a value indicating whether the remote desktop service has started.
+ /// </summary>
bool IsStarted { get; }
+
+ /// <summary>
+ /// Gets a value indicating whether there is any active remote desktop session with a remote peer.
+ /// </summary>
bool InSession { get; }
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/RemoteDesktopClient.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/RemoteDesktopClient.cs
new file mode 100644
index 000000000..f0f0a87de
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/RemoteDesktopClient.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Integration.ExternalBridge;
+using Tango.WebRTC;
+
+namespace Tango.PPC.Common.RemoteDesktop
+{
+ public class RemoteDesktopClient
+ {
+ public String Token { get; set; }
+ public ExternalBridgeReceiver Receiver { get; set; }
+ public bool InitialPacketSent { get; set; }
+ public WebRtcClient WebRtcClient { get; set; }
+ public bool IsWebRtcReady { get; set; }
+ }
+
+}