Example #1
0
        private void ReadScrnUpd()
        {
            byte[] msg      = ReadBytes(RfbSize.FrameBufUpd - 1);
            UInt16 numRects = RfbProtoUtil.GetNumRectsFromFrameBufUpdMsg(msg);

            for (int i = 0; i < numRects; i++)
            {
                msg = ReadBytes(RfbSize.FrameBufUpdRectHdr);
                FrameBufUpdRectMsgHdr frameBufUpdRectHdr = new FrameBufUpdRectMsgHdr(msg);
                Rectangle             rect = new Rectangle(frameBufUpdRectHdr.X, frameBufUpdRectHdr.Y, frameBufUpdRectHdr.Width, frameBufUpdRectHdr.Height);

                if (frameBufUpdRectHdr.Encoding == RfbEncoding.NewFBSize)
                {
                    frameBufWidth  = (UInt16)rect.Width;
                    frameBufHeight = (UInt16)rect.Height;
                    if (!termBgThread)
                    {
                        view.NewFrameBuf(frameBufWidth, frameBufHeight);
                    }
                    break;
                }

                switch (frameBufUpdRectHdr.Encoding)
                {
                case RfbEncoding.Raw:
                    ReadRawRect(rect);
                    if (opts.ViewOpts.ScrnUpdAlgo == ScrnUpdAlgo.Asap)
                    {
                        view.InvalidateRect(rect);
                    }
                    break;

                case RfbEncoding.CopyRect:
                    ReadCopyRect(rect);
                    if (opts.ViewOpts.ScrnUpdAlgo == ScrnUpdAlgo.Asap)
                    {
                        view.InvalidateRect(rect);
                    }
                    break;

                case RfbEncoding.Rre:
                    ReadRreRect(rect);
                    if (opts.ViewOpts.ScrnUpdAlgo == ScrnUpdAlgo.Asap)
                    {
                        view.InvalidateRect(rect);
                    }
                    break;

                case RfbEncoding.CoRre:
                    ReadCoRreRect(rect);
                    if (opts.ViewOpts.ScrnUpdAlgo == ScrnUpdAlgo.Asap)
                    {
                        view.InvalidateRect(rect);
                    }
                    break;

                case RfbEncoding.Hex:
                    ReadHexRect(rect);
                    break;

                default:
                    throw new WarnEx(App.GetStr("Server is using unknown encoding!"));
                }
            }

            if (opts.ViewOpts.ScrnUpdAlgo != ScrnUpdAlgo.Asap)
            {
                view.Invalidate();
            }

            // Do this in the UI thread so we always send data in one thread.
            view.SendUpdReq();
        }