diff --git a/Desktop.Win/ViewModels/MainWindowViewModel.cs b/Desktop.Win/ViewModels/MainWindowViewModel.cs index ab2cfaf2..4080f417 100644 --- a/Desktop.Win/ViewModels/MainWindowViewModel.cs +++ b/Desktop.Win/ViewModels/MainWindowViewModel.cs @@ -260,6 +260,7 @@ namespace Remotely.Desktop.Win.ViewModels serviceCollection.AddSingleton(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); + serviceCollection.AddScoped(); ServiceContainer.Instance = serviceCollection.BuildServiceProvider(); diff --git a/ScreenCast.Core/Communication/CasterSocket.cs b/ScreenCast.Core/Communication/CasterSocket.cs index 605210a8..ccd2f1c2 100644 --- a/ScreenCast.Core/Communication/CasterSocket.cs +++ b/ScreenCast.Core/Communication/CasterSocket.cs @@ -18,26 +18,20 @@ namespace Remotely.ScreenCast.Core.Communication public CasterSocket( IKeyboardMouseInput keyboardMouseInput, IScreenCaster screenCastService, - IAudioCapturer audioCapturer, - IClipboardService clipboardService) + IAudioCapturer audioCapturer) { KeyboardMouseInput = keyboardMouseInput; - ClipboardService = clipboardService; AudioCapturer = audioCapturer; ScreenCaster = screenCastService; - - ClipboardService.ClipboardTextChanged += ClipboardService_ClipboardTextChanged; } + public HubConnection Connection { get; private set; } public bool IsConnected => Connection?.State == HubConnectionState.Connected; public IScreenCaster ScreenCaster { get; } private IAudioCapturer AudioCapturer { get; } private IClipboardService ClipboardService { get; } - - public HubConnection Connection { get; private set; } - private IKeyboardMouseInput KeyboardMouseInput { get; } public async Task Connect(string host) { @@ -78,9 +72,9 @@ namespace Remotely.ScreenCast.Core.Communication await Connection.SendAsync("NotifyViewersRelaunchedScreenCasterReady", viewerIDs); } - public async Task SendAudioSample(byte[] buffer, List viewerIDs) + public async Task SendAudioSample(byte[] buffer, string viewerID) { - await Connection.SendAsync("SendAudioSample", buffer, viewerIDs); + await Connection.SendAsync("SendAudioSample", buffer, viewerID); } public async Task SendClipboardText(string clipboardText, string viewerID) @@ -93,6 +87,11 @@ namespace Remotely.ScreenCast.Core.Communication await Connection.SendAsync("SendConnectionFailedToViewers", viewerIDs); } + public async Task SendCtrlAltDel() + { + await Connection.SendAsync("CtrlAltDel"); + } + public async Task SendCursorChange(CursorInfo cursor, List viewerIDs) { await Connection.SendAsync("SendCursorChange", cursor, viewerIDs); @@ -203,7 +202,7 @@ namespace Remotely.ScreenCast.Core.Communication { if (conductor.Viewers.TryGetValue(viewerID, out var viewer) && viewer.HasControl) { - await Connection.SendAsync("CtrlAltDel"); + await SendCtrlAltDel(); } }); @@ -441,15 +440,5 @@ namespace Remotely.ScreenCast.Core.Communication conductor.InvokeSessionIDChanged(sessionID); }); } - - private async void ClipboardService_ClipboardTextChanged(object sender, string clipboardText) - { - var conductor = ServiceContainer.Instance.GetRequiredService(); - var viewerIDs = conductor.Viewers.Values.ToList(); - foreach (var viewer in viewerIDs) - { - await viewer.SendClipboardText(clipboardText); - } - } } } diff --git a/ScreenCast.Core/Communication/WebRtcSession.cs b/ScreenCast.Core/Communication/WebRtcSession.cs index 603ed902..4341ec71 100644 --- a/ScreenCast.Core/Communication/WebRtcSession.cs +++ b/ScreenCast.Core/Communication/WebRtcSession.cs @@ -12,16 +12,21 @@ namespace Remotely.ScreenCast.Core.Communication { public class WebRtcSession : IDisposable { + public WebRtcSession(IRtcMessageHandler rtcMessageHandler) + { + RtcMessageHandler = rtcMessageHandler; + } + public event EventHandler<(string candidate, int sdpMlineIndex, string sdpMid)> IceCandidateReady; public event EventHandler LocalSdpReady; public ulong CurrentBuffer { get; private set; } - public bool IsDataChannelOpen => CaptureChannel?.State == DataChannel.ChannelState.Open; public bool IsPeerConnected => PeerConnection?.IsConnected == true; private DataChannel CaptureChannel { get; set; } private PeerConnection PeerConnection { get; set; } + private IRtcMessageHandler RtcMessageHandler { get; } public void AddIceCandidate(string sdpMid, int sdpMlineIndex, string candidate) { PeerConnection.AddIceCandidate(sdpMid, sdpMlineIndex, candidate); @@ -95,6 +100,11 @@ namespace Remotely.ScreenCast.Core.Communication SendDto(new MachineNameDto(machineName)); } + public void SendAudioSample(byte[] audioSample) + { + SendDto(new AudioSampleDto(audioSample)); + } + public void SendScreenData(string selectedScreen, string[] displayNames) { SendDto(new ScreenDataDto(selectedScreen, displayNames)); @@ -113,9 +123,10 @@ namespace Remotely.ScreenCast.Core.Communication PeerConnection.CreateAnswer(); } } - private void CaptureChannel_MessageReceived(byte[] obj) + private async void CaptureChannel_MessageReceived(byte[] obj) { Logger.Debug($"DataChannel message received. Size: {obj.Length}"); + await RtcMessageHandler.ParseMessage(obj); } private async void CaptureChannel_StateChanged() diff --git a/ScreenCast.Core/Interfaces/IAudioCapturer.cs b/ScreenCast.Core/Interfaces/IAudioCapturer.cs index 9986eb4e..26a802c9 100644 --- a/ScreenCast.Core/Interfaces/IAudioCapturer.cs +++ b/ScreenCast.Core/Interfaces/IAudioCapturer.cs @@ -1,7 +1,10 @@ -namespace Remotely.ScreenCast.Core.Interfaces +using System; + +namespace Remotely.ScreenCast.Core.Interfaces { public interface IAudioCapturer { + event EventHandler AudioSampleReady; void ToggleAudio(bool toggleOn); } } diff --git a/ScreenCast.Core/Models/Viewer.cs b/ScreenCast.Core/Models/Viewer.cs index 8fc8f272..55addde4 100644 --- a/ScreenCast.Core/Models/Viewer.cs +++ b/ScreenCast.Core/Models/Viewer.cs @@ -11,19 +11,33 @@ namespace Remotely.ScreenCast.Core.Models { private int imageQuality; - public Viewer(IScreenCapturer screenCapturer, - CasterSocket casterSocket) + public Viewer(CasterSocket casterSocket, + IScreenCapturer screenCapturer, + IClipboardService clipboardService, + IWebRtcSessionFactory webRtcSessionFactory, + IAudioCapturer audioCapturer) { Capturer = screenCapturer; CasterSocket = casterSocket; + WebRtcSessionFactory = webRtcSessionFactory; EncoderParams = new EncoderParameters(); ImageQuality = 60; + ClipboardService = clipboardService; + ClipboardService.ClipboardTextChanged += ClipboardService_ClipboardTextChanged; + AudioCapturer = audioCapturer; + AudioCapturer.AudioSampleReady += AudioCapturer_AudioSampleReady; } + public bool AutoAdjustQuality { get; set; } = true; + public IScreenCapturer Capturer { get; } + public bool DisconnectRequested { get; set; } + public EncoderParameters EncoderParams { get; private set; } + public bool HasControl { get; set; } = true; + public int ImageQuality { get @@ -47,26 +61,34 @@ namespace Remotely.ScreenCast.Core.Models } public bool IsConnected => CasterSocket.IsConnected; + public string Name { get; set; } + public WebRtcSession RtcSession { get; set; } + public string ViewerConnectionID { get; set; } + public int WebSocketBuffer { get; set; } + + private IAudioCapturer AudioCapturer { get; } + private CasterSocket CasterSocket { get; } - public void Disconnect() - { - RtcSession.Dispose(); - } + + private IClipboardService ClipboardService { get; } + + private IWebRtcSessionFactory WebRtcSessionFactory { get; } public void Dispose() { RtcSession?.Dispose(); + Capturer?.Dispose(); } public async Task InitializeWebRtc() { try { - RtcSession = new WebRtcSession(); + RtcSession = WebRtcSessionFactory.GetNewSession(this); RtcSession.LocalSdpReady += async (sender, sdp) => { await CasterSocket.SendRtcOfferToBrowser(sdp, ViewerConnectionID); @@ -93,6 +115,12 @@ namespace Remotely.ScreenCast.Core.Models return RtcSession?.IsPeerConnected == true && RtcSession?.IsDataChannelOpen == true; } + public async Task SendAudioSample(byte[] audioSample) + { + await SendToViewer(() => RtcSession.SendAudioSample(audioSample), + () => CasterSocket.SendAudioSample(audioSample, ViewerConnectionID)); + } + public async Task SendClipboardText(string clipboardText) { await SendToViewer(() => RtcSession.SendClipboardText(clipboardText), @@ -101,11 +129,11 @@ namespace Remotely.ScreenCast.Core.Models public async Task SendMachineName(string machineName, string viewerID) { - await SendToViewer(()=> RtcSession.SendMachineName(machineName), + await SendToViewer(() => RtcSession.SendMachineName(machineName), () => CasterSocket.SendMachineName(machineName, viewerID)); } - public async Task SendScreenCapture(byte[] encodedImageBytes, string viewerID, int left, int top, int width, int height, int imageQuality) + public async Task SendScreenCapture(byte[] encodedImageBytes, string viewerID, int left, int top, int width, int height) { await SendToViewer(() => { @@ -113,7 +141,7 @@ namespace Remotely.ScreenCast.Core.Models WebSocketBuffer = 0; }, async () => { - await CasterSocket.SendScreenCapture(encodedImageBytes, viewerID, left, top, width, height, imageQuality); + await CasterSocket.SendScreenCapture(encodedImageBytes, viewerID, left, top, width, height, ImageQuality); WebSocketBuffer += encodedImageBytes.Length; }); } @@ -154,6 +182,14 @@ namespace Remotely.ScreenCast.Core.Models } } + private async void AudioCapturer_AudioSampleReady(object sender, byte[] sample) + { + await SendAudioSample(sample); + } + private async void ClipboardService_ClipboardTextChanged(object sender, string clipboardText) + { + await SendClipboardText(clipboardText); + } private Task SendToViewer(Action webRtcSend, Func websocketSend) { if (IsUsingWebRtc()) diff --git a/ScreenCast.Core/ScreenCast.Core.csproj b/ScreenCast.Core/ScreenCast.Core.csproj index b21e8363..289d3d75 100644 --- a/ScreenCast.Core/ScreenCast.Core.csproj +++ b/ScreenCast.Core/ScreenCast.Core.csproj @@ -34,6 +34,7 @@ + diff --git a/ScreenCast.Core/Services/RtcMessageHandler.cs b/ScreenCast.Core/Services/RtcMessageHandler.cs new file mode 100644 index 00000000..fe8cca07 --- /dev/null +++ b/ScreenCast.Core/Services/RtcMessageHandler.cs @@ -0,0 +1,216 @@ +using MessagePack; +using Remotely.ScreenCast.Core.Communication; +using Remotely.ScreenCast.Core.Interfaces; +using Remotely.ScreenCast.Core.Models; +using Remotely.Shared.Enums; +using Remotely.Shared.Models.RtcDtos; +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Text; +using System.Threading.Tasks; + +namespace Remotely.ScreenCast.Core.Services +{ + public interface IRtcMessageHandler + { + Task ParseMessage(byte[] message); + } + public class RtcMessageHandler : IRtcMessageHandler + { + private Viewer Viewer { get; } + + public RtcMessageHandler(Viewer viewer, + CasterSocket casterSocket, + IKeyboardMouseInput keyboardMouseInput, + IAudioCapturer audioCapturer, + IClipboardService clipboardService) + { + Viewer = viewer; + CasterSocket = casterSocket; + KeyboardMouseInput = keyboardMouseInput; + AudioCapturer = audioCapturer; + ClipboardService = clipboardService; + } + + private CasterSocket CasterSocket { get; } + private IKeyboardMouseInput KeyboardMouseInput { get; } + private IAudioCapturer AudioCapturer { get; } + private IClipboardService ClipboardService { get; } + + public async Task ParseMessage(byte[] message) + { + try + { + if (!Viewer.HasControl) + { + return; + } + + var baseDto = MessagePackSerializer.Deserialize(message); + switch (baseDto.DtoType) + { + case BinaryDtoType.SelectScreen: + SelectScreen(message); + break; + case BinaryDtoType.MouseMove: + MouseMove(message); + break; + case BinaryDtoType.MouseDown: + MouseDown(message); + break; + case BinaryDtoType.MouseUp: + MouseUp(message); + break; + case BinaryDtoType.Tap: + Tap(message); + break; + case BinaryDtoType.MouseWheel: + MouseWheel(message); + break; + case BinaryDtoType.KeyDown: + KeyDown(message); + break; + case BinaryDtoType.KeyUp: + KeyUp(message); + break; + case BinaryDtoType.CtrlAltDel: + await CasterSocket.SendCtrlAltDel(); + break; + case BinaryDtoType.AutoQualityAdjust: + SetAutoQualityAdjust(message); + break; + case BinaryDtoType.ToggleAudio: + ToggleAudio(message); + break; + case BinaryDtoType.ToggleBlockInput: + ToggleBlockInput(message); + break; + case BinaryDtoType.ClipboardTransfer: + ClipboardTransfer(message); + break; + case BinaryDtoType.KeyPress: + await KeyPress(message); + break; + case BinaryDtoType.QualityChange: + QualityChange(message); + break; + default: + break; + } + } + catch (Exception ex) + { + Logger.Write(ex); + } + } + + private void QualityChange(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + Viewer.ImageQuality = dto.QualityLevel; + } + + private async Task KeyPress(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + KeyboardMouseInput.SendKeyDown(dto.Key, Viewer); + await Task.Delay(1); + KeyboardMouseInput.SendKeyUp(dto.Key, Viewer); + } + + private void ClipboardTransfer(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + if (dto.TypeText) + { + KeyboardMouseInput.SendText(dto.Text, Viewer); + } + else + { + ClipboardService.SetText(dto.Text); + } + } + + private void ToggleBlockInput(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + KeyboardMouseInput.ToggleBlockInput(dto.ToggleOn); + } + + private void ToggleAudio(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + AudioCapturer.ToggleAudio(dto.ToggleOn); + } + + private void SetAutoQualityAdjust(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + Viewer.AutoAdjustQuality = dto.IsOn; + } + + private void KeyUp(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + KeyboardMouseInput.SendKeyUp(dto.Key, Viewer); + } + + private void KeyDown(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + KeyboardMouseInput.SendKeyDown(dto.Key, Viewer); + } + + private void MouseWheel(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + KeyboardMouseInput.SendMouseWheel(-(int)dto.DeltaY, Viewer); + } + + private void Tap(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + KeyboardMouseInput.SendLeftMouseDown(dto.PercentX, dto.PercentY, Viewer); + KeyboardMouseInput.SendLeftMouseUp(dto.PercentX, dto.PercentY, Viewer); + } + + private void MouseUp(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + if (dto.Button == 0) + { + KeyboardMouseInput.SendLeftMouseUp(dto.PercentX, dto.PercentY, Viewer); + } + else if (dto.Button == 2) + { + KeyboardMouseInput.SendRightMouseUp(dto.PercentX, dto.PercentY, Viewer); + } + } + + private void MouseDown(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + if (dto.Button == 0) + { + KeyboardMouseInput.SendLeftMouseDown(dto.PercentX, dto.PercentY, Viewer); + } + else if (dto.Button == 2) + { + KeyboardMouseInput.SendRightMouseDown(dto.PercentX, dto.PercentY, Viewer); + } + } + + private void MouseMove(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + KeyboardMouseInput.SendMouseMove(dto.PercentX, dto.PercentY, Viewer); + } + + private void SelectScreen(byte[] message) + { + var dto = MessagePackSerializer.Deserialize(message); + Viewer.Capturer.SetSelectedScreen(dto.DisplayName); + } + } +} diff --git a/ScreenCast.Core/Services/ScreenCasterBase.cs b/ScreenCast.Core/Services/ScreenCasterBase.cs index b8f940b1..2c8036b6 100644 --- a/ScreenCast.Core/Services/ScreenCasterBase.cs +++ b/ScreenCast.Core/Services/ScreenCasterBase.cs @@ -100,7 +100,7 @@ namespace Remotely.ScreenCast.Core.Services if (encodedImageBytes?.Length > 0) { - await viewer.SendScreenCapture(encodedImageBytes, viewerID, diffArea.Left, diffArea.Top, diffArea.Width, diffArea.Height, viewer.ImageQuality); + await viewer.SendScreenCapture(encodedImageBytes, viewerID, diffArea.Left, diffArea.Top, diffArea.Width, diffArea.Height); } } } @@ -117,10 +117,6 @@ namespace Remotely.ScreenCast.Core.Services { viewer.Dispose(); - viewer.Capturer.Dispose(); - - viewer.Disconnect(); - } catch (Exception ex) { diff --git a/ScreenCast.Core/Services/WebRtcSessionFactory.cs b/ScreenCast.Core/Services/WebRtcSessionFactory.cs new file mode 100644 index 00000000..c4e23b10 --- /dev/null +++ b/ScreenCast.Core/Services/WebRtcSessionFactory.cs @@ -0,0 +1,42 @@ +using Remotely.ScreenCast.Core.Communication; +using Remotely.ScreenCast.Core.Interfaces; +using Remotely.ScreenCast.Core.Models; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Remotely.ScreenCast.Core.Services +{ + public interface IWebRtcSessionFactory + { + WebRtcSession GetNewSession(Viewer viewer); + } + + public class WebRtcSessionFactory : IWebRtcSessionFactory + { + public WebRtcSessionFactory(CasterSocket casterSocket, + IKeyboardMouseInput keyboardMouseInput, + IAudioCapturer audioCapturer, + IClipboardService clipboardService) + { + CasterSocket = casterSocket; + KeyboardMouseInput = keyboardMouseInput; + AudioCapturer = audioCapturer; + ClipboardService = clipboardService; + } + public WebRtcSession GetNewSession(Viewer viewer) + { + var messageHandler = new RtcMessageHandler(viewer, + CasterSocket, + KeyboardMouseInput, + AudioCapturer, + ClipboardService); + + return new WebRtcSession(messageHandler); + } + private CasterSocket CasterSocket { get; } + private IKeyboardMouseInput KeyboardMouseInput { get; } + private IAudioCapturer AudioCapturer { get; } + private IClipboardService ClipboardService { get; } + } +} diff --git a/ScreenCast.Linux/Services/AudioCapturerLinux.cs b/ScreenCast.Linux/Services/AudioCapturerLinux.cs index 5e899553..99d67df9 100644 --- a/ScreenCast.Linux/Services/AudioCapturerLinux.cs +++ b/ScreenCast.Linux/Services/AudioCapturerLinux.cs @@ -1,9 +1,14 @@ using Remotely.ScreenCast.Core.Interfaces; +using System; namespace Remotely.ScreenCast.Linux.Services { public class AudioCapturerLinux : IAudioCapturer { +#pragma warning disable + public event EventHandler AudioSampleReady; +#pragma warning restore + public void ToggleAudio(bool toggleOn) { // Not implemented. diff --git a/ScreenCast.Win/Program.cs b/ScreenCast.Win/Program.cs index e6aa86fd..5bca8ce4 100644 --- a/ScreenCast.Win/Program.cs +++ b/ScreenCast.Win/Program.cs @@ -78,6 +78,7 @@ namespace Remotely.ScreenCast.Win serviceCollection.AddSingleton(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); + serviceCollection.AddScoped(); ServiceContainer.Instance = serviceCollection.BuildServiceProvider(); } diff --git a/ScreenCast.Win/Services/AudioCapturerWin.cs b/ScreenCast.Win/Services/AudioCapturerWin.cs index 09afc36c..26c8355e 100644 --- a/ScreenCast.Win/Services/AudioCapturerWin.cs +++ b/ScreenCast.Win/Services/AudioCapturerWin.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; @@ -11,6 +12,7 @@ namespace Remotely.ScreenCast.Win.Services { public class AudioCapturerWin : IAudioCapturer { + public event EventHandler AudioSampleReady; private WasapiLoopbackCapture Capturer { get; set; } private Stopwatch SendTimer { get; set; } private WaveFormat TargetFormat { get; set; } @@ -27,7 +29,7 @@ namespace Remotely.ScreenCast.Win.Services } } - private async void SendTempBuffer() + private void SendTempBuffer() { if (TempBuffer.Count == 0) { @@ -51,8 +53,7 @@ namespace Remotely.ScreenCast.Win.Services { WaveFileWriter.WriteWavFileToStream(ms3, resampler); } - var conductor = ServiceContainer.Instance.GetRequiredService(); - await conductor.CasterSocket.SendAudioSample(ms3.ToArray(), Program.Conductor.Viewers.Keys.ToList()); + AudioSampleReady?.Invoke(this, ms3.ToArray()); } } } @@ -77,7 +78,7 @@ namespace Remotely.ScreenCast.Win.Services SendTimer.Restart(); } TempBuffer.AddRange(args.Buffer.Take(args.BytesRecorded)); - if (TempBuffer.Count > 200000) + if (TempBuffer.Count > 50000) { SendTimer.Reset(); SendTempBuffer(); diff --git a/ScreenCast.Win/Services/ScreenCapturerWin.cs b/ScreenCast.Win/Services/ScreenCapturerWin.cs index 82b8fd97..d88df033 100644 --- a/ScreenCast.Win/Services/ScreenCapturerWin.cs +++ b/ScreenCast.Win/Services/ScreenCapturerWin.cs @@ -45,8 +45,8 @@ namespace Remotely.ScreenCast.Win.Services private bool directXCapable = true; public ScreenCapturerWin() { - SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; Init(); + SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; } public event EventHandler ScreenChanged; diff --git a/Server/Services/RCDeviceSocketHub.cs b/Server/Services/RCDeviceSocketHub.cs index 571bffc5..35b7ed88 100644 --- a/Server/Services/RCDeviceSocketHub.cs +++ b/Server/Services/RCDeviceSocketHub.cs @@ -152,9 +152,9 @@ namespace Remotely.Server.Services return Task.CompletedTask; } - public Task SendAudioSample(byte[] buffer, List viewerIDs) + public Task SendAudioSample(byte[] buffer, string viewerID) { - return RCBrowserHub.Clients.Clients(viewerIDs).SendAsync("AudioSample", buffer); + return RCBrowserHub.Clients.Client(viewerID).SendAsync("AudioSample", buffer); } public Task SendClipboardText(string clipboardText, string viewerID) diff --git a/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js b/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js index 51e060c2..d43bca32 100644 --- a/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js +++ b/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js @@ -15,7 +15,7 @@ export class ClipboardWatcher { if (this.LastClipboardText != newText) { this.LastClipboardText = newText; ClipboardTransferTextArea.value = newText; - MainRc.RCBrowserSockets.SendClipboardTransfer(newText, false); + MainRc.MessageSender.SendClipboardTransfer(newText, false); } }); }, 100); diff --git a/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js.map b/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js.map index 72f1f67f..f83f8e0d 100644 --- a/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js.map +++ b/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.js.map @@ -1 +1 @@ -{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["ClipboardWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,OAAO,gBAAgB;IAKzB,cAAc;QACV,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC9C,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC;YAErC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,IAAI,IAAI,CAAC,eAAe,EAAE;oBACtB,OAAO;iBACV;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE;oBACtB,OAAO;iBACV;gBAED,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC1C,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,EAAE;wBACnC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;wBACjC,yBAAyB,CAAC,KAAK,GAAG,OAAO,CAAC;wBAC1C,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;qBACjE;gBACL,CAAC,CAAC,CAAA;YACN,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,yBAAyB,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC;CACJ"} \ No newline at end of file +{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["ClipboardWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,OAAO,gBAAgB;IAKzB,cAAc;QACV,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC9C,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC;YAErC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,IAAI,IAAI,CAAC,eAAe,EAAE;oBACtB,OAAO;iBACV;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE;oBACtB,OAAO;iBACV;gBAED,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC1C,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,EAAE;wBACnC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;wBACjC,yBAAyB,CAAC,KAAK,GAAG,OAAO,CAAC;wBAC1C,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;qBAC9D;gBACL,CAAC,CAAC,CAAA;YACN,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,yBAAyB,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC;CACJ"} \ No newline at end of file diff --git a/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.ts b/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.ts index 9450c861..565d18e5 100644 --- a/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.ts +++ b/Server/wwwroot/scripts/RemoteControl/ClipboardWatcher.ts @@ -22,7 +22,7 @@ export class ClipboardWatcher { if (this.LastClipboardText != newText) { this.LastClipboardText = newText; ClipboardTransferTextArea.value = newText; - MainRc.RCBrowserSockets.SendClipboardTransfer(newText, false); + MainRc.MessageSender.SendClipboardTransfer(newText, false); } }) }, 100); diff --git a/Server/wwwroot/scripts/RemoteControl/Main.js b/Server/wwwroot/scripts/RemoteControl/Main.js index fa13ad2e..f9107d97 100644 --- a/Server/wwwroot/scripts/RemoteControl/Main.js +++ b/Server/wwwroot/scripts/RemoteControl/Main.js @@ -5,10 +5,12 @@ import * as UI from "./UI.js"; import { RemoteControlMode } from "../Enums/RemoteControlMode.js"; import { ClipboardWatcher } from "./ClipboardWatcher.js"; import { RtcMessageHandler } from "./RtcMessageHandler.js"; +import { MessageSender } from "./MessageSender.js"; var queryString = Utilities.ParseSearchString(); export const MainRc = { ClipboardWatcher: new ClipboardWatcher(), Debug: false, + MessageSender: new MessageSender(), RCBrowserSockets: new RCBrowserSockets(), RtcMessageHandler: new RtcMessageHandler(), RtcSession: new RtcSession(), @@ -17,7 +19,7 @@ export const MainRc = { RequesterName: queryString["requesterName"] ? decodeURIComponent(queryString["requesterName"]) : "", Mode: RemoteControlMode.None, Init: () => { - UI.ApplyInputHandlers(MainRc.RCBrowserSockets); + UI.ApplyInputHandlers(); if (queryString["clientID"]) { MainRc.Mode = RemoteControlMode.Unattended; UI.ConnectBox.style.display = "none"; diff --git a/Server/wwwroot/scripts/RemoteControl/Main.js.map b/Server/wwwroot/scripts/RemoteControl/Main.js.map index 7a1d8cef..543c04e4 100644 --- a/Server/wwwroot/scripts/RemoteControl/Main.js.map +++ b/Server/wwwroot/scripts/RemoteControl/Main.js.map @@ -1 +1 @@ -{"version":3,"file":"Main.js","sourceRoot":"","sources":["Main.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,IAAI,WAAW,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC;AAEhD,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,gBAAgB,EAAE,IAAI,gBAAgB,EAAE;IACxC,KAAK,EAAE,KAAK;IACZ,gBAAgB,EAAE,IAAI,gBAAgB,EAAE;IACxC,iBAAiB,EAAE,IAAI,iBAAiB,EAAE;IAC1C,UAAU,EAAE,IAAI,UAAU,EAAE;IAC5B,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACpF,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACvF,aAAa,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACnG,IAAI,EAAE,iBAAiB,CAAC,IAAI;IAE5B,IAAI,EAAE,GAAG,EAAE;QACP,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAE/C,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE;YACzB,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,UAAU,CAAC;YAC3C,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACrC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;SACrC;aACI,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;YAC/B,EAAE,CAAC,cAAc,CAAC,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;YACvE,IAAI,WAAW,CAAC,eAAe,CAAC,EAAE;gBAC9B,EAAE,CAAC,kBAAkB,CAAC,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;SACJ;IACL,CAAC;IACD,eAAe,EAAE,GAAG,EAAE;QAClB,EAAE,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;QACjC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC;QACnD,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC;QACvC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,SAAS,GAAG,+BAA+B,CAAC;IACjE,CAAC;CACJ,CAAA;AAED,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"Main.js","sourceRoot":"","sources":["Main.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,IAAI,WAAW,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC;AAEhD,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,gBAAgB,EAAE,IAAI,gBAAgB,EAAE;IACxC,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI,aAAa,EAAE;IAClC,gBAAgB,EAAE,IAAI,gBAAgB,EAAE;IACxC,iBAAiB,EAAE,IAAI,iBAAiB,EAAE;IAC1C,UAAU,EAAE,IAAI,UAAU,EAAE;IAC5B,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACpF,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACvF,aAAa,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACnG,IAAI,EAAE,iBAAiB,CAAC,IAAI;IAE5B,IAAI,EAAE,GAAG,EAAE;QACP,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAExB,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE;YACzB,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,UAAU,CAAC;YAC3C,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACrC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;SACrC;aACI,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;YAC/B,EAAE,CAAC,cAAc,CAAC,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;YACvE,IAAI,WAAW,CAAC,eAAe,CAAC,EAAE;gBAC9B,EAAE,CAAC,kBAAkB,CAAC,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;SACJ;IACL,CAAC;IACD,eAAe,EAAE,GAAG,EAAE;QAClB,EAAE,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;QACjC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC;QACnD,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC;QACvC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,SAAS,GAAG,+BAA+B,CAAC;IACjE,CAAC;CACJ,CAAA;AAED,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/Server/wwwroot/scripts/RemoteControl/Main.ts b/Server/wwwroot/scripts/RemoteControl/Main.ts index 8c4fd16b..328d2788 100644 --- a/Server/wwwroot/scripts/RemoteControl/Main.ts +++ b/Server/wwwroot/scripts/RemoteControl/Main.ts @@ -5,6 +5,7 @@ import * as UI from "./UI.js"; import { RemoteControlMode } from "../Enums/RemoteControlMode.js"; import { ClipboardWatcher } from "./ClipboardWatcher.js"; import { RtcMessageHandler } from "./RtcMessageHandler.js"; +import { MessageSender } from "./MessageSender.js"; var queryString = Utilities.ParseSearchString(); @@ -12,6 +13,7 @@ var queryString = Utilities.ParseSearchString(); export const MainRc = { ClipboardWatcher: new ClipboardWatcher(), Debug: false, + MessageSender: new MessageSender(), RCBrowserSockets: new RCBrowserSockets(), RtcMessageHandler: new RtcMessageHandler(), RtcSession: new RtcSession(), @@ -21,7 +23,7 @@ export const MainRc = { Mode: RemoteControlMode.None, Init: () => { - UI.ApplyInputHandlers(MainRc.RCBrowserSockets); + UI.ApplyInputHandlers(); if (queryString["clientID"]) { MainRc.Mode = RemoteControlMode.Unattended; diff --git a/Server/wwwroot/scripts/RemoteControl/UI.js b/Server/wwwroot/scripts/RemoteControl/UI.js index b0a56d9c..d69f9a25 100644 --- a/Server/wwwroot/scripts/RemoteControl/UI.js +++ b/Server/wwwroot/scripts/RemoteControl/UI.js @@ -50,11 +50,11 @@ var lastPinchDistance; var isMenuButtonDragging; var startMenuDraggingY; var startLongPressTimeout; -export function ApplyInputHandlers(sockets) { +export function ApplyInputHandlers() { AudioButton.addEventListener("click", (ev) => { AudioButton.classList.toggle("toggled"); var toggleOn = AudioButton.classList.contains("toggled"); - sockets.SendToggleAudio(toggleOn); + MainRc.MessageSender.SendToggleAudio(toggleOn); }); ChangeScreenButton.addEventListener("click", (ev) => { closeAllHorizontalBars("screenSelectBar"); @@ -68,7 +68,7 @@ export function ApplyInputHandlers(sockets) { if (ClipboardTransferTextArea.value.length == 0) { return; } - sockets.SendClipboardTransfer(ClipboardTransferTextArea.value, ClipboardTransferTypeCheckbox.checked); + MainRc.MessageSender.SendClipboardTransfer(ClipboardTransferTextArea.value, ClipboardTransferTypeCheckbox.checked); ClipboardTransferTextArea.blur(); PopupMessage("Clipboard sent!"); }); @@ -81,7 +81,7 @@ export function ApplyInputHandlers(sockets) { return; } closeAllHorizontalBars(null); - MainRc.RCBrowserSockets.SendCtrlAltDel(); + MainRc.MessageSender.SendCtrlAltDel(); }); DisconnectButton.addEventListener("click", (ev) => { ConnectButton.removeAttribute("disabled"); @@ -118,10 +118,10 @@ export function ApplyInputHandlers(sockets) { var button = ev.currentTarget; button.classList.toggle("toggled"); if (button.classList.contains("toggled")) { - MainRc.RCBrowserSockets.SendToggleBlockInput(true); + MainRc.MessageSender.SendToggleBlockInput(true); } else { - MainRc.RCBrowserSockets.SendToggleBlockInput(false); + MainRc.MessageSender.SendToggleBlockInput(false); } }); InviteButton.addEventListener("click", (ev) => { @@ -168,10 +168,10 @@ export function ApplyInputHandlers(sockets) { QualityBar.classList.toggle("open"); }); QualitySlider.addEventListener("change", (ev) => { - sockets.SendQualityChange(Number(QualitySlider.value)); + MainRc.MessageSender.SendQualityChange(Number(QualitySlider.value)); }); AutoQualityAdjustCheckBox.addEventListener("change", ev => { - sockets.SendAutoQualityAdjust(AutoQualityAdjustCheckBox.checked); + MainRc.MessageSender.SendAutoQualityAdjust(AutoQualityAdjustCheckBox.checked); }); ScreenViewer.addEventListener("pointermove", function (e) { currentPointerDevice = e.pointerType; @@ -190,7 +190,7 @@ export function ApplyInputHandlers(sockets) { lastPointerMove = Date.now(); var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendMouseMove(percentX, percentY); + MainRc.MessageSender.SendMouseMove(percentX, percentY); }); ScreenViewer.addEventListener("mousedown", function (e) { if (currentPointerDevice == "touch") { @@ -202,7 +202,7 @@ export function ApplyInputHandlers(sockets) { e.preventDefault(); var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendMouseDown(e.button, percentX, percentY); + MainRc.MessageSender.SendMouseDown(e.button, percentX, percentY); }); ScreenViewer.addEventListener("mouseup", function (e) { if (currentPointerDevice == "touch") { @@ -214,7 +214,7 @@ export function ApplyInputHandlers(sockets) { e.preventDefault(); var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendMouseUp(e.button, percentX, percentY); + MainRc.MessageSender.SendMouseUp(e.button, percentX, percentY); }); ScreenViewer.addEventListener("click", function (e) { if (cancelNextViewerClick) { @@ -228,7 +228,7 @@ export function ApplyInputHandlers(sockets) { else if (currentPointerDevice == "touch" && currentTouchCount == 0) { var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendTap(percentX, percentY); + MainRc.MessageSender.SendTap(percentX, percentY); } }); ScreenViewer.addEventListener("touchstart", function (e) { @@ -237,8 +237,8 @@ export function ApplyInputHandlers(sockets) { startLongPressTimeout = window.setTimeout(() => { var percentX = e.touches[0].pageX / ScreenViewer.clientWidth; var percentY = e.touches[0].pageY / ScreenViewer.clientHeight; - sockets.SendMouseDown(2, percentX, percentY); - sockets.SendMouseUp(2, percentX, percentY); + MainRc.MessageSender.SendMouseDown(2, percentX, percentY); + MainRc.MessageSender.SendMouseUp(2, percentX, percentY); }, 1000); } if (currentTouchCount > 1) { @@ -287,7 +287,7 @@ export function ApplyInputHandlers(sockets) { else if (isDragging) { e.preventDefault(); e.stopPropagation(); - sockets.SendMouseMove(percentX, percentY); + MainRc.MessageSender.SendMouseMove(percentX, percentY); } }); ScreenViewer.addEventListener("touchend", function (e) { @@ -297,8 +297,8 @@ export function ApplyInputHandlers(sockets) { isDragging = true; var percentX = (e.touches[0].pageX - ScreenViewer.getBoundingClientRect().left) / ScreenViewer.clientWidth; var percentY = (e.touches[0].pageY - ScreenViewer.getBoundingClientRect().top) / ScreenViewer.clientHeight; - sockets.SendMouseMove(percentX, percentY); - sockets.SendMouseDown(0, percentX, percentY); + MainRc.MessageSender.SendMouseMove(percentX, percentY); + MainRc.MessageSender.SendMouseDown(0, percentX, percentY); return; } if (currentTouchCount == 0) { @@ -310,7 +310,7 @@ export function ApplyInputHandlers(sockets) { if (isDragging) { var percentX = (e.changedTouches[0].pageX - ScreenViewer.getBoundingClientRect().left) / ScreenViewer.clientWidth; var percentY = (e.changedTouches[0].pageY - ScreenViewer.getBoundingClientRect().top) / ScreenViewer.clientHeight; - sockets.SendMouseUp(0, percentX, percentY); + MainRc.MessageSender.SendMouseUp(0, percentX, percentY); } isDragging = false; }); @@ -319,17 +319,17 @@ export function ApplyInputHandlers(sockets) { }); ScreenViewer.addEventListener("wheel", function (e) { e.preventDefault(); - sockets.SendMouseWheel(e.deltaX, e.deltaY); + MainRc.MessageSender.SendMouseWheel(e.deltaX, e.deltaY); }); TouchKeyboardTextArea.addEventListener("input", (ev) => { if (TouchKeyboardTextArea.value.length == 1) { - sockets.SendKeyPress("Backspace"); + MainRc.MessageSender.SendKeyPress("Backspace"); } else if (TouchKeyboardTextArea.value.endsWith("\n")) { - sockets.SendKeyPress("Enter"); + MainRc.MessageSender.SendKeyPress("Enter"); } else if (TouchKeyboardTextArea.value.endsWith(" ")) { - sockets.SendKeyPress(" "); + MainRc.MessageSender.SendKeyPress(" "); } else { var input = TouchKeyboardTextArea.value.trim().substr(1); @@ -337,11 +337,11 @@ export function ApplyInputHandlers(sockets) { var character = input.charAt(i); var sendShift = character.match(/[A-Z~!@#$%^&*()_+{}|<>?]/); if (sendShift) { - sockets.SendKeyDown("Shift"); + MainRc.MessageSender.SendKeyDown("Shift"); } - sockets.SendKeyPress(character); + MainRc.MessageSender.SendKeyPress(character); if (sendShift) { - sockets.SendKeyUp("Shift"); + MainRc.MessageSender.SendKeyUp("Shift"); } } } @@ -355,14 +355,14 @@ export function ApplyInputHandlers(sockets) { return; } e.preventDefault(); - sockets.SendKeyDown(e.key); + MainRc.MessageSender.SendKeyDown(e.key); }); window.addEventListener("keyup", function (e) { if (document.querySelector("input:focus") || document.querySelector("textarea:focus")) { return; } e.preventDefault(); - sockets.SendKeyUp(e.key); + MainRc.MessageSender.SendKeyUp(e.key); }); window.ondragover = function (e) { e.preventDefault(); @@ -451,34 +451,34 @@ export function UpdateDisplays(selectedDisplay, displayNames) { } } function uploadFiles(fileList) { - ShowMessage("File upload started..."); - FileTransferProgress.value = 0; - FileTransferProgress.parentElement.removeAttribute("hidden"); - var strPath = "/API/FileSharing/"; - var fd = new FormData(); - for (var i = 0; i < fileList.length; i++) { - fd.append('fileUpload' + i, fileList[i]); - } - var xhr = new XMLHttpRequest(); - xhr.open('POST', strPath, true); - xhr.addEventListener("load", function () { - FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); - if (xhr.status === 200) { - ShowMessage("File upload completed."); - MainRc.RCBrowserSockets.SendSharedFileIDs(xhr.responseText); - } - else { - ShowMessage("File upload failed."); - } - }); - xhr.addEventListener("error", () => { - FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); - ShowMessage("File upload failed."); - }); - xhr.addEventListener("progress", function (e) { - FileTransferProgress.value = isFinite(e.loaded / e.total) ? e.loaded / e.total : 0; - }); - xhr.send(fd); + //ShowMessage("File upload started..."); + //FileTransferProgress.value = 0; + //FileTransferProgress.parentElement.removeAttribute("hidden"); + //var strPath = "/API/FileSharing/"; + //var fd = new FormData(); + //for (var i = 0; i < fileList.length; i++) { + // fd.append('fileUpload' + i, fileList[i]); + //} + //var xhr = new XMLHttpRequest(); + //xhr.open('POST', strPath, true); + //xhr.addEventListener("load", function () { + // FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); + // if (xhr.status === 200) { + // ShowMessage("File upload completed."); + // MainRc.RCBrowserSockets.SendSharedFileIDs(xhr.responseText); + // } + // else { + // ShowMessage("File upload failed."); + // } + //}); + //xhr.addEventListener("error", () => { + // FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); + // ShowMessage("File upload failed."); + //}); + //xhr.addEventListener("progress", function (e) { + // FileTransferProgress.value = isFinite(e.loaded / e.total) ? e.loaded / e.total : 0; + //}); + //xhr.send(fd); } function closeAllHorizontalBars(exceptBarId) { HorizontalBars.forEach(x => { diff --git a/Server/wwwroot/scripts/RemoteControl/UI.js.map b/Server/wwwroot/scripts/RemoteControl/UI.js.map index 069e03ff..e73588d7 100644 --- a/Server/wwwroot/scripts/RemoteControl/UI.js.map +++ b/Server/wwwroot/scripts/RemoteControl/UI.js.map @@ -1 +1 @@ -{"version":3,"file":"UI.js","sourceRoot":"","sources":["UI.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"UI.js","sourceRoot":"","sources":["UI.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAGhF,MAAM,CAAC,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAsB,CAAC;AACrF,MAAM,CAAC,IAAI,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAsB,CAAC;AACnF,MAAM,CAAC,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAmB,CAAC;AAC9E,MAAM,CAAC,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAqB,CAAC;AAC1F,MAAM,CAAC,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAsB,CAAC;AACzF,MAAM,CAAC,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAqB,CAAC;AACzF,MAAM,CAAC,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAmB,CAAC;AACtF,MAAM,CAAC,IAAI,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAsB,CAAC;AACvF,MAAM,CAAC,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAmB,CAAC;AAClG,MAAM,CAAC,IAAI,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC3D,MAAM,CAAC,IAAI,cAAc,GAAG,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;AAChF,MAAM,CAAC,IAAI,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAmB,CAAC;AAChF,MAAM,CAAC,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAmB,CAAC;AAC1F,MAAM,CAAC,IAAI,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAmB,CAAC;AAChF,MAAM,CAAC,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAqB,CAAC;AAC5F,MAAM,CAAC,IAAI,yBAAyB,GAAG,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAqB,CAAC;AAChH,MAAM,CAAC,IAAI,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAmB,CAAC;AAChF,MAAM,CAAC,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAmB,CAAC;AAC1E,MAAM,CAAC,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAsB,CAAC;AACnG,MAAM,CAAC,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAsB,CAAC;AACzF,MAAM,CAAC,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAsB,CAAC;AACjG,MAAM,CAAC,IAAI,gBAAgB,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAsB,CAAC;AAC/F,MAAM,CAAC,IAAI,gBAAgB,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAsB,CAAC;AAC/F,MAAM,CAAC,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAqB,CAAC;AAChG,MAAM,CAAC,IAAI,oBAAoB,GAAG,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAwB,CAAC;AACzG,MAAM,CAAC,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAsB,CAAC;AAC3F,MAAM,CAAC,IAAI,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAsB,CAAC;AACvF,MAAM,CAAC,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAsB,CAAC;AACnG,MAAM,CAAC,IAAI,gBAAgB,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAsB,CAAC;AAC/F,MAAM,CAAC,IAAI,qBAAqB,GAAG,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAwB,CAAC;AAC3G,MAAM,CAAC,IAAI,oBAAoB,GAAG,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAmB,CAAC;AACpG,MAAM,CAAC,IAAI,yBAAyB,GAAG,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAwB,CAAC;AACnH,MAAM,CAAC,IAAI,uBAAuB,GAAG,QAAQ,CAAC,cAAc,CAAC,yBAAyB,CAAsB,CAAC;AAC7G,MAAM,CAAC,IAAI,6BAA6B,GAAG,QAAQ,CAAC,cAAc,CAAC,+BAA+B,CAAqB,CAAC;AACxH,MAAM,CAAC,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAgB,CAAC;AAC3F,MAAM,CAAC,IAAI,qBAAqB,GAAG,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAgB,CAAC;AAEnG,IAAI,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACjC,IAAI,UAAmB,CAAC;AACxB,IAAI,oBAA4B,CAAC;AACjC,IAAI,iBAAyB,CAAC;AAC9B,IAAI,qBAA8B,CAAC;AACnC,IAAI,cAAuB,CAAC;AAC5B,IAAI,gBAAuB,CAAC;AAC5B,IAAI,gBAAuB,CAAC;AAC5B,IAAI,iBAAyB,CAAC;AAC9B,IAAI,oBAA6B,CAAC;AAClC,IAAI,kBAA0B,CAAC;AAC/B,IAAI,qBAA6B,CAAC;AAElC,MAAM,UAAU,kBAAkB;IAC9B,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QACzC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAChD,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;QAC1C,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QACrD,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;QAC/C,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,yBAAyB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QACvD,IAAI,yBAAyB,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;YAC7C,OAAO;SACV;QACD,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,KAAK,EAAE,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACnH,yBAAyB,CAAC,IAAI,EAAE,CAAC;QACjC,YAAY,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC3C,MAAM,CAAC,eAAe,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,gBAAgB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC9C,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YACnB,WAAW,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO;SACV;QACD,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,gBAAgB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC9C,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;YAC1C,MAAM,CAAC,KAAK,EAAE,CAAC;SAClB;IACL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACjE,CAAC,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAiB,EAAE,EAAE;YACjD,IAAI,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE;gBACjC,MAAM,CAAC,eAAe,EAAE,CAAC;aAC5B;QACL,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAC;IACH,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAChD,iBAAiB,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,iBAAiB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;QAChD,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC/C,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACjD,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC/C,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;SACnD;aACI;YACD,YAAY,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;YACtC,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;SAC1C;IACL,CAAC,CAAC,CAAC;IACH,gBAAgB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC9C,IAAI,MAAM,GAAG,EAAE,CAAC,aAAkC,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACtC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;SACnD;aACI;YACD,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;SACpD;IACL,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC1C,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,MAAM,CAAC,IAAI,IAAI,iBAAiB,CAAC,MAAM,EAAE;YACzC,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC;SAC/E;aACI;YACD,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,aAAa,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC;SAC5G;QACD,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9C,YAAY,CAAC,2BAA2B,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC5C,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7B,qBAAqB,CAAC,KAAK,EAAE,CAAC;QAC9B,qBAAqB,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChH,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QACxC,IAAI,oBAAoB,EAAE;YACtB,oBAAoB,GAAG,KAAK,CAAC;YAC7B,OAAO;SACV;QACD,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE;QAC5C,oBAAoB,GAAG,KAAK,CAAC;QAC7B,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAAC;QAChC,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;QACrE,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,gCAAgC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE;QAC5C,EAAE,CAAC,cAAc,EAAE,CAAC;QACpB,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAC3C,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACrC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAA;IACF,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;QAC5C,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,yBAAyB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;QACtD,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,aAAa,EAAE,UAAU,CAAC;QACpD,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,aAAa,EAAE,UAAU,CAAC;QACpD,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,cAAc,EAAE,UAAU,CAAC;QACrD,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC;QAClD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,EAAE,EAAE;YACnC,OAAO;SACV;QACD,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC;QACpD,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC;QAClD,IAAI,oBAAoB,IAAI,OAAO,EAAE;YACjC,OAAO;SACV;QACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;YAChC,OAAO;SACV;QACD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC;QACpD,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC;QAChD,IAAI,oBAAoB,IAAI,OAAO,EAAE;YACjC,OAAO;SACV;QACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;YAChC,OAAO;SACV;QACD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC;QACpD,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;QAC9C,IAAI,qBAAqB,EAAE;YACvB,qBAAqB,GAAG,KAAK,CAAC;YAC9B,OAAO;SACV;QACD,IAAI,oBAAoB,IAAI,OAAO,EAAE;YACjC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;SACvB;aACI,IAAI,oBAAoB,IAAI,OAAO,IAAI,iBAAiB,IAAI,CAAC,EAAE;YAChE,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC;YACpD,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC;YACrD,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SACpD;IACL,CAAC,CAAC,CAAC;IAEH,YAAY,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,CAAC;QACnD,iBAAiB,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAErC,IAAI,iBAAiB,IAAI,CAAC,EAAE;YACxB,qBAAqB,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBAC3C,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC;gBAC7D,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC;gBAC9D,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC1D,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC,EAAE,IAAI,CAAC,CAAC;SACZ;QAED,IAAI,iBAAiB,GAAG,CAAC,EAAE;YACvB,qBAAqB,GAAG,IAAI,CAAC;SAChC;QACD,IAAI,iBAAiB,IAAI,CAAC,EAAE;YACxB,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACpF,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACpF,iBAAiB,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,EACrD,gBAAgB,CAAC,CAAC,EAClB,gBAAgB,CAAC,CAAC,EAClB,gBAAgB,CAAC,CAAC,CAAC,CAAC;SAC3B;QACD,UAAU,GAAG,KAAK,CAAC;QACnB,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAqB,CAAC;QAC7E,IAAI,YAAY,EAAE;YACd,YAAY,CAAC,IAAI,EAAE,CAAC;SACvB;IACL,CAAC,CAAC,CAAC;IAEH,YAAY,CAAC,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC;QAClD,iBAAiB,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAErC,YAAY,CAAC,qBAAqB,CAAC,CAAC;QAEpC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;QAC3G,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC;QAE3G,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;YACvB,IAAI,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACnF,IAAI,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACnF,IAAI,aAAa,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC,EAChD,WAAW,CAAC,CAAC,EACb,WAAW,CAAC,CAAC,EACb,WAAW,CAAC,CAAC,CAAC,CAAC;YAEnB,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE;gBACjD,cAAc,GAAG,IAAI,CAAC;gBACtB,IAAI,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;oBACjD,iBAAiB,CAAC,KAAK,EAAE,CAAC;iBAC7B;gBACD,IAAI,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC;gBAC5C,IAAI,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC;gBAE9C,IAAI,mBAAmB,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,IAAI,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,CAAC,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC;gBAC/F,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC;gBAEzD,IAAI,YAAY,GAAG,YAAY,CAAC,YAAY,GAAG,aAAa,CAAC;gBAC7D,IAAI,WAAW,GAAG,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC;gBAC1D,IAAI,cAAc,GAAG,mBAAmB,CAAC,UAAU,GAAI,CAAC,mBAAmB,CAAC,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;gBAC3H,IAAI,cAAc,GAAG,mBAAmB,CAAC,SAAS,GAAG,CAAC,mBAAmB,CAAC,YAAY,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAC3H,mBAAmB,CAAC,QAAQ,CAAC,WAAW,GAAG,cAAc,EAAE,YAAY,GAAG,cAAc,CAAC,CAAC;gBAE1F,iBAAiB,GAAG,aAAa,CAAC;aACrC;YACD,OAAO;SACV;aACI,IAAI,UAAU,EAAE;YACjB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC1D;IACL,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC;QACjD,iBAAiB,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAErC,YAAY,CAAC,qBAAqB,CAAC,CAAC;QAEpC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAC1C,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;YAC3G,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC;YAC3G,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC1D,OAAO;SACV;QAED,IAAI,iBAAiB,IAAI,CAAC,EAAE;YACxB,qBAAqB,GAAG,KAAK,CAAC;YAC9B,cAAc,GAAG,KAAK,CAAC;YACvB,gBAAgB,GAAG,IAAI,CAAC;YACxB,gBAAgB,GAAG,IAAI,CAAC;SAC3B;QAED,IAAI,UAAU,EAAE;YACZ,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;YAClH,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC;YAClH,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC3D;QAED,UAAU,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE;QAChD,EAAE,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;QAC9C,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,qBAAqB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QACnD,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;YACzC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;SAClD;aACI,IAAI,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACjD,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAC9C;aACI,IAAI,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAChD,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SAC1C;aACI;YACD,IAAI,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACnC,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC5D,IAAI,SAAS,EAAE;oBACX,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;iBAC7C;gBAED,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAE7C,IAAI,SAAS,EAAE;oBACX,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;iBAC3C;aACJ;SACJ;QAED,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACnB,qBAAqB,CAAC,KAAK,GAAG,IAAI,CAAC;YACnC,qBAAqB,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC;QAC1C,IAAI,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE;YACnF,OAAO;SACV;QACD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;QACxC,IAAI,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE;YACnF,OAAO;SACV;QACD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;QAC3B,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;QACvB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,OAAO;SACV;QACD,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,aAAqB;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEvC,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,UAAU,CAAC,SAAS,GAAG,aAAa,CAAC;QAErC,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAE3C,IAAI,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpD,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC;QAElC,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;QAE1B,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACrC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACjC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QACpC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEpC,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE;YACpB,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAA;QAED,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE;YACxB,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAA;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,MAAc;IACvD,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3B,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACvC,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/C,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1C,UAAU,CAAC,SAAS,GAAG,OAAO,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;QACnB,UAAU,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC,EAAE,IAAI,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC3C,IAAI,MAAM,CAAC,WAAW,EAAE;QACpB,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;KAClD;SACI,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,EAAE;QACxC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;KACzC;SACI;QACD,IAAI,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1D,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,8BAA8B,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC;KACzH;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,eAAuB,EAAE,YAAsB;IAC1E,eAAe,CAAC,SAAS,GAAG,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC9C,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE;YACpC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SACnC;QACD,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,GAAG,CAAC,EAAc,EAAE,EAAE;YAChC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,QAAQ,CAAC,gBAAgB,CAAC,yCAAyC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBAClF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YACF,EAAE,CAAC,aAAmC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrE,CAAC,CAAC;KACL;AACL,CAAC;AAED,SAAS,WAAW,CAAC,QAAkB;IACnC,wCAAwC;IACxC,iCAAiC;IACjC,+DAA+D;IAE/D,oCAAoC;IACpC,0BAA0B;IAC1B,6CAA6C;IAC7C,+CAA+C;IAC/C,GAAG;IACH,iCAAiC;IACjC,kCAAkC;IAClC,4CAA4C;IAC5C,0EAA0E;IAC1E,+BAA+B;IAC/B,gDAAgD;IAChD,sEAAsE;IACtE,OAAO;IACP,YAAY;IACZ,6CAA6C;IAC7C,OAAO;IACP,KAAK;IACL,uCAAuC;IACvC,0EAA0E;IAC1E,yCAAyC;IACzC,KAAK;IACL,iDAAiD;IACjD,yFAAyF;IACzF,KAAK;IACL,eAAe;AAEnB,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAmB;IAC/C,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACvB,IAAI,CAAC,CAAC,EAAE,IAAI,WAAW,EAAE;YACrB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC9B;IACL,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,cAAc,CAAC,EAAc;IAClC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE;QAC/C,IAAI,EAAE,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE;YACnD,OAAO;SACV;QACD,oBAAoB,GAAG,IAAI,CAAC;QAC5B,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC;KAC5C;AACL,CAAC;AAED,SAAS,gCAAgC,CAAC,EAAc;IACpD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;IACxE,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,gCAAgC,CAAC,CAAC;AAC/E,CAAC"} \ No newline at end of file diff --git a/Server/wwwroot/scripts/RemoteControl/UI.ts b/Server/wwwroot/scripts/RemoteControl/UI.ts index c38113e0..0e07e8bc 100644 --- a/Server/wwwroot/scripts/RemoteControl/UI.ts +++ b/Server/wwwroot/scripts/RemoteControl/UI.ts @@ -56,11 +56,11 @@ var isMenuButtonDragging: boolean; var startMenuDraggingY: number; var startLongPressTimeout: number; -export function ApplyInputHandlers(sockets: RCBrowserSockets) { +export function ApplyInputHandlers() { AudioButton.addEventListener("click", (ev) => { AudioButton.classList.toggle("toggled"); var toggleOn = AudioButton.classList.contains("toggled"); - sockets.SendToggleAudio(toggleOn); + MainRc.MessageSender.SendToggleAudio(toggleOn); }); ChangeScreenButton.addEventListener("click", (ev) => { closeAllHorizontalBars("screenSelectBar"); @@ -74,7 +74,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { if (ClipboardTransferTextArea.value.length == 0) { return; } - sockets.SendClipboardTransfer(ClipboardTransferTextArea.value, ClipboardTransferTypeCheckbox.checked); + MainRc.MessageSender.SendClipboardTransfer(ClipboardTransferTextArea.value, ClipboardTransferTypeCheckbox.checked); ClipboardTransferTextArea.blur(); PopupMessage("Clipboard sent!"); }); @@ -87,7 +87,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { return; } closeAllHorizontalBars(null); - MainRc.RCBrowserSockets.SendCtrlAltDel(); + MainRc.MessageSender.SendCtrlAltDel(); }); DisconnectButton.addEventListener("click", (ev) => { ConnectButton.removeAttribute("disabled"); @@ -124,10 +124,10 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { var button = ev.currentTarget as HTMLButtonElement; button.classList.toggle("toggled"); if (button.classList.contains("toggled")) { - MainRc.RCBrowserSockets.SendToggleBlockInput(true); + MainRc.MessageSender.SendToggleBlockInput(true); } else { - MainRc.RCBrowserSockets.SendToggleBlockInput(false); + MainRc.MessageSender.SendToggleBlockInput(false); } }); InviteButton.addEventListener("click", (ev) => { @@ -174,10 +174,10 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { QualityBar.classList.toggle("open"); }) QualitySlider.addEventListener("change", (ev) => { - sockets.SendQualityChange(Number(QualitySlider.value)); + MainRc.MessageSender.SendQualityChange(Number(QualitySlider.value)); }); AutoQualityAdjustCheckBox.addEventListener("change", ev => { - sockets.SendAutoQualityAdjust(AutoQualityAdjustCheckBox.checked); + MainRc.MessageSender.SendAutoQualityAdjust(AutoQualityAdjustCheckBox.checked); }); ScreenViewer.addEventListener("pointermove", function (e) { currentPointerDevice = e.pointerType; @@ -196,7 +196,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { lastPointerMove = Date.now(); var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendMouseMove(percentX, percentY); + MainRc.MessageSender.SendMouseMove(percentX, percentY); }); ScreenViewer.addEventListener("mousedown", function (e) { if (currentPointerDevice == "touch") { @@ -208,7 +208,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { e.preventDefault(); var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendMouseDown(e.button, percentX, percentY); + MainRc.MessageSender.SendMouseDown(e.button, percentX, percentY); }); ScreenViewer.addEventListener("mouseup", function (e) { if (currentPointerDevice == "touch") { @@ -220,7 +220,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { e.preventDefault(); var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendMouseUp(e.button, percentX, percentY); + MainRc.MessageSender.SendMouseUp(e.button, percentX, percentY); }); ScreenViewer.addEventListener("click", function (e) { @@ -235,7 +235,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { else if (currentPointerDevice == "touch" && currentTouchCount == 0) { var percentX = e.offsetX / ScreenViewer.clientWidth; var percentY = e.offsetY / ScreenViewer.clientHeight; - sockets.SendTap(percentX, percentY); + MainRc.MessageSender.SendTap(percentX, percentY); } }); @@ -246,8 +246,8 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { startLongPressTimeout = window.setTimeout(() => { var percentX = e.touches[0].pageX / ScreenViewer.clientWidth; var percentY = e.touches[0].pageY / ScreenViewer.clientHeight; - sockets.SendMouseDown(2, percentX, percentY); - sockets.SendMouseUp(2, percentX, percentY); + MainRc.MessageSender.SendMouseDown(2, percentX, percentY); + MainRc.MessageSender.SendMouseUp(2, percentX, percentY); }, 1000); } @@ -311,7 +311,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { else if (isDragging) { e.preventDefault(); e.stopPropagation(); - sockets.SendMouseMove(percentX, percentY); + MainRc.MessageSender.SendMouseMove(percentX, percentY); } }); ScreenViewer.addEventListener("touchend", function (e) { @@ -323,8 +323,8 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { isDragging = true; var percentX = (e.touches[0].pageX - ScreenViewer.getBoundingClientRect().left) / ScreenViewer.clientWidth; var percentY = (e.touches[0].pageY - ScreenViewer.getBoundingClientRect().top) / ScreenViewer.clientHeight; - sockets.SendMouseMove(percentX, percentY); - sockets.SendMouseDown(0, percentX, percentY); + MainRc.MessageSender.SendMouseMove(percentX, percentY); + MainRc.MessageSender.SendMouseDown(0, percentX, percentY); return; } @@ -338,7 +338,7 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { if (isDragging) { var percentX = (e.changedTouches[0].pageX - ScreenViewer.getBoundingClientRect().left) / ScreenViewer.clientWidth; var percentY = (e.changedTouches[0].pageY - ScreenViewer.getBoundingClientRect().top) / ScreenViewer.clientHeight; - sockets.SendMouseUp(0, percentX, percentY); + MainRc.MessageSender.SendMouseUp(0, percentX, percentY); } isDragging = false; @@ -348,17 +348,17 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { }); ScreenViewer.addEventListener("wheel", function (e) { e.preventDefault(); - sockets.SendMouseWheel(e.deltaX, e.deltaY); + MainRc.MessageSender.SendMouseWheel(e.deltaX, e.deltaY); }); TouchKeyboardTextArea.addEventListener("input", (ev) => { if (TouchKeyboardTextArea.value.length == 1) { - sockets.SendKeyPress("Backspace"); + MainRc.MessageSender.SendKeyPress("Backspace"); } else if (TouchKeyboardTextArea.value.endsWith("\n")) { - sockets.SendKeyPress("Enter"); + MainRc.MessageSender.SendKeyPress("Enter"); } else if (TouchKeyboardTextArea.value.endsWith(" ")) { - sockets.SendKeyPress(" "); + MainRc.MessageSender.SendKeyPress(" "); } else { var input = TouchKeyboardTextArea.value.trim().substr(1); @@ -366,13 +366,13 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { var character = input.charAt(i); var sendShift = character.match(/[A-Z~!@#$%^&*()_+{}|<>?]/); if (sendShift) { - sockets.SendKeyDown("Shift"); + MainRc.MessageSender.SendKeyDown("Shift"); } - sockets.SendKeyPress(character); + MainRc.MessageSender.SendKeyPress(character); if (sendShift) { - sockets.SendKeyUp("Shift"); + MainRc.MessageSender.SendKeyUp("Shift"); } } } @@ -387,14 +387,14 @@ export function ApplyInputHandlers(sockets: RCBrowserSockets) { return; } e.preventDefault(); - sockets.SendKeyDown(e.key); + MainRc.MessageSender.SendKeyDown(e.key); }); window.addEventListener("keyup", function (e) { if (document.querySelector("input:focus") || document.querySelector("textarea:focus")) { return; } e.preventDefault(); - sockets.SendKeyUp(e.key); + MainRc.MessageSender.SendKeyUp(e.key); }); window.ondragover = function (e) { @@ -499,35 +499,35 @@ export function UpdateDisplays(selectedDisplay: string, displayNames: string[]) } function uploadFiles(fileList: FileList) { - ShowMessage("File upload started..."); - FileTransferProgress.value = 0; - FileTransferProgress.parentElement.removeAttribute("hidden"); + //ShowMessage("File upload started..."); + //FileTransferProgress.value = 0; + //FileTransferProgress.parentElement.removeAttribute("hidden"); - var strPath = "/API/FileSharing/"; - var fd = new FormData(); - for (var i = 0; i < fileList.length; i++) { - fd.append('fileUpload' + i, fileList[i]); - } - var xhr = new XMLHttpRequest(); - xhr.open('POST', strPath, true); - xhr.addEventListener("load", function () { - FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); - if (xhr.status === 200) { - ShowMessage("File upload completed."); - MainRc.RCBrowserSockets.SendSharedFileIDs(xhr.responseText); - } - else { - ShowMessage("File upload failed."); - } - }); - xhr.addEventListener("error", () => { - FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); - ShowMessage("File upload failed."); - }); - xhr.addEventListener("progress", function (e) { - FileTransferProgress.value = isFinite(e.loaded / e.total) ? e.loaded / e.total : 0; - }); - xhr.send(fd); + //var strPath = "/API/FileSharing/"; + //var fd = new FormData(); + //for (var i = 0; i < fileList.length; i++) { + // fd.append('fileUpload' + i, fileList[i]); + //} + //var xhr = new XMLHttpRequest(); + //xhr.open('POST', strPath, true); + //xhr.addEventListener("load", function () { + // FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); + // if (xhr.status === 200) { + // ShowMessage("File upload completed."); + // MainRc.RCBrowserSockets.SendSharedFileIDs(xhr.responseText); + // } + // else { + // ShowMessage("File upload failed."); + // } + //}); + //xhr.addEventListener("error", () => { + // FileTransferProgress.parentElement.setAttribute("hidden", "hidden"); + // ShowMessage("File upload failed."); + //}); + //xhr.addEventListener("progress", function (e) { + // FileTransferProgress.value = isFinite(e.loaded / e.total) ? e.loaded / e.total : 0; + //}); + //xhr.send(fd); } diff --git a/Shared/Models/IBinaryDto.cs b/Shared/Models/IBinaryDto.cs deleted file mode 100644 index 88bdec3f..00000000 --- a/Shared/Models/IBinaryDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Remotely.Shared.Enums; - -namespace Remotely.Shared.Models -{ - public interface IBinaryDto - { - BinaryDtoType DtoType { get; } - } -} diff --git a/Shared/Models/RtcDtos/AudioSampleDto.cs b/Shared/Models/RtcDtos/AudioSampleDto.cs new file mode 100644 index 00000000..11d61b97 --- /dev/null +++ b/Shared/Models/RtcDtos/AudioSampleDto.cs @@ -0,0 +1,25 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class AudioSampleDto : BinaryDtoBase + { + public AudioSampleDto(byte[] audioSample) + { + Buffer = audioSample; + } + + [DataMember(Name = "Buffer")] + public byte[] Buffer { get; } + + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.AudioSample; + + } +} diff --git a/Shared/Models/RtcDtos/AutoQualityAdjustDto.cs b/Shared/Models/RtcDtos/AutoQualityAdjustDto.cs new file mode 100644 index 00000000..f7cde7e2 --- /dev/null +++ b/Shared/Models/RtcDtos/AutoQualityAdjustDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class AutoQualityAdjustDto : BinaryDtoBase + { + [DataMember(Name = "IsOn")] + public bool IsOn { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.AutoQualityAdjust; + } +} diff --git a/Shared/Models/RtcDtos/BinaryDtoBase.cs b/Shared/Models/RtcDtos/BinaryDtoBase.cs new file mode 100644 index 00000000..17e22251 --- /dev/null +++ b/Shared/Models/RtcDtos/BinaryDtoBase.cs @@ -0,0 +1,12 @@ +using Remotely.Shared.Enums; +using System.Runtime.Serialization; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class BinaryDtoBase + { + [DataMember(Name = "DtoType")] + public BinaryDtoType DtoType { get; set; } + } +} diff --git a/Shared/Models/RtcDtos/CaptureFrameDto.cs b/Shared/Models/RtcDtos/CaptureFrameDto.cs index f144417e..108c7d0a 100644 --- a/Shared/Models/RtcDtos/CaptureFrameDto.cs +++ b/Shared/Models/RtcDtos/CaptureFrameDto.cs @@ -4,10 +4,10 @@ using System.Runtime.Serialization; namespace Remotely.Shared.Models.RtcDtos { [DataContract] - public class CaptureFrameDto : IBinaryDto + public class CaptureFrameDto : BinaryDtoBase { [DataMember(Name = "DtoType")] - public BinaryDtoType DtoType { get; } = BinaryDtoType.CaptureFrame; + public new BinaryDtoType DtoType { get; } = BinaryDtoType.CaptureFrame; [DataMember(Name = "EndOfFrame")] public bool EndOfFrame { get; set; } diff --git a/Shared/Models/RtcDtos/ClipboardTextDto.cs b/Shared/Models/RtcDtos/ClipboardTextDto.cs index 4fd780ec..ec7da987 100644 --- a/Shared/Models/RtcDtos/ClipboardTextDto.cs +++ b/Shared/Models/RtcDtos/ClipboardTextDto.cs @@ -7,7 +7,7 @@ using System.Text; namespace Remotely.Shared.Models.RtcDtos { [DataContract] - public class ClipboardTextDto : IBinaryDto + public class ClipboardTextDto : BinaryDtoBase { public ClipboardTextDto(string clipboardText) { @@ -19,6 +19,6 @@ namespace Remotely.Shared.Models.RtcDtos [DataMember(Name = "DtoType")] - public BinaryDtoType DtoType { get; } = BinaryDtoType.ClipboardText; + public new BinaryDtoType DtoType { get; } = BinaryDtoType.ClipboardText; } } diff --git a/Shared/Models/RtcDtos/ClipboardTransferDto.cs b/Shared/Models/RtcDtos/ClipboardTransferDto.cs new file mode 100644 index 00000000..8c785513 --- /dev/null +++ b/Shared/Models/RtcDtos/ClipboardTransferDto.cs @@ -0,0 +1,23 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class ClipboardTransferDto : BinaryDtoBase + { + + [DataMember(Name = "Text")] + public string Text { get; set; } + + [DataMember(Name = "TypeText")] + public bool TypeText { get; set; } + + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.ClipboardTransfer; + } +} diff --git a/Shared/Models/RtcDtos/KeyDownDto.cs b/Shared/Models/RtcDtos/KeyDownDto.cs new file mode 100644 index 00000000..63c7fc44 --- /dev/null +++ b/Shared/Models/RtcDtos/KeyDownDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class KeyDownDto : BinaryDtoBase + { + [DataMember(Name = "Key")] + public string Key { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.KeyDown; + } +} diff --git a/Shared/Models/RtcDtos/KeyPressDto.cs b/Shared/Models/RtcDtos/KeyPressDto.cs new file mode 100644 index 00000000..e72a5c24 --- /dev/null +++ b/Shared/Models/RtcDtos/KeyPressDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class KeyPressDto : BinaryDtoBase + { + [DataMember(Name = "Key")] + public string Key { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.KeyPress; + } +} diff --git a/Shared/Models/RtcDtos/KeyUpDto.cs b/Shared/Models/RtcDtos/KeyUpDto.cs new file mode 100644 index 00000000..bc79a056 --- /dev/null +++ b/Shared/Models/RtcDtos/KeyUpDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class KeyUpDto : BinaryDtoBase + { + [DataMember(Name = "Key")] + public string Key { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.KeyUp; + } +} diff --git a/Shared/Models/RtcDtos/MachineNameDto.cs b/Shared/Models/RtcDtos/MachineNameDto.cs index f0084930..e325d6fd 100644 --- a/Shared/Models/RtcDtos/MachineNameDto.cs +++ b/Shared/Models/RtcDtos/MachineNameDto.cs @@ -7,7 +7,7 @@ using System.Text; namespace Remotely.Shared.Models.RtcDtos { [DataContract] - public class MachineNameDto : IBinaryDto + public class MachineNameDto : BinaryDtoBase { public MachineNameDto(string machineName) { @@ -15,7 +15,7 @@ namespace Remotely.Shared.Models.RtcDtos } [DataMember(Name = "DtoType")] - public BinaryDtoType DtoType { get; } = BinaryDtoType.MachineName; + public new BinaryDtoType DtoType { get; } = BinaryDtoType.MachineName; [DataMember(Name = "MachineName")] public string MachineName { get; } diff --git a/Shared/Models/RtcDtos/MouseDownDto.cs b/Shared/Models/RtcDtos/MouseDownDto.cs new file mode 100644 index 00000000..801f72b2 --- /dev/null +++ b/Shared/Models/RtcDtos/MouseDownDto.cs @@ -0,0 +1,24 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class MouseDownDto : BinaryDtoBase + { + [DataMember(Name = "Button")] + public int Button { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.MouseDown; + + [DataMember(Name = "PercentX")] + public double PercentX { get; set; } + + [DataMember(Name = "PercentY")] + public double PercentY { get; set; } + } +} diff --git a/Shared/Models/RtcDtos/MouseMoveDto.cs b/Shared/Models/RtcDtos/MouseMoveDto.cs new file mode 100644 index 00000000..3d28d974 --- /dev/null +++ b/Shared/Models/RtcDtos/MouseMoveDto.cs @@ -0,0 +1,22 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class MouseMoveDto : BinaryDtoBase + { + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; set; } = BinaryDtoType.MouseMove; + + [DataMember(Name = "PercentX")] + public double PercentX { get; set; } + + [DataMember(Name = "PercentY")] + public double PercentY { get; set; } + } +} diff --git a/Shared/Models/RtcDtos/MouseUpDto.cs b/Shared/Models/RtcDtos/MouseUpDto.cs new file mode 100644 index 00000000..19278006 --- /dev/null +++ b/Shared/Models/RtcDtos/MouseUpDto.cs @@ -0,0 +1,24 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class MouseUpDto : BinaryDtoBase + { + [DataMember(Name = "Button")] + public int Button { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.MouseUp; + + [DataMember(Name = "PercentX")] + public double PercentX { get; set; } + + [DataMember(Name = "PercentY")] + public double PercentY { get; set; } + } +} diff --git a/Shared/Models/RtcDtos/MouseWheelDto.cs b/Shared/Models/RtcDtos/MouseWheelDto.cs new file mode 100644 index 00000000..a18bb0a4 --- /dev/null +++ b/Shared/Models/RtcDtos/MouseWheelDto.cs @@ -0,0 +1,22 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class MouseWheelDto : BinaryDtoBase + { + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.MouseWheel; + + [DataMember(Name = "DeltaX")] + public double DeltaX { get; set; } + + [DataMember(Name = "DeltaY")] + public double DeltaY { get; set; } + } +} diff --git a/Shared/Models/RtcDtos/QualityChangeDto.cs b/Shared/Models/RtcDtos/QualityChangeDto.cs new file mode 100644 index 00000000..fe8f0f47 --- /dev/null +++ b/Shared/Models/RtcDtos/QualityChangeDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class QualityChangeDto : BinaryDtoBase + { + [DataMember(Name = "QualityLevel")] + public int QualityLevel { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.QualityChange; + } +} diff --git a/Shared/Models/RtcDtos/ScreenDataDto.cs b/Shared/Models/RtcDtos/ScreenDataDto.cs index a7f0623d..e1079492 100644 --- a/Shared/Models/RtcDtos/ScreenDataDto.cs +++ b/Shared/Models/RtcDtos/ScreenDataDto.cs @@ -7,7 +7,7 @@ using System.Text; namespace Remotely.Shared.Models.RtcDtos { [DataContract] - public class ScreenDataDto : IBinaryDto + public class ScreenDataDto : BinaryDtoBase { public ScreenDataDto(string selectedScreen, string[] displayNames) { @@ -20,7 +20,7 @@ namespace Remotely.Shared.Models.RtcDtos [DataMember(Name = "DtoType")] - public BinaryDtoType DtoType { get; } = BinaryDtoType.ScreenData; + public new BinaryDtoType DtoType { get; } = BinaryDtoType.ScreenData; [DataMember(Name = "SelectedScreen")] public string SelectedScreen { get; } diff --git a/Shared/Models/RtcDtos/ScreenSizeDto.cs b/Shared/Models/RtcDtos/ScreenSizeDto.cs index 04eeac72..b1283524 100644 --- a/Shared/Models/RtcDtos/ScreenSizeDto.cs +++ b/Shared/Models/RtcDtos/ScreenSizeDto.cs @@ -7,7 +7,7 @@ using System.Text; namespace Remotely.Shared.Models.RtcDtos { [DataContract] - public class ScreenSizeDto : IBinaryDto + public class ScreenSizeDto : BinaryDtoBase { public ScreenSizeDto(int width, int height) { @@ -22,6 +22,6 @@ namespace Remotely.Shared.Models.RtcDtos public int Height { get; } [DataMember(Name = "DtoType")] - public BinaryDtoType DtoType { get; } = BinaryDtoType.ScreenSize; + public new BinaryDtoType DtoType { get; } = BinaryDtoType.ScreenSize; } } diff --git a/Shared/Models/RtcDtos/SelectScreenDto.cs b/Shared/Models/RtcDtos/SelectScreenDto.cs new file mode 100644 index 00000000..e10c329e --- /dev/null +++ b/Shared/Models/RtcDtos/SelectScreenDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class SelectScreenDto : BinaryDtoBase + { + [DataMember(Name = "DisplayName")] + public string DisplayName { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.SelectScreen; + } +} diff --git a/Shared/Models/RtcDtos/TapDto.cs b/Shared/Models/RtcDtos/TapDto.cs new file mode 100644 index 00000000..1a62940b --- /dev/null +++ b/Shared/Models/RtcDtos/TapDto.cs @@ -0,0 +1,22 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class TapDto : BinaryDtoBase + { + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.Tap; + + [DataMember(Name = "PercentX")] + public double PercentX { get; set; } + + [DataMember(Name = "PercentY")] + public double PercentY { get; set; } + } +} diff --git a/Shared/Models/RtcDtos/ToggleAudioDto.cs b/Shared/Models/RtcDtos/ToggleAudioDto.cs new file mode 100644 index 00000000..83924967 --- /dev/null +++ b/Shared/Models/RtcDtos/ToggleAudioDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class ToggleAudioDto : BinaryDtoBase + { + [DataMember(Name = "ToggleOn")] + public bool ToggleOn { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.ToggleAudio; + } +} diff --git a/Shared/Models/RtcDtos/ToggleBlockInputDto.cs b/Shared/Models/RtcDtos/ToggleBlockInputDto.cs new file mode 100644 index 00000000..2c36c636 --- /dev/null +++ b/Shared/Models/RtcDtos/ToggleBlockInputDto.cs @@ -0,0 +1,18 @@ +using Remotely.Shared.Enums; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; + +namespace Remotely.Shared.Models.RtcDtos +{ + [DataContract] + public class ToggleBlockInputDto : BinaryDtoBase + { + [DataMember(Name = "ToggleOn")] + public bool ToggleOn { get; set; } + + [DataMember(Name = "DtoType")] + public new BinaryDtoType DtoType { get; } = BinaryDtoType.ToggleBlockInput; + } +}