diff options
| author | Avi Levkovich <avi@twine-s.com> | 2020-04-21 14:21:19 +0300 |
|---|---|---|
| committer | Avi Levkovich <avi@twine-s.com> | 2020-04-21 14:21:19 +0300 |
| commit | cd728bf3a7d1db76747cb18bcfe396c83d690e86 (patch) | |
| tree | 99347262eef3f175a7ff1441b6c5a031be74d26f /Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop | |
| parent | 7fe23e68512e2462de107e76ae3a92ddd381ac77 (diff) | |
| parent | 97a784b6ce43960bdb92465b08f26d3562a4f202 (diff) | |
| download | Tango-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')
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; } + } + +} |
