summaryrefslogtreecommitdiffstats
path: root/libvncserver
diff options
context:
space:
mode:
authorChristian Beier <dontmind@freeshell.org>2010-11-02 22:23:12 +0100
committerChristian Beier <dontmind@freeshell.org>2010-11-02 22:23:12 +0100
commite5523350a8fb5d6ccae4b4d9bc92897f3e5db18c (patch)
treea784f30fb06c79ec942613f7a3833a23f97e808c /libvncserver
parent5da7c7a71ac1db69902c3a2a80f8771713dde70f (diff)
downloadlibtdevnc-e5523350a8fb5d6ccae4b4d9bc92897f3e5db18c.tar.gz
libtdevnc-e5523350a8fb5d6ccae4b4d9bc92897f3e5db18c.zip
libvnc[server|client]: implement xvp VNC extension.
This implements the xvp VNC extension, which is described in the community version of the RFB protocol: http://tigervnc.sourceforge.net/cgi-bin/rfbproto It is also mentioned in the official RFB protocol.
Diffstat (limited to 'libvncserver')
-rw-r--r--libvncserver/main.c1
-rw-r--r--libvncserver/rfbserver.c63
-rwxr-xr-xlibvncserver/stats.c2
3 files changed, 64 insertions, 2 deletions
diff --git a/libvncserver/main.c b/libvncserver/main.c
index 28bbc42..5332e2d 100644
--- a/libvncserver/main.c
+++ b/libvncserver/main.c
@@ -901,6 +901,7 @@ rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
screen->displayHook = NULL;
screen->displayFinishedHook = NULL;
screen->getKeyboardLedStateHook = NULL;
+ screen->xvpHook = NULL;
/* initialize client list and iterator mutex */
rfbClientListInit(screen);
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c
index b540f04..b71daf8 100644
--- a/libvncserver/rfbserver.c
+++ b/libvncserver/rfbserver.c
@@ -874,6 +874,7 @@ rfbSendSupportedMessages(rfbClientPtr cl)
/*rfbSetBit(msgs.client2server, rfbTextChat); */
/*rfbSetBit(msgs.client2server, rfbKeyFrameRequest); */
rfbSetBit(msgs.client2server, rfbPalmVNCSetScaleFactor);
+ rfbSetBit(msgs.client2server, rfbXvp);
rfbSetBit(msgs.server2client, rfbFramebufferUpdate);
rfbSetBit(msgs.server2client, rfbSetColourMapEntries);
@@ -882,6 +883,7 @@ rfbSendSupportedMessages(rfbClientPtr cl)
rfbSetBit(msgs.server2client, rfbResizeFrameBuffer);
/*rfbSetBit(msgs.server2client, rfbKeyFrameUpdate); */
rfbSetBit(msgs.server2client, rfbPalmVNCReSizeFrameBuffer);
+ rfbSetBit(msgs.server2client, rfbXvp);
memcpy(&cl->updateBuf[cl->ublen], (char *)&msgs, sz_rfbSupportedMessages);
cl->ublen += sz_rfbSupportedMessages;
@@ -1027,6 +1029,33 @@ rfbSendServerIdentity(rfbClientPtr cl)
return TRUE;
}
+/*
+ * Send an xvp server message
+ */
+
+rfbBool
+rfbSendXvp(rfbClientPtr cl, uint8_t version, uint8_t code)
+{
+ rfbXvpMsg xvp;
+
+ xvp.type = rfbXvp;
+ xvp.pad = 0;
+ xvp.version = version;
+ xvp.code = code;
+
+ LOCK(cl->sendMutex);
+ if (rfbWriteExact(cl, (char *)&xvp, sz_rfbXvpMsg) < 0) {
+ rfbLogPerror("rfbSendXvp: write");
+ rfbCloseClient(cl);
+ }
+ UNLOCK(cl->sendMutex);
+
+ rfbStatRecordMessageSent(cl, rfbXvp, sz_rfbXvpMsg, sz_rfbXvpMsg);
+
+ return TRUE;
+}
+
+
rfbBool rfbSendTextChatMessage(rfbClientPtr cl, uint32_t length, char *buffer)
{
rfbTextChatMsg tc;
@@ -1984,7 +2013,15 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
"%s\n", cl->host);
cl->enableServerIdentity = TRUE;
}
- break;
+ break;
+ case rfbEncodingXvp:
+ rfbLog("Enabling Xvp protocol extension for client "
+ "%s\n", cl->host);
+ if (!rfbSendXvp(cl, 1, rfbXvp_Init)) {
+ rfbCloseClient(cl);
+ return;
+ }
+ break;
default:
#ifdef LIBVNCSERVER_HAVE_LIBZ
if ( enc >= (uint32_t)rfbEncodingCompressLevel0 &&
@@ -2368,6 +2405,28 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
rfbSendNewScaleSize(cl);
return;
+ case rfbXvp:
+
+ if ((n = rfbReadExact(cl, ((char *)&msg) + 1,
+ sz_rfbXvpMsg - 1)) <= 0) {
+ if (n != 0)
+ rfbLogPerror("rfbProcessClientNormalMessage: read");
+ rfbCloseClient(cl);
+ return;
+ }
+ rfbStatRecordMessageRcvd(cl, msg.type, sz_rfbXvpMsg, sz_rfbXvpMsg);
+
+ /* only version when is defined, so echo back a fail */
+ if(msg.xvp.version != 1) {
+ rfbSendXvp(cl, msg.xvp.version, rfbXvp_Fail);
+ }
+ else {
+ /* if the hook exists and fails, send a fail msg */
+ if(cl->screen->xvpHook && !cl->screen->xvpHook(cl, msg.xvp.version, msg.xvp.code))
+ rfbSendXvp(cl, 1, rfbXvp_Fail);
+ }
+ return;
+
default:
{
rfbExtensionData *e,*next;
@@ -2756,7 +2815,7 @@ rfbSendFramebufferUpdate(rfbClientPtr cl,
if (!rfbSendServerIdentity(cl))
goto updateFailed;
}
-
+
if (!sraRgnEmpty(updateCopyRegion)) {
if (!rfbSendCopyRegion(cl,updateCopyRegion,dx,dy))
goto updateFailed;
diff --git a/libvncserver/stats.c b/libvncserver/stats.c
index d5d6925..1e6c9b1 100755
--- a/libvncserver/stats.c
+++ b/libvncserver/stats.c
@@ -55,6 +55,7 @@ char *messageNameServer2Client(uint32_t type, char *buf, int len) {
case rfbFileTransfer: snprintf(buf, len, "FileTransfer"); break;
case rfbTextChat: snprintf(buf, len, "TextChat"); break;
case rfbPalmVNCReSizeFrameBuffer: snprintf(buf, len, "PalmVNCReSize"); break;
+ case rfbXvp: snprintf(buf, len, "XvpServerMessage"); break;
default:
snprintf(buf, len, "svr2cli-0x%08X", 0xFF);
}
@@ -78,6 +79,7 @@ char *messageNameClient2Server(uint32_t type, char *buf, int len) {
case rfbTextChat: snprintf(buf, len, "TextChat"); break;
case rfbKeyFrameRequest: snprintf(buf, len, "KeyFrameRequest"); break;
case rfbPalmVNCSetScaleFactor: snprintf(buf, len, "PalmVNCSetScale"); break;
+ case rfbXvp: snprintf(buf, len, "XvpClientMessage"); break;
default:
snprintf(buf, len, "cli2svr-0x%08X", type);