1
0
mirror of https://github.com/Ylianst/MeshCommander synced 2025-12-06 06:03:20 +00:00

Added support for new KVM modes.

This commit is contained in:
Ylian Saint-Hilaire
2020-08-13 20:49:58 -07:00
parent 4240250c81
commit e1c03184c4
2 changed files with 91 additions and 26 deletions

View File

@@ -21,7 +21,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.rwidth = 0;
obj.rheight = 0;
obj.bpp = 2; // Bytes per pixel (1 or 2 supported)
obj.useZRLE = true;
obj.useRLE = true;
obj.showmouse = true;
obj.buttonmask = 0;
obj.localKeyMap = true;
@@ -31,7 +31,6 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.sparew2 = 0;
obj.spareh2 = 0;
obj.sparecache = {};
obj.ZRLEfirst = 1;
obj.onScreenSizeChange = null;
obj.frameRateDelay = 0;
// ###BEGIN###{DesktopRotation}
@@ -45,6 +44,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.onKvmDataAck = -1;
obj.holding = false;
obj.lastKeepAlive = Date.now();
obj.kvmExt = {};
obj.kvmExtChanged = null;
obj.useZLib = false;
obj.graymode = false;
// ###END###{DesktopInband}
obj.mNagleTimer = null; // Mouse motion slowdown timer
@@ -156,10 +159,10 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
*/
// SetEncodings, with AMT we can't omit RAW, must be specified.
// Intel AMT supports encodings: RAW (0), ZRLE (16), Desktop Size (0xFFFFFF21, -223)
// Intel AMT supports encodings: RAW (0), RLE (16), Desktop Size (0xFFFFFF21, -223)
var supportedEncodings = '';
if (obj.useZRLE) supportedEncodings += IntToStr(16);
if (obj.useRLE) supportedEncodings += IntToStr(16);
supportedEncodings += IntToStr(0);
// ###BEGIN###{DesktopInband}
supportedEncodings += IntToStr(1092);
@@ -173,12 +176,16 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.state = 4;
if (obj.parent) { obj.parent.disconnectCode = 0; obj.parent.xxStateChange(3); }
_SendRefresh();
//obj.timer = setInterval(obj.xxOnTimer, 50);
// ###BEGIN###{DesktopFocus}
obj.ox = -1; // Old mouse x position
// ###END###{DesktopFocus}
// ###BEGIN###{DesktopInband}
obj.sendKvmExtCmd(2, obj.graymode?1:0); // Set Decimation State
obj.sendKvmExtCmd(4, obj.useZLib?1:0); // Set ZLib state
// ###END###{DesktopInband}
_SendRefresh();
if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
}
@@ -256,7 +263,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
}
_putImage(obj.spare, x, y);
} else if (encoding == 16) {
// ZRLE encoding
// RLE encoding
if (obj.acc.byteLength < 16) return;
var datalen = accview.getUint32(12);
if (obj.acc.byteLength < (16 + datalen)) return;
@@ -595,7 +602,6 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.Start = function () {
obj.state = 0;
obj.acc = null;
obj.ZRLEfirst = 1;
// ###BEGIN###{Inflate}
obj.inflate.inflateReset();
// ###END###{Inflate}
@@ -603,6 +609,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
obj.onKvmDataPending = [];
obj.onKvmDataAck = -1;
obj.kvmDataSupported = false;
obj.kvmExt = {};
// ###END###{DesktopInband}
for (var i in obj.sparecache) { delete obj.sparecache[i]; }
}
@@ -766,6 +773,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-DataChannel-Recv(' + (d.length - 16) + '): ' + d.substring(16)); }
if (d.length >= 16) { obj.onKvmData(d.substring(16)); } // Event the data and ack
if ((obj.onKvmDataAck == true) && (obj.onKvmDataPending.length > 0)) { obj.sendKvmData(obj.onKvmDataPending.shift()); } // Send pending data
} else if ((d.length >= 13) && (d.substring(0, 11) == '\0KvmExtCmd\0')) {
var cmd = d.charCodeAt(11), val = d.charCodeAt(12);
console.log('Received KvmExtCmd', cmd, val);
if (cmd == 1) { obj.kvmext.decimation = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(1, val); } }
if (cmd == 2) { obj.sendKvmExtCmd(1); }
if (cmd == 3) { obj.kvmext.compression = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(3, val); } }
if (cmd == 4) { obj.sendKvmExtCmd(3); }
} else {
console.log('Got KVM clipboard data:', d);
if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-ClipBoard-Recv(' + d.length + '): ' + rstr2hex(d) + ', ' + d); }
@@ -776,6 +790,12 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
}
// ###BEGIN###{DesktopInband}
obj.sendKvmExtCmd = function (cmd, val) {
console.log('Sending KvmExtCmd', cmd, val);
var x = '\0KvmExtCmd\0' + String.fromCharCode(cmd) + (val != null ? String.fromCharCode(val) : '');
obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(x.length) + x);
}
obj.sendKvmData = function (x) {
if (obj.onKvmDataAck !== true) {
obj.onKvmDataPending.push(x);

View File

@@ -1334,12 +1334,21 @@
<br>
<div style='height:26px'>
<select id="idx_d7desktopmode" style="float:right;width:200px">
<option value="1">RLE8, Color Fast</option>
<option value="2">RLE16, Color</option>
<option id="d7gray4" value="5">RLE4G, Gray Fastest</option>
<option id="d7gray8" value="6">RLE8G, Gray Fast</option>
<option value="3">RAW8, Color Slow</option>
<option value="4">RAW16, Color Very Slow</option>
<!-- Flags: 1 = RAW, 2 = 16bit, 4 = Gray, 8 = ZLib -->
<!-- ###BEGIN###{DesktopInband} -->
<option id="d7exm1" value="5">RLE8G, Gray (Fast)</option>
<option id="d7exm2" value="7">RLE16G, Gray</option>
<!-- ###END###{DesktopInband} -->
<option value="1">RLE8, Color</option>
<option value="3">RLE16, Color</option>
<!-- ###BEGIN###{DesktopInband} -->
<option id="d7exm3" value="13">ZRLE8G, Compressed Gray</option>
<option id="d7exm4" value="15">ZRLE16G, Compressed Gray</option>
<option id="d7exm5" value="9">ZRLE8, Compressed Color</option>
<option id="d7exm6" value="11">ZRLE16, Compressed Color</option>
<!-- ###END###{DesktopInband} -->
<option value="0">RAW8, Color</option>
<option value="2">RAW16, Color (Slow)</option>
</select>
<div>Image Encoding</div>
</div>
@@ -1724,7 +1733,7 @@
// ###END###{NetworkSettings}
// ###BEGIN###{Desktop}
var desktop;
var desktopsettings = { encoding:1, showfocus:false, showmouse:true, showcad:true, limitFrameRate:false, noMouseRotate:false };
var desktopsettings = { encflags: 1, showfocus: false, showmouse: true, showcad: true, limitFrameRate: false, noMouseRotate: false };
// ###END###{Desktop}
// ###BEGIN###{Mode-MeshCentral2}
var currentMeshNode = null;
@@ -1882,6 +1891,9 @@
// Setup the remote desktop
desktop = CreateAmtRedirect(CreateAmtRemoteDesktop('Desk', Q('id_mainarea')));
desktop.onStateChanged = onDesktopStateChange;
// ###BEGIN###{DesktopInband}
desktop.kvmExtChanged = updateDesktopState;
// ###END###{DesktopInband}
QE('idx_connectbutton1', true);
try { t = localStorage.getItem('desktopsettings'); } catch (ex) {}
if (t) { desktopsettings = JSON.parse(t); }
@@ -8111,7 +8123,7 @@
webRtcDesktop = null;
// Switch back to hardware KVM
desktop.m.hold(false);
Q('id_deskstatus').textContent = StatusStrs[desktop.State];
updateDesktopState();
// ###BEGIN###{DesktopInbandFiles}
p24files = null;
p24downloadFileCancel() // If any downloads are in process, cancel them.
@@ -8137,11 +8149,13 @@
if ((skipConsent !== true) && (amtversion > 5) && (amtsysstate['IPS_OptInService'] != null) && (amtsysstate['IPS_OptInService'].response != undefined) && (amtsysstate['IPS_OptInService'].response['OptInRequired'] == 0xFFFFFFFF)) {
connectDesktopConsent = true; amtstack.Get('IPS_OptInService', powerActionResponse0, 0, 1); return; // User consent always required, ask for it before KVM.
}
desktop.m.bpp = (desktopsettings.encoding == 2 || desktopsettings.encoding == 4) ? 2 : 1;
desktop.m.graymode = 0;
if (desktopsettings.encoding == 6) { desktop.m.graymode = 1; } // 256 grays
if (desktopsettings.encoding == 5) { desktop.m.graymode = 2; } // 16 grays
desktop.m.useZRLE = (desktopsettings.encoding < 3);
// Encoding Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib
desktop.m.useRLE = ((desktopsettings.encflags & 1) != 0);
desktop.m.bpp = (desktopsettings.encflags & 2) ? 2 : 1;
// ###BEGIN###{DesktopInband}
desktop.m.graymode = ((desktopsettings.encflags & 4) != 0);
desktop.m.useZLib = ((desktopsettings.encflags & 8) != 0);
// ###END###{DesktopInband}
desktop.m.showmouse = desktopsettings.showmouse;
desktop.m.onScreenSizeChange = center;
// ###BEGIN###{ComputerSelector}
@@ -8168,7 +8182,6 @@
webRtcDesktop.webchannel.onopen = function () {
// Switch to software KVM
if (urlvars && urlvars['kvmdatatrace']) { console.log('WebRTC Data Channel Open'); }
Q('id_deskstatus').textContent = StatusStrs[desktop.State] + ", Soft-KVM";
desktop.m.hold(true);
webRtcDesktop.webRtcActive = true;
webRtcDesktop.softdesktop = CreateKvmDataChannel(webRtcDesktop.webchannel, CreateAgentRemoteDesktop('Desk', Q('id_mainarea')), desktop.m);
@@ -8176,6 +8189,7 @@
if (desktopsettings.quality) { webRtcDesktop.softdesktop.m.CompressionLevel = desktopsettings.quality; } // Number from 1 to 100. 50 or less is best.
if (desktopsettings.scaling) { webRtcDesktop.softdesktop.m.ScalingLevel = desktopsettings.scaling; }
webRtcDesktop.softdesktop.Start();
updateDesktopState();
// Check if we can get remote file access
// ###BEGIN###{DesktopInbandFiles}
@@ -8308,7 +8322,6 @@
function onDesktopStateChange(desktop, state) {
//console.log("onDesktopStateChange: " + state);
idx_connectbutton1.value = (state == 0) ? "Connect" : "Disconnect";
Q('id_deskstatus').textContent = StatusStrs[state];
var input = ((state == 3) && !urlvars['kvmviewonly']);
QE('id_DeskCAD', input);
QE('deskkeys', input);
@@ -8352,6 +8365,28 @@
NW_SetupMainMenu(currentView);
// ###END###{Mode-NodeWebkit}
center();
updateDesktopState();
}
// Update remote desktop status
function updateDesktopState() {
// ###BEGIN###{DesktopInband}
var x = '';
if (desktop.State == 3) {
if ((webRtcDesktop) && (webRtcDesktop.webRtcActive == true)) {
x = ", Soft-KVM";
} else {
if (desktop.m && desktop.m.kvmExt) {
if (desktop.m.kvmExt.decimation == 2) { x += ", Gray" }
if (desktop.m.kvmExt.compression == 1) { x += ", ZLib" }
}
}
}
Q('id_deskstatus').textContent = StatusStrs[desktop.State] + x;
// ###END###{DesktopInband}
// ###BEGIN###{!DesktopInband}
Q('id_deskstatus').textContent = StatusStrs[desktop.State];
// ###END###{!DesktopInband}
}
function showDesktopSettings() {
@@ -8361,7 +8396,7 @@
}
function showDesktopSettingsChanged() {
desktopsettings.encoding = idx_d7desktopmode.value;
desktopsettings.encflags = parseInt(idx_d7desktopmode.value);
// ###BEGIN###{DesktopFocus}
desktopsettings.showfocus = d7showfocus.checked;
// ###END###{DesktopFocus}
@@ -8383,7 +8418,13 @@
}
function applyDesktopSettings() {
idx_d7desktopmode.value = desktopsettings.encoding;
// ###BEGIN###{!DesktopInband}
desktopsettings.encflags = desktopsettings.encflags & 3; // Remove gray & zlib flags (4 and 8), keep 1 & 2
// ###END###{!DesktopInband}
// ###BEGIN###{DesktopInband}
if (amtversion < 15) { desktopsettings.encflags = desktopsettings.encflags & 3; } // Remove gray & zlib flags (4 and 8), keep 1 & 2
// ###END###{DesktopInband}
idx_d7desktopmode.value = desktopsettings.encflags;
// ###BEGIN###{DesktopFocus}
d7showfocus.checked = desktopsettings.showfocus;
// ###END###{DesktopFocus}
@@ -8395,13 +8436,17 @@
if (desktopsettings.quality) { d7bitmapquality.value = desktopsettings.quality; }
if (desktopsettings.scaling) { d7bitmapscaling.value = desktopsettings.scaling; }
QV('d7softkvmsettings', amtversion >= 12);
QV('d7exm1', amtversion > 14);
QV('d7exm2', amtversion > 14);
QV('d7exm3', amtversion > 14);
QV('d7exm4', amtversion > 14);
QV('d7exm5', amtversion > 14);
QV('d7exm6', amtversion > 14);
// ###END###{DesktopInband}
// ###BEGIN###{DesktopFocus}
QV('idx_deskFocusBtn', desktopsettings.showfocus);
// ###END###{DesktopFocus}
QV('id_DeskCAD', desktopsettings.showcad);
QV('d7gray4', urlvars['kvmgray']);
QV('d7gray8', urlvars['kvmgray']);
}
var fullscreen = false;