Merge branch 'feature/KASM-2797_force_full_frame' into 'master'

Add /api/send_full_frame

Closes KASM-2797

See merge request kasm-technologies/internal/KasmVNC!50
This commit is contained in:
Anthony Merrill 2022-08-14 16:13:32 +00:00
commit d9cf46f83e
5 changed files with 47 additions and 0 deletions

View File

@ -44,6 +44,7 @@
int pipe_error = 0;
settings_t settings;
extern int wakeuppipe[2];
void traffic(const char * token) {
/*if ((settings.verbose) && (! settings.daemon)) {
@ -1558,6 +1559,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;
}

View File

@ -1221,3 +1221,13 @@ void VNCServerST::handleClipboardAnnounceBinary(VNCSConnectionST* client,
clipboardClient = client;
desktop->handleClipboardAnnounceBinary(num, mimes);
}
void VNCServerST::refreshClients()
{
add_changed(pb->getRect());
std::list<VNCSConnectionST*>::iterator i;
for (i = clients.begin(); i != clients.end(); i++) {
(*i)->add_changed_all();
}
}

View File

@ -197,6 +197,8 @@ namespace rfb {
void handleClipboardAnnounceBinary(VNCSConnectionST* client, const unsigned num,
const char mimes[][32]);
void refreshClients();
protected:
friend class VNCSConnectionST;

View File

@ -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;
}

View File

@ -17,8 +17,10 @@
* USA.
*/
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <set>
@ -50,6 +52,8 @@
extern "C" {
void vncSetGlueContext(int screenIndex);
int wakeuppipe[2];
}
using namespace rfb;
@ -228,6 +232,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;
}