blob: 17a881cb06b63bf2723d50977d495849e2e978fa [file] [log] [blame] [raw]
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Reflection;
using System.Security.Principal;
using System.Threading;
using System.Windows.Forms;
namespace RemoteView
{
class Program
{
static Mutex mutex = new Mutex(true, "-RemoteView-Mutex-");
private static string ApplicationName
{
get
{
return Path.GetFileNameWithoutExtension(Application.ExecutablePath);
}
}
static void Main(string[] args)
{
// get configuration from command line parameters
Configuration conf;
try
{
conf = Configuration.create(args);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return;
}
if (conf.Banner)
{
ShowBanner();
}
if (conf.Help)
{
ShowHelpMessage();
return;
}
// make sure only one instance is online
if (!conf.AllowMultiple && !InstanceIsUnique())
{
Console.WriteLine("Only one instance of process allowed. User -m for muliple instances.");
return;
}
// get admin level
if (!IsRunningAsAdministrator())
{
RunAsAdministrator(args);
return;
}
// check if http listener is supported
if (!HttpListener.IsSupported)
{
Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
return;
}
// run server
RunServer(conf);
}
/// <summary>
/// Find out if there are one or more instances of this program running
/// </summary>
/// <returns>n processes</returns>
private static bool InstanceIsUnique()
{
if (mutex.WaitOne(TimeSpan.Zero, true))
{
mutex.ReleaseMutex();
return true;
}
return false;
}
/// <summary>
/// Relaunch this Application with Admin user level if possible
/// </summary>
/// <param name="args"></param>
private static void RunAsAdministrator(string[] args)
{
ProcessStartInfo processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);
processInfo.UseShellExecute = true;
processInfo.Verb = "runas";
processInfo.Arguments = String.Join(" ", args);
try
{
Process.Start(processInfo);
}
catch (Exception)
{
Console.WriteLine("Needs administrator rights.");
}
}
/// <summary>
/// Run server
/// </summary>
/// <param name="conf">server configuration</param>
private static void RunServer(Configuration conf)
{
Server server = new Server();
new Thread(() =>
{
server.Start(conf.Port);
}).Start();
// works!
Thread.Sleep(2000);
if (!server.IsRunning())
{
Console.WriteLine("Could not start server... Exiting.");
return;
}
Console.WriteLine("Server running press [c] to stop");
while (server.IsRunning() && Console.ReadKey(true).Key != ConsoleKey.C) ;
server.Stop();
}
private static void ShowBanner()
{
Console.WriteLine(Application.ProductName + " - Desktop sharing server");
Console.WriteLine("Copyright (c) Joao Vilaca, 2013, Email: jvilaca@gmail.com");
Console.WriteLine();
}
private static void ShowHelpMessage()
{
Console.WriteLine("Syntax: " + ApplicationName + " [Port to listen] [Options]");
Console.WriteLine("Example: " + ApplicationName + " 6060 -b");
Console.WriteLine("Options: -b :\tDon't show banner message;");
Console.WriteLine(" -h :\tHelp (This screen);");
// Console.WriteLine("\t-i :\tInstall as Windows service");
// Console.WriteLine("\t-u :\tUninstall as Windows service");
}
private static bool IsRunningAsAdministrator()
{
return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
}
}
}