Add support for DesktopName extension

This extension allows session name to be changed during runtime.
This commit is contained in:
Niko Lehto 2019-09-04 14:23:37 +02:00 committed by Lauri Kasanen
parent c16cc6e2b9
commit 8c43287afb
3 changed files with 55 additions and 5 deletions

View File

@ -20,6 +20,7 @@ export const encodings = {
pseudoEncodingLastRect: -224,
pseudoEncodingCursor: -239,
pseudoEncodingQEMUExtendedKeyEvent: -258,
pseudoEncodingDesktopName: -307,
pseudoEncodingExtendedDesktopSize: -308,
pseudoEncodingXvp: -309,
pseudoEncodingFence: -312,

View File

@ -542,6 +542,13 @@ export default class RFB extends EventTargetMixin {
this.focus();
}
_setDesktopName(name) {
this._fb_name = name;
this.dispatchEvent(new CustomEvent(
"desktopname",
{ detail: { name: this._fb_name } }));
}
_windowResize(event) {
// If the window resized then our screen element might have
// as well. Update the viewport dimensions.
@ -1256,7 +1263,7 @@ export default class RFB extends EventTargetMixin {
/* Connection name/title */
const name_length = this._sock.rQshift32();
if (this._sock.rQwait('server init name', name_length, 24)) { return false; }
this._fb_name = decodeUTF8(this._sock.rQshiftStr(name_length));
let name = decodeUTF8(this._sock.rQshiftStr(name_length));
if (this._rfb_tightvnc) {
if (this._sock.rQwait('TightVNC extended server init header', 8, 24 + name_length)) { return false; }
@ -1296,10 +1303,7 @@ export default class RFB extends EventTargetMixin {
", blue_shift: " + blue_shift);
// we're past the point where we could backtrack, so it's safe to call this
this.dispatchEvent(new CustomEvent(
"desktopname",
{ detail: { name: this._fb_name } }));
this._setDesktopName(name);
this._resize(width, height);
if (!this._viewOnly) { this._keyboard.grab(); }
@ -1383,6 +1387,7 @@ export default class RFB extends EventTargetMixin {
encs.push(encodings.pseudoEncodingXvp);
encs.push(encodings.pseudoEncodingFence);
encs.push(encodings.pseudoEncodingContinuousUpdates);
encs.push(encodings.pseudoEncodingDesktopName);
if (this._hasWebp())
encs.push(encodings.pseudoEncodingWEBP);
@ -1694,6 +1699,9 @@ export default class RFB extends EventTargetMixin {
}
return true;
case encodings.pseudoEncodingDesktopName:
return this._handleDesktopName();
case encodings.pseudoEncodingDesktopSize:
this._resize(this._FBU.width, this._FBU.height);
return true;
@ -1743,6 +1751,25 @@ export default class RFB extends EventTargetMixin {
return true;
}
_handleDesktopName() {
if (this._sock.rQwait("DesktopName", 4)) {
return false;
}
let length = this._sock.rQshift32();
if (this._sock.rQwait("DesktopName", length, 4)) {
return false;
}
let name = this._sock.rQshiftStr(length);
name = decodeUTF8(name);
this._setDesktopName(name);
return true;
}
_handleExtendedDesktopSize() {
if (this._sock.rQwait("ExtendedDesktopSize", 4)) {
return false;

View File

@ -41,6 +41,13 @@ function push32(arr, num) {
num & 0xFF);
}
function pushString(arr, string) {
let utf8 = unescape(encodeURIComponent(string));
for (let i = 0; i < utf8.length; i++) {
arr.push(utf8.charCodeAt(i));
}
}
describe('Remote Frame Buffer Protocol Client', function () {
let clock;
let raf;
@ -2128,6 +2135,21 @@ describe('Remote Frame Buffer Protocol Client', function () {
send_fbu_msg([{ x: 0, y: 0, width: 0, height: 0, encoding: -224}], [[]], client, 100);
expect(client._FBU.rects).to.equal(0);
});
it('should handle the DesktopName pseudo-encoding', function () {
let data = [];
push32(data, 9);
pushString(data, "some name");
const spy = sinon.spy();
client.addEventListener("desktopname", spy);
send_fbu_msg([{ x: 0, y: 0, width: 0, height: 0, encoding: -307 }], [data], client);
expect(client._fb_name).to.equal('some name');
expect(spy).to.have.been.calledOnce;
expect(spy.args[0][0].detail.name).to.equal('some name');
});
});
});