From 8b71ea3cd96a24a225da6002d9499eced941e30f Mon Sep 17 00:00:00 2001 From: Lauri Kasanen Date: Thu, 23 Jun 2022 18:53:27 +0300 Subject: [PATCH] Add /api/send_full_frame --- common/network/websocket.c | 15 +++++++++++++++ common/rfb/VNCServerST.cxx | 10 ++++++++++ common/rfb/VNCServerST.h | 2 ++ unix/xserver/hw/vnc/XserverDesktop.cc | 11 +++++++++++ unix/xserver/hw/vnc/vncExtInit.cc | 9 +++++++++ 5 files changed, 47 insertions(+) diff --git a/common/network/websocket.c b/common/network/websocket.c index 960ba22..6fb552f 100644 --- a/common/network/websocket.c +++ b/common/network/websocket.c @@ -45,6 +45,7 @@ int ssl_initialized = 0; int pipe_error = 0; settings_t settings; +extern int wakeuppipe[2]; void traffic(const char * token) { /*if ((settings.verbose) && (! settings.daemon)) { @@ -1566,6 +1567,20 @@ static uint8_t ownerapi(ws_ctx_t *ws_ctx, const char *in, const char * const use weblog(200, wsthread_handler_id, 0, origip, ip, user, 1, origpath, strlen(buf) + strlen(statbuf)); handler_msg("Sent frame stats to API caller\n"); + ret = 1; + } else entry("/api/send_full_frame") { + write(wakeuppipe[1], "", 1); + + sprintf(buf, "HTTP/1.1 200 OK\r\n" + "Server: KasmVNC/4.0\r\n" + "Connection: close\r\n" + "Content-type: text/plain\r\n" + "Content-length: 6\r\n" + "\r\n" + "200 OK"); + ws_send(ws_ctx, buf, strlen(buf)); + weblog(200, wsthread_handler_id, 0, origip, ip, user, 1, origpath, strlen(buf)); + ret = 1; } diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index f440894..8546d3c 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -1181,3 +1181,13 @@ void VNCServerST::handleClipboardAnnounceBinary(VNCSConnectionST* client, clipboardClient = client; desktop->handleClipboardAnnounceBinary(num, mimes); } + +void VNCServerST::refreshClients() +{ + add_changed(pb->getRect()); + + std::list::iterator i; + for (i = clients.begin(); i != clients.end(); i++) { + (*i)->add_changed_all(); + } +} diff --git a/common/rfb/VNCServerST.h b/common/rfb/VNCServerST.h index 21ce5a9..440cd28 100644 --- a/common/rfb/VNCServerST.h +++ b/common/rfb/VNCServerST.h @@ -198,6 +198,8 @@ namespace rfb { void handleClipboardAnnounceBinary(VNCSConnectionST* client, const unsigned num, const char mimes[][32]); + void refreshClients(); + protected: friend class VNCSConnectionST; diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 4c08fec..a3aa73a 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -49,6 +49,8 @@ extern "C" { void vncSetGlueContext(int screenIndex); + +extern int wakeuppipe[2]; } using namespace rfb; @@ -307,6 +309,15 @@ void XserverDesktop::handleSocketEvent(int fd, bool read, bool write) { try { if (read) { + + if (fd == wakeuppipe[0]) { + unsigned char buf; + while (::read(fd, &buf, 1) > 0); + + server->refreshClients(); + return; + } + if (handleListenerEvent(fd, &listeners, server)) return; } diff --git a/unix/xserver/hw/vnc/vncExtInit.cc b/unix/xserver/hw/vnc/vncExtInit.cc index 503b2b3..46f3ed1 100644 --- a/unix/xserver/hw/vnc/vncExtInit.cc +++ b/unix/xserver/hw/vnc/vncExtInit.cc @@ -17,8 +17,10 @@ * USA. */ +#include #include #include +#include #include #include @@ -49,6 +51,8 @@ extern "C" { void vncSetGlueContext(int screenIndex); + +int wakeuppipe[2]; } using namespace rfb; @@ -225,6 +229,11 @@ void vncExtensionInit(void) dummyY < 16) vncFatalError("Invalid value to %s", Server::maxVideoResolution.getName()); + pipe(wakeuppipe); + const int flags = fcntl(wakeuppipe[0], F_GETFL, 0); + fcntl(wakeuppipe[0], F_SETFL, flags | O_NONBLOCK); + vncSetNotifyFd(wakeuppipe[0], 0, true, false); + initialised = true; }