rfbBool rfbSetClientColourMap(rfbClientPtr cl, int firstColour, int nColours) { if (cl->screen->serverFormat.trueColour || !cl->readyForSetColourMapEntries) { return TRUE; } if (nColours == 0) { nColours = cl->screen->colourMap.count; } if (cl->format.trueColour) { LOCK(cl->updateMutex); (*rfbInitColourMapSingleTableFns [BPP2OFFSET(cl->format.bitsPerPixel)]) (&cl->translateLookupTable, &cl->screen->serverFormat, &cl->format,&cl->screen->colourMap); sraRgnDestroy(cl->modifiedRegion); cl->modifiedRegion = sraRgnCreateRect(0,0,cl->screen->width,cl->screen->height); UNLOCK(cl->updateMutex); return TRUE; } return rfbSendSetColourMapEntries(cl, firstColour, nColours); }
static void rfbProcessClientNormalMessage(rfbClientPtr cl) { int n=0; rfbClientToServerMsg msg; char *str; int i; // unsigned char keyvalue; u32 enc; // debug_printf("--In the NormalMessadge process!\n"); if ((n = ReadExact(cl, (char *)&msg, 1)) <= 0) { debug_printf("rfbProcessClientNormalMessage: read--type-error,shutdown clien!\n"); // delay(10); rfbCloseClient(cl); return; } // debug_printf("--In the NormalMessadge process!--has read msg type=%d \n",msg.type); switch (msg.type) //根据收到的消息来对应的处理各种情况 { case rfbSetPixelFormat://目前已经处理完备 debug_printf("SetPixelFormat!\n"); if ((n = ReadExact(cl, ((char *)&msg) + 1, sz_rfbSetPixelFormatMsg - 1)) <= 0) { debug_printf("rfbProcessClientNormalMessage: read--setpixelmessage-error,shutdown client!\n"); // delay(10000); rfbCloseClient(cl); return; } cl->format.bitsPerPixel = msg.spf.format.bitsPerPixel; cl->format.depth = msg.spf.format.depth; cl->format.bigEndian = (msg.spf.format.bigEndian ? 1 : 0); cl->format.trueColour = (msg.spf.format.trueColour ? 1 : 0); cl->format.redMax = Swap16IfLE(msg.spf.format.redMax); cl->format.greenMax = Swap16IfLE(msg.spf.format.greenMax); cl->format.blueMax = Swap16IfLE(msg.spf.format.blueMax); cl->format.redShift = msg.spf.format.redShift; cl->format.greenShift = msg.spf.format.greenShift; cl->format.blueShift = msg.spf.format.blueShift; cl->readyForSetColourMapEntries = TRUE; //这个是必须要处理的,因为当客户端发送的信息是颜色不是真彩色的话,必须要发送服务器的映射方法。 debug_printf("got the client set pixformat=%s\n",cl->host); showPixelFormat(&(cl->format)); // deug_printf("--set the client color translate begin!\n"); rfbSetTranslateFunction(cl); // debug_printf("--set the client color end!\n"); return; case rfbFixColourMapEntries: debug_printf("rfbFixColourMapEntries!\n"); if ((n = ReadExact(cl, ((char *)&msg) + 1, sz_rfbFixColourMapEntriesMsg - 1)) <= 0) { debug_printf("rfbProcessClientNormalMessage: read--fixpixelmessage-error,shutdown client!\n"); delay(10000); rfbCloseClient(cl); return; } debug_printf("FixColourMapEntries unsupported\n"); rfbCloseClient(cl); return; case rfbSetEncodings://目前已经处理完备 { //debug_printf("rfbSetEncodings!\n"); if ((n = ReadExact(cl, ((char *)&msg) + 1, sz_rfbSetEncodingsMsg - 1)) <= 0) { debug_printf("rfbProcessClientNormalMessage: read--rfbSetEncodings-error,shutdown client!\n"); delay(10000); rfbCloseClient(cl); return; } msg.se.nEncodings = Swap16IfLE(msg.se.nEncodings); cl->preferredEncoding = -1; cl->useCopyRect = FALSE; cl->enableCursorShapeUpdates = FALSE; cl->enableLastRectEncoding = FALSE; for (i = 0; i < msg.se.nEncodings; i++) { if ((n = ReadExact(cl, (char *)&enc, 4)) <= 0) { debug_printf("rfbProcessClientNormalMessage: read--rfbSetEncodings-error,shutdown client!\n"); delay(10000); rfbCloseClient(cl); return; } enc = Swap32IfLE(enc); switch (enc) { case rfbEncodingCopyRect: debug_printf("client %s supported rfbEncodingCopyRect\n",cl->host); cl->useCopyRect = TRUE; break; case rfbEncodingRaw: debug_printf("client %s supported rfbEncodingRaw\n",cl->host); if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; debug_printf("Using raw encoding for client %s\n", cl->host); } break; case rfbEncodingRRE: debug_printf("client %s supported rfbEncodingRRE\n",cl->host); if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; debug_printf("Using rre encoding for client %s\n", cl->host); } break; case rfbEncodingCoRRE: debug_printf("client %s supported rfbEncodingCoRRE\n",cl->host); if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; debug_printf("Using CoRRE encoding for client %s\n", cl->host); } break; case rfbEncodingHextile: debug_printf("client %s supported rfbEncodingHextile\n",cl->host); if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; debug_printf("Using hextile encoding for client %s\n", cl->host); } break; case rfbEncodingZlib: debug_printf("client %s supported rfbEncodingZlib\n",cl->host); if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; debug_printf("Using zlib encoding for client %s\n", cl->host); } break; case rfbEncodingTight: debug_printf("client %s supported rfbEncodingHextile\n",cl->host); if (cl->preferredEncoding == -1) { cl->preferredEncoding = enc; debug_printf("Using tight encoding for client %s\n", cl->host); } break; case rfbEncodingXCursor: debug_printf("Enabling X-style cursor updates for client %s\n", cl->host); cl->enableCursorShapeUpdates = TRUE; cl->useRichCursorEncoding = FALSE; cl->cursorWasChanged = TRUE; break; case rfbEncodingRichCursor: if (!cl->enableCursorShapeUpdates) { debug_printf("Enabling full-color cursor updates for client " "%s\n", cl->host); cl->enableCursorShapeUpdates = TRUE; cl->useRichCursorEncoding = TRUE; cl->cursorWasChanged = TRUE; } break; case rfbEncodingLastRect: debug_printf("client %s supported rfbEncodingLastRect\n",cl->host); if (!cl->enableLastRectEncoding) { debug_printf("Enabling LastRect protocol extension for client " "%s\n", cl->host); cl->enableLastRectEncoding = TRUE; } break; default: if ( enc >= (u32)rfbEncodingCompressLevel0 && enc <= (u32)rfbEncodingCompressLevel9 ) { cl->zlibCompressLevel = enc & 0x0F; cl->tightCompressLevel = enc & 0x0F; debug_printf("Using compression level %d for client %s\n", cl->tightCompressLevel, cl->host); } else if ( enc >= (u32)rfbEncodingQualityLevel0 && enc <= (u32)rfbEncodingQualityLevel9 ) { cl->tightQualityLevel = enc & 0x0F; debug_printf("Using image quality level %d for client %s\n", cl->tightQualityLevel, cl->host); } else debug_printf("rfbProcessClientNormalMessage: ignoring unknown " "encoding type %d\n", (int)enc); } } if (cl->preferredEncoding == -1) { cl->preferredEncoding = rfbEncodingRaw; } return; } case rfbFramebufferUpdateRequest: { //debug_printf("rfbSetEncodings!\n"); if ((n = ReadExact(cl, ((char *)&msg) + 1, sz_rfbFramebufferUpdateRequestMsg-1)) <= 0) { if (n != 0) debug_printf("rfbProcessClientNormalMessage: read"); rfbCloseClient(cl); return; } if(msg.fur.incremental==FALSE)//客户端请求整幅数据,出现了某些数据的丢失 { cl->InitDone=FALSE; cl->modifiedregion.x=Swap16IfLE(msg.fur.x); cl->modifiedregion.y=Swap16IfLE(msg.fur.y); cl->modifiedregion.w=Swap16IfLE(msg.fur.w); cl->modifiedregion.h=Swap16IfLE(msg.fur.h); } else { cl->InitDone=TRUE; } if (!cl->readyForSetColourMapEntries) { /* client hasn't sent a SetPixelFormat so is using server's */ cl->readyForSetColourMapEntries = TRUE; if (!cl->format.trueColour) { if (!rfbSendSetColourMapEntries(cl, 0, 256)) { // sraRgnDestroy(tmpRegion); // TSIGNAL(cl->updateCond); // UNLOCK(cl->updateMutex); debug_printf("failed to send the color map!"); return; } } } cl->HasRequest = 1; return; } case rfbKeyEvent: debug_printf("rfbKeyEvent!\n"); cl->rfbKeyEventsRcvd++; if ((n = ReadExact(cl, ((char *)&msg) + 1, sz_rfbKeyEventMsg - 1)) <= 0) { if (n != 0) debug_printf("rfbProcessClientNormalMessage: read"); rfbCloseClient(cl); return; } //打印接受到的键盘值 msg.ke.key=Swap32IfLE(msg.ke.key); #if CN_CFG_KEYBOARD == 1 vncclient_keyevent(cl->screen, msg); #endif return; case rfbPointerEvent: cl->rfbPointerEventsRcvd++; if ((n = ReadExact(cl, ((char *)&msg) + 1, sz_rfbPointerEventMsg - 1)) <= 0) { if (n != 0)//等于0应该是客户端主动关闭了 debug_printf("rfbProcessClientNormalMessage: read"); rfbCloseClient(cl); return; } //输入touch message msg.pe.x = Swap16IfLE(msg.pe.x); msg.pe.y = Swap16IfLE(msg.pe.y); // debug_printf("rfbPointerEvent!----x=%d y=%d\n", msg.pe.x,msg.pe.y); #if CN_CFG_KEYBOARD == 1 vncclient_pointevent(cl->screen, msg); #endif return; case rfbClientCutText: debug_printf("rfbClientCutText!\n"); if ((n = ReadExact(cl, ((char *)&msg) + 1, sz_rfbClientCutTextMsg - 1)) <= 0) { if (n != 0) debug_printf("rfbProcessClientNormalMessage: read"); rfbCloseClient(cl); return; } msg.cct.length = Swap32IfLE(msg.cct.length); str = (char *)M_MallocLc(msg.cct.length+1, 0); if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) { if (n != 0) debug_printf("rfbProcessClientNormalMessage: read"); free(str); rfbCloseClient(cl); return; } // cl->screen->setXCutText(str, msg.cct.length, cl); str[msg.cct.length]= 0; debug_printf(" the cut messaged=%s\n",str); free(str); return; default: debug_printf("rfbProcessClientNormalMessage: unknown message type %d\n", msg.type); debug_printf(" ... closing connection\n"); rfbCloseClient(cl); return; } }