From b320e5e3d0fcde7d07211aacc3ba12bc11977e07 Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Mon, 25 Feb 2019 23:17:23 -0800 Subject: [PATCH] Rebranding. --- .../Resources/Remotely_ScreenCapture.exe | Bin 1299968 -> 1301504 bytes Remotely_ScreenCast/Capture/BitBltCapture.cs | 40 ++--- Remotely_ScreenCast/Capture/DXCapture.cs | 28 ++-- Remotely_ScreenCast/Capture/ICapturer.cs | 7 +- Remotely_ScreenCast/Models/Viewer.cs | 1 + .../Sockets/MessageHandlers.cs | 55 +++++-- Remotely_Server/Pages/_DataGrid.cshtml | 4 +- .../Services/RCBrowserSocketHub.cs | 152 +++++++++--------- .../scripts/RemoteControl/RCBrowserSockets.js | 21 +-- .../RemoteControl/RCBrowserSockets.js.map | 2 +- .../scripts/RemoteControl/RCBrowserSockets.ts | 20 +-- .../wwwroot/scripts/ResultsParser.js | 12 +- .../wwwroot/scripts/ResultsParser.ts | 12 +- 13 files changed, 179 insertions(+), 175 deletions(-) diff --git a/Remotely_Agent/Resources/Remotely_ScreenCapture.exe b/Remotely_Agent/Resources/Remotely_ScreenCapture.exe index 8612c28ecad16be0e60f3c192c4cdb9fe1294a65..2518b05f40516a8af15cbe5ba5e2888bf1362785 100644 GIT binary patch delta 30777 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 delta 29558 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 MN5&6oX+QV>0gDtD#Q*>R diff --git a/Remotely_ScreenCast/Capture/BitBltCapture.cs b/Remotely_ScreenCast/Capture/BitBltCapture.cs index c4c1d77e..7d3897a7 100644 --- a/Remotely_ScreenCast/Capture/BitBltCapture.cs +++ b/Remotely_ScreenCast/Capture/BitBltCapture.cs @@ -19,18 +19,11 @@ namespace Remotely_ScreenCast.Capture public class BitBltCapture : ICapturer { public Bitmap CurrentFrame { get; set; } - public Size CurrentScreenSize - { - get - { - return CurrentBounds.Size; - } - } public Bitmap PreviousFrame { get; set; } public bool IsCapturing { get; set; } public bool CaptureFullscreen { get; set; } = true; public int PauseForMilliseconds { get; set; } - public EventHandler ScreenChanged { get; set; } + public EventHandler ScreenChanged { get; set; } public int SelectedScreen { get @@ -51,38 +44,27 @@ namespace Remotely_ScreenCast.Capture { selectedScreen = 0; } - CurrentBounds = Screen.AllScreens[selectedScreen].Bounds; - ScreenChanged?.Invoke(this, CurrentBounds.Size); + CurrentScreenBounds = Screen.AllScreens[selectedScreen].Bounds; + ScreenChanged?.Invoke(this, CurrentScreenBounds); } } - public Rectangle CurrentBounds { get; set; } = Screen.PrimaryScreen.Bounds; + public Rectangle CurrentScreenBounds { get; set; } = Screen.PrimaryScreen.Bounds; private int selectedScreen = 0; - - // Offsets are the left and top edge of the screen, in case multiple monitor setups - // create a situation where the edge of a monitor is in the negative. This must - // be converted to a 0-based max left/top to render images on the canvas properly. private Graphics graphic; private string desktopName; public BitBltCapture() { - CurrentFrame = new Bitmap(CurrentBounds.Width, CurrentBounds.Height, PixelFormat.Format32bppArgb); - PreviousFrame = new Bitmap(CurrentBounds.Width, CurrentBounds.Height, PixelFormat.Format32bppArgb); + CurrentFrame = new Bitmap(CurrentScreenBounds.Width, CurrentScreenBounds.Height, PixelFormat.Format32bppArgb); + PreviousFrame = new Bitmap(CurrentScreenBounds.Width, CurrentScreenBounds.Height, PixelFormat.Format32bppArgb); graphic = Graphics.FromImage(CurrentFrame); desktopName = Win32Interop.GetCurrentDesktop(); } - private void CursorIcon_OnChange(object sender, int e) - { - //AditClient.SocketMessageHandler.SendIconUpdate(e); - } - public void Capture() { - Console.WriteLine($"Using BitBlt Capturer."); var currentDesktop = Win32Interop.GetCurrentDesktop(); - Console.WriteLine($"Current Desktop: {currentDesktop}"); if (currentDesktop != desktopName) { desktopName = currentDesktop; @@ -97,7 +79,7 @@ namespace Remotely_ScreenCast.Capture try { - graphic.CopyFromScreen(0 + CurrentBounds.Left, 0 + CurrentBounds.Top, 0, 0, new Size(CurrentBounds.Width, CurrentBounds.Height)); + graphic.CopyFromScreen(0 + CurrentScreenBounds.Left, 0 + CurrentScreenBounds.Top, 0, 0, new Size(CurrentScreenBounds.Width, CurrentScreenBounds.Height)); } catch (Exception ex) { @@ -105,5 +87,11 @@ namespace Remotely_ScreenCast.Capture } } - } + public Point GetAbsoluteScreenCoordinatesFromPercentages(decimal percentX, decimal percentY) + { + var absoluteX = (CurrentScreenBounds.Width * percentX) + CurrentScreenBounds.Left; + var absoluteY = (CurrentScreenBounds.Height * percentY) + CurrentScreenBounds.Top; + return new Point((int)absoluteX, (int)absoluteY); + } + } } diff --git a/Remotely_ScreenCast/Capture/DXCapture.cs b/Remotely_ScreenCast/Capture/DXCapture.cs index d16ec89d..768abc30 100644 --- a/Remotely_ScreenCast/Capture/DXCapture.cs +++ b/Remotely_ScreenCast/Capture/DXCapture.cs @@ -21,15 +21,9 @@ namespace Remotely_ScreenCast.Capture { public Bitmap PreviousFrame { get; set; } public Bitmap CurrentFrame { get; set; } - public Size CurrentScreenSize - { - get - { - return new Size(width, height); - } - } + public Rectangle CurrentScreenBounds { get; private set; } public bool CaptureFullscreen { get; set; } = true; - public EventHandler ScreenChanged { get; set; } + public EventHandler ScreenChanged { get; set; } public int SelectedScreen { get @@ -93,12 +87,14 @@ namespace Remotely_ScreenCast.Capture output = adapter.GetOutput(selectedScreen); output1 = output.QueryInterface(); - // Width/Height of desktop to capture - var newWidth = output.Description.DesktopBounds.Right - output.Description.DesktopBounds.Left; - var newHeight = output.Description.DesktopBounds.Bottom - output.Description.DesktopBounds.Top; + // Width/Height of desktop to capture + var bounds = output.Description.DesktopBounds; + var newWidth = bounds.Right - bounds.Left; + var newHeight = bounds.Bottom - bounds.Top; + CurrentScreenBounds = new Rectangle(bounds.Left, bounds.Top, newWidth, newHeight); if (newWidth != width || newHeight != height) { - ScreenChanged?.Invoke(this, new Size(newWidth, newHeight)); + ScreenChanged?.Invoke(this, CurrentScreenBounds); } width = newWidth; height = newHeight; @@ -212,5 +208,11 @@ namespace Remotely_ScreenCast.Capture } } - } + public Point GetAbsoluteScreenCoordinatesFromPercentages(decimal percentX, decimal percentY) + { + var absoluteX = (CurrentScreenBounds.Width * percentX) + CurrentScreenBounds.Left; + var absoluteY = (CurrentScreenBounds.Height * percentY) + CurrentScreenBounds.Top; + return new Point((int)absoluteX, (int)absoluteY); + } + } } diff --git a/Remotely_ScreenCast/Capture/ICapturer.cs b/Remotely_ScreenCast/Capture/ICapturer.cs index 0aeb661d..c01968d1 100644 --- a/Remotely_ScreenCast/Capture/ICapturer.cs +++ b/Remotely_ScreenCast/Capture/ICapturer.cs @@ -10,12 +10,13 @@ namespace Remotely_ScreenCast.Capture public interface ICapturer { Bitmap CurrentFrame { get; set; } - Size CurrentScreenSize { get; } - + Rectangle CurrentScreenBounds { get; } Bitmap PreviousFrame { get; set; } bool CaptureFullscreen { get; set; } void Capture(); - EventHandler ScreenChanged { get; set; } + EventHandler ScreenChanged { get; set; } int SelectedScreen { get; set; } + + Point GetAbsoluteScreenCoordinatesFromPercentages(decimal percentX, decimal percentY); } } diff --git a/Remotely_ScreenCast/Models/Viewer.cs b/Remotely_ScreenCast/Models/Viewer.cs index b57c6eca..a28903ed 100644 --- a/Remotely_ScreenCast/Models/Viewer.cs +++ b/Remotely_ScreenCast/Models/Viewer.cs @@ -14,5 +14,6 @@ namespace Remotely_ScreenCapture.Models public ICapturer Capturer { get; set; } public int CurrentScreenIndex { get; set; } public bool DisconnectRequested { get; set; } + public bool HasControl { get; set; } } } diff --git a/Remotely_ScreenCast/Sockets/MessageHandlers.cs b/Remotely_ScreenCast/Sockets/MessageHandlers.cs index b843706e..eb4c7944 100644 --- a/Remotely_ScreenCast/Sockets/MessageHandlers.cs +++ b/Remotely_ScreenCast/Sockets/MessageHandlers.cs @@ -29,20 +29,56 @@ namespace Remotely_ScreenCapture.Sockets BeginScreenCasting(hubConnection, viewerID, requesterName, outgoingMessages); }); - hubConnection.On("KeyDown", (int keyCode) => + hubConnection.On("KeyDown", (int keyCode, string viewerID) => { - Win32Interop.SendKeyDown((User32.VirtualKeyShort)keyCode); + var viewer = Program.Viewers[viewerID]; + if (viewer.HasControl) + { + Win32Interop.SendKeyDown((User32.VirtualKeyShort)keyCode); + } }); - hubConnection.On("KeyUp", (int keyCode) => + hubConnection.On("KeyUp", (int keyCode, string viewerID) => { - Win32Interop.SendKeyUp((User32.VirtualKeyShort)keyCode); + var viewer = Program.Viewers[viewerID]; + if (viewer.HasControl) + { + Win32Interop.SendKeyUp((User32.VirtualKeyShort)keyCode); + } }); - hubConnection.On("KeyPress", (int keyCode) => + hubConnection.On("KeyPress", (int keyCode, string viewerID) => { - Win32Interop.SendKeyDown((User32.VirtualKeyShort)keyCode); - Win32Interop.SendKeyUp((User32.VirtualKeyShort)keyCode); + var viewer = Program.Viewers[viewerID]; + if (viewer.HasControl) + { + Win32Interop.SendKeyDown((User32.VirtualKeyShort)keyCode); + Win32Interop.SendKeyUp((User32.VirtualKeyShort)keyCode); + } + }); + + hubConnection.On("MouseMove", (decimal percentX, decimal percentY, string viewerID) => + { + var viewer = Program.Viewers[viewerID]; + if (viewer.HasControl) + { + var mousePoint = viewer.Capturer.GetAbsoluteScreenCoordinatesFromPercentages(percentX, percentY); + Win32Interop.SendMouseMove(mousePoint.X, mousePoint.Y); + } + }); + + hubConnection.On("ViewerDisconnected", (string viewerID) => + { + if (Program.Viewers.ContainsKey(viewerID)) + { + var viewer = Program.Viewers[viewerID]; + viewer.DisconnectRequested = true; + var success = false; + while (!success) + { + success = Program.Viewers.TryRemove(viewerID, out _); + } + } }); } @@ -74,7 +110,8 @@ namespace Remotely_ScreenCapture.Sockets CurrentScreenIndex = 0, DisconnectRequested = false, Name = requesterName, - ViewerConnectionID = viewerID + ViewerConnectionID = viewerID, + HasControl = Program.Mode == "unattended" }; @@ -89,7 +126,7 @@ namespace Remotely_ScreenCapture.Sockets Screen.AllScreens.Length, viewerID); - await outgoingMessages.SendScreenSize(capturer.CurrentScreenSize.Width, capturer.CurrentScreenSize.Height, viewerID); + await outgoingMessages.SendScreenSize(capturer.CurrentScreenBounds.Width, capturer.CurrentScreenBounds.Height, viewerID); capturer.ScreenChanged += async (sender, size) => { diff --git a/Remotely_Server/Pages/_DataGrid.cshtml b/Remotely_Server/Pages/_DataGrid.cshtml index e9128420..0244c159 100644 --- a/Remotely_Server/Pages/_DataGrid.cshtml +++ b/Remotely_Server/Pages/_DataGrid.cshtml @@ -1,8 +1,8 @@ 
- - + + Filter:
diff --git a/Remotely_Server/Services/RCBrowserSocketHub.cs b/Remotely_Server/Services/RCBrowserSocketHub.cs index dfc5aebd..d9606679 100644 --- a/Remotely_Server/Services/RCBrowserSocketHub.cs +++ b/Remotely_Server/Services/RCBrowserSocketHub.cs @@ -19,12 +19,7 @@ namespace Remotely_Server.Services this.DeviceHub = deviceHub; } public static ConcurrentDictionary OrganizationConnectionList { get; set; } = new ConcurrentDictionary(); - private DataService DataService { get; } - private IHubContext RCDeviceHub { get; } - private ApplicationConfig AppConfig { get; set; } - private IHubContext DeviceHub { get; } - private string ClientID { get @@ -32,6 +27,7 @@ namespace Remotely_Server.Services return Context.Items["ClientID"] as string; } } + private string ClientType { get @@ -39,6 +35,10 @@ namespace Remotely_Server.Services return Context.Items["ClientType"] as string; } } + + private DataService DataService { get; } + private IHubContext DeviceHub { get; } + private IHubContext RCDeviceHub { get; } private string RequesterName { get @@ -46,26 +46,79 @@ namespace Remotely_Server.Services return Context.Items["RequesterName"] as string; } } - public async Task GetIceConfiguration() + + public async Task CtrlAltDel(string serviceID) { - //await Clients.Caller.SendAsync("IceConfiguration", AppConfig.IceConfiguration); + await DeviceHub.Clients.Client(serviceID).SendAsync("CtrlAltDel"); } - public async Task SendRTCSessionToDevice(object offer, string clientType, string clientID) + + public async Task KeyDown(string key) { - if (clientType == "Normal") + await RCDeviceHub.Clients.Client(ClientID).SendAsync("KeyDown", key, Context.ConnectionId); + } + + public async Task KeyPress(string key) + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("KeyPress", key, Context.ConnectionId); + } + + public async Task KeyUp(string key) + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("KeyUp", key, Context.ConnectionId); + } + + public async Task LongPress() + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("LongPress", Context.ConnectionId); + } + + public async Task MouseDown(string button, double percentX, double percentY) + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseDown", button, percentX, percentY, Context.ConnectionId); + } + + public async Task MouseMove(double percentX, double percentY) + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseMove", percentX, percentY, Context.ConnectionId); + } + + public async Task MouseUp(string button, double percentX, double percentY) + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseUp", button, percentX, percentY, Context.ConnectionId); + } + + public async Task MouseWheel(double deltaX, double deltaY) + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseWheel", deltaX, deltaY, Context.ConnectionId); + } + + public override Task OnConnectedAsync() + { + if (Context.User.Identity.IsAuthenticated) { - clientID = RCDeviceSocketHub.AttendedSessionList[clientID]; + var user = DataService.GetUserByName(Context.User.Identity.Name); + OrganizationConnectionList.TryAdd(Context.ConnectionId, user); } - await RCDeviceHub.Clients.Client(clientID).SendAsync("RTCSession", offer, Context.ConnectionId); + return base.OnConnectedAsync(); } - public async Task SendIceCandidateToDevice(object candidate, string clientType, string clientID) + + public override async Task OnDisconnectedAsync(Exception exception) { - if (clientType == "Normal") + if (Context.User.Identity.IsAuthenticated) { - clientID = RCDeviceSocketHub.AttendedSessionList[clientID]; + await RCDeviceHub.Clients.Client(ClientID).SendAsync("ViewerDisconnected", Context.ConnectionId); + while (!OrganizationConnectionList.TryRemove(Context.ConnectionId, out var user)) + { + await Task.Delay(1000); + } } - await RCDeviceHub.Clients.Client(clientID).SendAsync("IceCandidate", candidate, Context.ConnectionId); } + + public async Task SelectScreen(int screenIndex) + { + await RCDeviceHub.Clients.Client(ClientID).SendAsync("SelectScreen", screenIndex, Context.ConnectionId); + } + public async Task SendScreenCastRequestToDevice(string clientID, string requesterName, string clientType) { if (clientType == "Normal") @@ -92,49 +145,20 @@ namespace Remotely_Server.Services Context.Items["RequesterName"] = requesterName; await RCDeviceHub.Clients.Client(clientID).SendAsync("GetScreenCast", Context.ConnectionId, requesterName); } - public async Task SelectScreen(int screenIndex) + public async Task SendSharedFileIDs(List fileIDs) { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("SelectScreen", screenIndex, Context.ConnectionId); + await RCDeviceHub.Clients.Client(ClientID).SendAsync("SharedFileIDs", fileIDs, Context.ConnectionId); } - public async Task MouseMove(double percentX, double percentY) + + public async Task Tap() { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseMove", percentX, percentY, Context.ConnectionId); - } - public async Task MouseDown(string button, double percentX, double percentY) - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseDown", button, percentX, percentY, Context.ConnectionId); - } - public async Task MouseUp(string button, double percentX, double percentY) - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseUp", button, percentX, percentY, Context.ConnectionId); - } - public override Task OnConnectedAsync() - { - if (Context.User.Identity.IsAuthenticated) - { - var user = DataService.GetUserByName(Context.User.Identity.Name); - OrganizationConnectionList.TryAdd(Context.ConnectionId, user); - } - return base.OnConnectedAsync(); - } - public override async Task OnDisconnectedAsync(Exception exception) - { - if (Context.User.Identity.IsAuthenticated) - { - while (!OrganizationConnectionList.TryRemove(Context.ConnectionId, out var user)) - { - await Task.Delay(1000); - } - } + await RCDeviceHub.Clients.Client(ClientID).SendAsync("Tap", Context.ConnectionId); } + public async Task TouchDown() { await RCDeviceHub.Clients.Client(ClientID).SendAsync("TouchDown", Context.ConnectionId); } - public async Task LongPress() - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("LongPress", Context.ConnectionId); - } public async Task TouchMove(double moveX, double moveY) { await RCDeviceHub.Clients.Client(ClientID).SendAsync("TouchMove", moveX, moveY, Context.ConnectionId); @@ -143,33 +167,5 @@ namespace Remotely_Server.Services { await RCDeviceHub.Clients.Client(ClientID).SendAsync("TouchUp", Context.ConnectionId); } - public async Task Tap() - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("Tap", Context.ConnectionId); - } - public async Task MouseWheel(double deltaX, double deltaY) - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("MouseWheel", deltaX, deltaY, Context.ConnectionId); - } - public async Task KeyDown(string key) - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("KeyDown", key, Context.ConnectionId); - } - public async Task KeyUp(string key) - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("KeyUp", key, Context.ConnectionId); - } - public async Task KeyPress(string key) - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("KeyPress", key, Context.ConnectionId); - } - public async Task CtrlAltDel(string serviceID) - { - await DeviceHub.Clients.Client(serviceID).SendAsync("CtrlAltDel"); - } - public async Task SendSharedFileIDs(List fileIDs) - { - await RCDeviceHub.Clients.Client(ClientID).SendAsync("SharedFileIDs", fileIDs, Context.ConnectionId); - } } } diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js index fe6dda48..e2343c93 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js @@ -105,22 +105,11 @@ export class RCBrowserSockets { UI.ScreenViewer.height = height; }); hubConnection.on("ScreenCapture", (buffer) => { - var decodedString = window.atob(buffer); - var len = decodedString.length; - var bytes = new Uint8ClampedArray(len); - for (var i = 0; i < len; i++) { - bytes[i] = decodedString.charCodeAt(i); - } - ; - var imageData = new ImageData(bytes, UI.ScreenViewer.width, UI.ScreenViewer.height); - UI.Screen2DContext.putImageData(imageData, 0, 0); - //var url = window.URL.createObjectURL(new Blob([buffer])); - //var img = document.createElement("img"); - //img.onload = function () { - // UI.Screen2DContext.drawImage(img, 0, 0, UI.ScreenViewer.width, UI.ScreenViewer.height); - // window.URL.revokeObjectURL(url); - //}; - //img.src = url; + var img = new Image(); + img.onload = () => { + UI.Screen2DContext.drawImage(img, 0, 0); + }; + img.src = "data:image/png;base64," + buffer; }); hubConnection.on("ConnectionFailed", () => { UI.ConnectButton.removeAttribute("disabled"); diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map index 482ffeba..ec466c82 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.js.map @@ -1 +1 @@ -{"version":3,"file":"RCBrowserSockets.js","sourceRoot":"","sources":["RCBrowserSockets.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"RCBrowserSockets.js","sourceRoot":"","sources":["RCBrowserSockets.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts index 20ccba30..6d72cab3 100644 --- a/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts +++ b/Remotely_Server/wwwroot/scripts/RemoteControl/RCBrowserSockets.ts @@ -114,21 +114,11 @@ export class RCBrowserSockets { UI.ScreenViewer.height = height; }); hubConnection.on("ScreenCapture", (buffer) => { - var decodedString = window.atob(buffer); - var len = decodedString.length; - var bytes = new Uint8ClampedArray(len); - for (var i = 0; i < len; i++) { - bytes[i] = decodedString.charCodeAt(i); - }; - var imageData = new ImageData(bytes, UI.ScreenViewer.width, UI.ScreenViewer.height); - UI.Screen2DContext.putImageData(imageData, 0, 0); - //var url = window.URL.createObjectURL(new Blob([buffer])); - //var img = document.createElement("img"); - //img.onload = function () { - // UI.Screen2DContext.drawImage(img, 0, 0, UI.ScreenViewer.width, UI.ScreenViewer.height); - // window.URL.revokeObjectURL(url); - //}; - //img.src = url; + var img = new Image(); + img.onload = () => { + UI.Screen2DContext.drawImage(img, 0, 0); + } + img.src = "data:image/png;base64," + buffer; }); hubConnection.on("ConnectionFailed", () => { UI.ConnectButton.removeAttribute("disabled"); diff --git a/Remotely_Server/wwwroot/scripts/ResultsParser.js b/Remotely_Server/wwwroot/scripts/ResultsParser.js index e5204176..9aa7f403 100644 --- a/Remotely_Server/wwwroot/scripts/ResultsParser.js +++ b/Remotely_Server/wwwroot/scripts/ResultsParser.js @@ -11,9 +11,9 @@ export function CreateCommandHarness(context) { Total Devices: ${context.TargetDeviceIDs.length} | Completed: 0% | Errors: 0 | - - JSON - XML + + JSON + XML
`; @@ -29,9 +29,9 @@ export function AddPSCoreResultsHarness(result) {
Device: ${deviceName} | Had Errors: ${result.ErrorOutput.length > 1 ? "Yes" : "No"} | - +
-
+
Host Output:
${result.HostOutput.replace(/\n/g, "
").replace(/ /g, " ")}
Debug Output:
${result.DebugOutput.join("
").replace(/ /g, " ")}
Verbose Output:
${result.VerboseOutput.join("
").replace(/ /g, " ")}
@@ -57,7 +57,7 @@ export function AddCommandResultsHarness(result) {
Device: ${deviceName} | Had Errors: ${result.ErrorOutput.length > 1 ? "Yes" : "No"} | - +
Standard Output:
${result.StandardOutput.replace(/\n/g, "
").replace(/ /g, " ")}
diff --git a/Remotely_Server/wwwroot/scripts/ResultsParser.ts b/Remotely_Server/wwwroot/scripts/ResultsParser.ts index fa7ed9c2..72a98df1 100644 --- a/Remotely_Server/wwwroot/scripts/ResultsParser.ts +++ b/Remotely_Server/wwwroot/scripts/ResultsParser.ts @@ -15,9 +15,9 @@ export function CreateCommandHarness(context: CommandContext): HTMLDivElement { Total Devices: ${context.TargetDeviceIDs.length} | Completed: 0% | Errors: 0 | - - JSON - XML + + JSON + XML
`; @@ -35,9 +35,9 @@ export function AddPSCoreResultsHarness(result: PSCoreCommandResult) {
Device: ${deviceName} | Had Errors: ${result.ErrorOutput.length > 1 ? "Yes": "No"} | - +
-
+
Host Output:
${result.HostOutput.replace(/\n/g, "
").replace(/ /g, " ")}
Debug Output:
${result.DebugOutput.join("
").replace(/ /g, " ")}
Verbose Output:
${result.VerboseOutput.join("
").replace(/ /g, " ")}
@@ -64,7 +64,7 @@ export function AddCommandResultsHarness(result: GenericCommandResult) {
Device: ${deviceName} | Had Errors: ${result.ErrorOutput.length > 1 ? "Yes" : "No"} | - +
Standard Output:
${result.StandardOutput.replace(/\n/g, "
").replace(/ /g, " ")}