Resolve dependency loop.

This commit is contained in:
Jared Goodwin 2020-04-13 20:25:09 -07:00
parent 74f48270ce
commit 08ac61e4ef
15 changed files with 66 additions and 53 deletions

View File

@ -157,10 +157,10 @@ Global
{6B726FC4-A907-4813-BF38-3342E02AA8D2}.Release|x86.Build.0 = Release|x86
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x64.ActiveCfg = Debug|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x64.Build.0 = Debug|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x86.ActiveCfg = Debug|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x86.Build.0 = Debug|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x64.ActiveCfg = Debug|x64
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x64.Build.0 = Debug|x64
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x86.ActiveCfg = Debug|x86
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Debug|x86.Build.0 = Debug|x86
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Release|Any CPU.Build.0 = Release|Any CPU
{A3D0368C-0850-4614-B5B5-41B9D5135AA9}.Release|x64.ActiveCfg = Release|x64

View File

@ -15,61 +15,53 @@ namespace Remotely.ScreenCast.Core.Services
{
public class ScreenCasterBase
{
public ScreenCasterBase(Viewer viewer)
{
Viewer = viewer;
}
protected Viewer Viewer { get; }
public async Task BeginScreenCasting(string viewerID,
string requesterName)
{
byte[] encodedImageBytes;
var fpsQueue = new Queue<DateTimeOffset>();
var conductor = ServiceContainer.Instance.GetRequiredService<Conductor>();
var viewers = conductor.Viewers;
var mode = conductor.Mode;
var viewer = ServiceContainer.Instance.GetRequiredService<Viewer>();
viewer.Name = requesterName;
viewer.ViewerConnectionID = viewerID;
var viewers = conductor.Viewers;
Logger.Write($"Starting screen cast. Requester: {requesterName}. Viewer ID: {viewerID}. App Mode: {mode}");
byte[] encodedImageBytes;
var fpsQueue = new Queue<DateTimeOffset>();
Viewer.Name = requesterName;
Viewer.ViewerConnectionID = viewerID;
viewers.AddOrUpdate(viewerID, Viewer, (id, v) => Viewer);
viewers.AddOrUpdate(viewerID, viewer, (id, v) => viewer);
if (mode == Enums.AppMode.Normal)
{
conductor.InvokeViewerAdded(Viewer);
conductor.InvokeViewerAdded(viewer);
}
if (EnvironmentHelper.IsWindows)
{
await Viewer.InitializeWebRtc();
await viewer.InitializeWebRtc();
}
await Viewer.SendMachineName(Environment.MachineName, viewerID);
await viewer.SendMachineName(Environment.MachineName, viewerID);
await Viewer.SendScreenData(
Viewer.Capturer.SelectedScreen,
Viewer.Capturer.GetDisplayNames().ToArray(),
await viewer.SendScreenData(
viewer.Capturer.SelectedScreen,
viewer.Capturer.GetDisplayNames().ToArray(),
viewerID);
await Viewer.SendScreenSize(Viewer.Capturer.CurrentScreenBounds.Width,
Viewer.Capturer.CurrentScreenBounds.Height,
await viewer.SendScreenSize(viewer.Capturer.CurrentScreenBounds.Width,
viewer.Capturer.CurrentScreenBounds.Height,
viewerID);
Viewer.Capturer.ScreenChanged += async (sender, bounds) =>
viewer.Capturer.ScreenChanged += async (sender, bounds) =>
{
await Viewer.SendScreenSize(bounds.Width, bounds.Height, viewerID);
await viewer.SendScreenSize(bounds.Width, bounds.Height, viewerID);
};
while (!Viewer.DisconnectRequested && Viewer.IsConnected)
while (!viewer.DisconnectRequested && viewer.IsConnected)
{
try
{
if (Viewer.IsStalled())
if (viewer.IsStalled())
{
// Viewer isn't responding. Abort sending.
break;
@ -85,30 +77,30 @@ namespace Remotely.ScreenCast.Core.Services
Debug.WriteLine($"Capture FPS: {fpsQueue.Count}");
}
await Viewer.ThrottleIfNeeded();
await viewer.ThrottleIfNeeded();
Viewer.Capturer.GetNextFrame();
viewer.Capturer.GetNextFrame();
var diffArea = ImageUtils.GetDiffArea(Viewer.Capturer.CurrentFrame, Viewer.Capturer.PreviousFrame, Viewer.Capturer.CaptureFullscreen);
var diffArea = ImageUtils.GetDiffArea(viewer.Capturer.CurrentFrame, viewer.Capturer.PreviousFrame, viewer.Capturer.CaptureFullscreen);
if (diffArea.IsEmpty)
{
continue;
}
using (var newImage = Viewer.Capturer.CurrentFrame.Clone(diffArea, PixelFormat.Format32bppArgb))
using (var newImage = viewer.Capturer.CurrentFrame.Clone(diffArea, PixelFormat.Format32bppArgb))
{
if (Viewer.Capturer.CaptureFullscreen)
if (viewer.Capturer.CaptureFullscreen)
{
Viewer.Capturer.CaptureFullscreen = false;
viewer.Capturer.CaptureFullscreen = false;
}
encodedImageBytes = ImageUtils.EncodeBitmap(newImage, Viewer.EncoderParams);
encodedImageBytes = ImageUtils.EncodeBitmap(newImage, viewer.EncoderParams);
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, viewer.ImageQuality);
}
}
}
@ -123,11 +115,11 @@ namespace Remotely.ScreenCast.Core.Services
try
{
Viewer.Dispose();
viewer.Dispose();
Viewer.Capturer.Dispose();
viewer.Capturer.Dispose();
Viewer.Disconnect();
viewer.Disconnect();
}
catch (Exception ex)

View File

@ -8,7 +8,9 @@ namespace Remotely.ScreenCast.Linux.Services
{
public class ClipboardServiceLinux : IClipboardService
{
#pragma warning disable
public event EventHandler<string> ClipboardTextChanged;
#pragma warning restore
public void BeginWatching()
{

View File

@ -13,12 +13,6 @@ namespace Remotely.ScreenCast.Linux.Services
{
public class ScreenCasterLinux : ScreenCasterBase, IScreenCaster
{
public ScreenCasterLinux(Viewer viewer)
: base(viewer)
{
}
public async Task BeginScreenCasting(ScreenCastRequest screenCastRequest)
{
try

View File

@ -13,8 +13,7 @@ namespace Remotely.ScreenCast.Win.Services
{
public class ScreenCasterWin : ScreenCasterBase, IScreenCaster
{
public ScreenCasterWin(CursorIconWatcher cursorIconWatcher, Viewer viewer)
: base(viewer)
public ScreenCasterWin(CursorIconWatcher cursorIconWatcher)
{
CursorIconWatcher = cursorIconWatcher;
}

View File

@ -45,6 +45,7 @@
<Content Remove="wwwroot\scripts\Models\GenericCommandResult.ts" />
<Content Remove="wwwroot\scripts\Models\Parameter.ts" />
<Content Remove="wwwroot\scripts\Models\Point.ts" />
<Content Remove="wwwroot\scripts\RemoteControl\RtcDtos\ClipboardTextDto.ts" />
<Content Remove="wwwroot\scripts\RemoteControl\RtcDtos\MachineNameDto.ts" />
<Content Remove="wwwroot\scripts\RemoteControl\RtcDtos\ScreenDataDto.ts" />
<Content Remove="wwwroot\scripts\Models\UserOptions.ts" />
@ -159,6 +160,7 @@
<TypeScriptCompile Include="wwwroot\scripts\Enums\DynamicDtoType.ts" />
<TypeScriptCompile Include="wwwroot\scripts\RemoteControl\RtcDtos\CaptureFrameDto.ts" />
<TypeScriptCompile Include="wwwroot\scripts\Models\Point.ts" />
<TypeScriptCompile Include="wwwroot\scripts\RemoteControl\RtcDtos\ClipboardTextDto.ts" />
<TypeScriptCompile Include="wwwroot\scripts\RemoteControl\RtcDtos\MachineNameDto.ts">
<SubType>Code</SubType>
</TypeScriptCompile>

View File

@ -4,5 +4,6 @@ export var DynamicDtoType;
DynamicDtoType[DynamicDtoType["ScreenData"] = 1] = "ScreenData";
DynamicDtoType[DynamicDtoType["ScreenSize"] = 2] = "ScreenSize";
DynamicDtoType[DynamicDtoType["MachineName"] = 3] = "MachineName";
DynamicDtoType[DynamicDtoType["ClipboardText"] = 4] = "ClipboardText";
})(DynamicDtoType || (DynamicDtoType = {}));
//# sourceMappingURL=DynamicDtoType.js.map

View File

@ -1 +1 @@
{"version":3,"file":"DynamicDtoType.js","sourceRoot":"","sources":["DynamicDtoType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACtB,mEAAgB,CAAA;IAChB,+DAAc,CAAA;IACd,+DAAc,CAAA;IACd,iEAAe,CAAA;AACnB,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB"}
{"version":3,"file":"DynamicDtoType.js","sourceRoot":"","sources":["DynamicDtoType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAMX;AAND,WAAY,cAAc;IACtB,mEAAgB,CAAA;IAChB,+DAAc,CAAA;IACd,+DAAc,CAAA;IACd,iEAAe,CAAA;IACf,qEAAa,CAAA;AACjB,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB"}

View File

@ -2,5 +2,6 @@
CaptureFrame = 0,
ScreenData = 1,
ScreenSize = 2,
MachineName = 3
MachineName = 3,
ClipboardText
}

View File

@ -0,0 +1 @@
//# sourceMappingURL=ClipboardTextDto.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"ClipboardTextDto.js","sourceRoot":"","sources":["ClipboardTextDto.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1,5 @@
import { DynamicDto } from "../DynamicDto.js";
export interface ClipboardTextDto extends DynamicDto {
ClipboardText: string;
}

View File

@ -1,6 +1,7 @@
import * as UI from "./UI.js";
import { DynamicDtoType } from "../Enums/DynamicDtoType.js";
import { Remotely } from "./Main.js";
import { PopupMessage } from "../UI.js";
export class RtcMessageHandler {
constructor() {
this.FpsStack = [];
@ -22,9 +23,15 @@ export class RtcMessageHandler {
case DynamicDtoType.ScreenSize:
this.ProcessScreenSize(model);
break;
case DynamicDtoType.ClipboardText:
this.ProcessClipboardText(model);
default:
}
}
ProcessClipboardText(clipboardText) {
Remotely.ClipboardWatcher.SetClipboardText(clipboardText.ClipboardText);
PopupMessage("Clipboard updated.");
}
ProcessMachineName(machineNameDto) {
document.title = `${machineNameDto.MachineName} - Remotely Session`;
}

View File

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

View File

@ -6,6 +6,8 @@ import { CaptureFrameDto } from "./RtcDtos/CaptureFrameDto.js";
import { MachineNameDto } from "./RtcDtos/MachineNameDto.js";
import { ScreenDataDto } from "./RtcDtos/ScreenDataDto.js";
import { ScreenSizeDto } from "./RtcDtos/ScreenSizeDto.js";
import { ClipboardTextDto } from "./RtcDtos/ClipboardTextDto.js";
import { PopupMessage } from "../UI.js";
export class RtcMessageHandler {
FpsStack: Array<number> = [];
@ -26,9 +28,15 @@ export class RtcMessageHandler {
case DynamicDtoType.ScreenSize:
this.ProcessScreenSize(model as unknown as ScreenSizeDto)
break;
case DynamicDtoType.ClipboardText:
this.ProcessClipboardText(model as unknown as ClipboardTextDto);
default:
}
}
ProcessClipboardText(clipboardText: ClipboardTextDto) {
Remotely.ClipboardWatcher.SetClipboardText(clipboardText.ClipboardText);
PopupMessage("Clipboard updated.");
}
ProcessMachineName(machineNameDto: MachineNameDto) {
document.title = `${machineNameDto.MachineName} - Remotely Session`;
}