blob: a200de3a574ff3af87bed0da9296ef01c25fd7d4 [file] [log] [blame] [raw]
// NVNC - .NET VNC Server Library
// Copyright (C) 2014 T!T@N
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using System.Drawing;
using NVNC.Utils;
namespace NVNC
{
/// <summary>
/// A wrapper class that should be used. It represents a VNC Server, and handles all the RFB procedures and communication.
/// </summary>
public class VncServer
{
private VncHost host;
private Framebuffer fb;
public int Port { get; private set; }
public string Password { get; private set; }
/// <summary>
/// The VNC Server name.
/// <remarks>The variable value should be non-null.</remarks>
/// </summary>
public string Name { get; private set; }
/// <summary>
/// The default constructor using the default values for the parameters.
/// Port is set to 5900, the Name is set to Default, and there is no password.
/// </summary>
public VncServer()
: this("", 5900, "Default")
{ }
public VncServer(string password, int port, string name)
{
Password = password;
Port = port;
Name = name;
Size screenSize = ScreenSize();
fb = new Framebuffer(screenSize.Width, screenSize.Height)
{
BitsPerPixel = 32,
Depth = 24,
BigEndian = false,
TrueColor = true,
RedShift = 16,
GreenShift = 8,
BlueShift = 0,
BlueMax = 0xFF,
GreenMax = 0xFF,
RedMax = 0xFF,
DesktopName = name
};
}
public void Start()
{
if (String.IsNullOrEmpty(Name))
throw new ArgumentNullException("Name", "The VNC Server Name cannot be empty.");
if (Port == 0)
throw new ArgumentNullException("Port", "The VNC Server port cannot be zero.");
Console.WriteLine("Started VNC Server at port: " + Port);
host = new VncHost(Name, new ScreenHandler(new Rectangle(0, 0, ScreenSize().Width, ScreenSize().Height), true, fb));
host.StartListen(Port);
host.Accept();
host.WriteProtocolVersion();
Console.WriteLine("Wrote Protocol Version");
host.ReadProtocolVersion();
Console.WriteLine("Read Protocol Version");
Console.WriteLine("Awaiting Authentication");
if (!host.WriteAuthentication(Password))
{
Console.WriteLine("Authentication failed !");
host.Close();
//Start();
}
else
{
Console.WriteLine("Authentication successfull !");
bool share = host.ReadClientInit();
Console.WriteLine("Share: " + share);
Console.WriteLine("Server name: " + fb.DesktopName);
host.WriteServerInit(fb);
while ((host.isRunning))
{
switch (host.ReadServerMessageType())
{
case VncHost.ClientMessages.SetPixelFormat:
Console.WriteLine("Read SetPixelFormat");
Framebuffer f = host.ReadSetPixelFormat(fb.Width, fb.Height);
if (f != null)
fb = f;
break;
case VncHost.ClientMessages.ReadColorMapEntries:
Console.WriteLine("Read ReadColorMapEntry");
host.ReadColorMapEntry();
break;
case VncHost.ClientMessages.SetEncodings:
Console.WriteLine("Read SetEncodings");
host.ReadSetEncodings();
break;
case VncHost.ClientMessages.FramebufferUpdateRequest:
Console.WriteLine("Read FrameBufferUpdateRequest");
host.ReadFrameBufferUpdateRequest(fb);
break;
case VncHost.ClientMessages.KeyEvent:
Console.WriteLine("Read KeyEvent");
host.ReadKeyEvent();
break;
case VncHost.ClientMessages.PointerEvent:
Console.WriteLine("Read PointerEvent");
host.ReadPointerEvent();
break;
case VncHost.ClientMessages.ClientCutText:
Console.WriteLine("Read CutText");
host.ReadClientCutText();
break;
}
}
//if (!host.isRunning)
//Start();
}
}
/// <summary>
/// Closes all active connections, and stops the VNC Server from listening on the specified port.
/// </summary>
public void Stop()
{
host.Close();
}
private Size ScreenSize()
{
Size s = new Size();
s.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
s.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
return s;
}
}
}