Esempio n. 1
0
        /////////////////////////////////////////////////////////////////////
        // 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);
        }
Esempio n. 2
0
        /////////////////////////////////////////////////////////////////////
        // 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);
        }