annotate VNCServer/VNCServer.cs @ 23:644a923bca98

Added FBGUI and VNCServer
author Ivo Smits <Ivo@UCIS.nl>
date Mon, 15 Apr 2013 02:04:36 +0200
parents
children 2ecb82eea559
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Collections.Generic;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.Diagnostics;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.Drawing;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Drawing.Drawing2D;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 using System.Drawing.Imaging;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 using System.IO;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 using System.Net;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 using System.Net.Sockets;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 using System.Security.Cryptography;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 using System.Text;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 using System.Threading;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 using System.Windows.Forms;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 using UCIS.Net.HTTP;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 namespace UCIS.VNCServer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 public class VNCServerManager : IFramebuffer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 private VNCFramebuffer fb;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 private List<VNCServerConnection> clients = new List<VNCServerConnection>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 private VNCServer server;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 public event MouseEventHandler MouseDown;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 public event MouseEventHandler MouseMove;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 public event MouseEventHandler MouseUp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 public event KeyEventHandler KeyDown;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 public event KeyEventHandler KeyUp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 public VNCServerManager(int w, int h) : this(w, h, 5901) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 public VNCServerManager(int w, int h, int p) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 fb = new VNCFramebuffer(w, h);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 server = new VNCServer(p);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 server.ClientConnected += delegate(object sender, VNCClientConnectedEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 e.Client.Framebuffer = fb;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 e.Client.MouseDown += MouseDown;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 e.Client.MouseMove += MouseMove;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 e.Client.MouseUp += MouseUp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 e.Client.KeyDown += KeyDown;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 e.Client.KeyUp += KeyUp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 e.Client.Disconnected += ClientDisconnected;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 lock (clients) clients.Add(e.Client);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 };
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 server.Listen();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 private void ClientDisconnected(Object sender, EventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 lock (clients) clients.Remove((VNCServerConnection)sender);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 public void Close() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 server.Close();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 foreach (VNCServerConnection c in clients.ToArray()) c.Close();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 public int Width {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 get { return fb.Width; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 public int Height {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 get { return fb.Height; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 public void Clear() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 fb.Clear();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 public void DrawImage(Image image, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 fb.DrawImage(image, srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 public void DrawPixels(int[] bitmap, int bmwidth, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67 fb.DrawPixels(bitmap, bmwidth, srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 public void DrawPixels(IntPtr bitmap, int bmwidth, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 fb.DrawPixels(bitmap, bmwidth, srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 public void CopyRectangle(Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 fb.CopyRectangle(srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 public void CopyRectangleTo(Rectangle srcrect, IFramebuffer destbuffer, Point destposition) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 fb.CopyRectangleTo(srcrect, destbuffer, destposition);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 public void Resize(int w, int h) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 fb = new VNCFramebuffer(w, h);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 foreach (VNCServerConnection c in clients) c.Framebuffer = fb;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 public class VNCFramebufferUpdateEventArgs : EventArgs {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 public VNCFramebuffer Framebuffer { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 public Rectangle Area { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 internal VNCFramebufferUpdateEventArgs(VNCFramebuffer fb, Rectangle a) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 this.Framebuffer = fb;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 this.Area = a;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 public class VNCFramebuffer : IFramebuffer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 public event EventHandler<VNCFramebufferUpdateEventArgs> Update;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 internal Int32[] Framebuffer { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 public int Width { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 public int Height { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 public VNCFramebuffer(int width, int height) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 if (width <= 0) throw new ArgumentOutOfRangeException("width");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 if (height <= 0) throw new ArgumentOutOfRangeException("height");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 this.Width = width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 this.Height = height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 this.Framebuffer = new Int32[width * height];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 public void Clear() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 for (int i = 0; i < Width * Height; i++) Framebuffer[i] = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 EventHandler<VNCFramebufferUpdateEventArgs> eh = Update;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 if (eh != null) eh(this, new VNCFramebufferUpdateEventArgs(this, new Rectangle(0, 0, Width, Height)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 public unsafe void DrawImage(Image image, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 if (srcrect.Width == 0 || srcrect.Height == 0) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 fixed (int* fbptr = Framebuffer) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 using (Bitmap b = new Bitmap(Width, Height, Width * 4, PixelFormat.Format32bppRgb, (IntPtr)fbptr)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 using (Graphics g = Graphics.FromImage(b)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 g.CompositingMode = CompositingMode.SourceCopy;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 g.DrawImage(image, new Rectangle(dest, srcrect.Size), srcrect, GraphicsUnit.Pixel);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 EventHandler<VNCFramebufferUpdateEventArgs> eh = Update;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 if (eh != null) eh(this, new VNCFramebufferUpdateEventArgs(this, new Rectangle(dest, srcrect.Size)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 public void DrawBitmap(Bitmap bitmap, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 DrawImage(bitmap, srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 public unsafe void DrawPixels(int[] bitmap, int bmwidth, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 fixed (int* bmp = bitmap) DrawPixels(bmp, bmwidth, srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 public unsafe void DrawPixels(IntPtr bitmap, int bmwidth, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 DrawPixels((int*)bitmap, bmwidth, srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 public unsafe void DrawPixels(int* bitmap, int bmwidth, Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 if (srcrect.X < 0 || srcrect.Y < 0 || srcrect.Width < 0 || srcrect.Height < 0) throw new ArgumentOutOfRangeException("srcrect");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 if (dest.X < 0 || dest.Y < 0 || dest.X + srcrect.Width > Width || dest.Y + srcrect.Height > Height) throw new ArgumentOutOfRangeException("dest");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 if (srcrect.Width == 0 || srcrect.Height == 0) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 int* bmin = bitmap + srcrect.Y * bmwidth + srcrect.X;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 //Optionally detect regions that have actually changed. This produces many small regions which may slow down the Tight JPEG encoder (and ZLib based codecs)
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 //DrawChangedPixels(Framebuffer, dest.Y * Width + dest.X, bmin, srcrect.Width, srcrect.Height, bmwidth, dest.X, dest.Y);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 //return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 fixed (int* fbptr = Framebuffer) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 int* bmout = fbptr + dest.Y * Width + dest.X;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 for (int y = 0; y < srcrect.Height; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 int* bminl = bmin + y * bmwidth;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 int* bmoutl = bmout + y * Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 for (int x = 0; x < srcrect.Width; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 bmoutl[x] = bminl[x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 EventHandler<VNCFramebufferUpdateEventArgs> eh = Update;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 if (eh != null) eh(this, new VNCFramebufferUpdateEventArgs(this, new Rectangle(dest, srcrect.Size)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 private unsafe void DrawChangedPixels(int[] shadow, int shadowoffset, int* pixels, int width, int height, int bmwidth, int xoffset, int yoffset) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 EventHandler<VNCFramebufferUpdateEventArgs> eh = Update;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 if (eh == null) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 int firstx = -1, lastx = -1, firsty = -1, lasty = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 for (int y = 0; y < height; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 int firstxline = -1, lastxline = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 for (int x = 0; x < width; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 if (shadow[shadowoffset] != *pixels) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 if (firstxline == -1) firstxline = x;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 lastxline = x;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 shadow[shadowoffset] = *pixels;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 shadowoffset++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 pixels++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 shadowoffset += Width - width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 pixels += bmwidth - width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 if (firsty != -1 && firstxline == -1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 eh(this, new VNCFramebufferUpdateEventArgs(this, new Rectangle(firstx + xoffset, firsty + yoffset, lastx - firstx + 1, lasty - firsty + 1)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 firsty = lasty = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 } else if (firstxline != -1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 if (firsty == -1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 firsty = y;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 firstx = firstxline;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 lastx = lastxline;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 if (firstxline < firstx) firstx = firstxline;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 if (lastxline > lastx) lastx = lastxline;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 lasty = y;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 if (firsty != -1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 eh(this, new VNCFramebufferUpdateEventArgs(this, new Rectangle(firstx + xoffset, firsty + yoffset, lastx - firstx + 1, lasty - firsty + 1)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 public void CopyRectangle(Rectangle srcrect, Point dest) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 DrawPixels(Framebuffer, Width, srcrect, dest);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 public void CopyRectangleTo(Rectangle srcrect, IFramebuffer destbuffer, Point destposition) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 destbuffer.DrawPixels(Framebuffer, Width, srcrect, destposition);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 struct RFBPixelFormat {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 public Byte BitsPerPixel { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 public Byte ColorDepth { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 public Boolean BigEndian { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 public Boolean TrueColor { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 public UInt16 RedMax { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 public UInt16 GreenMax { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 public UInt16 BlueMax { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 public Byte RedShift { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 public Byte GreenShift { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 public Byte BlueShift { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 public class VNCClientConnectedEventArgs : EventArgs {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 public VNCServer Server { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 public EndPoint RemoteEndPoint { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 public VNCServerConnection Client { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 public Boolean Drop { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 public Boolean AllowNoAuthentication { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 public Boolean AllowPasswordAuthentication { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 public VNCClientConnectedEventArgs(VNCServer serv, VNCServerConnection c, EndPoint ep) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 this.Server = serv;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 this.RemoteEndPoint = ep;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 this.Client = c;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 this.Drop = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219 this.AllowNoAuthentication = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 this.AllowPasswordAuthentication = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 public class VNCClientAuthenticationEventArgs : EventArgs {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 public VNCServerConnection Client { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 public Boolean Drop { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 public Boolean UsedPasswordAuthentication { get; internal set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 public String DesktopName { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 internal Byte[] VNCAuthChallenge { private get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 internal Byte[] VNCAuthResponse { private get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 internal VNCClientAuthenticationEventArgs(VNCServerConnection c) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 this.Client = c;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 this.Drop = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 public Boolean CheckPassword(String password) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 return CheckPassword(Encoding.ASCII.GetBytes(password));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 public Boolean CheckPassword(Byte[] password) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 Byte[] passwordtransform = new Byte[8];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 for (int i = 0; i < 8 && i < password.Length; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240 Byte a = password[i], b = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 for (int j = 0; j < 8; j++) b |= (Byte)(((a >> (7 - j)) & 1) << j);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 passwordtransform[i] = b;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
243 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 byte[] check;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
245 using (DES des = new DESCryptoServiceProvider()) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 des.Mode = CipherMode.ECB;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 des.Padding = PaddingMode.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 using (ICryptoTransform transform = des.CreateEncryptor(passwordtransform, null)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 check = transform.TransformFinalBlock(VNCAuthChallenge, 0, 16);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
250 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
251 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
252 for (int i = 0; i < 16; i++) if (VNCAuthResponse[i] != check[i]) return false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
253 return true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
254 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
255 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
256 public class VNCServer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
257 public event EventHandler<VNCClientConnectedEventArgs> ClientConnected;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 public EndPoint LocalEndPoint { get; protected set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 public Boolean Listening { get; protected set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260 private Socket socket = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 public VNCServer() : this(null) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 public VNCServer(int port) : this(new IPEndPoint(IPAddress.Any, port)) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 public VNCServer(EndPoint ep) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 LocalEndPoint = ep;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
266 public void Listen() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
267 if (LocalEndPoint == null) throw new ArgumentNullException("LocalEndPoint");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
268 Listen(LocalEndPoint);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
269 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
270 public void Listen(int port) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
271 Listen(new IPEndPoint(IPAddress.Any, port));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273 public virtual void Listen(EndPoint ep) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 if (Listening) throw new InvalidOperationException("The server is already listening");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 socket = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Unspecified);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 socket.Bind(ep);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277 socket.Listen(5);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278 LocalEndPoint = ep;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279 Listening = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 socket.BeginAccept(AcceptCallback, socket);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
281 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282 public virtual void Close() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
283 if (!Listening) throw new InvalidOperationException("The server is not listening");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284 Listening = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 socket.Close();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287 private void AcceptCallback(IAsyncResult ar) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 Socket socket = ar.AsyncState as Socket;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
289 try {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
290 Socket clientsock = socket.EndAccept(ar);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 if (clientsock.ProtocolType == ProtocolType.Tcp) clientsock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
292 ClientAccepted(new VNCServerConnection(clientsock));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293 } catch (SocketException ex) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
294 Debug.WriteLine(ex);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
295 } catch (ObjectDisposedException ex) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
296 Debug.WriteLine(ex);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
297 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
298 if (Listening) socket.BeginAccept(AcceptCallback, socket);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
299 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
300 protected void ClientAccepted(VNCServerConnection client) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
301 VNCClientConnectedEventArgs clientargs = new VNCClientConnectedEventArgs(this, client, client.RemoteEndPoint);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 if (ClientConnected != null) ClientConnected(this, clientargs);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303 if (clientargs.Drop) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
304 client.Close();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
305 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
306 client.RunAsync(clientargs);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
307 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
308 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
309 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
310 public class WebVNCServer : VNCServer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
311 private HTTPServer httpserver;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
312 public WebVNCServer() : this(null) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
313 public WebVNCServer(int port) : this(new IPEndPoint(IPAddress.Any, port)) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
314 public WebVNCServer(EndPoint ep) : base(ep) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
315 httpserver = new HTTPServer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
316 httpserver.ContentProvider = new HTTPContentProviderFunction(HandleClient);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
317 httpserver.ServeFlashPolicyFile = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
318 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
319 public override void Listen(EndPoint ep) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
320 httpserver.Listen(ep);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
321 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
322 public override void Close() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
323 httpserver.Dispose();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
324 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
325 public void HandleClient(HTTPContext context) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
326 WebSocketPacketStream stream = new WebSocketPacketStream(context);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
327 ClientAccepted(new VNCServerConnection(stream, context.Socket));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
328 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
329 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
330 public interface IZLibCompressor {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
331 byte[] Compress(Byte[] data, int offset, int count);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
332 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
333 public delegate IZLibCompressor ZLibCompressorFactory();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
334 public class VNCServerConnection {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
335 VNCFramebuffer framebuffer = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
336 List<Rectangle> dirtyrects = new List<Rectangle>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
337 int waitingforupdate = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
338 Rectangle waitingforupdaterect = Rectangle.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
339 Int32[] SupportedEncodings = new Int32[] { };
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
340 MouseButtons mousebuttons = MouseButtons.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
341 Boolean resized = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
342 Thread worker = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
343 Keys modifierKeys = Keys.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
344 MemoryStream SendBuffer = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
345 Stream socket;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
346 Socket realsocket;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
347 Int32 protover;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
348 RFBPixelFormat pixelformat;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
349 int jpegCounter = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
350 Rectangle blurryrect = Rectangle.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
351 int blurryrecoveryline = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
352 Point mousePosition = new Point(-1, -1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
353 ZLibCompressorFactory ZLibFactory = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
354
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
355 public int Width { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
356 public int Height { get; private set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
357 public Object Tag { get; set; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
358
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
359 public EndPoint RemoteEndPoint { get { return realsocket == null ? null : realsocket.RemoteEndPoint; } }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
360 public VNCFramebuffer Framebuffer {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
361 get { return framebuffer; }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
362 set {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
363 if (framebuffer != null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
364 framebuffer.Update -= FBUpdate;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
365 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
366 framebuffer = value;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
367 if (value == null) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
368 lock (dirtyrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
369 resized = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
370 dirtyrects.Clear();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
371 framebuffer.Update += FBUpdate;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
372 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
373 FBUpdate(this, new VNCFramebufferUpdateEventArgs(value, new Rectangle(0, 0, framebuffer.Width, framebuffer.Height)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
374 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
375 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
376
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
377 public event MouseEventHandler MouseDown;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
378 public event MouseEventHandler MouseMove;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
379 public event MouseEventHandler MouseUp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
380 public event KeyEventHandler KeyDown;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
381 public event KeyEventHandler KeyUp;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
382
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
383 public event EventHandler Disconnected;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
384
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
385 public event EventHandler UpdateRequested;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
386 public event EventHandler WaitingForUpdate;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
387
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
388 public event EventHandler<VNCClientAuthenticationEventArgs> ClientAuthentication;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
389 public event EventHandler ConnectionComplete;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
390
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
391 public VNCServerConnection(Socket client) : this(new NetworkStream(client, true), client) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
392 realsocket.SendBufferSize = 1024 * 1024;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
393 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
394 public VNCServerConnection(Stream client) : this(client, null) { }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
395 public VNCServerConnection(Stream client, Socket socket) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
396 this.socket = client;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
397 this.realsocket = socket;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
398 pixelformat = new RFBPixelFormat() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
399 BigEndian = false, BitsPerPixel = 32, ColorDepth = 24, TrueColor = true,
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
400 BlueMax = 255, BlueShift = 0, GreenMax = 255, GreenShift = 8, RedMax = 255, RedShift = 16
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
401 };
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
402 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
403
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
404 public void Close() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
405 socket.Close();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
406 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
407
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
408 public void RunAsync(VNCClientConnectedEventArgs args) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
409 worker = new Thread(RunSafe);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
410 worker.Start(args);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
411 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
412 private void RunSafe(Object state) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
413 try {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
414 RunProc((VNCClientConnectedEventArgs)state);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
415 } catch (Exception ex) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
416 Console.Error.WriteLine(ex);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
417 } finally {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
418 try { socket.Close(); } catch (Exception ex) { Console.Error.WriteLine(ex); }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
419 if (Disconnected != null) Disconnected(this, new EventArgs());
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
420 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
421 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
422 private void RunProc(VNCClientConnectedEventArgs connargs) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
423 Initialisation(connargs);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
424 ReceiveLoop();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
425 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
426
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
427 private void Initialisation(VNCClientConnectedEventArgs connargs) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
428 {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
429 Byte[] protovbuf = Encoding.ASCII.GetBytes("RFB 003.008\n");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
430 SendAll(protovbuf);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
431 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
432 protovbuf = ReceiveAll(12);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
433 String protovs = Encoding.ASCII.GetString(protovbuf);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
434 protover = int.Parse(protovs.Substring(4, 3)) * 1000 + int.Parse(protovs.Substring(8, 3));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
435 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
436 //Console.WriteLine("Client protocol is {0} = {1}", protovs.TrimEnd('\n'), protover);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
437 if (protover < 3003) throw new InvalidOperationException("Unsupported protocol version");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
438 VNCClientAuthenticationEventArgs authargs = new VNCClientAuthenticationEventArgs(this);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
439 if (protover >= 3007) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
440 if (connargs.AllowNoAuthentication && connargs.AllowPasswordAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
441 SendAll(new Byte[] { 2, 1, 2 }); //2 security types, no security, VNC security
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
442 } else if (connargs.AllowNoAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
443 SendAll(new Byte[] { 1, 1 }); //1 security type, none security
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
444 } else if (connargs.AllowPasswordAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
445 SendAll(new Byte[] { 1, 2 }); //1 security type, VNC security
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
446 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
447 SendAll(new Byte[] { 0 }); //no security types, drop connection
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
448 throw new InvalidOperationException("No security types allowed");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
449 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
450 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
451 Byte[] sectype = ReceiveAll(1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
452 if (sectype[0] == 1 && connargs.AllowNoAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
453 authargs.UsedPasswordAuthentication = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
454 } else if (sectype[0] == 2 && connargs.AllowPasswordAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
455 authargs.UsedPasswordAuthentication = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
456 } else throw new InvalidOperationException("Unsupported security type");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
457 } else if (protover == 3003) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
458 if (connargs.AllowNoAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
459 SendUInt32(1); //Security type is none
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
460 authargs.UsedPasswordAuthentication = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
461 } else if (connargs.AllowPasswordAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
462 SendUInt32(2); //Security type is VNC security
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
463 authargs.UsedPasswordAuthentication = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
464 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
465 SendUInt32(0); //no security types, drop connection
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
466 throw new InvalidOperationException("No security types allowed");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
467 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
468 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
469 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
470 throw new InvalidOperationException("Unsupported protocol version");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
471 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
472 if (authargs.UsedPasswordAuthentication) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
473 Byte[] challenge = new Byte[16];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
474 (new RNGCryptoServiceProvider()).GetBytes(challenge);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
475 SendAll(challenge);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
476 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
477 authargs.VNCAuthChallenge = challenge;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
478 authargs.VNCAuthResponse = ReceiveAll(16);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
479 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
480 if (ClientAuthentication != null) ClientAuthentication(this, authargs);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
481 if (authargs.Drop) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
482 SendUInt32(1); //Security not OK
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
483 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
484 throw new Exception("Authentication rejected");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
485 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
486 if (authargs.UsedPasswordAuthentication || protover >= 3008) SendUInt32(0); //Security OK
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
487 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
488 Byte[] clientinit = ReceiveAll(1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
489 //Console.WriteLine("Shared = {0}", clientinit[0]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
490 {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
491 VNCFramebuffer fb = framebuffer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
492 if (fb != null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
493 Width = fb.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
494 Height = fb.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
495 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
496 Width = 1024;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
497 Height = 768;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
498 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
499 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
500 resized = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
501 SendUInt16((UInt16)Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
502 SendUInt16((UInt16)Height);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
503 SendPixelFormat(pixelformat);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
504 {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
505 Byte[] desknamestr;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
506 if (authargs.DesktopName == null) desknamestr = new Byte[0];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
507 else desknamestr = Encoding.ASCII.GetBytes(authargs.DesktopName);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
508 SendUInt32((UInt32)desknamestr.Length);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
509 SendAll(desknamestr);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
510 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
511 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
512 if (ConnectionComplete != null) ConnectionComplete(this, new EventArgs());
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
513 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
514
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
515 private void ReceiveLoop() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
516 while (true) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
517 Byte mtype = ReceiveByte();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
518 switch (mtype) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
519 case 0: //SetPixelFormat
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
520 ReceiveMessageSetPixelFormat();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
521 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
522 case 2: //SetEncodings
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
523 Byte[] b = ReceiveAll(3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
524 b = ReceiveAll(4 * ((b[1] << 8) | b[2]));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
525 SupportedEncodings = new Int32[b.Length / 4];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
526 for (int i = 0; i < b.Length; i += 4) SupportedEncodings[i / 4] = (b[i] << 24) | (b[i + 1] << 16) | (b[i + 2] << 8) | b[i + 3];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
527 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
528 case 3: //FramebufferUpdateRequest
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
529 b = ReceiveAll(9);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
530 Rectangle r = new Rectangle((b[1] << 8) | b[2], (b[3] << 8) | b[4], (b[5] << 8) | b[6], (b[7] << 8) | b[8]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
531 SendQueuedRectangles(r, b[0] != 0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
532 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
533 case 4: //KeyEvent
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
534 ReceiveMessageKeyboard();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
535 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
536 case 5: //PointerEvent
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
537 ReceiveMessageMouse();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
538 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
539 case 6: //ClientCutText
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
540 b = ReceiveAll(7);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
541 ReceiveAll((b[3] << 24) | (b[4] << 16) | (b[5] << 8) | b[6]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
542 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
543 default:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
544 throw new InvalidOperationException("Received unknown message type, synchronization is lost");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
545 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
546 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
547 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
548 private void ReceiveMessageSetPixelFormat() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
549 Byte[] b = ReceiveAll(3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
550 pixelformat = ReceivePixelFormat();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
551 if (!pixelformat.TrueColor) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
552 //I don't want to use a pallette, so I cheat by sending a 8bpp "true color" pallette
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
553 pixelformat.TrueColor = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
554 pixelformat.BigEndian = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
555 pixelformat.RedShift = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
556 pixelformat.RedMax = 3;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
557 pixelformat.GreenShift = 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
558 pixelformat.GreenMax = 7;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
559 pixelformat.BlueShift = 5;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
560 pixelformat.BlueMax = 7;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
561 lock (socket) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
562 SendUInt8(1); //SetColourMapEntries
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
563 SendUInt8(0); //Padding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
564 SendUInt16(0); //First colour
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
565 SendUInt16(256); //Number of colours
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
566 for (UInt16 blue = 0; blue < 256; blue += 32) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
567 for (UInt16 green = 0; green < 256; green += 32) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
568 for (UInt16 red = 0; red < 256; red += 64) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
569 SendUInt16((UInt16)(red << 8));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
570 SendUInt16((UInt16)(green << 8));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
571 SendUInt16((UInt16)(blue << 8));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
572 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
573 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
574 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
575 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
576 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
577 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
578 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
579 private void ReceiveMessageKeyboard() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
580 Byte[] b = ReceiveAll(7);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
581 Boolean down = b[0] != 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
582 uint key = (uint)((b[3] << 24) | (b[4] << 16) | (b[5] << 8) | b[6]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
583 //Console.WriteLine("KeyEvent code=0x{0:x} down={1}", key, down);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
584 Keys keyval = Keys.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
585 //see: http://cgit.freedesktop.org/xorg/proto/x11proto/plain/keysymdef.h
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
586 if (key >= 'A' && key <= 'Z') keyval = (Keys)(key + (int)Keys.A - 'A') | Keys.Shift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
587 else if (key >= 'a' && key <= 'z') keyval = (Keys)(key + (int)Keys.A - 'a');
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
588 else if (key >= '0' && key <= '9') keyval = (Keys)(key + (int)Keys.D0 - '0');
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
589 else if (key >= 0xffb0 && key <= 0xffb9) keyval = (Keys)(key + (int)Keys.NumPad0 - 0xffb0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
590 else if (key >= 0xffbe && key <= 0xffd5) keyval = (Keys)(key + (int)Keys.F1 - 0xffbe); //all the way to F35...
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
591 else switch (key) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
592 case 0xff08: keyval = Keys.Back; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
593 case 0xff09: keyval = Keys.Tab; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
594 case 0xff0a: keyval = Keys.LineFeed; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
595 case 0xff0b: keyval = Keys.Clear; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
596 case 0xff0d: keyval = Keys.Return; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
597 case 0xff13: keyval = Keys.Pause; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
598 case 0xff14: keyval = Keys.Scroll; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
599 case 0xff15: keyval = Keys.None; break; //Sys req
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
600 case 0xff1b: keyval = Keys.Escape; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
601 case 0xffff: keyval = Keys.Delete; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
602 case 0xff50: keyval = Keys.Home; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
603 case 0xff51: keyval = Keys.Left; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
604 case 0xff52: keyval = Keys.Up; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
605 case 0xff53: keyval = Keys.Right; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
606 case 0xff54: keyval = Keys.Down; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
607 case 0xff55: keyval = Keys.PageUp; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
608 case 0xff56: keyval = Keys.PageDown; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
609 case 0xff57: keyval = Keys.End; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
610 case 0xff58: keyval = Keys.Home; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
611 case 0xff60: keyval = Keys.Select; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
612 case 0xff61: keyval = Keys.Print; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
613 case 0xff62: keyval = Keys.Execute; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
614 case 0xff63: keyval = Keys.Insert; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
615 case 0xff65: keyval = Keys.None; break; //Undo
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
616 case 0xff66: keyval = Keys.None; break; //Redo
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
617 case 0xff67: keyval = Keys.Apps; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
618 case 0xff68: keyval = Keys.BrowserSearch; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
619 case 0xff69: keyval = Keys.Cancel; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
620 case 0xff6a: keyval = Keys.Help; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
621 case 0xff6b: keyval = Keys.Pause; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
622 case 0xff7e: keyval = Keys.None; break; //Character set switch
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
623 case 0xff7f: keyval = Keys.NumLock; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
624 case 0xff80: keyval = Keys.Space; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
625 case 0xff89: keyval = Keys.Tab; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
626 case 0xff8d: keyval = Keys.Enter; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
627 case 0xff91: keyval = Keys.F1; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
628 case 0xff92: keyval = Keys.F2; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
629 case 0xff93: keyval = Keys.F3; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
630 case 0xff94: keyval = Keys.F4; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
631 case 0xff95: keyval = Keys.Home; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
632 case 0xff96: keyval = Keys.Left; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
633 case 0xff97: keyval = Keys.Up; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
634 case 0xff98: keyval = Keys.Right; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
635 case 0xff99: keyval = Keys.Down; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
636 case 0xff9a: keyval = Keys.PageUp; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
637 case 0xff9b: keyval = Keys.PageDown; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
638 case 0xff9c: keyval = Keys.End; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
639 case 0xff9d: keyval = Keys.Home; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
640 case 0xff9e: keyval = Keys.Insert; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
641 case 0xff9f: keyval = Keys.Delete; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
642 case 0xffbd: keyval = Keys.None; break; //keypad equals
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
643 case 0xffaa: keyval = Keys.Multiply; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
644 case 0xffab: keyval = Keys.Add; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
645 case 0xffac: keyval = Keys.Separator; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
646 case 0xffad: keyval = Keys.Subtract; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
647 case 0xffae: keyval = Keys.Decimal; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
648 case 0xffaf: keyval = Keys.Divide; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
649 case 0xffe1: keyval = Keys.LShiftKey; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
650 case 0xffe2: keyval = Keys.RShiftKey; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
651 case 0xffe3: keyval = Keys.LControlKey; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
652 case 0xffe4: keyval = Keys.RControlKey; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
653 case 0xffe5: keyval = Keys.CapsLock; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
654 case 0xffe6: keyval = Keys.CapsLock; break; //shift lock!?
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
655 case 0xffe7: keyval = Keys.None; break; //Left meta!?
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
656 case 0xffe8: keyval = Keys.None; break; //Right meta!?
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
657 case 0xffe9: keyval = Keys.LMenu; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
658 case 0xffea: keyval = Keys.Menu; break; //right alt
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
659 case 0xffeb: keyval = Keys.LWin; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
660 case 0xffec: keyval = Keys.RWin; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
661 case 0xffed: keyval = Keys.None; break; //Left hyper
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
662 case 0xffee: keyval = Keys.None; break; //Right hyper
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
663 //Some X11 specific stuff
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
664 case 0x20: keyval = Keys.Space; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
665 case 0x21: keyval = Keys.D1 | Keys.Shift; break; //!
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
666 case 0x22: keyval = Keys.OemQuotes | Keys.Shift; break; //double quotes
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
667 case 0x23: keyval = Keys.D3 | Keys.Shift; break; //number sign? #
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
668 case 0x24: keyval = Keys.D4 | Keys.Shift; break; //dollar
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
669 case 0x25: keyval = Keys.D5 | Keys.Shift; break; //percent
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
670 case 0x26: keyval = Keys.D7 | Keys.Shift; break; //ampersand
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
671 case 0x27: keyval = Keys.OemQuotes; break; //apostrophe
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
672 case 0x28: keyval = Keys.D9 | Keys.Shift; break; //parenleft
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
673 case 0x29: keyval = Keys.D0 | Keys.Shift; break; //parenright
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
674 case 0x2a: keyval = Keys.D8 | Keys.Shift; break; //askerisk
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
675 case 0x2b: keyval = Keys.Oemplus | Keys.Shift; break; //plus
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
676 case 0x2c: keyval = Keys.Oemcomma; break; //comma
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
677 case 0x2d: keyval = Keys.OemMinus; break; //minus
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
678 case 0x2e: keyval = Keys.OemPeriod; break; //period
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
679 case 0x2f: keyval = Keys.OemQuestion; break; //slash
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
680 //digits handled above
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
681 case 0x3a: keyval = Keys.OemSemicolon | Keys.Shift; break; //colon
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
682 case 0x3b: keyval = Keys.OemSemicolon; break; //semicolon
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
683 case 0x3c: keyval = Keys.Oemcomma | Keys.Shift; break; //less than
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
684 case 0x3d: keyval = Keys.Oemplus; break; //equals
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
685 case 0x3e: keyval = Keys.OemPeriod | Keys.Shift; break; //greater than
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
686 case 0x3f: keyval = Keys.OemQuestion | Keys.Shift; break; //question mark
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
687 case 0x40: keyval = Keys.D2 | Keys.Shift; break; //commercial at
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
688 //capital letters handled above
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
689 case 0x5b: keyval = Keys.OemOpenBrackets; break; //left square bracker
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
690 case 0x5c: keyval = Keys.OemBackslash; break; //backslash
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
691 case 0x5d: keyval = Keys.OemCloseBrackets; break; //right square bracker
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
692 case 0x5e: keyval = Keys.D6 | Keys.Shift; break; //CIRCUMFLEX ACCENT
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
693 case 0x5f: keyval = Keys.OemMinus | Keys.Shift; break; //underscore
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
694 case 0x60: keyval = Keys.Oemtilde; break; //grave accent
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
695 //small letters handled above
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
696 case 0x7b: keyval = Keys.OemOpenBrackets | Keys.Shift; break; //left curly bracket
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
697 case 0x7c: keyval = Keys.OemBackslash | Keys.Shift; break; //vertical line
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
698 case 0x7d: keyval = Keys.OemCloseBrackets | Keys.Shift; break; //right curly bracket
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
699 case 0x7e: keyval = Keys.Oemtilde | Keys.Shift; break; //tilde
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
700 //blah blah
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
701 //experimental:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
702 case 0xfe03: keyval = Keys.RMenu; break; //Alt gr or XK_ISO_Level3_Shift
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
703 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
704 switch (keyval) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
705 case Keys.LShiftKey:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
706 case Keys.RShiftKey:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
707 case Keys.ShiftKey:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
708 if (down) modifierKeys |= Keys.Shift; else modifierKeys &= ~Keys.Shift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
709 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
710 case Keys.LControlKey:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
711 case Keys.RControlKey:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
712 case Keys.ControlKey:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
713 if (down) modifierKeys |= Keys.Control; else modifierKeys &= ~Keys.Control;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
714 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
715 case Keys.LMenu:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
716 case Keys.RMenu:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
717 case Keys.Menu:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
718 if (down) modifierKeys |= Keys.Alt; else modifierKeys &= ~Keys.Alt;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
719 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
720 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
721 keyval |= modifierKeys;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
722 if (down && KeyDown != null) KeyDown(this, new KeyEventArgs(keyval));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
723 else if (!down && KeyUp != null) KeyUp(this, new KeyEventArgs(keyval));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
724 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
725 private void ReceiveMessageMouse() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
726 Byte[] b = ReceiveAll(5);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
727 Point p = new Point((b[1] << 8) | b[2], (b[3] << 8) | b[4]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
728 MouseButtons mb = MouseButtons.None;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
729 if ((b[0] & 1) != 0) mb |= MouseButtons.Left;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
730 if ((b[0] & 2) != 0) mb |= MouseButtons.Middle;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
731 if ((b[0] & 4) != 0) mb |= MouseButtons.Right;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
732 if ((b[0] & 32) != 0) mb |= MouseButtons.XButton1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
733 if ((b[0] & 64) != 0) mb |= MouseButtons.XButton2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
734 int dd = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
735 if ((b[0] & 8) != 0) dd = 120;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
736 if ((b[0] & 16) != 0) dd = -120;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
737 //Console.WriteLine("PointerEvent x={0} y={1} buttons={2} delta={3}", p.X, p.Y, mb, dd);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
738 foreach (MouseButtons mbi in Enum.GetValues(typeof(MouseButtons))) if ((mousebuttons & mbi) != 0 && (mb & mbi) == 0) if (MouseUp != null) MouseUp(this, new MouseEventArgs(mbi, 0, p.X, p.Y, 0));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
739 if ((dd != 0 || mousePosition != p) && MouseMove != null) MouseMove(this, new MouseEventArgs(mb & mousebuttons, 0, p.X, p.Y, dd));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
740 foreach (MouseButtons mbi in Enum.GetValues(typeof(MouseButtons))) if ((mousebuttons & mbi) == 0 && (mb & mbi) != 0) if (MouseDown != null) MouseDown(this, new MouseEventArgs(mbi, 0, p.X, p.Y, 0));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
741 mousePosition = p;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
742 mousebuttons = mb;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
743 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
744
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
745 private void FBUpdate(Object sender, VNCFramebufferUpdateEventArgs e) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
746 if (e.Framebuffer != framebuffer) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
747 Rectangle r = e.Area;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
748 r.Intersect(new Rectangle(0, 0, e.Framebuffer.Width, e.Framebuffer.Height));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
749 if (r.Width == 0 || r.Height == 0) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
750 Boolean send;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
751 lock (dirtyrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
752 for (int i = 0; i < dirtyrects.Count; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
753 Rectangle r2 = dirtyrects[i];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
754 if (r.IntersectsWith(r2)) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
755 dirtyrects.RemoveAt(i);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
756 i = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
757 r = Rectangle.Union(r, r2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
758 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
759 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
760 dirtyrects.Add(r);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
761 send = waitingforupdate > 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
762 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
763 if (send) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
764 Interlocked.Decrement(ref waitingforupdate);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
765 SendQueuedRectangles(waitingforupdaterect, false);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
766 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
767 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
768
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
769 private void ClearIntersectingQueuedRectangles(Rectangle r) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
770 lock (dirtyrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
771 for (int i = 0; i < dirtyrects.Count; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
772 Rectangle r2 = dirtyrects[i];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
773 if (!r2.IntersectsWith(r)) continue;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
774 dirtyrects.RemoveAt(i);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
775 i--;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
776 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
777 dirtyrects.TrimExcess();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
778 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
779 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
780 private void SendQueuedRectangles(Rectangle r, Boolean incremental) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
781 lock (socket) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
782 if (resized) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
783 resized = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
784 jpegCounter = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
785 VNCFramebuffer fb = framebuffer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
786 SendUInt8(0); //FramebufferUpdate
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
787 SendUInt8(0); //Padding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
788 if (Array.IndexOf(SupportedEncodings, -223) == -1) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
789 Console.Error.WriteLine("VNC: Desktop size update not supported");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
790 SendUInt16(fb == null ? (UInt16)1 : (UInt16)2); //Number of rectangles
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
791 int[] empty = new int[r.Width * r.Height];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
792 SendFBRectangle(empty, new Rectangle(0, 0, r.Width, r.Height), r.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
793 ClearIntersectingQueuedRectangles(r);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
794 blurryrect = Rectangle.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
795 if (fb != null) SendFBRectangle(fb.Framebuffer, r, fb.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
796 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
797 if (fb != null) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
798 Width = fb.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
799 Height = fb.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
800 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
801 Console.Error.WriteLine("VNC: Sending desktop size update {0}x{1}", Width, Height);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
802 SendUInt16(1); //Number of rectangles
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
803 SendUInt16(0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
804 SendUInt16(0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
805 SendUInt16((UInt16)Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
806 SendUInt16((UInt16)Height);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
807 SendUInt32(unchecked((UInt32)(-223))); //Encoding type
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
808 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
809 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
810 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
811 if (UpdateRequested != null) UpdateRequested(this, new EventArgs());
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
812 VNCFramebuffer fb = framebuffer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
813 if (!incremental) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
814 jpegCounter = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
815 ClearIntersectingQueuedRectangles(r);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
816 blurryrect = Rectangle.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
817 SendUInt8(0); //FramebufferUpdate
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
818 SendUInt8(0); //Padding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
819 SendUInt16(1); //Number of rectangles
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
820 SendFBRectangle(fb.Framebuffer, r, fb.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
821 } else { //incremental
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
822 List<Rectangle> sending = new List<Rectangle>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
823 lock (dirtyrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
824 if (dirtyrects.Count == 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
825 if (jpegCounter > 0) jpegCounter--;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
826 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
827 if (jpegCounter < 10) jpegCounter++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
828 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
829 for (int i = 0; i < dirtyrects.Count; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
830 Rectangle r2 = dirtyrects[i];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
831 if (!r2.IntersectsWith(r)) continue;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
832 dirtyrects.RemoveAt(i);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
833 i--;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
834 r2.Intersect(r);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
835 sending.Add(r2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
836 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
837 dirtyrects.TrimExcess();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
838 if (sending.Count == 0 && blurryrect.IsEmpty) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
839 Interlocked.Increment(ref waitingforupdate);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
840 waitingforupdaterect = r;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
841 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
842 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
843 if (sending.Count > 0 || !blurryrect.IsEmpty) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
844 SendUInt8(0); //FramebufferUpdate
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
845 SendUInt8(0); //Padding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
846 SendUInt16((UInt16)(sending.Count + (blurryrect.IsEmpty ? 0 : 1))); //Number of rectangles
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
847 if (!blurryrect.IsEmpty) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
848 //The idea here is to use a lossless compression for a small area to "recover" textual/static content from the JPEG artifacts
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
849 //Only a small area is updated here each time because compressing a full frame takes too much CPU time
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
850 Rectangle fixrect = blurryrect;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
851 if (blurryrecoveryline < fixrect.Top) blurryrecoveryline = fixrect.Top;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
852 else if (blurryrecoveryline >= fixrect.Bottom) blurryrecoveryline = fixrect.Top;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
853 fixrect.Intersect(new Rectangle(0, blurryrecoveryline, Int16.MaxValue, 10));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
854 if (fixrect.IsEmpty) fixrect = blurryrect;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
855 int oldjpeg = jpegCounter;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
856 jpegCounter = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
857 SendFBRectangle(fb.Framebuffer, Rectangle.Intersect(fixrect, r), fb.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
858 jpegCounter = oldjpeg;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
859 blurryrecoveryline = fixrect.Bottom;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
860 if (fixrect.Top <= blurryrect.Top && fixrect.Bottom >= blurryrect.Top) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
861 blurryrect.Intersect(new Rectangle(0, fixrect.Bottom, Int16.MaxValue, Int16.MaxValue));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
862 } else if (fixrect.Top <= blurryrect.Bottom && fixrect.Bottom >= blurryrect.Bottom) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
863 blurryrect.Intersect(new Rectangle(0, 0, fixrect.Top, Int16.MaxValue));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
864 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
865 if (blurryrect.Height == 0) blurryrect = Rectangle.Empty;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
866 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
867 foreach (Rectangle r2 in sending) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
868 SendFBRectangle(fb.Framebuffer, r2, fb.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
869 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
870 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
871 if (WaitingForUpdate != null) WaitingForUpdate(this, new EventArgs());
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
872 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
873 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
874 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
875 FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
876 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
877 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
878
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
879 private void SendFBRectangle(Int32[] fb, Rectangle r, Int32 fbwidth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
880 r.Intersect(new Rectangle(0, 0, fbwidth, fb.Length / fbwidth));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
881 r.Intersect(new Rectangle(0, 0, Width, Height));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
882 Boolean sent = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
883 foreach (Int32 enc in SupportedEncodings) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
884 switch (enc) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
885 case 0:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
886 SendFBRectangleRaw(fb, r, fbwidth); sent = true; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
887 case 2:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
888 if (r.Height < 8) break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
889 SendFBRectangleRRE(fb, r, fbwidth); sent = true; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
890 case 5:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
891 if (r.Width < 16 || r.Height < 16) break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
892 SendFBRectangleHextile(fb, r, fbwidth); sent = true; break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
893 case 6:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
894 sent = SendFBRectangleZLib(fb, r, fbwidth);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
895 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
896 case 7:
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
897 sent = SendFBRectangleTight(fb, r, fbwidth);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
898 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
899 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
900 if (sent) break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
901 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
902 if (!sent) SendFBRectangleRaw(fb, r, fbwidth);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
903 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
904 private void SendFBRectangleHeader(Rectangle r, UInt32 encoding) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
905 SendUInt16((UInt16)r.X);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
906 SendUInt16((UInt16)r.Y);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
907 SendUInt16((UInt16)r.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
908 SendUInt16((UInt16)r.Height);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
909 SendUInt32(encoding);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
910 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
911 IZLibCompressor TightZLib = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
912 private unsafe Boolean SendFBRectangleTight(Int32[] framebuffer, Rectangle r, Int32 fbwidth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
913 if (jpegCounter > 3 && r.Width * r.Height > 100 * 100) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
914 SendFBRectangleHeader(r, 7);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
915 SendUInt8(0x90); //Jpeg encoding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
916 MemoryStream jpeg = new MemoryStream();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
917 if (r.Width > 0 && r.Height > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
918 fixed (int* fbptr = framebuffer) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
919 using (Bitmap bmp = new Bitmap(r.Width, r.Height, fbwidth * 4, PixelFormat.Format32bppRgb, (IntPtr)(fbptr + (r.Top * fbwidth + r.Left)))) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
920 ImageCodecInfo ici = Array.Find(ImageCodecInfo.GetImageEncoders(), delegate(ImageCodecInfo item) { return item.FormatID == ImageFormat.Jpeg.Guid; });
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
921 EncoderParameters ep = new EncoderParameters(1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
922 ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
923 bmp.Save(jpeg, ici, ep);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
924 //bmp.Save(jpeg, ImageFormat.Jpeg);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
925 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
926 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
927 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
928 jpeg.Seek(0, SeekOrigin.Begin);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
929 int length = (int)jpeg.Length;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
930 Byte b1 = (Byte)(length & 0x7F);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
931 Byte b2 = (Byte)((length >> 7) & 0x7F);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
932 Byte b3 = (Byte)((length >> 14) & 0x7F);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
933 if (b3 != 0) b2 |= 0x80;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
934 if (b2 != 0) b1 |= 0x80;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
935 SendUInt8(b1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
936 if (b2 != 0) SendUInt8(b2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
937 if (b3 != 0) SendUInt8(b3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
938 SendAll(jpeg.ToArray());
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
939 blurryrect = blurryrect.IsEmpty ? r : Rectangle.Union(blurryrect, r);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
940 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
941 if (TightZLib == null && ZLibFactory == null) return false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
942 SendFBRectangleHeader(r, 7);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
943 SendUInt8(0x00); //Basic encoding, copy filter (raw), zlib stream 0
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
944 Byte[] row;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
945 int i = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
946 if (pixelformat.BitsPerPixel == 32 && pixelformat.ColorDepth == 24) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
947 row = new Byte[r.Width * r.Height * 3];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
948 for (int y = r.Top; y < r.Bottom; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
949 for (int x = r.Left; x < r.Right; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
950 UInt32 pixel = (UInt32)framebuffer[y * fbwidth + x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
951 row[i++] = (Byte)(pixel >> 16);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
952 row[i++] = (Byte)(pixel >> 8);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
953 row[i++] = (Byte)(pixel >> 0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
954 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
955 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
956 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
957 row = new Byte[r.Width * r.Height * pixelformat.BitsPerPixel / 8];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
958 for (int y = r.Top; y < r.Bottom; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
959 for (int x = r.Left; x < r.Right; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
960 UInt32 pixel = (UInt32)framebuffer[y * fbwidth + x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
961 UInt32 encoded = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
962 encoded |= ((((pixel >> 16) & 0xff) * (pixelformat.RedMax + 1u) / 256) & pixelformat.RedMax) << pixelformat.RedShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
963 encoded |= ((((pixel >> 8) & 0xff) * (pixelformat.GreenMax + 1u) / 256) & pixelformat.GreenMax) << pixelformat.GreenShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
964 encoded |= ((((pixel >> 0) & 0xff) * (pixelformat.BlueMax + 1u) / 256) & pixelformat.BlueMax) << pixelformat.BlueShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
965 if (pixelformat.BigEndian) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
966 for (int b = pixelformat.BitsPerPixel - 8; b >= 0; b -= 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
967 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
968 for (int b = 0; b < pixelformat.BitsPerPixel; b += 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
969 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
970 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
971 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
972 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
973 if (i >= 12) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
974 if (TightZLib == null) TightZLib = ZLibFactory();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
975 Byte[] compressed = TightZLib.Compress(row, 0, i);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
976 int length = compressed.Length;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
977 Byte b1 = (Byte)(length & 0x7F);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
978 Byte b2 = (Byte)((length >> 7) & 0x7F);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
979 Byte b3 = (Byte)((length >> 14) & 0x7F);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
980 if (b3 != 0) b2 |= 0x80;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
981 if (b2 != 0) b1 |= 0x80;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
982 SendUInt8(b1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
983 if (b2 != 0) SendUInt8(b2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
984 if (b3 != 0) SendUInt8(b3);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
985 SendAll(compressed);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
986 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
987 SendAll(row, 0, i);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
988 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
989 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
990 return true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
991 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
992 private void SendFBRectangleRaw(Int32[] framebuffer, Rectangle r, int fbwidth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
993 SendFBRectangleHeader(r, 0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
994 for (int y = r.Top; y < r.Bottom; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
995 Byte[] row = new Byte[r.Width * pixelformat.BitsPerPixel / 8];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
996 int i = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
997 for (int x = r.Left; x < r.Right; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
998 UInt32 pixel = (UInt32)framebuffer[y * fbwidth + x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
999 UInt32 encoded = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1000 encoded |= ((((pixel >> 16) & 0xff) * (pixelformat.RedMax + 1u) / 256) & pixelformat.RedMax) << pixelformat.RedShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1001 encoded |= ((((pixel >> 8) & 0xff) * (pixelformat.GreenMax + 1u) / 256) & pixelformat.GreenMax) << pixelformat.GreenShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1002 encoded |= ((((pixel >> 0) & 0xff) * (pixelformat.BlueMax + 1u) / 256) & pixelformat.BlueMax) << pixelformat.BlueShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1003 if (pixelformat.BigEndian) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1004 for (int b = pixelformat.BitsPerPixel - 8; b >= 0; b -= 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1005 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1006 for (int b = 0; b < pixelformat.BitsPerPixel; b += 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1007 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1008 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1009 SendAll(row);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1010 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1011 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1012
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1013 IZLibCompressor ZLibStream = null;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1014 private Boolean SendFBRectangleZLib(Int32[] framebuffer, Rectangle r, int fbwidth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1015 if (ZLibStream == null && ZLibFactory == null) return false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1016 SendFBRectangleHeader(r, 6);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1017 Byte[] row = new Byte[r.Width * r.Height * pixelformat.BitsPerPixel / 8];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1018 int i = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1019 for (int y = r.Top; y < r.Bottom; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1020 for (int x = r.Left; x < r.Right; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1021 UInt32 pixel = (UInt32)framebuffer[y * fbwidth + x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1022 UInt32 encoded = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1023 encoded |= ((((pixel >> 16) & 0xff) * (pixelformat.RedMax + 1u) / 256) & pixelformat.RedMax) << pixelformat.RedShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1024 encoded |= ((((pixel >> 8) & 0xff) * (pixelformat.GreenMax + 1u) / 256) & pixelformat.GreenMax) << pixelformat.GreenShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1025 encoded |= ((((pixel >> 0) & 0xff) * (pixelformat.BlueMax + 1u) / 256) & pixelformat.BlueMax) << pixelformat.BlueShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1026 if (pixelformat.BigEndian) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1027 for (int b = pixelformat.BitsPerPixel - 8; b >= 0; b -= 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1028 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1029 for (int b = 0; b < pixelformat.BitsPerPixel; b += 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1030 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1031 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1032 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1033 if (ZLibStream == null) ZLibStream = ZLibFactory();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1034 Byte[] compressed = ZLibStream.Compress(row, 0, i);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1035 SendUInt32((UInt32)compressed.Length);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1036 SendAll(compressed);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1037 return true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1038 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1039
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1040
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1041 private void SendFBRectangleRRE(Int32[] framebuffer, Rectangle r, int fbwidth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1042 SendFBRectangleHeader(r, 2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1043 int basecolor = framebuffer[r.Y * fbwidth + r.X];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1044 List<Rectangle> subrects = new List<Rectangle>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1045 if (false) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1046 for (int y = r.Top; y < r.Bottom; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1047 int color = basecolor;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1048 int runstart = r.Left;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1049 int runlength = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1050 for (int x = r.Left; x < r.Right; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1051 int newcolor = framebuffer[y * fbwidth + x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1052 if (color != newcolor) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1053 if (color != basecolor && runlength > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1054 Rectangle r2 = new Rectangle(runstart, y, runlength, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1055 if (r2.Y > 0 && framebuffer[(r2.Y - 1) * fbwidth + r2.X] == color) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1056 Boolean hasadjacent = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1057 Rectangle adjacent = r2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1058 foreach (Rectangle r3 in subrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1059 if (r3.Left == r2.Left && r3.Width == r2.Width && r3.Top + r3.Height == r2.Top) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1060 adjacent = r3;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1061 hasadjacent = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1062 break;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1063 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1064 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1065 if (hasadjacent) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1066 subrects.Remove(adjacent);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1067 r2 = Rectangle.Union(r2, adjacent);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1068 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1069 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1070 subrects.Add(r2);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1071 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1072 runstart = x;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1073 runlength = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1074 color = newcolor;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1075 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1076 runlength++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1077 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1078 if (color != basecolor && runlength > 0) subrects.Add(new Rectangle(runstart, y, runlength, 1));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1079 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1080 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1081 Queue<Rectangle> remaining = new Queue<Rectangle>();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1082 remaining.Enqueue(r);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1083 while (remaining.Count > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1084 Rectangle r2 = remaining.Dequeue();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1085 int color = framebuffer[r2.Y * fbwidth + r2.X];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1086 int rw = -1, rh = -1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1087 for (int x = r2.Left; x < r2.Right && rw == -1; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1088 if (color != framebuffer[r2.Y * fbwidth + x]) rw = x - r2.Left;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1089 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1090 if (rw == -1) rw = r2.Width;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1091 for (int y = r2.Top + 1; y < r2.Bottom && rh == -1; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1092 Boolean success = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1093 for (int x = r2.Left; x < r2.Left + rw && success; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1094 if (color != framebuffer[y * fbwidth + x]) success = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1095 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1096 if (!success) rh = y - r2.Top;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1097 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1098 if (rh == -1) rh = r2.Height;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1099 if (rw != 0 && rh != 0) subrects.Add(new Rectangle(r2.X, r2.Y, rw, rh));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1100 //if (r2.Width - rw > 0 && rh != 0) remaining.Enqueue(new Rectangle(r2.X + rw, r2.Y, r2.Width - rw, rh));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1101 if (r2.Height - rh > 0 && rw != 0) remaining.Enqueue(new Rectangle(r2.X, r2.Y + rh, rw, r2.Height - rh));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1102 //if (r2.Width - rw > 0 && r2.Height - rh > 0) remaining.Enqueue(new Rectangle(r2.X + rw, r2.Y + rh, r2.Width - rw, r2.Height - rh));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1103 //if (r2.Height - rh > 0) remaining.Enqueue(new Rectangle(r2.X, r2.Y + rh, r2.Width, r2.Height - rh));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1104 if (r2.Width - rw > 0) remaining.Enqueue(new Rectangle(r2.X + rw, r2.Y, r2.Width - rw, r2.Height));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1105 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1106 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1107 SendUInt32((UInt32)subrects.Count);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1108 SendPixel(basecolor);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1109 foreach (Rectangle r2 in subrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1110 SendPixel(framebuffer[r2.Y * fbwidth + r2.X]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1111 SendUInt16((UInt16)(r2.Left - r.Left));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1112 SendUInt16((UInt16)(r2.Top - r.Top));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1113 SendUInt16((UInt16)r2.Width);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1114 SendUInt16((UInt16)r2.Height);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1115 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1116 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1117 private void SendFBRectangleHextile(Int32[] framebuffer, Rectangle r, int fbwidth) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1118 SendFBRectangleHeader(r, 5);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1119 const int hextileRaw = 1;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1120 const int hextileBgSpecified = 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1121 const int hextileFgSpecified = 4;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1122 const int hextileAnySubrects = 8;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1123 const int hextileSubrectsColoured = 16;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1124 int oldBg = 0, oldFg = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1125 bool oldBgValid = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1126 bool oldFgValid = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1127 Rectangle t = new Rectangle();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1128 for (t.Y = r.Top; t.Top < r.Bottom; t.Y += 16) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1129 t.Height = Math.Min(r.Bottom, t.Top + 16) - t.Top;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1130 for (t.X = r.Left; t.Left < r.Right; t.X += 16) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1131 t.Width = Math.Min(r.Right, t.Left + 16) - t.Left;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1132 int tileType = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1133 int bg = framebuffer[t.Y * fbwidth + t.X];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1134 int fg = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1135 if (!oldBgValid || oldBg != bg) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1136 tileType |= hextileBgSpecified;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1137 oldBg = bg;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1138 oldBgValid = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1139 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1140 Boolean foundfg = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1141 Boolean foundcol = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1142 int subrects = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1143 for (int y = t.Top; y < t.Bottom; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1144 int color = bg;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1145 int length = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1146 for (int x = t.Left; x < t.Right; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1147 int pixel = framebuffer[y * fbwidth + x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1148 if (pixel == bg) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1149 } else if (!foundfg) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1150 fg = pixel;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1151 foundfg = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1152 } else if (pixel == fg) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1153 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1154 foundcol = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1155 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1156 if (color != pixel && length > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1157 if (color != bg) subrects++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1158 length = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1159 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1160 length++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1161 color = pixel;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1162 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1163 if (length > 0 && color != bg) subrects++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1164 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1165 if (foundcol) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1166 tileType |= hextileSubrectsColoured | hextileAnySubrects;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1167 oldFgValid = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1168 } else if (foundfg) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1169 tileType |= hextileAnySubrects;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1170 if (!oldFgValid || oldFg != fg) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1171 tileType |= hextileFgSpecified;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1172 oldFg = fg;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1173 oldFgValid = true;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1174 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1175 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1176 int encbytes = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1177 if ((tileType & hextileBgSpecified) != 0) encbytes += pixelformat.BitsPerPixel / 8;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1178 if ((tileType & hextileFgSpecified) != 0) encbytes += pixelformat.BitsPerPixel / 8;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1179 if ((tileType & hextileAnySubrects) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1180 int pertile = 2;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1181 if ((tileType & hextileSubrectsColoured) != 0) pertile += pixelformat.BitsPerPixel / 8;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1182 encbytes += pertile * subrects;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1183 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1184 if (t.Width * t.Height * pixelformat.BitsPerPixel / 8 <= encbytes) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1185 SendUInt8(hextileRaw);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1186 for (int y = t.Top; y < t.Bottom; y++) for (int x = t.Left; x < t.Right; x++) SendPixel(framebuffer[y * fbwidth + x]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1187 oldBgValid = oldFgValid = false;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1188 continue;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1189 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1190 SendUInt8((Byte)tileType);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1191 if ((tileType & hextileBgSpecified) != 0) SendPixel(bg);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1192 if ((tileType & hextileFgSpecified) != 0) SendPixel(fg);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1193 if ((tileType & hextileAnySubrects) != 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1194 SendUInt8((Byte)subrects);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1195 int subrectsa = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1196 for (int y = t.Top; y < t.Bottom; y++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1197 int color = bg;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1198 int length = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1199 int start = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1200 for (int x = t.Left; x < t.Right; x++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1201 int newcolor = framebuffer[y * fbwidth + x];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1202 if (color != newcolor && length > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1203 if (color != bg && subrectsa < subrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1204 if ((tileType & hextileSubrectsColoured) != 0) SendPixel(color);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1205 SendUInt8((Byte)(((start & 0xF) << 4) | ((y - t.Top) & 0xF)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1206 SendUInt8((Byte)((((length - 1) & 0xF) << 4) | (0 & 0xF)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1207 subrectsa++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1208 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1209 length = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1210 start = x - t.Left;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1211 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1212 length++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1213 color = newcolor;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1214 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1215 if (length > 0 && color != bg && subrectsa < subrects) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1216 if ((tileType & hextileSubrectsColoured) != 0) SendPixel(color);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1217 SendUInt8((Byte)(((start & 0xF) << 4) | ((y - t.Top) & 0xF)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1218 SendUInt8((Byte)((((length - 1) & 0xF) << 4) | (0 & 0xF)));
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1219 subrectsa++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1220 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1221 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1222 for (int i = subrectsa; i < subrects; i++) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1223 if ((tileType & hextileSubrectsColoured) != 0) SendPixel(0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1224 SendUInt16(0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1225 subrectsa++;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1226 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1227 if (subrects != subrectsa) throw new Exception("subrects != subrectsa");
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1228 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1229 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1230 //Flush();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1231 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1232 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1233
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1234 private void SendPixel(int pixeli) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1235 UInt32 encoded = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1236 UInt32 pixel = (UInt32)pixeli;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1237 encoded |= ((((pixel >> 16) & 0xff) * (pixelformat.RedMax + 1u) / 256) & pixelformat.RedMax) << pixelformat.RedShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1238 encoded |= ((((pixel >> 8) & 0xff) * (pixelformat.GreenMax + 1u) / 256) & pixelformat.GreenMax) << pixelformat.GreenShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1239 encoded |= ((((pixel >> 0) & 0xff) * (pixelformat.BlueMax + 1u) / 256) & pixelformat.BlueMax) << pixelformat.BlueShift;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1240 byte[] row = new Byte[pixelformat.BitsPerPixel / 8];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1241 int i = 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1242 if (pixelformat.BigEndian) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1243 for (int b = pixelformat.BitsPerPixel - 8; b >= 0; b -= 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1244 } else {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1245 for (int b = 0; b < pixelformat.BitsPerPixel; b += 8) row[i++] = (Byte)(encoded >> b);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1246 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1247 SendAll(row);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1248 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1249
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1250 private void SendPixelFormat(RFBPixelFormat pf) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1251 SendUInt8(pf.BitsPerPixel); //bits per pixel
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1252 SendUInt8(pf.ColorDepth); //depth
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1253 SendUInt8(pf.BigEndian ? (Byte)1 : (Byte)0); //big endian
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1254 SendUInt8(pf.TrueColor ? (Byte)1 : (Byte)0); //true color
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1255 SendUInt16(pf.RedMax); //red max
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1256 SendUInt16(pf.GreenMax); //green max
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1257 SendUInt16(pf.BlueMax); //blue max
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1258 SendUInt8(pf.RedShift); //red shift
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1259 SendUInt8(pf.GreenShift); //green shift
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1260 SendUInt8(pf.BlueShift); //blue shift
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1261 SendUInt8(0); //padding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1262 SendUInt8(0); //padding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1263 SendUInt8(0); //padding
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1264 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1265 private RFBPixelFormat ReceivePixelFormat() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1266 Byte[] b = ReceiveAll(16);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1267 RFBPixelFormat pf = new RFBPixelFormat();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1268 pf.BitsPerPixel = b[0];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1269 pf.ColorDepth = b[1];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1270 pf.BigEndian = b[2] != 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1271 pf.TrueColor = b[3] != 0;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1272 pf.RedMax = (UInt16)((b[4] << 8) | b[5]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1273 pf.GreenMax = (UInt16)((b[6] << 8) | b[7]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1274 pf.BlueMax = (UInt16)((b[8] << 8) | b[9]);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1275 pf.RedShift = b[10];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1276 pf.GreenShift = b[11];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1277 pf.BlueShift = b[12];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1278 return pf;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1279 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1280
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1281 private void SendUInt32(UInt32 value) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1282 SendAll(new Byte[] { (Byte)(value >> 24), (Byte)(value >> 16), (Byte)(value >> 8), (Byte)value });
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1283 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1284 private void SendUInt16(UInt16 value) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1285 SendAll(new Byte[] { (Byte)(value >> 8), (Byte)value });
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1286 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1287 private void SendUInt8(Byte value) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1288 SendAll(new Byte[] { value });
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1289 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1290 private void SendAll(Byte[] buffer) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1291 SendAll(buffer, 0, buffer.Length);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1292 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1293
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1294 private void SendAll(Byte[] buffer, int off, int len) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1295 if (SendBuffer == null) SendBuffer = new MemoryStream();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1296 SendBuffer.Write(buffer, off, len);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1297 if (SendBuffer.Length > 102400) FlushSendBuffer();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1298 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1299 private void FlushSendBuffer() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1300 if (SendBuffer == null) return;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1301 SendBuffer.Seek(0, SeekOrigin.Begin);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1302 SendBuffer.WriteTo(socket);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1303 SendBuffer.SetLength(0);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1304 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1305
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1306 private Byte ReceiveByte() {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1307 Byte[] buffer = new Byte[1];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1308 ReceiveAll(buffer, 0, 1);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1309 return buffer[0];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1310 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1311 private Byte[] ReceiveAll(int len) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1312 Byte[] buffer = new Byte[len];
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1313 ReceiveAll(buffer, 0, len);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1314 return buffer;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1315 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1316 private void ReceiveAll(Byte[] buffer, int off, int len) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1317 while (len > 0) {
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1318 int sent = socket.Read(buffer, off, len);
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1319 if (sent == 0) throw new EndOfStreamException();
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1320 len -= sent;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1321 off += sent;
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1322 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1323 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1324 }
644a923bca98 Added FBGUI and VNCServer
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1325 }