コード例 #1
0
ファイル: translate.c プロジェクト: 12019/Carberp
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);
}
コード例 #2
0
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;
        }
}