diff options
Diffstat (limited to 'libvncserver')
-rw-r--r-- | libvncserver/main.c | 1 | ||||
-rw-r--r-- | libvncserver/rfbserver.c | 63 | ||||
-rwxr-xr-x | libvncserver/stats.c | 2 |
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); |