Merged PR 9: Auto-quality tweaks.

Auto-quality updates.
This commit is contained in:
Jared Goodwin 2021-08-07 17:53:14 +00:00
parent af0884e260
commit ec2ae45e88
49 changed files with 532 additions and 365 deletions

View File

@ -4,4 +4,7 @@
dotnet_diagnostic.CA1416.severity = none
# CS1591: Missing XML comment for publicly visible type or member
dotnet_diagnostic.CS1591.severity = none
dotnet_diagnostic.CS1591.severity = none
csharp_style_var_for_built_in_types=true:silent
csharp_style_var_when_type_is_apparent=true:silent
csharp_style_var_elsewhere=true:silent

View File

@ -11,8 +11,6 @@ namespace Remotely.Desktop.Core
{
public event EventHandler<ScreenCastRequest> ScreenCastRequested;
public event EventHandler<string> SessionIDChanged;
public event EventHandler<Services.Viewer> ViewerAdded;
public event EventHandler<string> ViewerRemoved;
@ -32,11 +30,6 @@ namespace Remotely.Desktop.Core
ScreenCastRequested?.Invoke(null, viewerIdAndRequesterName);
}
public void InvokeSessionIDChanged(string sessionID)
{
SessionIDChanged?.Invoke(null, sessionID);
}
public void InvokeViewerAdded(Services.Viewer viewer)
{
ViewerAdded?.Invoke(null, viewer);

View File

@ -14,5 +14,6 @@ namespace Remotely.Desktop.Core.Models
public int Left { get; init; }
public int Height { get; init; }
public int Width { get; init; }
public long Sequence { get; init; }
}
}

View File

@ -20,14 +20,14 @@ namespace Remotely.Desktop.Core.Services
Task DisconnectAllViewers();
Task DisconnectViewer(Viewer viewer, bool notifyViewer);
Task<IceServerModel[]> GetIceServers();
Task GetSessionID();
Task<string> GetSessionID();
Task NotifyRequesterUnattendedReady(string requesterID);
Task NotifyViewersRelaunchedScreenCasterReady(string[] viewerIDs);
Task SendConnectionFailedToViewers(List<string> viewerIDs);
Task SendConnectionRequestDenied(string viewerID);
Task SendCtrlAltDelToAgent();
Task SendDeviceInfo(string serviceID, string machineName, string deviceID);
Task SendDtoToViewer<T>(T baseDto, string viewerId);
Task SendDtoToViewer<T>(T dto, string viewerId);
Task SendIceCandidateToBrowser(string candidate, int sdpMlineIndex, string sdpMid, string viewerConnectionID);
Task SendMessageToViewer(string viewerID, string message);
Task SendRtcOfferToBrowser(string sdp, string viewerID, IceServerModel[] iceServers);
@ -108,11 +108,11 @@ namespace Remotely.Desktop.Core.Services
}
}
public async Task DisconnectViewer(Viewer viewer, bool notifyViewer)
public Task DisconnectViewer(Viewer viewer, bool notifyViewer)
{
viewer.DisconnectRequested = true;
viewer.Dispose();
await Connection.SendAsync("DisconnectViewer", viewer.ViewerConnectionID, notifyViewer);
return Connection.SendAsync("DisconnectViewer", viewer.ViewerConnectionID, notifyViewer);
}
public async Task<IceServerModel[]> GetIceServers()
@ -120,62 +120,62 @@ namespace Remotely.Desktop.Core.Services
return await Connection.InvokeAsync<IceServerModel[]>("GetIceServers");
}
public async Task GetSessionID()
public async Task<string> GetSessionID()
{
await Connection.SendAsync("GetSessionID");
return await Connection.InvokeAsync<string>("GetSessionID");
}
public async Task NotifyRequesterUnattendedReady(string requesterID)
public Task NotifyRequesterUnattendedReady(string requesterID)
{
await Connection.SendAsync("NotifyRequesterUnattendedReady", requesterID);
return Connection.SendAsync("NotifyRequesterUnattendedReady", requesterID);
}
public async Task NotifyViewersRelaunchedScreenCasterReady(string[] viewerIDs)
public Task NotifyViewersRelaunchedScreenCasterReady(string[] viewerIDs)
{
await Connection.SendAsync("NotifyViewersRelaunchedScreenCasterReady", viewerIDs);
return Connection.SendAsync("NotifyViewersRelaunchedScreenCasterReady", viewerIDs);
}
public async Task SendConnectionFailedToViewers(List<string> viewerIDs)
public Task SendConnectionFailedToViewers(List<string> viewerIDs)
{
await Connection.SendAsync("SendConnectionFailedToViewers", viewerIDs);
return Connection.SendAsync("SendConnectionFailedToViewers", viewerIDs);
}
public async Task SendConnectionRequestDenied(string viewerID)
public Task SendConnectionRequestDenied(string viewerID)
{
await Connection.SendAsync("SendConnectionRequestDenied", viewerID);
return Connection.SendAsync("SendConnectionRequestDenied", viewerID);
}
public async Task SendMessageToViewer(string viewerID, string message)
public Task SendMessageToViewer(string viewerID, string message)
{
await Connection.SendAsync("SendMessageToViewer", viewerID, message);
return Connection.SendAsync("SendMessageToViewer", viewerID, message);
}
public async Task SendCtrlAltDelToAgent()
public Task SendCtrlAltDelToAgent()
{
await Connection.SendAsync("SendCtrlAltDelToAgent");
return Connection.SendAsync("SendCtrlAltDelToAgent");
}
public async Task SendDeviceInfo(string serviceID, string machineName, string deviceID)
public Task SendDeviceInfo(string serviceID, string machineName, string deviceID)
{
await Connection.SendAsync("ReceiveDeviceInfo", serviceID, machineName, deviceID);
return Connection.SendAsync("ReceiveDeviceInfo", serviceID, machineName, deviceID);
}
public Task SendDtoToViewer<T>(T baseDto, string viewerId)
public Task SendDtoToViewer<T>(T dto, string viewerId)
{
var serializedDto = MessagePack.MessagePackSerializer.Serialize(baseDto);
var serializedDto = MessagePack.MessagePackSerializer.Serialize(dto);
return Connection.SendAsync("SendDtoToBrowser", serializedDto, viewerId);
}
public async Task SendIceCandidateToBrowser(string candidate, int sdpMlineIndex, string sdpMid, string viewerConnectionID)
public Task SendIceCandidateToBrowser(string candidate, int sdpMlineIndex, string sdpMid, string viewerConnectionID)
{
await Connection.SendAsync("SendIceCandidateToBrowser", candidate, sdpMlineIndex, sdpMid, viewerConnectionID);
return Connection.SendAsync("SendIceCandidateToBrowser", candidate, sdpMlineIndex, sdpMid, viewerConnectionID);
}
public async Task SendRtcOfferToBrowser(string sdp, string viewerID, IceServerModel[] iceServers)
public Task SendRtcOfferToBrowser(string sdp, string viewerID, IceServerModel[] iceServers)
{
await Connection.SendAsync("SendRtcOfferToBrowser", sdp, viewerID, iceServers);
return Connection.SendAsync("SendRtcOfferToBrowser", sdp, viewerID, iceServers);
}
public async Task SendViewerConnected(string viewerConnectionId)
public Task SendViewerConnected(string viewerConnectionId)
{
await Connection.SendAsync("ViewerConnected", viewerConnectionId);
return Connection.SendAsync("ViewerConnected", viewerConnectionId);
}
private void ApplyConnectionHandlers()
@ -287,11 +287,6 @@ namespace Remotely.Desktop.Core.Services
}
});
Connection.On("SessionID", (string sessionID) =>
{
conductor.InvokeSessionIDChanged(sessionID);
});
Connection.On("ViewerDisconnected", async (string viewerID) =>
{
await Connection.SendAsync("DisconnectViewer", viewerID, false);

View File

@ -161,15 +161,7 @@ namespace Remotely.Desktop.Core.Services
private void HandleFrameReceived(Viewer viewer)
{
while (viewer.PendingSentFrames.Count > 0 &&
!viewer.IsStalled &&
viewer.IsConnected)
{
if (viewer.PendingSentFrames.TryDequeue(out _))
{
break;
}
}
viewer.DequeuePendingFrame();
}
private void KeyDown(byte[] message)

View File

@ -42,6 +42,7 @@ namespace Remotely.Desktop.Core.Services
{
Bitmap currentFrame = null;
Bitmap previousFrame = null;
long sequence = 0;
var viewer = ServiceContainer.Instance.GetRequiredService<Viewer>();
viewer.Name = screenCastRequest.RequesterName;
@ -66,11 +67,11 @@ namespace Remotely.Desktop.Core.Services
await viewer.SendViewerConnected();
await viewer.SendMachineName(Environment.MachineName);
await viewer.SendScreenData(
viewer.Capturer.SelectedScreen,
viewer.Capturer.GetDisplayNames().ToArray());
viewer.Capturer.SelectedScreen,
viewer.Capturer.GetDisplayNames(),
screenBounds.Width,
screenBounds.Height);
await viewer.SendScreenSize(screenBounds.Width, screenBounds.Height);
@ -93,7 +94,8 @@ namespace Remotely.Desktop.Core.Services
Left = screenBounds.Left,
Top = screenBounds.Top,
Width = screenBounds.Width,
Height = screenBounds.Height
Height = screenBounds.Height,
Sequence = sequence++
});
}
}
@ -116,6 +118,7 @@ namespace Remotely.Desktop.Core.Services
Thread.Sleep(100);
continue;
}
if (viewer.IsStalled)
{
// Viewer isn't responding. Abort sending.
@ -123,8 +126,6 @@ namespace Remotely.Desktop.Core.Services
break;
}
viewer.ThrottleIfNeeded();
if (currentFrame != null)
{
previousFrame?.Dispose();
@ -149,8 +150,21 @@ namespace Remotely.Desktop.Core.Services
viewer.Capturer.CaptureFullscreen = false;
using var croppedFrame = currentFrame.Clone(diffArea, currentFrame.PixelFormat);
var encodedImageBytes = ImageUtils.EncodeJpeg(croppedFrame);
await SendFrame(encodedImageBytes, diffArea, viewer);
byte[] encodedImageBytes;
if (viewer.ImageQuality == Viewer.DefaultQuality)
{
encodedImageBytes = ImageUtils.EncodeJpeg(croppedFrame);
}
else
{
encodedImageBytes = ImageUtils.EncodeJpeg(croppedFrame, viewer.ImageQuality);
}
await SendFrame(encodedImageBytes, diffArea, sequence++, viewer);
viewer.ApplyAutoQuality();
}
catch (Exception ex)
@ -184,7 +198,7 @@ namespace Remotely.Desktop.Core.Services
}
}
private static async Task SendFrame(byte[] encodedImageBytes, Rectangle diffArea, Viewer viewer)
private static async Task SendFrame(byte[] encodedImageBytes, Rectangle diffArea, long sequence, Viewer viewer)
{
if (encodedImageBytes.Length == 0)
{
@ -198,6 +212,7 @@ namespace Remotely.Desktop.Core.Services
Left = diffArea.Left,
Width = diffArea.Width,
Height = diffArea.Height,
Sequence = sequence
});
}
}

View File

@ -14,13 +14,23 @@ using System.Threading.Tasks;
using System.Text.Json;
using System.Threading;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
namespace Remotely.Desktop.Core.Services
{
public class Viewer : IDisposable
{
public const int DefaultQuality = 75;
private const double MaxLatency = 300;
private const double MaxMbps = 9;
private const int MinQuality = 20;
private readonly ConcurrentQueue<double> _sentMegabits = new();
private readonly ConcurrentQueue<DateTimeOffset> _sentTimestamps = new();
public Viewer(ICasterSocket casterSocket,
IScreenCapturer screenCapturer,
IScreenCapturer screenCapturer,
IClipboardService clipboardService,
IWebRtcSessionFactory webRtcSessionFactory,
IAudioCapturer audioCapturer)
@ -33,12 +43,12 @@ namespace Remotely.Desktop.Core.Services
AudioCapturer = audioCapturer;
AudioCapturer.AudioSampleReady += AudioCapturer_AudioSampleReady;
}
public IScreenCapturer Capturer { get; }
public double CurrentMbps { get; private set; }
public bool DisconnectRequested { get; set; }
public EncoderParameters EncoderParams { get; private set; }
public bool HasControl { get; set; } = true;
public int ImageQuality { get; private set; } = DefaultQuality;
public bool IsConnected => CasterSocket.IsConnected;
public bool IsStalled
@ -66,9 +76,8 @@ namespace Remotely.Desktop.Core.Services
}
public string Name { get; set; }
public ConcurrentQueue<SentFrame> PendingSentFrames { get; } = new();
public TimeSpan RoundTripLatency { get; private set; }
public WebRtcSession RtcSession { get; set; }
public string ViewerConnectionID { get; set; }
@ -80,6 +89,46 @@ namespace Remotely.Desktop.Core.Services
private IClipboardService ClipboardService { get; }
private IWebRtcSessionFactory WebRtcSessionFactory { get; }
public void ApplyAutoQuality()
{
if (ImageQuality < DefaultQuality)
{
ImageQuality = Math.Min(DefaultQuality, ImageQuality + 2);
}
// Limit to 20 FPS.
_ = TaskHelper.DelayUntil(() =>
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp > TimeSpan.FromMilliseconds(50),
TimeSpan.FromSeconds(5));
// Wait for pending frames to be received.
_ = TaskHelper.DelayUntil(() =>
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp < TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5));
// Limit max number of pending frames.
_ = TaskHelper.DelayUntil(() => PendingSentFrames.Count < 5, TimeSpan.FromSeconds(5));
if (RoundTripLatency.TotalMilliseconds > MaxLatency)
{
ImageQuality = Math.Max(MinQuality, (int)(MaxLatency / RoundTripLatency.TotalMilliseconds * ImageQuality));
}
if (CurrentMbps > MaxMbps)
{
var targetPercent = MaxMbps / CurrentMbps;
ImageQuality = Math.Max(MinQuality, (int)(ImageQuality * targetPercent));
Debug.WriteLine($"Current Mbps: {CurrentMbps}. Setting quality to {ImageQuality}");
}
}
public void DequeuePendingFrame()
{
if (PendingSentFrames.TryDequeue(out var frame))
{
RoundTripLatency = Time.Now - frame.Timestamp;
}
}
public void Dispose()
{
@ -148,7 +197,6 @@ namespace Remotely.Desktop.Core.Services
await SendToViewer(() => RtcSession.SendDto(dto),
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
}
public async Task SendFile(FileUpload fileUpload, CancellationToken cancelToken, Action<double> progressUpdateCallback)
{
try
@ -207,16 +255,10 @@ namespace Remotely.Desktop.Core.Services
}
}
public async Task SendMachineName(string machineName)
{
var dto = new MachineNameDto(machineName);
await SendToViewer(() => RtcSession.SendDto(dto),
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
}
public async Task SendScreenCapture(CaptureFrame screenFrame)
{
PendingSentFrames.Enqueue(new SentFrame(DateTimeOffset.Now, screenFrame.EncodedImageBytes.Length));
PendingSentFrames.Enqueue(new SentFrame(screenFrame.EncodedImageBytes.Length));
var left = screenFrame.Left;
var top = screenFrame.Top;
@ -227,37 +269,51 @@ namespace Remotely.Desktop.Core.Services
{
var dto = new CaptureFrameDto()
{
Id = screenFrame.Id,
Left = left,
Top = top,
Width = width,
Height = height,
EndOfFrame = false,
Sequence = screenFrame.Sequence,
ImageBytes = screenFrame.EncodedImageBytes.Skip(i).Take(50_000).ToArray()
};
await SendToViewer(() => RtcSession.SendDto(dto),
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
await SendToViewer(
() => RtcSession.SendDto(dto),
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
}
var endOfFrameDto = new CaptureFrameDto()
{
Id = screenFrame.Id,
Left = left,
Top = top,
Width = width,
Height = height,
EndOfFrame = true
EndOfFrame = true,
Sequence = screenFrame.Sequence,
};
await SendToViewer(
() => RtcSession.SendDto(endOfFrameDto),
() => CasterSocket.SendDtoToViewer(endOfFrameDto, ViewerConnectionID));
() => RtcSession.SendDto(endOfFrameDto),
() => CasterSocket.SendDtoToViewer(endOfFrameDto, ViewerConnectionID));
UpdateMbps(screenFrame.EncodedImageBytes.Length);
}
public async Task SendScreenData(string selectedScreen, string[] displayNames)
public async Task SendScreenData(
string selectedDisplay,
IEnumerable<string> displayNames,
int screenWidth,
int screenHeight)
{
var dto = new ScreenDataDto(selectedScreen, displayNames);
var dto = new ScreenDataDto()
{
MachineName = Environment.MachineName,
DisplayNames = displayNames,
SelectedDisplay = selectedDisplay,
ScreenWidth = screenWidth,
ScreenHeight = screenHeight
};
await SendToViewer(() => RtcSession.SendDto(dto),
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
}
@ -273,6 +329,7 @@ namespace Remotely.Desktop.Core.Services
{
await CasterSocket.SendViewerConnected(ViewerConnectionID);
}
public async Task SendWindowsSessions()
{
if (EnvironmentHelper.IsWindows)
@ -282,20 +339,6 @@ namespace Remotely.Desktop.Core.Services
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
}
}
public void ThrottleIfNeeded()
{
// Limit to 20 FPS.
TaskHelper.DelayUntil(() =>
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp > TimeSpan.FromMilliseconds(50),
TimeSpan.FromSeconds(5));
// Wait for pending frames to be received.
TaskHelper.DelayUntil(() =>
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp < TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5));
}
public void ToggleWebRtcVideo(bool toggleOn)
{
RtcSession.ToggleWebRtcVideo(toggleOn);
@ -330,5 +373,27 @@ namespace Remotely.Desktop.Core.Services
return Task.CompletedTask;
}
}
private void UpdateMbps(int frameSize)
{
while (_sentMegabits.Count > 10)
{
_sentMegabits.TryDequeue(out _);
}
while (_sentTimestamps.Count > 10)
{
_sentTimestamps.TryDequeue(out _);
}
var mb = (double)frameSize / 1024 / 1024 * 8;
_sentMegabits.Enqueue(mb);
_sentTimestamps.Enqueue(Time.Now);
// Don't calculate Mbps until we have a decent sample size.
if (_sentMegabits.Count < 5)
{
return;
}
_sentTimestamps.TryPeek(out var oldestTime);
CurrentMbps = _sentMegabits.Sum() / (Time.Now - oldestTime).TotalSeconds;
}
}
}

View File

@ -128,10 +128,10 @@ namespace Remotely.Desktop.Core.Utilities
{
// Bounding box is valid. Padding is necessary to prevent artifacts from
// moving windows.
left = Math.Max(left - 5, 0);
top = Math.Max(top - 5, 0);
right = Math.Min(right + 5, width);
bottom = Math.Min(bottom + 5, height);
left = Math.Max(left - 2, 0);
top = Math.Max(top - 2, 0);
right = Math.Min(right + 2, width);
bottom = Math.Min(bottom + 2, height);
return new Rectangle(left, top, right - left, bottom - top);
}

View File

@ -28,7 +28,8 @@ namespace Remotely.Desktop.Win.Models
public void Dispose()
{
Disposer.TryDisposeAll(Adapter, Device, OutputDuplication, Texture2D);
OutputDuplication.ReleaseFrame();
Disposer.TryDisposeAll(OutputDuplication, Texture2D, Adapter, Device);
GC.SuppressFinalize(this);
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>x64</Platform>
<PublishDir>C:\Program Files\Remotely\Desktop</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net5.0-windows</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>False</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun>
<PublishTrimmed>False</PublishTrimmed>
</PropertyGroup>
</Project>

View File

@ -84,13 +84,17 @@ namespace Remotely.Desktop.Win.Services
{
try
{
if (!Win32Interop.SwitchToInputDesktop())
{
Logger.Write("SwitchToInputDesktop failed.", Shared.Enums.EventType.Warning);
}
Win32Interop.SwitchToInputDesktop();
if (NeedsInit)
{
Logger.Write("Init needed in GetNextFrame.");
Init();
NeedsInit = false;
}
// Sometimes DX will result in a timeout, even when there are changes
@ -142,7 +146,10 @@ namespace Remotely.Desktop.Win.Services
public void Init()
{
Win32Interop.SwitchToInputDesktop();
if (!Win32Interop.SwitchToInputDesktop())
{
Logger.Write("SwitchToInputDesktop failed.", Shared.Enums.EventType.Warning);
}
CaptureFullscreen = true;
InitBitBlt();
@ -280,22 +287,32 @@ namespace Remotely.Desktop.Win.Services
}
catch (SharpDXException e)
{
if (e.ResultCode.Code != SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code)
if (e.ResultCode.Code == SharpDX.DXGI.ResultCode.WaitTimeout.Code)
{
Logger.Write(e);
NeedsInit = true;
return (GetDirectXFrameResult.Failure, null);
return (GetDirectXFrameResult.Timeout, null);
}
return (GetDirectXFrameResult.Timeout, null);
Logger.Write(e, "SharpDXException error.");
}
catch (Exception ex)
{
Logger.Write(ex);
}
return (GetDirectXFrameResult.Failure, null);
}
private void InitBitBlt()
{
_bitBltScreens.Clear();
for (var i = 0; i < Screen.AllScreens.Length; i++)
try
{
_bitBltScreens.Add(Screen.AllScreens[i].DeviceName, i);
_bitBltScreens.Clear();
for (var i = 0; i < Screen.AllScreens.Length; i++)
{
_bitBltScreens.Add(Screen.AllScreens[i].DeviceName, i);
}
}
catch (Exception ex)
{
Logger.Write(ex);
}
}
@ -352,9 +369,6 @@ namespace Remotely.Desktop.Win.Services
}
}
}
NeedsInit = false;
}
catch (Exception ex)
{

View File

@ -26,7 +26,8 @@ namespace Remotely.Desktop.Win.ViewModels
private readonly IConfigService _configService;
private readonly ICursorIconWatcher _cursorIconWatcher;
private string _host;
private string _sessionID;
private string _sessionId;
private string _statusMessage;
public MainWindowViewModel()
{
@ -47,7 +48,6 @@ namespace Remotely.Desktop.Win.ViewModels
Services.GetRequiredService<IClipboardService>().BeginWatching();
Services.GetRequiredService<IKeyboardMouseInput>().Init();
_conductor.SessionIDChanged += SessionIDChanged;
_conductor.ViewerRemoved += ViewerRemoved;
_conductor.ViewerAdded += ViewerAdded;
_conductor.ScreenCastRequested += ScreenCastRequested;
@ -166,13 +166,12 @@ namespace Remotely.Desktop.Win.ViewModels
}
}
public string SessionID
public string StatusMessage
{
get => _sessionID;
get => _statusMessage;
set
{
_sessionID = value;
_statusMessage = value;
FirePropertyChanged();
}
}
@ -181,18 +180,30 @@ namespace Remotely.Desktop.Win.ViewModels
public void CopyLink()
{
Clipboard.SetText($"{Host}/RemoteControl?sessionID={SessionID?.Replace(" ", "")}");
Clipboard.SetText($"{Host}/RemoteControl?sessionID={StatusMessage?.Replace(" ", "")}");
}
public async Task GetSessionID()
{
await _casterSocket.SendDeviceInfo(_conductor.ServiceID, Environment.MachineName, _conductor.DeviceID);
await _casterSocket.GetSessionID();
var sessionId = await _casterSocket.GetSessionID();
var formattedSessionID = "";
for (var i = 0; i < sessionId.Length; i += 3)
{
formattedSessionID += sessionId.Substring(i, 3) + " ";
}
App.Current?.Dispatcher?.Invoke(() =>
{
_sessionId = formattedSessionID.Trim();
StatusMessage = _sessionId;
});
}
public async Task Init()
{
SessionID = "Retrieving...";
StatusMessage = "Retrieving...";
Host = _configService.GetConfig().Host;
@ -215,7 +226,7 @@ namespace Remotely.Desktop.Win.ViewModels
App.Current?.Dispatcher?.Invoke(() =>
{
Viewers.Clear();
SessionID = "Disconnected";
StatusMessage = "Disconnected";
});
return Task.CompletedTask;
};
@ -225,14 +236,15 @@ namespace Remotely.Desktop.Win.ViewModels
App.Current?.Dispatcher?.Invoke(() =>
{
Viewers.Clear();
SessionID = "Reconnecting";
StatusMessage = "Reconnecting";
});
return Task.CompletedTask;
};
_casterSocket.Connection.Reconnected += async (arg) =>
_casterSocket.Connection.Reconnected += (id) =>
{
await GetSessionID();
StatusMessage = _sessionId;
return Task.CompletedTask;
};
await DeviceInitService.GetInitParams();
@ -249,7 +261,7 @@ namespace Remotely.Desktop.Win.ViewModels
}
// If we got here, something went wrong.
SessionID = "Failed";
StatusMessage = "Failed";
MessageBox.Show(Application.Current.MainWindow, "Failed to connect to server.", "Connection Failed", MessageBoxButton.OK, MessageBoxImage.Warning);
}
@ -326,15 +338,6 @@ namespace Remotely.Desktop.Win.ViewModels
}
});
}
private void SessionIDChanged(object sender, string sessionID)
{
var formattedSessionID = "";
for (var i = 0; i < sessionID.Length; i += 3)
{
formattedSessionID += sessionID.Substring(i, 3) + " ";
}
SessionID = formattedSessionID.Trim();
}
private void ViewerAdded(object sender, Viewer viewer)
{

View File

@ -55,7 +55,7 @@
<StackPanel Grid.Column="0" Margin="0,0,15,0">
<TextBlock Style="{StaticResource SectionHeader}"><Run Text="Share Screen"/></TextBlock>
<TextBlock FontSize="16" Margin="0,10,0,5"><Run Text="Your Session ID:"/></TextBlock>
<TextBox FontSize="16" Text="{Binding SessionID}" IsReadOnly="True"/>
<TextBox FontSize="16" Text="{Binding StatusMessage}" IsReadOnly="True"/>
<Grid Margin="0,10,0,0">
<TextBlock VerticalAlignment="Center">
Invite Link:

View File

@ -29,7 +29,8 @@ namespace Remotely.Desktop.XPlat.ViewModels
private double _copyMessageOpacity;
private string _host;
private bool _isCopyMessageVisible;
private string _sessionID;
private string _sessionId;
private string _statusMessage;
public MainWindowViewModel()
{
@ -39,7 +40,6 @@ namespace Remotely.Desktop.XPlat.ViewModels
_conductor = Services.GetRequiredService<Conductor>();
_casterSocket = Services.GetRequiredService<ICasterSocket>();
_conductor.SessionIDChanged += SessionIDChanged;
_conductor.ViewerRemoved += ViewerRemoved;
_conductor.ViewerAdded += ViewerAdded;
_conductor.ScreenCastRequested += ScreenCastRequested;
@ -70,7 +70,7 @@ namespace Remotely.Desktop.XPlat.ViewModels
public ICommand CopyLinkCommand => new Executor(async (param) =>
{
await App.Current.Clipboard.SetTextAsync($"{Host}/RemoteControl?sessionID={SessionID.Replace(" ", "")}");
await App.Current.Clipboard.SetTextAsync($"{Host}/RemoteControl?sessionID={StatusMessage.Replace(" ", "")}");
CopyMessageOpacity = 1;
IsCopyMessageVisible = true;
@ -122,19 +122,31 @@ namespace Remotely.Desktop.XPlat.ViewModels
await _casterSocket.DisconnectViewer(viewer, true);
}
});
public string SessionID
public string StatusMessage
{
get => _sessionID;
set => this.RaiseAndSetIfChanged(ref _sessionID, value);
get => _statusMessage;
set => this.RaiseAndSetIfChanged(ref _statusMessage, value);
}
public ObservableCollection<Viewer> Viewers { get; } = new ObservableCollection<Viewer>();
private static IServiceProvider Services => ServiceContainer.Instance;
public async Task GetSessionID()
{
await _casterSocket.SendDeviceInfo(_conductor.ServiceID, Environment.MachineName, _conductor.DeviceID);
await _casterSocket.GetSessionID();
var sessionId = await _casterSocket.GetSessionID();
var formattedSessionID = "";
for (var i = 0; i < sessionId.Length; i += 3)
{
formattedSessionID += sessionId.Substring(i, 3) + " ";
}
await Dispatcher.UIThread.InvokeAsync(() =>
{
_sessionId = formattedSessionID.Trim();
StatusMessage = _sessionId;
});
}
public async Task Init()
@ -147,11 +159,11 @@ namespace Remotely.Desktop.XPlat.ViewModels
Environment.Exit(0);
}
SessionID = "Initializing...";
StatusMessage = "Initializing...";
await InstallDependencies();
SessionID = "Retrieving...";
StatusMessage = "Retrieving...";
Host = _configService.GetConfig().Host;
@ -176,7 +188,7 @@ namespace Remotely.Desktop.XPlat.ViewModels
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
SessionID = "Disconnected";
StatusMessage = "Disconnected";
});
};
@ -184,21 +196,20 @@ namespace Remotely.Desktop.XPlat.ViewModels
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
SessionID = "Reconnecting";
StatusMessage = "Reconnecting";
});
};
_casterSocket.Connection.Reconnected += async (arg) =>
_casterSocket.Connection.Reconnected += (id) =>
{
await GetSessionID();
StatusMessage = _sessionId;
return Task.CompletedTask;
};
await DeviceInitService.GetInitParams();
ApplyBranding();
await _casterSocket.SendDeviceInfo(_conductor.ServiceID, Environment.MachineName, _conductor.DeviceID);
await _casterSocket.GetSessionID();
await GetSessionID();
return;
}
@ -210,7 +221,7 @@ namespace Remotely.Desktop.XPlat.ViewModels
}
// If we got here, something went wrong.
_sessionID = "Failed";
_statusMessage = "Failed";
await MessageBox.Show("Failed to connect to server.", "Connection Failed", MessageBoxType.OK);
}
@ -280,18 +291,6 @@ namespace Remotely.Desktop.XPlat.ViewModels
}
});
}
private async void SessionIDChanged(object sender, string sessionID)
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
var formattedSessionID = "";
for (var i = 0; i < sessionID.Length; i += 3)
{
formattedSessionID += sessionID.Substring(i, 3) + " ";
}
SessionID = formattedSessionID.Trim();
});
}
private void ViewerAdded(object sender, Viewer viewer)
{

View File

@ -35,7 +35,7 @@
<StackPanel Grid.Column="0" Margin="0,0,15,0">
<TextBlock Classes="SectionHeader">Share Screen</TextBlock>
<TextBlock FontSize="16" Margin="0,10,0,5">Your Session ID:</TextBlock>
<TextBox Name="SessionIDTextBox" FontSize="16" Text="{Binding SessionID}" IsReadOnly="True"/>
<TextBox Name="SessionIDTextBox" FontSize="16" Text="{Binding StatusMessage}" IsReadOnly="True"/>
<Grid Margin="0,10,0,0">
<TextBlock VerticalAlignment="Center">
Invite Link:

View File

@ -61,7 +61,7 @@ namespace Remotely.Server.Hubs
return _appConfig.IceServers;
}
public Task GetSessionID()
public string GetSessionID()
{
var random = new Random();
var sessionId = "";
@ -79,7 +79,7 @@ namespace Remotely.Server.Hubs
SessionInfoList[Context.ConnectionId].AttendedSessionID = sessionId;
return Clients.Caller.SendAsync("SessionID", sessionId);
return sessionId;
}
public Task NotifyRequesterUnattendedReady(string browserHubConnectionID)

View File

@ -264,21 +264,6 @@ namespace Remotely.Server
private static void ConfigureStaticFiles(IApplicationBuilder app, IWebHostEnvironment env)
{
// TODO: This redirects downloads from the old location to the new one.
// Remove after a few releases.
app.Use(async (context, next) =>
{
if (context.Request.Path.HasValue &&
context.Request.Path.Value.Contains("/Downloads/", StringComparison.OrdinalIgnoreCase) &&
!context.Request.Path.Value.TrimEnd('/').EndsWith("downloads", StringComparison.OrdinalIgnoreCase))
{
var redirectUrl = context.Request.GetDisplayUrl().Replace("/Downloads/", "/Content/");
context.Response.Redirect(redirectUrl);
return;
}
await next();
});
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".ps1"] = "application/octet-stream";

View File

@ -41,6 +41,7 @@ export const ViewerApp = {
if (ViewerApp.CasterID) {
ViewerApp.Mode = RemoteControlMode.Unattended;
ViewerApp.ViewerHubConnection.Connect();
UI.StatusMessage.innerHTML = "Connecting to remote device...";
}
else {
UI.ConnectBox.style.removeProperty("display");
@ -59,7 +60,7 @@ export const ViewerApp = {
ViewerApp.RequesterName = UI.RequesterNameInput.value;
ViewerApp.Mode = RemoteControlMode.Normal;
ViewerApp.ViewerHubConnection.Connect();
UI.StatusMessage.innerHTML = "Sending connection request...";
UI.StatusMessage.innerHTML = "Request access on remote device...";
ViewerApp.Settings.displayName = ViewerApp.RequesterName;
SetSettings(ViewerApp.Settings);
}

View File

@ -1 +1 @@
{"version":3,"file":"App.js","sourceRoot":"","sources":["App.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"App.js","sourceRoot":"","sources":["App.ts"],"names":[],"mappings":"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"}

View File

@ -48,6 +48,7 @@ export const ViewerApp = {
if (ViewerApp.CasterID) {
ViewerApp.Mode = RemoteControlMode.Unattended;
ViewerApp.ViewerHubConnection.Connect();
UI.StatusMessage.innerHTML = "Connecting to remote device...";
}
else {
UI.ConnectBox.style.removeProperty("display");
@ -67,7 +68,7 @@ export const ViewerApp = {
ViewerApp.RequesterName = UI.RequesterNameInput.value;
ViewerApp.Mode = RemoteControlMode.Normal;
ViewerApp.ViewerHubConnection.Connect();
UI.StatusMessage.innerHTML = "Sending connection request...";
UI.StatusMessage.innerHTML = "Request access on remote device...";
ViewerApp.Settings.displayName = ViewerApp.RequesterName;
SetSettings(ViewerApp.Settings);

View File

@ -0,0 +1,76 @@
import { ViewerApp } from "./App.js";
import { Screen2DContext } from "./UI.js";
const BitmapQueue = [];
const ImagePartials = {};
let CanvasLock = 1;
let NextSequence = 0;
export function HandleCaptureReceived(captureFrame) {
// TODO: Move to OffscreenCanvas after it's fully supported.
if (captureFrame.EndOfFrame) {
var partials = ImagePartials[captureFrame.Sequence];
let completedFrame = new Blob(partials);
delete ImagePartials[captureFrame.Sequence];
createImageBitmap(completedFrame).then(bitmap => {
BitmapQueue.push({
ImageContent: bitmap,
FrameData: captureFrame
});
if (CanvasLock < 1) {
return;
}
CanvasLock--;
processQueue();
});
//let url = window.URL.createObjectURL(completedFrame);
//let img = new Image(captureFrame.Width, captureFrame.Height);
//img.onload = () => {
// UI.Screen2DContext.drawImage(img,
// captureFrame.Left,
// captureFrame.Top,
// captureFrame.Width,
// captureFrame.Height);
// window.URL.revokeObjectURL(url);
//};
}
else {
if (!ImagePartials[captureFrame.Sequence]) {
ImagePartials[captureFrame.Sequence] = [];
}
ImagePartials[captureFrame.Sequence].push(captureFrame.ImageBytes);
}
}
function processQueue() {
try {
if (BitmapQueue.length > 0) {
let completedFrame = BitmapQueue.shift();
let content = completedFrame.ImageContent;
let data = completedFrame.FrameData;
if (data.Sequence == 0) {
NextSequence = 0;
BitmapQueue.splice(0);
}
if (data.Sequence != NextSequence) {
console.debug("Frame out of sequence. Putting it back in queue.");
BitmapQueue.push(completedFrame);
BitmapQueue.sort((a, b) => a.FrameData.Sequence - b.FrameData.Sequence);
window.setTimeout(() => processQueue(), 1);
return;
}
createImageBitmap(content).then(bitmap => {
Screen2DContext.drawImage(bitmap, data.Left, data.Top, data.Width, data.Height);
bitmap.close();
ViewerApp.MessageSender.SendFrameReceived();
NextSequence = data.Sequence + 1;
window.setTimeout(() => processQueue(), 1);
});
}
else {
CanvasLock++;
}
}
catch (ex) {
CanvasLock = 1;
console.error(ex);
}
}
//# sourceMappingURL=CaptureProcessor.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"CaptureProcessor.js","sourceRoot":"","sources":["CaptureProcessor.ts"],"names":[],"mappings":"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"}

View File

@ -0,0 +1,97 @@
import { ViewerApp } from "./App.js";
import { CaptureFrameDto } from "./Interfaces/Dtos.js";
import { CompletedFrame } from "./Models/CompletedFrame.js";
import { Screen2DContext } from "./UI.js";
const BitmapQueue: Array <CompletedFrame> =[];
const ImagePartials: Record <string, Array<Uint8Array>> = { };
let CanvasLock: number = 1;
let NextSequence: number = 0;
export function HandleCaptureReceived(captureFrame: CaptureFrameDto) {
// TODO: Move to OffscreenCanvas after it's fully supported.
if (captureFrame.EndOfFrame) {
var partials = ImagePartials[captureFrame.Sequence];
let completedFrame = new Blob(partials);
delete ImagePartials[captureFrame.Sequence];
createImageBitmap(completedFrame).then(bitmap => {
BitmapQueue.push({
ImageContent: bitmap,
FrameData: captureFrame
});
if (CanvasLock < 1) {
return;
}
CanvasLock--;
processQueue();
});
//let url = window.URL.createObjectURL(completedFrame);
//let img = new Image(captureFrame.Width, captureFrame.Height);
//img.onload = () => {
// UI.Screen2DContext.drawImage(img,
// captureFrame.Left,
// captureFrame.Top,
// captureFrame.Width,
// captureFrame.Height);
// window.URL.revokeObjectURL(url);
//};
}
else {
if (!ImagePartials[captureFrame.Sequence]) {
ImagePartials[captureFrame.Sequence] = [];
}
ImagePartials[captureFrame.Sequence].push(captureFrame.ImageBytes);
}
}
function processQueue() {
try {
if (BitmapQueue.length > 0) {
let completedFrame = BitmapQueue.shift();
let content = completedFrame.ImageContent;
let data = completedFrame.FrameData;
if (data.Sequence == 0) {
NextSequence = 0;
BitmapQueue.splice(0);
}
if (data.Sequence != NextSequence) {
console.debug("Frame out of sequence. Putting it back in queue.")
BitmapQueue.push(completedFrame);
BitmapQueue.sort((a, b) => a.FrameData.Sequence - b.FrameData.Sequence);
window.setTimeout(() => processQueue(), 1);
return;
}
createImageBitmap(content).then(bitmap => {
Screen2DContext.drawImage(bitmap,
data.Left,
data.Top,
data.Width,
data.Height);
bitmap.close();
ViewerApp.MessageSender.SendFrameReceived();
NextSequence = data.Sequence + 1;
window.setTimeout(() => processQueue(), 1);
})
}
else {
CanvasLock++;
}
}
catch (ex) {
CanvasLock = 1;
console.error(ex);
}
}

View File

@ -1,12 +1,17 @@
import { ViewerApp } from "./App.js";
import { ShowMessage } from "./UI.js";
export class ClipboardWatcher {
WatchClipboard() {
if (navigator.clipboard.readText) {
this.ClipboardTimer = setInterval(() => {
if (this.PauseMonitoring) {
if (!document.hasFocus()) {
return;
}
if (!document.hasFocus()) {
if (this.NewClipboardText && navigator.clipboard.writeText) {
navigator.clipboard.writeText(this.NewClipboardText);
this.LastClipboardText = this.NewClipboardText;
this.NewClipboardText = null;
ShowMessage("Clipboard updated.");
return;
}
navigator.clipboard.readText().then(newText => {
@ -15,19 +20,14 @@ export class ClipboardWatcher {
ViewerApp.MessageSender.SendClipboardTransfer(newText, false);
}
});
}, 100);
}, 500);
}
}
SetClipboardText(text) {
if (text == this.LastClipboardText) {
return;
}
if (navigator.clipboard.writeText) {
this.PauseMonitoring = true;
this.LastClipboardText = text;
navigator.clipboard.writeText(text);
this.PauseMonitoring = false;
}
this.NewClipboardText = text;
}
}
//# sourceMappingURL=ClipboardWatcher.js.map

View File

@ -1 +1 @@
{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["ClipboardWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,OAAO,gBAAgB;IAKzB,cAAc;QACV,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;YAE9B,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,SAAS,CAAC,aAAa,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;qBACjE;gBACL,CAAC,CAAC,CAAA;YACN,CAAC,EAAE,GAAG,CAAC,CAAC;SACX;IACL,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAChC,OAAO;SACV;QAED,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;SAChC;IACL,CAAC;CACJ"}
{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["ClipboardWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,OAAO,gBAAgB;IAKzB,cAAc;QACV,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;YAE9B,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE;oBACtB,OAAO;iBACV;gBAED,IAAI,IAAI,CAAC,gBAAgB,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE;oBACxD,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACrD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC;oBAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC7B,WAAW,CAAC,oBAAoB,CAAC,CAAC;oBAClC,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,SAAS,CAAC,aAAa,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;qBACjE;gBACL,CAAC,CAAC,CAAA;YACN,CAAC,EAAE,GAAG,CAAC,CAAC;SACX;IACL,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAChC,OAAO;SACV;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACjC,CAAC;CACJ"}

View File

@ -1,18 +1,24 @@
import { ViewerApp } from "./App.js";
import { ShowMessage } from "./UI.js";
export class ClipboardWatcher {
ClipboardTimer: number;
LastClipboardText: string;
PauseMonitoring: boolean;
NewClipboardText: string;
WatchClipboard() {
if (navigator.clipboard.readText) {
this.ClipboardTimer = setInterval(() => {
if (this.PauseMonitoring) {
if (!document.hasFocus()) {
return;
}
if (!document.hasFocus()) {
if (this.NewClipboardText && navigator.clipboard.writeText) {
navigator.clipboard.writeText(this.NewClipboardText);
this.LastClipboardText = this.NewClipboardText;
this.NewClipboardText = null;
ShowMessage("Clipboard updated.");
return;
}
@ -22,7 +28,7 @@ export class ClipboardWatcher {
ViewerApp.MessageSender.SendClipboardTransfer(newText, false);
}
})
}, 100);
}, 500);
}
}
@ -31,11 +37,6 @@ export class ClipboardWatcher {
return;
}
if (navigator.clipboard.writeText) {
this.PauseMonitoring = true;
this.LastClipboardText = text;
navigator.clipboard.writeText(text);
this.PauseMonitoring = false;
}
this.NewClipboardText = text;
}
}

View File

@ -1,13 +1,12 @@
import * as UI from "./UI.js";
import { BaseDtoType } from "./Enums/BaseDtoType.js";
import { ViewerApp } from "./App.js";
import { ShowMessage } from "./UI.js";
import { Sound } from "./Sound.js";
import { ReceiveFile } from "./FileTransferService.js";
import { HandleCaptureReceived } from "./CaptureProcessor.js";
export class DtoMessageHandler {
constructor() {
this.MessagePack = window['msgpack5']();
this.ImagePartials = {};
}
ParseBinaryMessage(data) {
var model = this.MessagePack.decode(data);
@ -24,9 +23,6 @@ export class DtoMessageHandler {
case BaseDtoType.CursorChange:
this.HandleCursorChange(model);
break;
case BaseDtoType.MachineName:
this.HandleMachineName(model);
break;
case BaseDtoType.ScreenData:
this.HandleScreenData(model);
break;
@ -46,37 +42,10 @@ export class DtoMessageHandler {
Sound.Play(audioSample.Buffer);
}
HandleCaptureFrame(captureFrame) {
if (captureFrame.EndOfFrame) {
var partials = this.ImagePartials[captureFrame.Id];
let completedFrame = new Blob(partials);
this.ImagePartials[captureFrame.Id] = [];
let url = window.URL.createObjectURL(completedFrame);
let img = new Image(captureFrame.Width, captureFrame.Height);
img.onload = () => {
UI.Screen2DContext.drawImage(img, captureFrame.Left, captureFrame.Top, captureFrame.Width, captureFrame.Height);
window.URL.revokeObjectURL(url);
};
img.src = url;
//createImageBitmap(completedFrame).then(bitmap => {
// UI.Screen2DContext.drawImage(bitmap,
// captureFrame.Left,
// captureFrame.Top,
// captureFrame.Width,
// captureFrame.Height);
// bitmap.close();
//})
ViewerApp.MessageSender.SendFrameReceived();
}
else {
if (!this.ImagePartials[captureFrame.Id]) {
this.ImagePartials[captureFrame.Id] = [];
}
this.ImagePartials[captureFrame.Id].push(captureFrame.ImageBytes);
}
HandleCaptureReceived(captureFrame);
}
HandleClipboardText(clipboardText) {
ViewerApp.ClipboardWatcher.SetClipboardText(clipboardText.ClipboardText);
ShowMessage("Clipboard updated.");
}
HandleCursorChange(cursorChange) {
UI.UpdateCursor(cursorChange.ImageBytes, cursorChange.HotSpotX, cursorChange.HotSpotY, cursorChange.CssOverride);
@ -84,11 +53,11 @@ export class DtoMessageHandler {
HandleFile(file) {
ReceiveFile(file);
}
HandleMachineName(machineNameDto) {
document.title = `${machineNameDto.MachineName} - Remotely Session`;
}
HandleScreenData(screenDataDto) {
UI.UpdateDisplays(screenDataDto.SelectedScreen, screenDataDto.DisplayNames);
document.title = `${screenDataDto.MachineName} - Remotely Session`;
UI.ToggleConnectUI(false);
UI.SetScreenSize(screenDataDto.ScreenWidth, screenDataDto.ScreenHeight);
UI.UpdateDisplays(screenDataDto.SelectedDisplay, screenDataDto.DisplayNames);
}
HandleScreenSize(screenSizeDto) {
UI.SetScreenSize(screenSizeDto.Width, screenSizeDto.Height);

View File

@ -1 +1 @@
{"version":3,"file":"DtoMessageHandler.js","sourceRoot":"","sources":["DtoMessageHandler.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"DtoMessageHandler.js","sourceRoot":"","sources":["DtoMessageHandler.ts"],"names":[],"mappings":"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"}

View File

@ -9,17 +9,16 @@ import {
CaptureFrameDto,
ClipboardTextDto,
CursorChangeDto,
MachineNameDto,
ScreenDataDto,
ScreenSizeDto,
FileDto,
WindowsSessionsDto
} from "./Interfaces/Dtos.js";
import { ReceiveFile } from "./FileTransferService.js";
import { HandleCaptureReceived } from "./CaptureProcessor.js";
export class DtoMessageHandler {
MessagePack: any = window['msgpack5']();
ImagePartials: Record<string, Array<Uint8Array>> = {};
ParseBinaryMessage(data: ArrayBuffer) {
var model = this.MessagePack.decode(data) as BaseDto;
@ -36,9 +35,6 @@ export class DtoMessageHandler {
case BaseDtoType.CursorChange:
this.HandleCursorChange(model as unknown as CursorChangeDto);
break;
case BaseDtoType.MachineName:
this.HandleMachineName(model as unknown as MachineNameDto);
break;
case BaseDtoType.ScreenData:
this.HandleScreenData(model as unknown as ScreenDataDto);
break;
@ -60,48 +56,11 @@ export class DtoMessageHandler {
}
HandleCaptureFrame(captureFrame: CaptureFrameDto) {
if (captureFrame.EndOfFrame) {
var partials = this.ImagePartials[captureFrame.Id];
let completedFrame = new Blob(partials);
this.ImagePartials[captureFrame.Id] = [];
let url = window.URL.createObjectURL(completedFrame);
let img = new Image(captureFrame.Width, captureFrame.Height);
img.onload = () => {
UI.Screen2DContext.drawImage(img,
captureFrame.Left,
captureFrame.Top,
captureFrame.Width,
captureFrame.Height);
window.URL.revokeObjectURL(url);
};
img.src = url;
//createImageBitmap(completedFrame).then(bitmap => {
// UI.Screen2DContext.drawImage(bitmap,
// captureFrame.Left,
// captureFrame.Top,
// captureFrame.Width,
// captureFrame.Height);
// bitmap.close();
//})
ViewerApp.MessageSender.SendFrameReceived();
}
else {
if (!this.ImagePartials[captureFrame.Id]) {
this.ImagePartials[captureFrame.Id] = [];
}
this.ImagePartials[captureFrame.Id].push(captureFrame.ImageBytes);
}
HandleCaptureReceived(captureFrame);
}
HandleClipboardText(clipboardText: ClipboardTextDto) {
ViewerApp.ClipboardWatcher.SetClipboardText(clipboardText.ClipboardText);
ShowMessage("Clipboard updated.");
}
HandleCursorChange(cursorChange: CursorChangeDto) {
UI.UpdateCursor(cursorChange.ImageBytes, cursorChange.HotSpotX, cursorChange.HotSpotY, cursorChange.CssOverride);
@ -109,11 +68,11 @@ export class DtoMessageHandler {
HandleFile(file: FileDto) {
ReceiveFile(file);
}
HandleMachineName(machineNameDto: MachineNameDto) {
document.title = `${machineNameDto.MachineName} - Remotely Session`;
}
HandleScreenData(screenDataDto: ScreenDataDto) {
UI.UpdateDisplays(screenDataDto.SelectedScreen, screenDataDto.DisplayNames);
document.title = `${screenDataDto.MachineName} - Remotely Session`;
UI.ToggleConnectUI(false);
UI.SetScreenSize(screenDataDto.ScreenWidth, screenDataDto.ScreenHeight);
UI.UpdateDisplays(screenDataDto.SelectedDisplay, screenDataDto.DisplayNames);
}
HandleScreenSize(screenSizeDto: ScreenSizeDto) {

View File

@ -3,7 +3,6 @@ export var BaseDtoType;
BaseDtoType[BaseDtoType["CaptureFrame"] = 0] = "CaptureFrame";
BaseDtoType[BaseDtoType["ScreenData"] = 1] = "ScreenData";
BaseDtoType[BaseDtoType["ScreenSize"] = 2] = "ScreenSize";
BaseDtoType[BaseDtoType["MachineName"] = 3] = "MachineName";
BaseDtoType[BaseDtoType["ClipboardText"] = 4] = "ClipboardText";
BaseDtoType[BaseDtoType["AudioSample"] = 5] = "AudioSample";
BaseDtoType[BaseDtoType["CursorChange"] = 6] = "CursorChange";

View File

@ -1 +1 @@
{"version":3,"file":"BaseDtoType.js","sourceRoot":"","sources":["BaseDtoType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WA2BX;AA3BD,WAAY,WAAW;IACnB,6DAAgB,CAAA;IAChB,yDAAc,CAAA;IACd,yDAAc,CAAA;IACd,2DAAe,CAAA;IACf,+DAAiB,CAAA;IACjB,2DAAe,CAAA;IACf,6DAAgB,CAAA;IAChB,6DAAgB,CAAA;IAChB,uDAAa,CAAA;IACb,uDAAa,CAAA;IACb,oDAAY,CAAA;IACZ,4CAAQ,CAAA;IACR,0DAAe,CAAA;IACf,oDAAY,CAAA;IACZ,gDAAU,CAAA;IACV,0DAAe,CAAA;IACf,4DAAgB,CAAA;IAChB,sEAAqB,CAAA;IACrB,wEAAsB,CAAA;IACtB,sDAAa,CAAA;IACb,8CAAS,CAAA;IACT,oEAAoB,CAAA;IACpB,kEAAmB,CAAA;IACnB,gEAAkB,CAAA;IAClB,wEAAsB,CAAA;IACtB,kFAA2B,CAAA;AAC/B,CAAC,EA3BW,WAAW,KAAX,WAAW,QA2BtB"}
{"version":3,"file":"BaseDtoType.js","sourceRoot":"","sources":["BaseDtoType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WA0BX;AA1BD,WAAY,WAAW;IACnB,6DAAgB,CAAA;IAChB,yDAAc,CAAA;IACd,yDAAc,CAAA;IACd,+DAAiB,CAAA;IACjB,2DAAe,CAAA;IACf,6DAAgB,CAAA;IAChB,6DAAgB,CAAA;IAChB,uDAAa,CAAA;IACb,uDAAa,CAAA;IACb,oDAAY,CAAA;IACZ,4CAAQ,CAAA;IACR,0DAAe,CAAA;IACf,oDAAY,CAAA;IACZ,gDAAU,CAAA;IACV,0DAAe,CAAA;IACf,4DAAgB,CAAA;IAChB,sEAAqB,CAAA;IACrB,wEAAsB,CAAA;IACtB,sDAAa,CAAA;IACb,8CAAS,CAAA;IACT,oEAAoB,CAAA;IACpB,kEAAmB,CAAA;IACnB,gEAAkB,CAAA;IAClB,wEAAsB,CAAA;IACtB,kFAA2B,CAAA;AAC/B,CAAC,EA1BW,WAAW,KAAX,WAAW,QA0BtB"}

View File

@ -2,7 +2,6 @@
CaptureFrame = 0,
ScreenData = 1,
ScreenSize = 2,
MachineName = 3,
ClipboardText = 4,
AudioSample = 5,
CursorChange = 6,

View File

@ -6,7 +6,6 @@ import { RemoteControlMode } from "./Enums/RemoteControlMode.js";
import { GetDistanceBetween } from "./Utilities.js";
import { ShowMessage } from "./UI.js";
import { SetSettings } from "./SettingsService.js";
var lastPointerMove = Date.now();
var isDragging;
var currentPointerDevice;
var currentTouchCount;
@ -196,10 +195,6 @@ export function ApplyInputHandlers() {
if (ViewerApp.ViewOnlyMode) {
return;
}
if (Date.now() - lastPointerMove < 25) {
return;
}
lastPointerMove = Date.now();
var percentX = e.offsetX / viewer.clientWidth;
var percentY = e.offsetY / viewer.clientHeight;
ViewerApp.MessageSender.SendMouseMove(percentX, percentY);

File diff suppressed because one or more lines are too long

View File

@ -41,7 +41,6 @@ import { GetDistanceBetween } from "./Utilities.js";
import { ShowMessage } from "./UI.js";
import { SetSettings } from "./SettingsService.js";
var lastPointerMove = Date.now();
var isDragging: boolean;
var currentPointerDevice: string;
var currentTouchCount: number;
@ -245,10 +244,6 @@ export function ApplyInputHandlers() {
return;
}
if (Date.now() - lastPointerMove < 25) {
return;
}
lastPointerMove = Date.now();
var percentX = e.offsetX / viewer.clientWidth;
var percentY = e.offsetY / viewer.clientHeight;
ViewerApp.MessageSender.SendMouseMove(percentX, percentY);

View File

@ -1 +1 @@
{"version":3,"file":"Dtos.js","sourceRoot":"","sources":["Dtos.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"Dtos.js","sourceRoot":"","sources":["Dtos.ts"],"names":[],"mappings":"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"}

View File

@ -8,13 +8,13 @@ export interface AudioSampleDto extends BaseDto {
}
export interface CaptureFrameDto extends BaseDto {
Id: string;
EndOfFrame: boolean;
Left: number;
Top: number;
Width: number;
Height: number;
ImageBytes: Uint8Array;
Sequence: number;
}
export interface ClipboardTextDto extends BaseDto {
@ -102,10 +102,6 @@ export class KeyUpDto implements BaseDto {
DtoType: BaseDtoType = BaseDtoType.KeyUp;
}
export interface MachineNameDto extends BaseDto {
MachineName: string;
}
export class MouseDownDto implements BaseDto {
constructor(button: number, percentX: number, percentY: number) {
this.Button = button;
@ -156,7 +152,10 @@ export class MouseWheelDto implements BaseDto {
export interface ScreenDataDto extends BaseDto {
DisplayNames: string[];
SelectedScreen: string;
SelectedDisplay: string;
MachineName: string;
ScreenWidth: number;
ScreenHeight: number;
}
export interface ScreenSizeDto extends BaseDto {

View File

@ -0,0 +1,3 @@
export class CompletedFrame {
}
//# sourceMappingURL=CompletedFrame.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"CompletedFrame.js","sourceRoot":"","sources":["CompletedFrame.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;CAG1B"}

View File

@ -0,0 +1,6 @@
import { CaptureFrameDto } from "../Interfaces/Dtos.js";
export class CompletedFrame {
ImageContent: ImageBitmap;
FrameData: CaptureFrameDto;
}

View File

@ -17,7 +17,6 @@ export class ViewerHubConnection {
this.ApplyMessageHandlers(this.Connection);
this.Connection.start().then(() => {
this.SendScreenCastRequestToDevice();
UI.ToggleConnectUI(false);
}).catch(err => {
console.error(err.toString());
console.log("Connection closed.");

View File

@ -1 +1 @@
{"version":3,"file":"ViewerHubConnection.js","sourceRoot":"","sources":["ViewerHubConnection.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"ViewerHubConnection.js","sourceRoot":"","sources":["ViewerHubConnection.ts"],"names":[],"mappings":"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"}

View File

@ -29,7 +29,6 @@ export class ViewerHubConnection {
this.Connection.start().then(() => {
this.SendScreenCastRequestToDevice();
UI.ToggleConnectUI(false);
}).catch(err => {
console.error(err.toString());
console.log("Connection closed.");

View File

@ -11,8 +11,6 @@ namespace Remotely.Shared.Enums
ScreenData = 1,
[EnumMember(Value = "ScreenSize")]
ScreenSize = 2,
[EnumMember(Value = "MachineName")]
MachineName = 3,
[EnumMember(Value = "ClipboardText")]
ClipboardText = 4,
[EnumMember(Value = "AudioSample")]

View File

@ -11,22 +11,22 @@ namespace Remotely.Shared.Models.RemoteControlDtos
public new BaseDtoType DtoType { get; } = BaseDtoType.CaptureFrame;
[DataMember(Name = "EndOfFrame")]
public bool EndOfFrame { get; set; }
public bool EndOfFrame { get; init; }
[DataMember(Name = "Height")]
public int Height { get; set; }
[DataMember(Name = "Id")]
public Guid Id { get; set; }
public int Height { get; init; }
[DataMember(Name = "ImageBytes")]
public byte[] ImageBytes { get; set; }
public byte[] ImageBytes { get; init; }
[DataMember(Name = "Left")]
public int Left { get; set; }
public int Left { get; init; }
[DataMember(Name = "Top")]
public int Top { get; set; }
public int Top { get; init; }
[DataMember(Name = "Width")]
public int Width { get; set; }
public int Width { get; init; }
[DataMember(Name = "Sequence")]
public long Sequence { get; init; }
}
}

View File

@ -1,20 +0,0 @@
using Remotely.Shared.Enums;
using System.Runtime.Serialization;
namespace Remotely.Shared.Models.RemoteControlDtos
{
[DataContract]
public class MachineNameDto : BaseDto
{
public MachineNameDto(string machineName)
{
MachineName = machineName;
}
[DataMember(Name = "DtoType")]
public new BaseDtoType DtoType { get; } = BaseDtoType.MachineName;
[DataMember(Name = "MachineName")]
public string MachineName { get; }
}
}

View File

@ -1,4 +1,5 @@
using Remotely.Shared.Enums;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Remotely.Shared.Models.RemoteControlDtos
@ -6,20 +7,23 @@ namespace Remotely.Shared.Models.RemoteControlDtos
[DataContract]
public class ScreenDataDto : BaseDto
{
public ScreenDataDto(string selectedScreen, string[] displayNames)
{
SelectedScreen = selectedScreen;
DisplayNames = displayNames;
}
[DataMember(Name = "DisplayNames")]
public string[] DisplayNames { get; }
public IEnumerable<string> DisplayNames { get; init; }
[DataMember(Name = "DtoType")]
public new BaseDtoType DtoType { get; } = BaseDtoType.ScreenData;
[DataMember(Name = "SelectedScreen")]
public string SelectedScreen { get; }
[DataMember(Name = "SelectedDisplay")]
public string SelectedDisplay { get; init; }
[DataMember(Name = "MachineName")]
public string MachineName { get; init; }
[DataMember(Name = "ScreenWidth")]
public int ScreenWidth { get; init; }
[DataMember(Name = "ScreenHeight")]
public int ScreenHeight { get; init; }
}
}

View File

@ -1,4 +1,5 @@
using System;
using Remotely.Shared.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -8,9 +9,9 @@ namespace Remotely.Shared.Models
{
public struct SentFrame
{
public SentFrame(DateTimeOffset timestamp, int frameSize)
public SentFrame(int frameSize)
{
Timestamp = timestamp;
Timestamp = Time.Now;
FrameSize = frameSize;
}

View File

@ -117,10 +117,10 @@ namespace Remotely.Shared.Utilities
}
}
public static void Write(Exception ex, string message, EventType eventType = EventType.Error)
public static void Write(Exception ex, string message, EventType eventType = EventType.Error, [CallerMemberName] string callerName = "")
{
Write(message, eventType);
Write(ex, eventType);
Write(message, eventType, callerName);
Write(ex, eventType, callerName);
}
private static void CheckLogFileExists()