void NegotiateDesktop() { byte shareDesktopSetting = _c.ReceiveByte();//是否同意分享屏幕 bool shareDesktop = shareDesktopSetting != 0; var e = new CreatingDesktopEventArgs(shareDesktop); OnCreatingDesktop(e); var fbSource = _fbSource; Framebuffer = fbSource != null?fbSource.Capture() : null; VncStream.Require(Framebuffer != null, "No framebuffer. Make sure you've called SetFramebufferSource. It can be set to a VncFramebuffer.", VncFailureReason.SanityCheckFailed); _clientPixelFormat = Framebuffer.PixelFormat; _clientWidth = Framebuffer.Width; _clientHeight = Framebuffer.Height; _fbuAutoCache = null; _c.SendUInt16BE((ushort)Framebuffer.Width); _c.SendUInt16BE((ushort)Framebuffer.Height); var pixelFormat = new byte[VncPixelFormat.Size]; Framebuffer.PixelFormat.Encode(pixelFormat, 0); _c.Send(pixelFormat); _c.SendString(Framebuffer.Name, true); }
public void HandleSetEncodingsTest(bool forceConnect, VncEncoding expectedEncoding) { using (var stream = new TestStream()) { // Have the client send a list of supported encodings, including // Raw and zlib VncStream clientStream = new VncStream(stream.Input); clientStream.SendByte(0); clientStream.SendUInt16BE(2); // 2 encodings are supported clientStream.SendUInt32BE((uint)VncEncoding.Raw); clientStream.SendUInt32BE((uint)VncEncoding.Zlib); stream.Input.Position = 0; var session = new VncServerSession(); session.Connect(stream, null, startThread: false, forceConnected: forceConnect); session.HandleSetEncodings(); // The server should not have written any output, but switched // to zlib encoding VncStream serverStream = new VncStream(stream.Output); Assert.Equal(0, serverStream.Stream.Length); stream.Output.Position = 0; Assert.Equal(expectedEncoding, session.Encoder.Encoding); } }
public void SetDesktopSizeTest() { var framebuffer1 = new VncFramebuffer("test-1", 100, 200, VncPixelFormat.RGB32); var framebuffer2 = new VncFramebuffer("test-2", 200, 400, VncPixelFormat.RGB32); var framebuffer = framebuffer1; var framebufferSourceMock = new Mock <IVncFramebufferSource>(MockBehavior.Strict); framebufferSourceMock .Setup(m => m.SetDesktopSize(200, 300)) .Returns(ExtendedDesktopSizeStatus.Success) .Callback(() => { framebuffer = framebuffer2; }); framebufferSourceMock .Setup(m => m.Capture()) .Returns(() => framebuffer); using (var stream = new TestStream()) { VncStream clientStream = new VncStream(stream.Input); // Negotiating the dessktop size clientStream.SendByte(0); // share desktop setting // Send a SetDesktopSize request clientStream.SendByte((byte)VncMessageType.SetDesktopSize); clientStream.SendByte(0); // padding clientStream.SendUInt16BE(200); // width clientStream.SendUInt16BE(300); // height clientStream.SendByte(1); // number of screens clientStream.SendByte(0); // padding clientStream.SendUInt32BE(1); // screen id clientStream.SendUInt16BE(0); // x position clientStream.SendUInt16BE(0); // x position clientStream.SendUInt16BE(200); // width clientStream.SendUInt16BE(300); // height clientStream.SendUInt32BE(0); // flags stream.Input.Position = 0; var session = new VncServerSession(); session.SetFramebufferSource(framebufferSourceMock.Object); session.Connect(stream, null, startThread: false); // Negotiate the desktop session.NegotiateDesktop(); Assert.Equal(VncPixelFormat.RGB32, session.ClientPixelFormat); // Handle the SetDesktopSize request session.HandleMessage(); VncStream serverStream = new VncStream(stream.Output); stream.Output.Position = 0; // Desktop negotiation result Assert.Equal(100, serverStream.ReceiveUInt16BE()); Assert.Equal(200, serverStream.ReceiveUInt16BE()); var format = serverStream.Receive(16); Assert.Equal("test-1", serverStream.ReceiveString()); // SetDesktopSize result Assert.Equal(0, serverStream.ReceiveUInt16BE()); // Update rectangle request Assert.Equal(1, serverStream.ReceiveUInt16BE()); // 1 rectangle; Assert.Equal((ushort)ExtendedDesktopSizeReason.Client, serverStream.ReceiveUInt16BE()); // x Assert.Equal((ushort)ExtendedDesktopSizeStatus.Success, serverStream.ReceiveUInt16BE()); // y Assert.Equal(100, serverStream.ReceiveUInt16BE()); // width Assert.Equal(200, serverStream.ReceiveUInt16BE()); // height Assert.Equal((int)VncEncoding.ExtendedDesktopSize, (int)serverStream.ReceiveUInt32BE()); // encoding Assert.Equal(1u, serverStream.ReceiveByte()); // Number of screens serverStream.Receive(3); // Padding Assert.Equal(0u, serverStream.ReceiveUInt32BE()); // screen ID Assert.Equal(0u, serverStream.ReceiveUInt16BE()); // x-position Assert.Equal(0u, serverStream.ReceiveUInt16BE()); // y-position Assert.Equal(100u, serverStream.ReceiveUInt16BE()); // width Assert.Equal(200u, serverStream.ReceiveUInt16BE()); // height Assert.Equal(0u, serverStream.ReceiveUInt32BE()); // flags Assert.Equal(stream.Output.Length, stream.Output.Position); Assert.Equal(stream.Input.Length, stream.Input.Position); } }