///////////////////////////////////////////////////////////////////// // SERVER MODE ///////////////////////////////////////////////////////////////////// private void StartServerMode(Server.StartParams startParams) { //start server try { startParams.ReplaceTabsWithSpaces = 4; startParams.Port = Server.DefaultPort + 1; startParams.Public = true; otexServer.Start(startParams); } catch (Exception exc) { Logger.ErrorMessage("An error occurred while starting the server:\n\n{0}", exc.Message); return; } //start client try { otexClient.Connect(IPAddress.Loopback, startParams.Port, null, localClient.Serialize()); } catch (Exception exc) { Logger.ErrorMessage("An error occurred while connecting:\n\n{0}", exc.Message); return; } //set last connection data to null lastConnectionEndpoint = null; lastConnectionPassword = null; lastConnectionFailedReason = null; lastConnectionReturnToServerBrowser = false; //started ok, set title text Text = string.Format("Hosting {0} - {1}", otexClient.ServerFilePath.Length == 0 ? "a temporary document" : Path.GetFileName(otexClient.ServerFilePath), App.Name); }
///////////////////////////////////////////////////////////////////// // MAIN ///////////////////////////////////////////////////////////////////// static int Main(string[] args) { //handle command line arguments var startParams = new Server.StartParams() { ReplaceTabsWithSpaces = 4 }; try { var arguments = App.ProcessArguments(args); //help if (arguments.Find((a) => { return(a.Flag && a.Value.CompareTo("?") == 0); }) != null) { Print(Console.Out, ConsoleColor.Cyan, Splash); Console.Out.WriteLine(); Out(Help); return(0); } //key value pairs for (int i = 0; i < arguments.Count - 1; ++i) { if (!arguments[i].Flag || arguments[i + 1].Flag) { continue; } bool match = false; if (match = (arguments[i].Value.CompareTo("port") == 0)) { startParams.Port = ushort.Parse(arguments[i + 1].Value); } else if (match = (arguments[i].Value.CompareTo("password") == 0)) { startParams.Password = new Password(arguments[i + 1].Value); } else if (match = (arguments[i].Value.CompareTo("name") == 0)) { startParams.Name = arguments[i + 1].Value; } else if (match = (arguments[i].Value.CompareTo("maxclients") == 0)) { startParams.MaxClients = uint.Parse(arguments[i + 1].Value); } if (match) { arguments[i].Handled = arguments[i + 1].Handled = true; } } //single flag arguments for (int i = 0; i < arguments.Count; ++i) { if (!arguments[i].Flag || arguments[i].Handled) { continue; } bool match = false; if (match = (arguments[i].Value.CompareTo("edit") == 0)) { startParams.EditMode = true; } else if (match = (arguments[i].Value.CompareTo("new") == 0)) { startParams.EditMode = false; } else if (match = (arguments[i].Value.CompareTo("public") == 0)) { startParams.Public = true; } if (match) { arguments[i].Handled = true; } } //single non-flag arguments for (int i = 0; i < arguments.Count; ++i) { if (arguments[i].Flag || arguments[i].Handled) { continue; } startParams.FilePath = arguments[i].Value; } } catch (Exception exc) { #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { Error("{0}: {1}", exc.GetType().FullName, exc.Message); throw; } #endif Error("Error: {0}", exc.Message); Warning("usage:{0}{1}", Environment.NewLine, Usage); return(1); } //create server server = new Server(); //attach server events server.OnThreadException += (s, e) => { Error("{0}: {1}", e.InnerException.GetType().FullName, e.InnerException.Message); }; server.OnStarted += (s) => { Out("OTEX Server started."); Out(" Name: {0}", s.Name); Out(" File: {0}", s.FilePath); Out(" Port: {0}", s.Port); Out(" Password: {0}", s.RequiresPassword); Out(" Public: {0}", s.Public); Out(" Line endings: {0}", s.FileLineEndings.Equals("\r\n") ? "CRLF" : (s.FileLineEndings.Equals("\r") ? "CR" : "LF")); Out(" Max clients: {0}", s.MaxClients); }; server.OnClientConnected += (s, id) => { Out("Client {0} connected.", id); }; server.OnClientDisconnected += (s, id) => { Out("Client {0} disconnected.", id); }; server.OnStopped += (s) => { Out("Server stopped."); }; Console.CancelKeyPress += (s, e) => { stop = true; e.Cancel = true; }; //start server try { server.Start(startParams); } catch (Exception exc) { #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { Error("{0}: {1}", exc.GetType().FullName, exc.Message); throw; } #endif Error("Error: {0}", exc.Message); Warning("usage:{0}{1}", Environment.NewLine, Usage); return(2); } //loop, waiting for stop while (!stop) { Thread.Sleep(250); } //dispose server (also stops it) server.Dispose(); //exit return(0); }